You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JiTCDDE求解多维延迟微分方程?含具体系统实现疑问

使用JiTCDDE求解含双延迟项的微分方程并绘制分岔图

你选JiTCDDE完全没问题——它就是专门处理这类包含多个状态变量延迟的微分方程的工具,你的困惑主要是没掌握多变量延迟的调用方式。咱们一步步来解决这个问题:

第一步:明确方程结构

先把你的延迟微分方程整理清楚(修正了原方程里的笔误):
$$
\left{
\begin{array}{l}
\dot{v}(t) = y(t) \
\dot{y}(t) = \frac{a_1\alpha}{\omega_1} \cdot y(t-\tau) \cdot \left(1-\tanh^2[v(t-\tau)]\right) - v(t) - \frac{1}{Q_1} \cdot y(t)
\end{array}
\right.
$$
参数:$a_1=70,\ Q_1=50,\ \omega_1=2260,\ \alpha=10,\ \tau \in [0,8\times10^{-3}]$

在JiTCDDE中,我们可以把状态变量定义为一个向量:$x[0] = v(t)$,$x[1] = y(t)$,这样就能统一处理两个变量的当前值和延迟值。

第二步:用JiTCDDE定义方程组

核心是用.past(τ)方法调用对应状态变量的延迟值,不管是$y(t-\tau)$还是$v(t-\tau)$,都可以通过这个方法获取。下面是完整的代码框架:

from jitcdde import jitcdde, y
import numpy as np
from matplotlib import pyplot as plt

# 定义参数
a1 = 70
Q1 = 50
omega1 = 2260
alpha = 10

# 定义微分方程组
def system():
    # x[0] = v(t), x[1] = y(t)
    yield y(1)  # 对应v的导数:dv/dt = y(t)
    yield (a1*alpha/omega1) * y(1, tau) * (1 - np.tanh(y(0, tau))**2) - y(0) - y(1)/Q1  # 对应y的导数

# 准备绘制分岔图的数据
tau_values = np.linspace(0, 8e-3, 50)  # 取50个τ值,可根据精度调整
v_bifurcation = []

for tau in tau_values:
    # 初始化DDE求解器,传入方程组和延迟值τ
    DDE = jitcdde(system, delays=[tau])
    
    # 设置初始历史:假设初始时刻v和y都为0(可根据实际需求调整)
    DDE.constant_past([0.0, 0.0])
    
    # 先积分一段时间让系统达到稳态/周期态
    DDE.adjust_diff()
    DDE.integrate_blindly(0.1)  # 先积分0.1秒,足够系统稳定
    
    # 收集稳态下v的极值(或均值,根据需求)
    v_values = []
    t_start = DDE.t
    for _ in range(100):
        t = DDE.t + 0.001
        DDE.integrate(t)
        v_values.append(DDE.y[0])
    
    # 提取极值作为分岔点数据
    v_max = max(v_values)
    v_min = min(v_values)
    v_bifurcation.append( (v_min, v_max) )

# 绘制分岔图
plt.figure(figsize=(10,6))
for tau, (v_min, v_max) in zip(tau_values, v_bifurcation):
    plt.scatter(tau, v_min, color="blue", s=5)
    plt.scatter(tau, v_max, color="blue", s=5)

plt.xlabel(r"$\tau$ (s)")
plt.ylabel(r"$v(t)$")
plt.title("Bifurcation Diagram of the DDE System")
plt.grid(True)
plt.show()

关键细节解释

  • 多变量延迟的调用:y(0, tau)就是$v(t-\tau)$,y(1, tau)就是$y(t-\tau)$,JiTCDDE会自动处理不同状态变量的延迟历史。
  • 初始历史设置:constant_past是最简单的初始条件,如果你需要更复杂的初始历史,可以用past_from_function自定义。
  • 稳态判断:integrate_blindly先让系统运行一段时间,跳过暂态过程,之后收集的数据才是稳态/周期解的信息。
  • 分岔数据收集:对于每个τ,我们收集v的最大值和最小值,这样能展示分岔时的周期倍化或混沌行为。

常见问题排查

如果运行时出现错误,先检查:

  • 延迟值τ的单位是否和时间积分的单位一致(这里都是秒,没问题)
  • 初始历史是否合理,比如如果系统有固有稳态,初始值可以设为该稳态值
  • 积分时间是否足够长,确保系统已经脱离暂态

内容的提问来源于stack exchange,提问作者A.MdP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:57