使用JiTCDDE模拟时滞Kuramoto模型:get_state()提取导数维度异常问题
时滞Kuramoto模型JiTCDDE模拟中导数提取异常的原因与解决方法
问题原因
你误解了get_state()的作用:这个方法返回的是JiTCDDE积分器内部维护的历史状态节点集合,而非当前时刻的单一状态。这些节点是积分器为了计算时滞项(t-τ时刻的相位)而保留的不同过去时刻的状态数据,每个节点包含对应时刻的时间、相位向量、导数向量。
初始阶段积分器需要逐步积累覆盖最大时滞τ的历史数据,所以节点数量会不断减少并最终稳定——当历史数据足够覆盖所有时滞需求后,积分器只会保留插值所需的最少节点,因此你看到输出形状从(21,50)逐步收敛到(3,50)。
解决方法
要获取当前时刻的n个相速度(导数),不需要使用get_state(),直接调用积分器的compute_derivatives()方法即可。修改你的循环代码如下:
p = [] # 相位 dp = [] # 相速度 for time in I.t + np.arange(0, 100.1, 0.1): current_phase = I.integrate(time) % (2 * np.pi) p.append(list(current_phase)) # 获取当前时刻的导数向量 current_derivs = I.compute_derivatives(I.t, I.y) dp.append(list(current_derivs))
这样每个时间步都会得到一个长度为n的导数列表,完全符合你的预期。
补充说明
I.integrate(time)会将积分器推进到目标时刻,此时I.t对应当前时间,I.y对应当前的相位向量。compute_derivatives(t, y)会根据你定义的模型,计算在时间t、状态y下的导数向量,结果维度与状态向量一致(即n个元素)。
内容的提问来源于stack exchange,提问作者Snoobooks
相关产品推荐
相关产品推荐

