[英]How to solve a delay differential equation numerically
为了大致了解 DDE 集成的工作原理,我将提供一些基于低阶 Heun 方法的代码(以避免无趣的细节,同时仍然有点用处)。
在数值积分中,先前的值被视为 function 的时间,就像任何其他时间相关项一样。 由于没有真正的函数表达式,目前的解决方案将用作 function 表进行插值。 插值误差阶数应与 ODE 积分器的误差阶数一样高,这对于低阶方法很容易安排,但对于高阶方法则需要额外的努力。 solve_ivp
步进器类每步提供这样一个“密集输出”插值,可以针对当前存在的积分区间组装成 function。
所以在理论之后实践。 Select 步长h=0.05
,将给定的历史记录 function 转换为解决方案的开始 function 表
u=1
u_arr = []
w_arr = []
while u<2+0.5*h:
u_arr.append(u)
w_arr.append(1/u)
u += h
然后求解方程,对于延迟值使用 function 表中的插值,这里使用numpy.interp
。 `scipy.interpolate 中还有其他具有更多选项的函数。
请注意, h
需要小于最小延迟,以便延迟值来自上一步。 这里就是这种情况。
u = u_arr[-1]
w = w_arr[-1]
while u < 4:
k1 = (-w + np.interp(u-1,u_arr,w_arr))/u
us, ws = u+h, w+h*k1
k2 = (-ws + np.interp(us-1,u_arr,w_arr))/us
u,w = us, w+0.5*h*(k1+k2)
u_arr.append(us)
w_arr.append(ws)
现在可以进一步处理数值近似,例如绘制。
plt.plot(u_arr,w_arr); plt.grid(); plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.