2014-10-09 23 views
4

我想写一段python脚本来自动化一些相当耗时的任务,在一些液压问题中,发生在土木工程。求解Sympy Python的非线性方程 - 需要解决TypeError(“不能将表达式转换为float”)

的公式是从科尔布鲁克 - 怀特,而如下:

我写了下面的代码:

from math import * 
from sympy import * 

e = 0.2 
d = 0.2 
v = 0.00000131 
q = 10 
s = (pi * d ** 2)/4 
u = q/s 
re = u * d/v 

lamb = symbols('lamb') 

solve( 1/sqrt(lamb)        \ 
     + 2 * log10( e/(3.7 * d)     \ 
        + 2.51/(re * sqrt(lamb))  \ 
       ),         \ 
     lamb           \ 
    ) 

但它给人的错误:

File "hg.py", line 12, in <module> 
    solve(1/sqrt(lamb) + 2*log10(k/(3.7*d) + 2.51/(re*sqrt(lamb))),lamb) 
    File "/home/luis/Documents/sympy/sympy/core/expr.py", line 211, in __float__ 
    raise TypeError("can't convert expression to float") 
    TypeError: can't convert expression to float 

我不能不会发布关于方程式的图片,就像新的一样。

由于sqrt(lambda)是在等式的两边,我认为它必须通过迭代的方法来解决,但我不知道该怎么办呢?在我的计算器(TI-航程200)我通常使用nSolve(),它完成这项工作。

在此先感谢!

+0

你总是可以张贴的链接公式。图片,我可以上传到您的文章,好吗? – user3666197 2014-10-13 16:53:53

+0

嗨,谢谢,但我已经解决了它!感谢所有的帮助! – 2014-10-15 16:42:31

回答

1

您仍在使用log10而不是log(expr, 10)。纠正和使​​用二分法与nsolve作品:

>>> eq = 1/sqrt(lamb) + 2*log(e/(3.7*d) + 2.51/(re*sqrt(lamb)), 10) 
>>> nsolve(eq,lamb, (.1, 1.1), method='bisect') 
mpf('0.77434599870454337') 

其他求解选项见help(mpmath.findroot)除了平分。

3

不要做from math import *。这是通过数学模块中的函数来实现的,这些函数不能与SymPy表达式一起工作(它们只能用于浮点数)。在这种情况下,log10来自数学。只要做from sympy import *或更好,如果你正在编写脚本,明确地导入你使用的所有东西。 log10(x)的SymPy等效为log(x, 10)

+0

谢谢你的回答! 我试过编辑导入,只导入必要的,现在试过这个代码,但它仍然给出错误... 代码: 'solve(1/sqrt(l)+ 2 * log( K /(3.7 * d)2.51(重新* SQRT(1)),10),升)' 错误: '回溯(最近最后调用): 文件 “”,第1行,在 TypeError:'float'对象不可调用' – 2014-10-12 17:57:02

+0

您忘记了一个'*'。它应该是'2.51 *(re * sqrt(l))'而不是'2.51(re * sqrt(l))'。 – asmeurer 2014-10-13 01:33:05

+0

感谢您发现错误,但实际上它应该是/而不是*(我的错误)。不幸的是,这并不影响问题...它仍然提供了错误:
'文件 “”,第1行,在 文件 “sympy /核心/ expr.py”,线211,在__float__ 加注类型错误( “不能转换表达式浮动”) TypeError:无法将表达式转换为浮点数 – 2014-10-13 13:29:02

0

感谢您的帮助! 随着你的帮助,以及其他线程在这里stackoverflow,我已经能够解决这个问题。

这是我的最后,解决,代码:

def f(x): 
    return (-2*numpy.log10((2.51/(Re*numpy.sqrt(x))) + (k/(3.7*d))) - 1.0/numpy.sqrt(x)) 

lamb = float(fsolve(f, 0.02)) 
print "Lambda = %f " % lamb