我目前有一个具有时间依赖常数的颂歌系统 . 例如 .
def fun(u, t, a, b, c):
x = u[0]
y = u[1]
z = u[2]
dx_dt = a * x + y * z
dy_dt = b * (y-z)
dz_dt = -x*y+c*y-z
return [dx_dt, dy_dt, dz_dt]
常数是“a”,“b”和“c” . 我目前有一个每个时间步的“a”列表,我想在每个时间步骤插入,当使用scipy ode求解器时...这可能吗?
谢谢!
2 回答
是的,这是可能的 . 在
a
是常量的情况下,我猜你调用了scipy.integrate.odeint(fun, u0, t, args)
,其中fun
被定义为你的问题,u0 = [x0, y0, z0]
是初始条件,t
是要求ODE求解的时间点序列,args = (a, b, c)
是要传递的额外参数到fun
.在
a
取决于时间的情况下,您只需重新考虑a
作为函数,例如(给定常量a0
):然后你必须修改
fun
,它计算每个时间步的衍生物,以考虑先前的变化:最后,请注意
u0
,t
和args
保持不变,您可以再次调用scipy.integrate.odeint(fun, u0, t, args)
.关于这种方法的正确性的一句话 . 数值积分近似的性能受到影响,我不知道究竟是如何(没有理论上的保证),但这里有一个简单的例子:
我希望这能帮到您 .
不,这是不可能的,因为求解器将使用您无法控制的内部时间步,并且每个时间步使用该函数的多个评估 .
如果参数是分段常数,那么您可以从跳转点到跳转点进行积分 .
如果是分段线性,则可以使用插值函数 .
对于其他任何事情,您必须实现自己的逻辑,从时间
t
到这些参数的正确值 .注意,数值积分的近似顺序不仅受RK方法的阶数限制,而且受微分方程(部分)的微分阶数的限制 .