求解液压系统的Sympy Python非线性方程需要解决TypeError(“无法将表达式转换为float”)

2024-10-03 04:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图写一段python脚本来自动处理一些在土木工程中出现的水力学问题中非常耗时的任务。在

公式来自科尔布鲁克-怀特,如下所示:

我写了以下代码:

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                                           \
     )

但它给出了一个错误:

^{pr2}$

因为我是新来的,所以我不能发布一张等式的图片。在

由于sqrt(lambda)在方程的两边,所以我认为必须用迭代法来求解,但我不知道怎么去做。。。在我的计算器(tivoyage200)上,我通常使用nSolve(),它完成了这项工作。在

提前谢谢!在


Tags: 代码fromimportre脚本pimathsqrt
3条回答

不要做from math import *。这是在用math模块中的函数大嚼你的命名空间,这些函数不适用于SymPy表达式(它们只适用于float)。在本例中,log10来自数学。只需执行from sympy import *,或者更好,如果您正在编写脚本,请显式导入您使用的所有内容。log10(x)的同调等价物是log(x, 10)。在

您仍在使用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 )以了解除对分之外的其他解算器选项。在

谢谢你的帮助! 在您的帮助下,与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

相关问题 更多 >