非线性方程求解Sympy Python用于液压 – 需要解决TypeError(“无法将表达式转换为浮点数”)

我正在尝试编写一段python脚本,以便在土木工程中出现的某些液压问题中自动执行相当耗时的任务.

等式来自Cole*-White,如下:

我写了以下代码:

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-Voyage 200)上我经常使用nSolve(),它完成了这项工作.

提前致谢!

解决方法:

您仍在使用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')

有关除bisect之外的其他求解器选项,请参阅help(mpmath.findroot).

上一篇:python – 如何查看sklearn.preprocessing.PolynomialFeatures的效果?


下一篇:Asp.Net Web Forms/MVC/Console App中使用Autofac