这是一个相当笼统的问题,其中一部分可能适用于耦合ODE的任何数值模拟,其中一部分可能仅适用于odeint
Python库中的scipy.integrate
方法。
首先,odeint
如何使用手动输入的雅可比行列式(Dfunc
参数,为什么它如此大地加速大型ODE系统的速度?
[第二,更具体地讲,与我的特定问题有关,如果雅可比函数稍微不正确,odeint
会产生不正确的解决方案还是会减慢速度?用肉眼(模拟结果的动画)我无法检测到差异。我希望这是因为Jacobian是正确的,但我不能完全确定。
LSODA,由odeint
调用的ODEPACK方法,使用隐式多步方法来求解y'=f(t,y)
。这意味着它必须在每个步骤中求解非线性方程组,本质上是定点方程]
y[i+1] = b*h*f(t[i+1],y[i+1]) + C
其中C
是先前点和f
的值的线性组合,该值对于该步骤恒定。
现在在任何定点方程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)
获得。现在,其收敛因子取决于到固定点的距离,您越接近,收敛速度就越快。这可能具有一个非零的下限,并且不是二次的,但是它将比原始迭代更快。