无法导入X问题。适用于Oregonator模型的刚性ODE求解器

时间:2019-10-18 18:07:15

标签: python numerical-methods ode numerical-integration chemistry

错误来自尝试从scipy.integrate导入Radau方法(之所以需要,是因为Oregonator模型是一个刚性系统)。

我正在尝试对Oregonator模型进行数值积分,以显示参数f必须在0和3之间存在某个过渡点,以便在此间隔的特定子集中发生振荡。

原谅我的经验,我是Python的新手。

错误:ImportError:无法从'scipy.integrate'导入名称'radau'

由于无知,我从头开始构建了一个四阶Runge-Kutta方法。发现股价而不是化学振荡后,我转而使用odeint。这仍然失败。直到此后,我才发现了刚性系统的概念,因此我一直在研究Radau方法。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate. import radau

# Dimensionless parameters
e = 0.04
q = 0.0008
f = 1.0

# Oregonator model
def Oregonator(Y, t):
    return [((Y[0] * (1 - Y[0])  - ((Y[0] - q) * f * Y[1]) // (q + Y[0]))) 
    // e, Y[0] - Y[1]]

# Time span and inital conditions
ts = np.linspace(0, 10, 100)
Y0 = [1, 3]

# Numerical algorithm/method
NumSol = radau(Oregonator, 0, Y0, t_bound=30)
x = NumSol[:,0]
z = NumSol[:,1]

预期的结果应该是振荡(类似于第12页): https://pdfs.semanticscholar.org/0959/9106a563e9d88ce6442e3bb5b242d5ccbdad.pdf 仅适用于x和z。 y的缺失是由于我使用了稳态近似。

1 个答案:

答案 0 :(得分:0)

使用solve_ivp作为诸如RK45Radau之类的求解器类的单行接口。使用该类的正确大写。在ODE函数中使用正确的参数顺序(可以在tfirst=True中使用odeint来使用同一函数)。避免在打算使用浮点除法的情况下进行整数除法。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# Dimensionless parameters
eps = 4e-2
q = 8e-4
f = 2.0/3

# Oregonator model
def Oregonator(t,Y):
    x,z = Y;
    return [(x * (1 - x) + (f*(q-x)*z) / (q + x)) / eps, x - z]

# Time span and inital conditions
ts = np.linspace(0, 10, 100)
Y0 = [1, 0.5]

# Numerical algorithm/method
NumSol = solve_ivp(Oregonator, [0, 30], Y0, method="Radau")
x, z = NumSol.y
y = (f*z)/(q+x)
t = NumSol.t
plt.subplot(221);
plt.plot(t,x,'b'); plt.xlabel("t"); plt.ylabel("x");
plt.subplot(222);
plt.plot(t,y,'r'); plt.xlabel("t"); plt.ylabel("y");
plt.subplot(223);
plt.plot(t,z,'g'); plt.xlabel("t"); plt.ylabel("z");
plt.subplot(224);
plt.plot(x,z,'k'); plt.xlabel("x"); plt.ylabel("z");
plt.tight_layout(); plt.show()

然后生成图

enter image description here

表现出周期性振荡。

下一步可能是使用tspan选项或“密集输出”以在用户定义的采样点获取解决方案样本。为了获得可靠的结果,请手动设置误差容限。

f=0.51262接近从收敛行为到振荡行为的过渡点。 enter image description here