在这一章中,我们介绍非线性方程组的数值解法。
非线性方程组的数值求解方法一方面可以从函数零点求解方法出发进行推广得到(不动点法,Newton方法)。另一方面,也有一些广泛而又有启发性的新方法的引入。
我们加下来讨论的问题限定于
即具有形式
1、不动点法
我们在求解线性方程的方法一章中将不动点迭代进行了推广得到了Jacobi方法。
其实,不动点迭代方法也能够很容易推广至非线性方程的求解。
为了能够清晰地看出不动点函数,我们先对于方程组进行形式改写。
假设向量函数
并且假设
则非线性方程组可以统一地表示成
我们成功地将非线性方程组写成了函数零点求解的形式。
接下来,很自然地,我们可以进行类似于一元情形的不动点迭代重构非线性方程不动点迭代的求解理论。
类似地,我们将一元的压缩映照定理进行推广。
定理(压缩映照定理的向量函数形式)
进一步地,如果
值得注意的是:压缩映照条件中偏导数的上界不是
那么,自然地,我们对于向量函数的不动点迭代有如下形式。
取定初值
一元情况下对于不动点迭代收敛情况的讨论也可以为我们所用。
定理(不动点迭代收敛性)
只需要满足压缩映照条件,则对于任意初值,不动点迭代必定收敛到不动点。
我们直接在例子中体会即可。
例:
在区域
解:
先构造向量函数(显式地将
容易发现
容易验证其满足自身映射性质。即
接着再考虑其各个分量函数关于
容易验证:
说明
若我们取
到此为止,一些敏锐的读者可能已经发现了:我们可以略施技巧加速不动点迭代的收敛。
回忆Gauss-Seidel方法对于Jacobi方法进行的改进:当最新的估计已经可用时,我们使用最新的估计值,而非上一次的估计值。
这里其实是一样的。注意到在估计
故在进行这个小小的优化后,估计式为:
额外需要注意的一些地方是:
2、Newton方法
在我们推广了不动点迭代后,读者自然地能想到对于Newton法的推广形式。
我们下面将再一次说明:二阶收敛选择了Newton方法。
我们的目标是:找到一个函数具有形式
回忆一元情况,二阶收敛的条件是不动点迭代函数在不动点
不妨假设矩阵
则
则当
当
由二阶收敛的条件,当
当
写成矩阵乘法形式,得到
其中
故得到:
这说明了一个简单的事实:在向量函数情况下,Jacobi矩阵代替了导数在Newton方法中的作用。
我们得到了Newton方法的估计式:
在具体实现中,求逆通常用解线性方程组来代替。
牛顿法的优点是非常快的收敛速度,但是其收敛性是初值依赖的,需要初值足够靠近真实解的前提下才能保证收敛。此外,计算Jacobi矩阵中各个元素的值需要利用数值微分,计算代价十分巨大。
为此,一些近似Newton方法被引入。如Broyden方法,可以看作是割线法在向量函数情况下的推广。类似地,其不再需要每次迭代都计算Jacobi矩阵的值,大大减少了计算代价。但是其不再是二阶收敛,而仅仅是超线性收敛,且其失去了对于舍入误差的自修正性。Broyden的具体实现就不在此赘述了。
3、最速下降法
牛顿方法与Broyden方法收敛的前提条件都是:迭代的初值足够靠近方程零点。
那么是否有一种方法能保证在一般情况下的收敛性呢?
最速下降法便具有这样的优良性质,其在一般情况下对于任意迭代初值均能保证收敛。
我们在共轭梯度法处已经提及:梯度方向是函数的值增加得最快的方向。很自然地,我们联想到当在估计一个函数的最小值时,在每一点处均沿着负梯度方向前进一定使得函数值下降得最快。
而对于一个非线性方程组,我们不难将零点求解问题转化为一个辅助函数
考虑
显然,
现在,我们清晰地知道了最速下降法的原理;我们也知道了在每一步迭代中我们应该向哪个方向前进。剩下的唯一问题便是:在具体实现中,每一步前进的距离长度为多少?
我们总是希望每一步的函数值能够尽可能多得下降。即对于给定的
具体做法是:
对于给定的
接下来,取
我们的目的是:求出
由于
利用
最速下降法的完整步骤到此为止就介绍完了。
值得注意的是:最速下降法一般而言收敛,但是却未必收敛到理想结果。由于辅助函数
另外,最速下降法仅仅是线性收敛的。故其在实际中常常作为为牛顿方法或Broyden方法寻找良好迭代初值的方法。
四、同伦延展法
在第一次学习到同伦延展法时,我一直很疑惑:同伦作为拓扑中的概念,要如何与方程组的求解问题联系起来呢?
我们先进行一些简单的定义:
假定
即对于任意一个固定的
这意味着随着
假定
我们的意图是将非线性方程组的求解问题转化为
则我们不妨假设
基于上述意图,我们可以如下地简单地构造出
我们接下来的工作是:寻找到
要得到规律,直接的想法就是对于
得到:
化简得到矩阵形式:
我们惊奇地发现:这是
这表示:我们成功地利用同伦的性质将一个方程组求解问题转化为了一个ODE的初值问题。
接下来的步骤中,我们只需要数值地估计常微分方程组即可,Runge-Kutta的推广方法可以被使用来产生出
同伦延展方法将函数抽象为函数族,以使得曲线能够随参数的连续变化而连续变化,从而将方程组求解问题转化为了连续变化的ODE初值问题。如此一来,各种先前提及的ODE数值方法就可以被应用来产生估计。
值得一提的是:同伦延展法本身可以作为一个完整方法来使用,且对于初值的选取无要求,但是计算代价往往很大。
关于非线性方程组求解方法的叙述,到此为止就告一段落了。
事实上,原本我还想阐述一些数值求解特征值的方法,但是后来发现诸如幂法及其推广、Householder变换、Q-R方法、SVD等等均在高代课程中有了比较完备的概述,读者若有兴趣可以自行查找资料学习。
那么,数值分析这个系列的学习笔记就到此为止了。个人感觉,数值分析是一门很应用也很有趣的数学课。学习数值分析,最应该把握的是某种特定方法为何会出现、具有什么优缺点、能够进行哪些改进等等问题,而非一味地追求实践。只有对于各种方法有了宏观层面的把握,才能够对每一个方法的适用场合与实现细节了如指掌。
最后,谢谢各位对于数值分析系列学习笔记的阅读!
另外:
谢谢 @一条大BASS 为我指出了文章的错误!