如何将数学 ODE 代码更改为 Python
How to change Mathematical ODE code to Python
我在 Mathematica
中得到了以下代码
solution = NDSolve[{\[CapitalOmega]\[CapitalLambda]'[x] ==
(1 - \[CapitalOmega]\[CapitalLambda][x]) \[CapitalOmega]\[CapitalLambda][x] ((1 - \[CapitalOmega]\[CapitalLambda][x])^((1 - \[Delta])/(4 - \[Delta])) \[CapitalOmega]\[CapitalLambda][x]^(1/(4 - 2 \[Delta]))), \[CapitalOmega]\[CapitalLambda][0] == \[CapitalOmega]\[CapitalLambda]f}, \[CapitalOmega]\[CapitalLambda], {x, xi, xf}];
我想写成Python,使用ODEINT
但是我真的不明白它的写法,因为它发送复数的`error1。
def OD_H(z, od, delt):
dMdt = od * (1 - od) * ((1 - od)**((1 - delt)/(4-2*delt)) * od**(1/(2 *(2-delt))))
return dMdt
def ant(z, od0, delt):
z1 = 0
od = odeint(OD_H, od0, [z1, z], args=(delt,))[-1]
return od
for z in np.arange(0,3.1,0.1):
print(ant(z, 0.7, 1.1))
错误是
od = odeint(OD_H, od0, [z1, z], args=(delt,))[-1]
File "C:\Python36-32\lib\site-packages\scipy\integrate\odepack.py", line 244, in odeint
int(bool(tfirst)))
TypeError: can't convert complex to float
从 odeint
调用中我们得知您使用 z
作为时间变量,使用 od
作为 space/state 变量。由于您的导数函数首先具有时间,而 odeint
中的默认值是首先具有状态,因此您需要设置选项 tfirst=True
。有了这个改变,就没有错误了。通过使用 odeint
的全部功能为它提供所有所需采样点的列表
,您可以用更少的计算获得相同的值
z = np.arange(0,3.1,0.1)
od = odeint(OD_H, od0, z, args=(delt,), tfirst=True)
其中 z[k], od[k]
对对应于您在循环中计算的 argument-value 对。
我在 Mathematica
solution = NDSolve[{\[CapitalOmega]\[CapitalLambda]'[x] ==
(1 - \[CapitalOmega]\[CapitalLambda][x]) \[CapitalOmega]\[CapitalLambda][x] ((1 - \[CapitalOmega]\[CapitalLambda][x])^((1 - \[Delta])/(4 - \[Delta])) \[CapitalOmega]\[CapitalLambda][x]^(1/(4 - 2 \[Delta]))), \[CapitalOmega]\[CapitalLambda][0] == \[CapitalOmega]\[CapitalLambda]f}, \[CapitalOmega]\[CapitalLambda], {x, xi, xf}];
我想写成Python,使用ODEINT
但是我真的不明白它的写法,因为它发送复数的`error1。
def OD_H(z, od, delt):
dMdt = od * (1 - od) * ((1 - od)**((1 - delt)/(4-2*delt)) * od**(1/(2 *(2-delt))))
return dMdt
def ant(z, od0, delt):
z1 = 0
od = odeint(OD_H, od0, [z1, z], args=(delt,))[-1]
return od
for z in np.arange(0,3.1,0.1):
print(ant(z, 0.7, 1.1))
错误是
od = odeint(OD_H, od0, [z1, z], args=(delt,))[-1]
File "C:\Python36-32\lib\site-packages\scipy\integrate\odepack.py", line 244, in odeint
int(bool(tfirst)))
TypeError: can't convert complex to float
从 odeint
调用中我们得知您使用 z
作为时间变量,使用 od
作为 space/state 变量。由于您的导数函数首先具有时间,而 odeint
中的默认值是首先具有状态,因此您需要设置选项 tfirst=True
。有了这个改变,就没有错误了。通过使用 odeint
的全部功能为它提供所有所需采样点的列表
z = np.arange(0,3.1,0.1)
od = odeint(OD_H, od0, z, args=(delt,), tfirst=True)
其中 z[k], od[k]
对对应于您在循环中计算的 argument-value 对。