【问题标题】:Non-linear equation solving Sympy Python for hydraulics - Need resolve TypeError("can't convert expression to float")用于液压的非线性方程求解 Sympy Python - 需要解决 TypeError(“无法将表达式转换为浮点数”)
【发布时间】:2014-12-05 00:19:12
【问题描述】:

我正在尝试编写一段 Python 脚本,以自动处理土木工程中出现的一些水力学问题中的一项相当耗时的任务。

公式来自 Colebrook-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(),它可以胜任。

提前致谢!

【问题讨论】:

  • 您可以随时发布 Eqn 的链接。图片,我可以上传到你的帖子,好吗?
  • 嗨,谢谢,但我同时解决了!感谢所有的帮助!

标签: python sympy solver nonlinear-functions


【解决方案1】:

不要做from math import *。这是使用数学模块中的函数来修改命名空间,这些函数不适用于 SymPy 表达式(它们仅适用于浮点数)。在这种情况下,log10 来自数学。只需执行from sympy import *,或者更好的是,如果您正在编写脚本,请明确导入您使用的所有内容。 log10(x) 的 SymPy 等效项是 log(x, 10)

【讨论】:

  • 感谢您的回答!我已经尝试编辑导入,只导入必要的,现在尝试了这段代码,但它仍然给出错误...代码:solve(1/sqrt(l)+2*log(k/(3.7*d)+2.51(re*sqrt(l)),10),l) 错误:Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; TypeError: 'float' object is not callable
  • 您忘记了*。应该是 2.51*(re*sqrt(l)) 而不是 2.51(re*sqrt(l))
  • 感谢您发现该错误,但实际上它应该是 / 而不是 *(我的错误)。不幸的是,这不会影响问题......它仍然给出错误:
    File "&lt;stdin&gt;", line 1, in &lt;module&gt; File "sympy/core/expr.py", line 211, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float
【解决方案2】:

您仍在使用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】:

    感谢大家的帮助! 在您的帮助下,连同 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多