流行病学中非线性 ODE 的求解系统

计算科学 非线性方程 符号计算
2021-12-07 23:38:15

我有 9 个非线性 ODE 系统要解决。我想确定地方性平衡点。

我该怎么做?

我尝试了手动计算,但它变得很麻烦。软件可以用于此目的吗?

1个回答

如果您想找到平衡点,您需要将系统编写为一阶系统

dxdt=F(x)

并求解非线性方程组

F(x)=0 ,

这可能无法通过分析解决。之后,您需要在每个平衡点周围找到雅可比矩阵的特征值x,J(x). 您可以使用计算机代数系统 (CAS)来完成这项工作。SymPy、Maxima、Mathematica 和 Maple 就是一些例子。

下面是使用 SymPy 的 Lotka-Volterra 模型的一个示例

from sympy import symbols, Matrix, solve, diff
x, y = symbols("x y")
alpha, beta, gamma, delta = symbols("alpha beta gamma delta")
dXdt = Matrix([alpha*x - beta*x*y, delta*x*y -gamma*y])
eqpts = solve(dXdt, [x, y])
J = Matrix(2, 2, lambda i, j: diff(dXdt[i], [x, y][j]))
vals1 = J.subs({x: eqpts[0][0], y: eqpts[0][1]}).eigenvals()
vals2 = J.subs({x: eqpts[1][0], y: eqpts[1][1]}).eigenvals()
print(vals1)
print(vals2)

带输出

{-gamma: 1, alpha: 1}
{sqrt(-alpha*gamma): 1, -sqrt(-alpha*gamma): 1}

在这里你应该考虑两件事:

  1. 非线性方程组可能没有解析解,您可能需要对其进行数值求解(例如,使用牛顿法)。
  2. 即使您有系统的解析解,特征系统也可能无法解析解。