我正在尝试编写一段python脚本来自动化一些在土木工程中发生的水力学问题中相当耗时的任务。
方程来自Colebrook,如下所示:
我编写了以下代码:
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-Voyage200)上,我通常使用nSolve()并完成这项工作。
提前感谢!
发布于 2014-10-13 15:31:59
您仍然在使用log( expr, 10 ).而不是log10纠正这种情况,并使用二分法与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 )中的其他求解器选项。
发布于 2014-10-11 00:04:15
不要做from math import *。这是用来自数学模块的函数来处理您的命名空间,这些函数不适用于SymPy表达式(它们只适用于浮点数)。在这种情况下,log10来自数学。只需执行from sympy import *,或者更好的是,如果您正在编写脚本,则显式导入您使用的所有内容。与SymPy等价的log10(x)是log(x, 10)。
发布于 2014-10-15 16:49:28
谢谢你的帮助!在您的帮助下,与这里的其他线程在堆栈溢出,我已经能够解决这个问题。
这是我的最后一个解决方案,密码:
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 " % lambhttps://stackoverflow.com/questions/26289087
复制相似问题