当初始条件是平衡点时试图扰乱 ODE 不起作用

计算科学 Python
2021-12-19 02:48:06

我有以下微分方程组:

x=axcy+e1

y=bydx+e2

对于变量 和参数x,ya,b,c,d,e1,e2

我想在 python 中解决这个问题,这很容易使用odeint.

def f(y, t, params):
    weaponsC1, weaponsC2 = y
    a, b, c, d, e1, e2 = params  
    t_0 = 10
    t_1 = 11
    derivs = [a*x- c*y + e1,       
              b*y - d*x + e2]
    return derivs


#solve
psoln = odeint(f, y0, t, args=(params,), rtol=1e-10)

这将返回您所期望的:

为了

a=1b=1c=2d=2e1=5e2=5

和初始条件:,上面的代码返回:(2,2)

结果 1

现在我想添加一个强制函数以便我可以在某个时间以某个恒定量扰动 ODE。在与更简洁的方法进行了一番斗争之后,我决定这样做:g

def f(y, t, params):
    weaponsC1, weaponsC2 = y
    a, b, c, d, e1, e2 = params  
    t_0 = 10
    t_1 = 11
    derivs = [a*weaponsC1- c*weaponsC2 + e1, + (2*(t > t_0)*(t < t_0+0.5)) + (5*(t > t_1)*(t < t_1+0.5)),       
              b*weaponsC2 - d*weaponsC1 + e2 + (2*(t > t_0)*(t < t_0+0.5))+ (5*(t > t_1)*(t < t_1+0.5))]
    return derivs

仅显示了强制函数的图表,考虑了不同的时间值:

def g(t_0):
    return((2*(t > t_0)*(t < t_0+0.5)))

plt.plot(t,(g(3) + g(4)))

强制函数

当我用这个强制函数绘制 ODE 时,它适用于任何非平衡的初始条件:

在此处输入图像描述

但是,当我将平衡设置为起始条件时,尽我所能,我永远无法影响 ODE:

在此处输入图像描述

这是与上述工作解决方案相同的代码;唯一的变化是起始条件。

我知道 ODEint 假设 diffeq 是可微的,而我的不是——这可能是问题的原因吗?或者这是 ODE 某些属性的结果?

1个回答

由于您完全处于平衡状态,因此您的积分器可能会采用太大的步长来解决您的强制函数。这对您的问题尤其不利,因为强制函数在几乎没有支持的情况下是不连续的,因此积分器时间步长与不连续性对齐的可能性非常低。

这通常在积分器中通过事件或指定时间点来处理,在该时间点强制求解器以小步长将解求解到所需的容差。odeint 不处理事件,但可能您可以将“tcrit”参数设置为强制函数的不连续点,这将迫使求解器在这些点周围格外小心