我想在 python 中做这个人在 MATLAB 中所做的事情。
我已经安装了 anaconda,所以我有 numpy 和 sympy 库。到目前为止,我已经尝试过使用 numpy nsolve,但这不起作用。我应该说我是 python 新手,而且我知道如何在 MATLAB 中做到这一点:P。
方程:
-2*log(( 2.51/(331428*sqrt(x)) ) + ( 0.0002 /(3.71*0.26)) ) = 1/sqrt(x)
通常,我会迭代地解决这个问题,简单地猜测左边的 x 而不是解决右边的 x。把解放在左边,再解。重复直到左边的 x 接近右边。我知道应该是什么解决方案。
所以我可以这样做,但这不是很酷。我想用数字来做。我的 15 欧元卡西欧计算器可以按原样解决,所以我认为它不应该太复杂?
谢谢您的帮助,
编辑:所以我尝试了以下方法:
from scipy.optimize import brentq
w=10;
d=0.22;
rho=1.18;
ni=18.2e-6;
Re=(w*d*rho)/ni
k=0.2e-3;
d=0.26;
def f(x,Re,k,d):
return (
-2*log((2.51/(Re*sqrt(x)))+(k/(3.71*d)),10)*sqrt(x)+1
);
print(
scipy.optimize.brentq
(
f,0.0,1.0,xtol=4.44e-12,maxiter=100,args=(),full_output=True,disp=True
)
);
我得到了这个结果:
r = _zeros._brentq(f,a,b,xtol,maxiter,args,full_output,disp)
TypeError: f() takes exactly 4 arguments (1 given)
是因为我也在解决常量问题吗?
edit2:所以我想我必须通过 args=() 关键字分配常量,所以我改变了:
f,0.0,1.0,xtol=4.44e-12,maxiter=100,args=(Re,k,d),full_output=True,disp=True
但现在我明白了:
-2*log((2.51/(Re*sqrt(x)))+(k/(3.71*d)),10)*sqrt(x)+1
TypeError: return arrays must be of ArrayType
无论如何,当我输入不同的方程式时;可以说它2*x*Re+(k*d)/(x+5)
有效,所以我想我必须转换方程。
所以它死在这里:log(x,10)..
编辑4:正确的语法是log10(x)......现在它可以工作但结果我得到零