Используйте solve_ivp
в качестве однострочного интерфейса для классов решателей, таких как RK45
или Radau
. Используйте правильную заглавную букву класса. Используйте правильный порядок аргументов в функции 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()
Затем получается график
с периодическими колебаниями.
Дальнейшие действия могут заключаться в использовании опции tspan
или «плотного вывода» для получения выборок решения в определенных пользователем точках выборки. Для получения достоверных результатов установите допуски ошибок вручную.
f=0.51262
находится близко к точке перехода от сходящегося к колебательному поведению.