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

解决Mathematica中登革热DDE模型的NDSolveValue::rdelay延迟错误

登革热DDE模型Mathematica求解延迟时间错误问题

我用Wolfram Mathematica构建了包含宿主-媒介交互、季节性效应和疫苗策略的登革热媒介动力学延迟微分方程(DDE)模型,但调用NDSolveValue求解时触发延迟时间相关错误:

NDSolveValue::rdelay: Delayed time {-1. τ} = -1. τ computed at t = 0 did not evaluate to a real number.

已为所有含延迟项的函数添加符合要求的初始历史条件,移除延迟项后系统可正常运行,说明问题仅出在延迟实现环节。现寻求具备Mathematica DDE处理经验的人士分析错误成因,提供延迟项改写或NDSolveValue参数调整的解决方案。


蚊子繁殖数与生命周期参数

Rm = 2.69  (*蚊子繁殖数*)
\[Omega] = 0.025 (*幼虫死亡率*)
\[CurlyEpsilon] = 0.1 (*成蚊死亡率*)
\[Alpha] = 1/19 (*幼虫平均发育时间*)
(* 通过设定Rm的值计算b *)
b = Rm / (\[Alpha]/(\[CurlyEpsilon] * (\[Alpha] + \[Omega])))
meq = 0.5 (*人均雌蚊数*)
K0 = meq / (\[Alpha]/\[CurlyEpsilon] (\[Alpha] (b - \
\[CurlyEpsilon])/(\[CurlyEpsilon] \[Omega]) - 
      1)) (*幼虫平均环境容纳量*)
\[CapitalDelta]K = 0.3 (*环境容纳量季节波动幅度,设为0.3以匹配登革热流行周期和振幅*)
POP = 1000000

K[t_] := K0*POP*(1 + \[CapitalDelta]K*Sin[2*Pi*t])

Plot[K[t], {t, 0, 10}]

疫苗参数与函数

\[Beta]mh = 1  (*蚊传人的单次叮咬传播概率,需匹配R0*)
\[Kappa]  = 0.6 (*单蚊日均叮咬率*)
TD = 8 (*疫苗诱导感染保护的平均持续时间*)
VEMinus = 0.87 (*血清阴性接种者的最大疫苗感染保护效力*)
VEPlus = 0.4 (*血清阳性接种者的最大疫苗感染保护效力*)
A = 2 (*接种年龄*)
P[0] = 0.45 (*原发感染症状比例*)
P[1] = 0.8 (*继发感染症状比例*)
P[2] = 0.12 (*三、四发感染症状比例*)
P[3] = 0.12 (*三、四发感染症状比例*)
P[4] = 0
P[5] = 0

S[v_, t_, a_, \[CapitalTheta]_] = 100000

(* 人群中血清型i的感染压力\[CapitalLambda]𝑖定义为: *)
\[CapitalLambda][i_, t_] := (\[Kappa] \[Beta]mh/M[t]) Y[t, i]

(* 保护衰减函数h(𝜏):疫苗接种后保护呈指数衰减,平均持续时间为T *)
h[\[Tau]_] := Piecewise[
  {{Exp[-\[Tau]/TD], \[Tau] < 0.5},
   {Exp[-([Tau] - 0.5)/TD], 0.5 <= \[Tau] < 1},
   {Exp[-([Tau] - 1)/TD], \[Tau] >= 1}}
  ]

Plot[h[\[Tau]], {\[Tau], 0, 10}, PlotLegends -> "Expressions"]

(* 异源疫苗诱导的感染保护随时间衰减,相对风险函数𝑓(𝜏)(𝜏为接种后时间)定义为: *)
f[\[Tau]_, v_] := Piecewise[
  {{1, v == 0},
   {1 - VEMinus*h[\[Tau]], v == 1},
   {1 - VEPlus*h[\[Tau]], v == 2}}
  ]

Plot[{f[\[Tau], 0], f[\[Tau], 1], f[\[Tau], 2]}, {\[Tau], 0, 10}, 
 PlotLegends -> "Expressions"]

(* t时刻,血清型暴露史为theta、年龄a、疫苗状态v的人群中,血清型i的感染发生率 *)
InfIncidence = 
 cI[v_, t_, a_, i_, \[CapitalTheta]_] := \[CapitalLambda][i, t]* 
   f[a - A, v]* S[v, t, a, \[CapitalTheta]]

