非线性方程(组):计算基本理论

1. 非线性方程(组)及其解

  对于非线性函数 $f(x)$ ,方程 $f(x)=0$ 为非线性方程( $f:mathbb{R} ightarrow mathbb{R}$ )。

  对于n维向量 $oldsymbol{x}$ 和在n维空间上的变换 $oldsymbol{f}:mathbb{R}^n ightarrow mathbb{R}^n$ ,方程 $oldsymbol{f}(oldsymbol{x})=oldsymbol{0}$ 即可看作是一个n元非线性方程组(共含n个标量方程,$oldsymbol{f}(oldsymbol{x})$ 可以看作是一个n维向量,每一个分量均为一个关于 $oldsymbol{x}$ 的n个分量的多元函数)。非线性方程(组)的求解问题也即相对应非线性函数的零点问题。

  对于线性方程组,一般的n维向量的n个耦合方程组的解的理论已经非常清楚完整:它要么有唯一的解,要么有以线性空间的形式出现的无穷多个解,要么没有解。但是对于非线性方程,即使是一维的情形,也没有一个直截了当的方法可以判断,遑论高维情形。对于连续的一元非线性函数,若其在两个点的取值异号则在两点间必定存在零点,但是这一判断并不能推广到更高的维度:比如在二维的情况下,函数值的两个分量可以轮流反号,但是在相空间的表现可以是绕着原点作圆周运动而从未经过原点。在更高维的空间类似的例子更容易列举。而解的数量更是任意,可以有唯一解,可以有无穷多解,可以有任意正整数个的解。

2. 问题条件的性质

  先来考虑一维求函数在x处取值的条件数。对于求函数的算法,输入为x,输出为y,根据定义:$$cond(f)=frac{|delta y|}{|delta x|}= limlimits_{delta x ightarrow 0}frac{|delta f(x)|}{|delta x|}=frac{|df(x)|}{|dx|}=|f'(x)|$$  再来考虑一维非线性方程求解的条件数。对于求解的算法,在计算表达式f(或者过程)已知的条件下,输入为右端项0(或者说,右端项也就是该方程的解的残差,当残差恰好为零时解恰好为精确解),输出为x,此时条件数表达当右端项离开0产生微小扰动时造成的解的差异,则有:$$cond(f)=frac{|delta x|}{|delta y|}=limlimits_{delta y ightarrow 0}frac{|delta x|}{|delta y|}=limlimits_{delta x ightarrow 0}frac{|delta x|}{|delta y|}=(frac{|dy|}{|dx|})^{-1}=frac{1}{|f'(x)|}|_{f(x)=0}$$  求解非线性方程的条件数和计算取值的条件数恰好互为倒数。函数在零点附近导数绝对值越小,求解方程的条件数也越大,问题越病态。求解方程即函数零点的几何表示为求解一条弧线与x轴(即y=0)的交点(如下图)。当弧线在该处导数绝对值很小时,弧线在零点附近切线和x轴夹角很小,这使得二者交点的不确定度很大(可参考线性方程组章节中,当直线夹角越小时交点不确定度越大,矩阵越接近奇异,问题越病态),问题显得十分病态。

  然后来考虑高维非线性方程的求解。首先引进一个矩阵,雅可比矩阵(Jacobian)。对于 $oldsymbol{f}:mathbb{R}^n ightarrow mathbb{R}^n$ :$$Jacobian:quad oldsymbol{J}_f(oldsymbol{x}), quad (oldsymbol{J}_f(oldsymbol{x}))_{ij}=frac{partial f_i(oldsymbol{x})}{partial x_j}$$  雅可比矩阵在微积分中已经有过许多接触。当将面积分的积分区域转化为极坐标表示时,$rsin heta$ 项即来自于雅可比行列式的贡献;在积分坐标变换的普遍方法中,从正交的A坐标系转化到正交的B坐标系需要乘以从B到A的映射f的雅可比行列式的绝对值。可以看出,雅可比行列式表达的是从一套坐标向另一套坐标转化的过程中,面积微元的伸缩率。把类似的概念转嫁到 $oldsymbol{f}:mathbb{R}^n ightarrow mathbb{R}$ 的变换上,那么雅可比矩阵应该表达的就是由一套坐标构成的向量 $oldsymbol{x}$ 向另一套坐标构成的向量 $oldsymbol{y}=oldsymbol{f}(oldsymbol{x})$ 转化的过程中,向量的伸缩比。讲到这里,雅可比矩阵的意义应该已经清楚了:它是一个类似于导数的概念,描述 $oldsymbol{x}$ 的微小变化造成的 $oldsymbol{y}$ 的改变。注意,这里粗体的 $oldsymbol{x}$ 和 $oldsymbol{y}$ 全部都是向量的概念。

  雅可比矩阵的意义也可以用另一个方法来得到。微积分的知识给出,多元函数 $y=f(oldsymbol{x})$ (注意这里y是一维的,x是n维的,即 $f:mathbb{R}^n ightarrow mathbb{R}$ )的全微分为:$$dy=sumlimits_{i=1}^nfrac{partial f(oldsymbol{x})}{partial x_i}dx_i$$  因而对于 $oldsymbol{y}=oldsymbol{f}(oldsymbol{x})$ ,就有:$$delta y_i=sumlimits_{j=1}^nfrac{partial f_i(oldsymbol{x})}{partial x_j}delta x_j$$

