牛顿方法在小错误处停滞不前

计算科学 有限元 非线性方程 牛顿法
2021-12-11 07:10:06

我有一个表格系统

A(u)f(u)=b

在哪里A基本上是源自有限元方法的矩阵。

我尝试使用牛顿法解决它:

R=A(ui)f(ui)b
ui+1=uiJ1R

在哪里J是残差的雅可比行列式R关于u.

乍一看,它工作正常。残留物在几次迭代中下降了几个数量级。它似乎收敛到一个对我的应用程序来说足够小的错误。

但是仍然 - 经过几次迭代后,它会以一个小错误停滞/振荡。我想知道这是否正常,或者我是否应该怀疑我的代码中存在错误。

到目前为止我发现了什么:

  • 剩下的错误是107与条目J大约108并且在u大约103. 我怀疑这还不足以导致浮点精度有限的问题。
  • 当导数时剩余误差变小dA/dudf/du变大。

我当然很高兴能回答我的问题,但我也很高兴能进一步阅读有关该主题的内容。

1个回答

我怀疑代码中存在错误,除非您确切了解为什么预期看到的行为。

至于如何编写非线性求解器(全局收敛牛顿求解器)的特定参考资料,我很高兴使用:

  1. 非线性问题的牛顿方法、
    仿射不变性和自适应算法;
    杜费尔哈德,彼得;Springer, 2006 (第二次印刷)
    ISBN 978-3-642-23898-7 (平装)

  2. (1) 的参考实现,
    http ://elib.zib.de/pub/elib/codelib/NewtonLib/index.html

  3. 用于高度非线性方程组的一系列牛顿代码(1991 年);诺瓦克,U.,魏曼,L.;?,
    http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.3751

(1),(2) 中概述的 NLEQ_ERR 求解器非常适合我的应用程序。

另一本带有简单非线性示例的好书(包括每个牛顿步的(正切)刚度矩阵):

  • 结构有限元分析高级主题:使用 Mathematica 和 MATLAB 计算;巴蒂·M·阿斯加尔;威利;国际标准书号:978-0-471-64807-9