B被称为质量矩阵。有很多方法可以直接用质量矩阵求解。主要是隐式方法:隐式 Runge-Kutta 方法和多步 BDF 方法。Rosenbrock 方法也可以直接处理质量矩阵,但不是隐式方法。
“为什么有效”的快速概述是因为在每一步这些方法都必须求解涉及 RHS 雅可比行列式的线性方程。线性问题通常具有以下形式(I−γJ)x=b在哪里J是系统雅可比行列式,γ和b是一些常数,并且x是必须解决的系统的演变。好吧,事实证明,如果你只使用质量矩阵B通过将系统更改为(B−γJ)x=b,这些直接解决了质量矩阵的线性问题,隐式反转B在它已经在做的计算中(这是因为I取雅可比行列式时来自 LHS,但使用质量矩阵而不是该值B!)。Shampine 的论文中概述了使用非自适应二阶版本的 Rosenbrock 方法执行此操作并不困难,尽管如果没有自适应时间步长,您会损失很多效率。
如果您使用 Julia,DifferentialEquations.jl 可以访问这些方法。只是改变类型mass_matrix的构造ODEProblem。该Rosenbrock23()方法将处理这样的质量矩阵。此外,质量矩阵可以传递给隐式 RK 方法radau(),radau5()如果您希望以高精度解决刚性问题,这些方法具有更高阶并且往往更快。从技术上讲,日晷CVODE_BDF()可以使用质量矩阵来解决,但是为此设置 C FFI 存在一个未解决的问题(它在我的优先级列表中很高。完全披露:我是微分方程的开发人员)。
如果您可以处理转而使用 MATLAB 的性能下降,您会发现该领域非常相似。ode23s是二阶 Rosenbrock 方法,与 非常相似Rosenbrock23(),并且可以使用恒定质量矩阵. ode15s非常类似于CVODE_BDF()并且可以采用质量矩阵。MATLAB 没有隐式 RK 方法,但它确实ode23t适用于需要辛积分器并且可以处理质量矩阵的问题。
我没有看到将质量矩阵传递给 SciPy 的 ODE 求解器的选项,也没有使用 SciPy 包装器。它们包含一些与DifferentialEquations.jl 相同的代码,所以我知道在某些情况下,质量矩阵可以通过他们使用的底层C/Fortran 代码来求解,但看起来API 的那部分没有公开。