我正在使用 JiTCDDE 模块来求解延迟微分方程。我的工作要求我让模型发展一段时间,然后对其进行扰动。为此,我尝试使用jitcdd.purge_past()
后跟jitcdde.add_past_points()
. 问题是,后者要求我不仅提供输入时的值,还需要提供导数的值。
有没有办法从jitcdde
实例本身获取这些,还是我需要手动笨拙地计算它们?
编辑:更多信息
我的系统由两个耦合在一起的非线性振荡器组成(它们不是相位振荡器)。我让系统发展一段时间,直到它达到稳定状态,然后通过稍微移动两个振荡器中的一个来扰乱它。I shift it 的量计算为振荡周期的百分比,即有效相移。
我的系统是 12 维的,我正在努力获得一个最小的工作示例,所以这是代码的非工作模型:
f = [...]
DDE = jitcdde(f)
DDE.constant_past([1]*len(f))
DDE.step_on_discontinuities()
initial_integration_time = 30
DDE.integrate(initial_integration_time)
这样做之后,我想执行应该是的扰动,比如说一个周期的 10%,假设我知道静止周期长度是T
。我要做的是用来get_state
获取系统和导数的当前状态,以及状态和导数perturbation
时间单位之前的状态。然后,我可以构造一组新的anchor
s,我可以将其传递给它DDE.add_past_points
以从那里开始集成。
T = ...
perturbation = 0.1*T #in units of time
state = DDE.get_state()
# get position and derivative of first oscilator
# since the system is 12-D, the first six correspond to osc1
osc1_x = [state[1][6:] for s in state]
osc1_dx = [state[2][6:] for s in state]
# here, do the same for osc2 at DDE.t - perturbation