python - 在 odeint Python 中使用 Dfun (Jacobian)
问题描述
这是一个相当普遍的问题,其中一部分可能适用于耦合 ODE 的任何数值模拟,部分可能仅适用于Python 库中的odeint
方法。scipy.integrate
首先,如何odeint
使用手动输入的雅可比行列式(Dfunc
参数),为什么它会如此加速大型 ODE 系统?
其次,与我的具体问题更相关的是,如果雅可比函数稍微不正确,会odeint
产生不正确的解决方案还是会减慢速度?通过眼睛(模拟结果的动画)我无法检测到差异;我希望这是因为雅可比是正确的,但我不能完全确定。
解决方案
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)
获得。它的收敛因子现在取决于到固定点的距离,距离越近,收敛越快。这可能具有非零下限,并且不是二次的,但它会比原始迭代更快。
推荐阅读
- ios - 以编程方式设置文本时,UITextField 占位符在 UITextField.text 后面显示阴影。为什么?
- excel - 将具有多行数据的列转换为具有多列的行,删除重复的参考编号
- django - Django 管理模型关系
- python - 如何以内存有效的方式将图像数据集作为 numpy 数组读取?
- c++ - sscanf 无法读取双十六进制
- bootstrap-4 - Bootstrap 4.3 - 使用卡片图像覆盖创建销售标签
- c# - 在 c# 和 xamarin 中解析 JSON
- android - GoogleMap onMapReady 触发良好,但未在应用程序上显示
- reactjs - 在 reactjs 功能组件中实现 contextType 的正确方法是什么?
- javascript - 在原型中创建一个方法并在 Init 中调用它