当 Jacobian 分析已知且稀疏时,哪个 SciPy 非线性求解器?

计算科学 有限元 非线性方程 稀疏矩阵 scipy 牛顿法
2021-12-15 05:26:02

我有一个fun具有n 个输入和n 个输出的非线性函数。我还有一个jac计算雅可比行列式的函数,它是稀疏的。我可以使用哪种 SciPy 方法(如果有)来查找 的根fun


我很惊讶我找不到一种scipy.optimize采用稀疏矩阵格式的雅可比行列式的方法。但是我相信这可以通过牛顿方法简单地解决所以如果这种方法不存在我很困惑。这个包中有许多拟牛顿方法可以估计雅可比,但它们似乎不太正确。唯一看起来相似的是newton_krylov它记录了一些关于稀疏预处理器的东西。这是我应该看的吗?如果没有这样的方法,我应该做如下的事情吗?

while not some_stopping_condition(x):
    x -= scipy.sparse.spsolve(jac(x), fun(x))

我宁愿使用现有的 SciPy 函数,以防我做一些愚蠢的事情。值得注意的是,碰巧的是,我相信我的特定问题条件不佳,我认为我会受益于能够使用scipy.sparse.lsqrlsmr采用阻尼参数。

顺便说一句,问题是在 3D 空间中使用 FEM 求解 2D 膜上的大位移弹性方程。问题很稀疏,因为它是 FEM。由于大位移(以及相应的格林拉格朗日应变),该问题是非线性的。条件不佳的原因是,任何节点在垂直于表面的方向上的微小扰动都会对应变能产生很小的变化(表面越平坦,变化越小)。

2个回答

我相信newton_krylov可能是您正在寻找的。文档令人困惑,但我认为你可以做你想做的事。似乎没有任何方法可以在该软件的 Krylov 求解器中使用解析雅可比行列式,但是如果您给它一个函数,该函数接受并在参数中返回一个稀疏矩阵,那么它看起来应该可以工作. 但是,您可能会遇到线性求解的问题,因为如果给它一个稀疏矩阵,它看起来像是在使用直接求解,这可能比 Krylov 方法慢很多,具体取决于问题。xmethod

您可以通过尝试最小化函数的最小二乘来将求根问题视为最小化问题:

minxRnF(x)2.

然后用 SciPy 的 optimize.least_squares 求解器解决这个问题。使用此求解器,您可以通过“jac_sparsity”输入提供稀疏信息(如果这样做,它将自动使用 lsmr),甚至可以将分析 Jacobian 作为可调用的“jac”输入。