(* t时刻,血清型暴露史为theta、年龄a、疫苗状态v的人群中,血清型i感染导致的症状性疾病发生率 *)
SympIncidence = 
 cD[v_, t_, a_, i_, \[CapitalTheta]_] := 
  P[Length[\[CapitalTheta]] + (1 - 
       KroneckerDelta[0, v])]*\[CapitalLambda][i, t]*f[a - A, v]* 
   S[v, t, a, \[CapitalTheta]]

蚊子传染性参数与函数

\[Theta] = 2 (* 症状性感染的传染性较无症状感染的倍数 *)
\[Beta]hm = 1 (* 人传蚊的单次叮咬传播概率,暂设为1 *)
seroCombs = 
 Subsets[{1, 2, 3, 
   4}] (*生成所有血清型组合*) 
vacStats = {0, 1, 2} (*所有疫苗状态*)
TIP = 6 (* 内在潜伏期 *)
TInf = 4 (* 人群感染期 *)
maxAge = 120 (* 人群最大年龄 *)

innerFunction[i_, t_, \[Tau]_, a_, \[CapitalTheta]_, v_] := 
 If[Not[MemberQ[\[CapitalTheta], i]], 
  cI[v, t - \[Tau], a, i, \[CapitalTheta]] + (\[Theta] - 1)*
    cD[v, t - \[Tau], a, i, \[CapitalTheta]], 0]

(* 蚊子中血清型i的感染压力\[CapitalPsi]𝑖定义为:*)
\[CapitalPsi][i_, t_] := \[Kappa]*\[Beta]hm/POP*
  Integrate[
   Sum[
    innerFunction[i, t, \[Tau], a, \[CapitalTheta], v],
    {\[CapitalTheta], seroCombs},
    {v, vacStats}
    ],
   {a, 0, maxAge},
   {\[Tau], TIP, TIP + TInf}
   ]

微分方程系统

\[Omega] = 0.025 (*幼虫死亡率*)
\[Eta] = 1/10 (*外在潜伏期均值*)

eqLarvae = 
 D[L[t], t] == 
  b*M[t] - \[Alpha]*L[t] - \[Omega]*L[t] (1 + L[t]/K[t]) (*幼虫方程*)
eqAdults = 
 D[Am[t], t] == \[Alpha]*L[t] - 
   Sum[\[CapitalPsi][i, t]*Am[t], {i, 4}] - \[CurlyEpsilon]*
    Am[t] (*易感成蚊方程*)
eqInfected = 
 Flatten[Table[
   D[H[t, i, j], 
     t] == (KroneckerDelta[1, j]* \[CapitalPsi][i, t]*
       Am[t]) + (4 \[Eta]*(1 - KroneckerDelta[1, j])*
       H[t, i, j - 1]) - (4 \[Eta] + \[CurlyEpsilon])*H[t, i, j], {i, 
    4}, {j, 4}]] (* 感染但未具有传染性的蚊子方程 *)
eqInfectious = 
 Flatten[Table[
   D[Y[t, i], t] == 4 \[Eta]*H[t, i, 4] - \[CurlyEpsilon]*Y[t, i], {i,
     4}]] (* 传染性蚊子方程 *)

M[t_] := 
 Am[t] + Sum[H[t, i, j], {i, 4}, {j, 4}] + 
  Sum[Y[t, i], {i, 4}] (*成蚊总数,不含幼虫*)

histories = {
  L[t /; t <= 0] == 0,
  Am[t /; t <= 0] == 100000,
  H[t /; t <= 0, i, j] == 0 /. {i -> #, j -> #2} & @@@ 
   Tuples[Range[4], 2],
  Y[t /; t <= 0, i] == 1000 /. i -> # & /@ Range[4]
  }

求解代码

solution = NDSolveValue[
  Flatten[{eqLarvae, eqAdults, eqInfected, eqInfectious, histories}],
  Flatten[{L[t], Am[t], H[t, 1, 1], Y[t, 1]}],
  {t, 0, 200},
  Method -> {"EquationSimplification" -> "Residual"}
  ]

内容的提问来源于stack exchange,提问作者Lennert Saerens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:23:09