在odeint Python中使用Dfun(Jacobian)

问题描述 投票:0回答:1

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

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

[第二,更具体地讲,与我的特定问题有关,如果雅可比函数稍微不正确,odeint会产生不正确的解决方案还是会减慢速度?用肉眼(模拟结果的动画)我无法检测到差异。我希望这是因为Jacobian是正确的,但我不能完全确定。

python scipy numerical-methods ode odeint
1个回答
0
投票

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.