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

Python 无法导入X问题。Oregonator模型的刚性ODE求解器,python,numerical-methods,ode,numerical-integration,chemistry,Python,Numerical Methods,Ode,Numerical Integration,Chemistry,错误来自尝试从scipy.integrate导入Radau方法(因为Oregonator模型是一个刚性系统,所以需要) 我试图对Oregonator模型进行数值积分,以表明参数f在0和3之间必须存在一些过渡点,因此在该区间的特定子集中,振荡会发生 请原谅我的经验不足,我是Python新手 错误:导入错误:无法从“scipy.integrate”导入名称“radau” 在我无知的情况下,我从头开始构造了一个四阶龙格-库塔方法。找到了股票价格而不是化学振荡后,我转而使用odeint。这仍然失败。直到

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

我试图对Oregonator模型进行数值积分,以表明参数f在0和3之间必须存在一些过渡点,因此在该区间的特定子集中,振荡会发生

请原谅我的经验不足,我是Python新手

错误:导入错误:无法从“scipy.integrate”导入名称“radau”

在我无知的情况下,我从头开始构造了一个四阶龙格-库塔方法。找到了股票价格而不是化学振荡后,我转而使用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页)中的振荡:
仅适用于x和z。缺少y是由于我使用了稳态近似值。

使用
solve\u ivp
作为解算器类(如
RK45
Radau
)的单线接口。使用正确的大写字母。在ODE函数中使用正确的参数顺序(您可以在
odeint
中使用
tfirst=True
来全面使用相同的函数)。避免使用浮点除法的整数除法

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()
然后生成情节

表现出周期性振荡的

进一步的步骤可以是使用
tspan
选项或“密集输出”在用户定义的采样点获取溶液样本。为获得可靠的结果,请手动设置误差公差

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

使用
solve\u ivp
作为求解器类(如
RK45
Radau
)的单线接口。使用正确的大写字母。在ODE函数中使用正确的参数顺序(您可以在
odeint
中使用
tfirst=True
来全面使用相同的函数)。避免使用浮点除法的整数除法

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()
然后生成情节

表现出周期性振荡的

进一步的步骤可以是使用
tspan
选项或“密集输出”在用户定义的采样点获取溶液样本。为获得可靠的结果,请手动设置误差公差

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

如果查看文档,您会发现解算器类名为“Radau”,首字母大写。//为什么不使用
solve\u ivp
界面?如果查看文档,您会发现解算器类名为“Radau”,首字母大写。//为什么不使用
solve\u ivp
界面?现在一切正常。看来我把事情搞砸了!我认为你必须直接导入Radau方法本身,因此存在资本化问题。你的短语肖像看起来比我的好,我只添加流动箭头。谢谢你的帮助。编辑:不过我有一些问题。1.根据定义,为什么可以使用Y作为输入,然后在返回行中使用x和z?2.NumSol是做什么的。行的意思是什么?为什么需要它们?Radau类本身包含一个初始化和一个步进器,与旧的scipy接口的ode类类似但不完全相同。您可以直接使用它,但有可能的是,带有事件机制的solve_ivp框架捕获了大多数用例。1.)第一行将数组Y解压缩到左侧的变量列表中。2.)solve_ivp返回一个“bunch object”,该结构包含内部步骤点及其值以及有关解决方案的附加信息。请注意,Matlab的ode45在每个内部步长内插3个额外的点,以获得更圆的曲线。现在一切正常。看来我把事情搞砸了!我认为你必须直接导入Radau方法本身,因此存在资本化问题。你的短语肖像看起来比我的好,我只添加流动箭头。谢谢你的帮助。编辑:不过我有一些问题。1.根据定义,为什么可以使用Y作为输入,然后在返回行中使用x和z?2.NumSol是做什么的。行的意思是什么?为什么需要它们?Radau类本身包含一个初始化和一个步进器,与旧的scipy接口的ode类类似但不完全相同。您可以直接使用它,但有可能的是,带有事件机制的solve_ivp框架捕获了大多数用例。1.)第一行将数组Y解压缩到左侧的变量列表中。2.)solve_ivp返回一个“bunch object”,该结构包含内部步骤点及其值以及有关解决方案的附加信息。请注意,Matlab的ode45在每个内部步长内插入3个额外的点,以获得更圆的曲线。