首页 > 解决方案 > JiTCDDE 集成问题

问题描述

我正在尝试用一些参数求解一个二维延迟微分方程。问题是我无法获得正确的解决方案(我知道)并且我怀疑它来自集成步骤,但我不确定并且我不太了解 JiTCDDE 的工作原理。

这是 DDE:

在此处输入图像描述

这是我的模型:

def model(p, q, r, alpha, T, tau, tmax, ci):
    f = [1/T * (p*y(0)+alpha*y(1, t-tau)), 1/T * (r*y(0)+q*y(1))]
            
    DDE = jitcdde(f)
    
    
    DDE.constant_past(ci)
    
    DDE.step_on_discontinuities()
    
         
    data = []
    for time in np.arange(DDE.t, DDE.t+tmax, 0.09):
        data.append( DDE.integrate(time)[1])
    return data

我只对 y(1) 解决方案感兴趣

和参数:

T=32        #escala temporal
p=-2.4/T
q=-1.12/T
r=1.5/T
alpha=.6/T
tau=T*2.4     #delay
tmax=400
ci = np.array([4080, 0])

这是我对该模型和参数的绘图:

在此处输入图像描述

这是(蓝线)正确的解决方案(有人给我情节而不是数据)

在此处输入图像描述

标签: pythondifferential-equationsjitcode-jitcdde-jitcsde

解决方案


以下代码适用于我并产生类似于您的控件的结果:

import numpy as np
from jitcdde import y,t,jitcdde

T = 1
p = -2.4/T
q = -1.12/T
r = 1.5/T
alpha = .6/T
tau = T*2.4
tmax = 10
ci = np.array([4080, 0])

f = [
        1/T * (p*y(0)+alpha*y(1, t-tau)),
        1/T * (r*y(0)+q*y(1))
    ]

DDE = jitcdde(f)
DDE.constant_past(ci)
DDE.adjust_diff()

times = np.linspace( DDE.t, DDE.t+tmax, 1000 )
values = [DDE.integrate(time)[1] for time in times]

from matplotlib.pyplot import subplots
fig,axes = subplots()
axes.plot(times,values)
fig.show()

请注意以下事项:

  • 我设置T=1(并tmax相应调整)。我认为这里仍然存在错误。

  • 我用adjust_diff而不是step_on_discontinuities. 您的模型的问题在于它在t = 0 处的导数存在严重的不连续性。(不连续是正常的,但不是这种情况)。这会在积分一开始就导致自适应步长控制出现问题。这种不连续性表明您的模型或您最初的过去有问题。如果您只关心长期行为,后者并不重要,但这里似乎并非如此。我在文档中添加了有关此类问题的段落。


推荐阅读