无雅可比牛顿法的实现

计算科学 牛顿法 雅可比 无基质
2021-12-06 17:55:56

在我使用牛顿法计算(一个简单的热方程,用于测试)时,我尝试用一​​个近似向量替换完整的雅可比矩阵,即替换J

J(u)δu=F(u)
JvF(u+εv)F(u)ε
在我使用 GMRES 求解器求解系统之后,这应该是可能的。这里ε计算使用
ε=1n||v||2i=1n(b|ui|+b)b=106
F(u)是函数本身,即
F(u)=2u+f
现在我遇到了两个问题:

  • 通常在第一次迭代中||v||2=0,导致无穷大ε. 我目前的解决方案是设置ε=106在那种情况下,但这是正确的吗?我在文献中找不到任何解决方案
    • 在考虑价值时F(u)在每一步,当使用完整版本时,它会减少(应该如此)J, 但在使用近似值时会增加。有没有办法可以缩小这里可能出现的问题?

我怎样才能解决这些问题(或者是否有关于它们的文献我还找不到)?

2个回答

不知道你从哪里得到你的方程ϵ,但最终您对 Jacobian matvec 运算的近似是对的有向导数的有限差分近似F(). 这意味着您将希望尽可能准确地估计此有向导数,同时确保避免数值舍入问题。

对于这种情况,我个人使用了以下称为复步导数近似的方法:

F(x)v=Im(F(x+iϵv))ϵ+O(ϵ2)

其中中的复数向量映射,只需取每个分量的虚部即可。请注意,如果不是单位向量,则应以的方向计算上述量,然后将结果乘以这里要注意的明显一点是,上面假设您可以修改代码以允许将复数输入Im()CnRnvvvF(). 如果你能做到这一点,这个近似值具有很高的数值精度,因为它没有与减法相关的舍入问题,如典型的有限差分近似值。您可以轻松选择并接近机器精度。ϵ=108

我终于找到了解决这个问题的方法:为了能够尽可能多地重用代码,我只有一个函数来计算问题的右侧,即,并用于计算残值. 此函数在调用时返回,但我在使用相同函数进行近似时忘记删除减号,从而导致 相乘后,该方法按预期工作。F(u)F(u)

JvF(u+εv)+F(u)ε
1