首页 > 解决方案 > 在 odeint Python 中使用 Dfun (Jacobian)

问题描述

这是一个相当普遍的问题,其中一部分可能适用于耦合 ODE 的任何数值模拟,部分可能仅适用于Python 库中的odeint方法。scipy.integrate

首先,如何odeint使用手动输入的雅可比行列式(Dfunc参数),为什么它会如此加速大型 ODE 系统?

其次,与我的具体问题更相关的是,如果雅可比函数稍微不正确,会odeint产生不正确的解决方案还是会减慢速度?通过眼睛(模拟结果的动画)我无法检测到差异;我希望这是因为雅可比是正确的,但我不能完全确定。

标签: pythonscipynumerical-methodsodeodeint

解决方案


LSODA,即由 调用的ODEPACK 方法odeint,使用隐式多步法求解y'=f(t,y)。这意味着它必须在每一步中求解非线性方程组,本质上是定点方程

y[i+1] = h*b[0]*f(t[i+1],y[i+1]) + C

其中C是先前点y[i-k]和 的值的线性组合f(t[i-k],y[i-k])k=0,..,q它是当前要计算的步骤中的常数y[i+1]

现在在任何不动点方程y=g(y)中,如果它在感兴趣的区域收缩,您可以对其进行迭代并找到一个不动点yfix作为极限。收敛将是线性的,其中收缩因子主要由雅可比的范数/光谱半径决定g'(yfix)。现在想象一个g已知的分裂为线性部分和非线性剩余部分(可能有一个小的线性部分),

g(y) = A*y + r(y) = yfix + A*(y-yfix) + [r(y)-r(yfix)]

其中“小”与最后分解中的最后一项有关。定点方程中的线性部分可以转移到另一边,从而得到一个新的定点方程

y = (I-A)^(-1) * r(y)

获得。它的收敛因子现在取决于到固定点的距离,距离越近,收敛越快。这可能具有非零下限,并且不是二次的,但它会比原始迭代更快。


推荐阅读