$$delta y_1=frac{partial f_1(oldsymbol{x})}{partial x_1}cdot delta x_1+frac{partial f_1(oldsymbol{x})}{partial x_2}cdot delta x_2...+frac{partial f_1(oldsymbol{x})}{partial x_n}cdot delta x_n$$

$$delta y_2=frac{partial f_2(oldsymbol{x})}{partial x_1}cdot delta x_1+frac{partial f_2(oldsymbol{x})}{partial x_2}cdot delta x_2...+frac{partial f_2(oldsymbol{x})}{partial x_n}cdot delta x_n$$

$$...qquad ...$$

$$delta y_n=frac{partial f_n(oldsymbol{x})}{partial x_1}cdot delta x_1+frac{partial f_n(oldsymbol{x})}{partial x_2}cdot delta x_2...+frac{partial f_n(oldsymbol{x})}{partial x_n}cdot delta x_n$$

  最终写成矩阵形式就得到了:

$$oldsymbol{delta y}=egin{bmatrix}frac{partial f_1(oldsymbol{x})}{partial x_1} & frac{partial f_1(oldsymbol{x})}{partial x_2} & ... & frac{partial f_1(oldsymbol{x})}{partial x_n}\ frac{partial f_2(oldsymbol{x})}{partial x_1} & frac{partial f_2(oldsymbol{x})}{partial x_2} & ... & frac{partial f_2(oldsymbol{x})}{partial x_n}\ ... & ... & ... & ... \ frac{partial f_n(oldsymbol{x})}{partial x_1} & frac{partial f_n(oldsymbol{x})}{partial x_2} & ... & frac{partial f_n(oldsymbol{x})}{partial x_n} end{bmatrix}cdot oldsymbol{delta x}=oldsymbol{J}_f(oldsymbol{x})oldsymbol{delta x}$$  这就证明了 $oldsymbol{J}_f(oldsymbol{x})oldsymbol{delta x}$ 正是 $oldsymbol{y}$ 的线性主部,也即其微分;而 $oldsymbol{delta x}$ 的系数雅可比矩阵 $oldsymbol{J}_f(oldsymbol{x})$ 也就是导数。

  因此,可以推测,对于一维非线性函数成立的条件数公式,只要把导数换成雅可比矩阵就很有可能成立。事实也确实如此,但是所谓的导数的“倒数”操作和取绝对值操作有些不同,分别换成了取逆和取范数,即:$cond(oldsymbol{f})=||oldsymbol{J}_f^{-1}(oldsymbol{x})||$.

3. 数值方法的收敛率和收敛速度

  几乎主要的求解一般非线性方程的数值算法都是迭代法。衡量迭代法工作效率的一个因素是它的收敛速度,即通过多少步迭代可以达到所需精度。设真解(精确解)为 $oldsymbol{x}^*$ ,k步迭代以后达到的解为 $oldsymbol{x}_k$ ,则第k步迭代后距离真解的误差为 $oldsymbol{e}_k=oldsymbol{x}_k-oldsymbol{x}^*$ .  量化收敛速度可以通过下式:$$limlimits_{k ightarrow infty}frac{||oldsymbol{e}_{k+1}||}{||oldsymbol{e}_k||^r}=C$$  其中r为收敛率,C为收敛常数。收敛率规定了足够多次迭代后,误差减小的次数;收敛常数则规定了误差减小的系数,即 $||oldsymbol{e}_{k+1}||approx C||oldsymbol{e}_k||^r$ .

表1 非线性方程迭代算法的收敛率,及常见求解一维方程算法
收敛率(rate)r 收敛次数 每次迭代获得的有效位数 解释 常见算法
$r=1,C<1$ 线性(Linear)收敛 常数位(如2位-4位-6位)

$r=1$时,若$Cgeq 1$ 则不收敛;

由于误差总是以系数C每次迭代减小,缩减比相同,获得有效位数一定

二分法;不动点迭代(导数非零)

$r>1$ 超线性(Superlinear)收敛 递增 (如2位-4位-7位) 介于线性和二次收敛之间

割线法(线性插值法);正向/反向二次插值法

一次分式插值法

$r=2$ 二次(Quadratic)收敛 翻倍 (如2位-4位-8位) 误差按平方的性质递减,获得的有效位数按照平方的性质翻倍 牛顿法;不动点迭代(导数为零)
原文地址:https://www.cnblogs.com/gentle-min-601/p/9643749.html