牛顿法
非线性方程的牛顿法基于如下线性近似
因此,通过简单地设置
,可以找到牛顿步,
在接近方程的根的位置,牛顿法具有
-二次收敛速度,这类似于用来极小化的牛顿 方法. 牛顿法被用作 FindRoot 的默认方法.
牛顿法可以通过 线搜索 或者 信赖域 这两种步控制方法来使用. 工作的时候,线搜索控制通常更快,但是信赖域法往往更强稳健.
| Out[2]= |  |
这里通过默认的线搜索方法寻找非线性系统的解.(牛顿法是
FindRoot 的默认方法.)
| Out[3]= |  |
请注意,每个线搜索都沿着
的线开始. 这是对于此特定问题,牛顿步的特殊性质.
这里使用符号化方法计算Rosenbrock问题的雅克比和牛顿步.
| Out[4]= |  |
当对点
施加这个步骤时,就很容易看出为什么步骤跑到线
上. 这只是这一问题的一个特点,对大部分函数来说并不典型. 因为信赖域方法不会尝试牛顿步,除非它位于该域的边界以内,所以当我们使用信赖域步控制时,这个特点不会如此强烈地显示出来.
| Out[5]= |  |
当雅可比矩阵的结构是稀疏的, Mathematica 将使用 SparseArray 对象来计算雅可比和处理必要的数值线性代数.
当把求解非线性方程组作为一个更一般的数值程序的一部分,比如使用隐式方法求解微分方程,初始值往往是相当不错的,而完全收敛不是绝对有必要的. 往往计算牛顿步代价最高的部分是求雅可比和计算矩阵分解. 然而,当足够接近根时,有可能让雅可比在几个步骤内不进行更新(尽管这样肯定会影响收敛速度). 您可以在Mathematica 中使用方法选项
来这样做,这给出在更新雅可比之前所需的步骤数目. 默认值为
,因此雅可比在每一步都进行更新.
这里显示了当每隔三步更新一次雅可比时,用来寻找一个简单的平方根所需的步数目,函数计算次数,和雅可比计算次数.
| Out[6]= |  |
这里显示了当在每一步更新一次雅可比时用来寻找一个简单的平方根所需的步数目,函数计算次数,和雅可比计算次数.
| Out[7]= |  |
当然对于一个简单的一维根,更新雅可比在成本上是微不足道的,因此,这里使用更新仅在于演示这一理念.
| | |
| "UpdateJacobian" | 1 | 在更新雅可比之前,我们所采取的步数目 |
| "StepControl" | "LineSearch" | 步控制方法,可以是 、 或者 None(这个是不被推荐的) |
在 FindRoot 中 Method->"Newton" 的方法选项.