在问题的早期版本中,问题仅说明了一个简单的 ODE 系统。然后改为延迟微分方程,下面的答案不再有效。我把它留作将来参考。
要解决系统延迟问题,必须使用额外的 python 包。例如包JiTCDDE 允许求解这种方程。
这里提出了一个相关问题:Solve ODE in Python with a time-delay
旧答案
scipy 函数 ode 可能就是你要找的东西:
让我们首先定义两个方程组。一种用于t<t0,另一种用于t>t0。我们称这些函数为f 和f2。此外,我们还计算雅可比矩阵,供积分器使用。
def f(t,y,a,b,c,t_0):
return [b*y[0]*y[1]-c*(t-t_0), a*y[1]-b*y[0]*y[1]]
def f2(t,y,a,b,c):
return [b*y[0]*y[1], a*y[1]-b*y[0]*y[1]]
def jac_f(t,y,a,b):
return [[b*y[1],b*y[0]],[-b*y[1],a-b*y[1]]]
然后我们导入ode,调用积分器两次。第一次,我们从起始值(我将其设置为 t=0)积分直到达到t0,然后使用对t>t0 有效的方程系统开始第二次积分。我们将最后计算的值作为初始条件传递给积分器并继续积分,直到达到t=4(任意选择)。
from scipy.integrate import ode
y_res = []
t_list = []
a,b,c,t0=1,1,1,1
y0=[1,2]
t_start=0
t_fin=t0
dt=0.01
r=ode(f2,jac_f).set_integrator("vode", method="adams", with_jacobian=True)
r.set_initial_value(y0, t_start).set_f_params(a,b).set_jac_params(a,b)
while r.successful() and r.t < t_fin:
r.integrate(r.t+dt)
y_res.append(r.y)
t_list.append(r.t)
y0=y_res[-1]
t_start=t0
t_fin=4
dt=0.01
r=ode(f,jac_f).set_integrator("vode", method="adams", with_jacobian=True)
r.set_initial_value(y0, t_start).set_f_params(a,b,c,t0).set_jac_params(a,b)
while r.successful() and r.t < t_fin:
r.integrate(r.t+dt)
y_res.append(r.y)
t_list.append(r.t)
我们现在可以绘制结果曲线:
import matplotlib.pyplot as plt
yy=np.stack(y_res)
plt.plot(t_list, yy[:,0], label="x(t)")
plt.plot(t_list, yy[:,1], label="y(t)")
plt.legend()
plt.show()
我们得到了这个漂亮的图表: