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

如何获取SIR模型ODE系统的所有稳态解?SymPy求解疑问

解决SIR模型稳态点求解问题

首先明确:SIR模型的稳态要求所有导数均为0,即dSdt=0、dIdt=0、dRdt=0。从dRdt=g*I=0推导,由于恢复率g通常为正数,必然得出I=0。将I=0代入另外两个方程,dSdt=-b*S*0=0、dIdt=b*S*0 -g*0=0均自动成立,因此所有满足I=0的(S, I, R)都是稳态。

SymPy返回的[(S, 0, R)]是稳态的通解,表示S和R可取任意值(若模型隐含总人数守恒约束S+I+R=N,则R=N-S)。你提到的[(g/b, 0, R)]并非独立的第二个稳态解,只是通解中S=g/b的一个特例。

若需显式获取包含S=g/b的解

如果你想针对性得到S=g/b的情况(本质仍属于I=0的稳态),可以通过添加额外条件求解:

import sympy as sp
S, I, R, b, g = sp.symbols('S I R b g', positive=True)
dSdt = -b * S * I
dIdt = b * S * I - g * I
dRdt = g * I
# 加入条件b*S - g = 0,锁定S的取值
steady_states = sp.solve([dSdt, dIdt, dRdt, sp.Eq(b*S, g)], [S, I, R])
steady_states

运行结果为[(g/b, 0, R)],符合你的预期。

关于地方病平衡点的说明

如果你误将地方病平衡点(I≠0时dIdt=0的点)当作稳态,需要注意:此时dRdt=g*I≠0,不满足稳态的所有导数为0的要求。若仅需寻找dIdt=0的点,可忽略dRdt=0的约束求解:

import sympy as sp
S, I, R, b, g = sp.symbols('S I R b g', positive=True)
dSdt = -b * S * I
dIdt = b * S * I - g * I
equilibria = sp.solve([dSdt, dIdt], [S, I])
equilibria

结果会返回[(S, 0), (g/b, 0)],但需注意这两个点中只有I=0的情况是真正的稳态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:15:20