非线性方程(组):计算基本理论
1. 非线性方程(组)及其解
对于非线性函数 $f(x)$ ,方程 $f(x)=0$ 为非线性方程( $f:\mathbb{R} \rightarrow \mathbb{R}$ )。
对于n维向量 $\boldsymbol{x}$ 和在n维空间上的变换 $\boldsymbol{f}:\mathbb{R}^n\rightarrow \mathbb{R}^n$ ,方程 $\boldsymbol{f}(\boldsymbol{x})=\boldsymbol{0}$ 即可看作是一个n元非线性方程组(共含n个标量方程,$\boldsymbol{f}(\boldsymbol{x})$ 可以看作是一个n维向量,每一个分量均为一个关于 $\boldsymbol{x}$ 的n个分量的多元函数)。非线性方程(组)的求解问题也即相对应非线性函数的零点问题。
对于线性方程组,一般的n维向量的n个耦合方程组的解的理论已经非常清楚完整:它要么有唯一的解,要么有以线性空间的形式出现的无穷多个解,要么没有解。但是对于非线性方程,即使是一维的情形,也没有一个直截了当的方法可以判断,遑论高维情形。对于连续的一元非线性函数,若其在两个点的取值异号则在两点间必定存在零点,但是这一判断并不能推广到更高的维度:比如在二维的情况下,函数值的两个分量可以轮流反号,但是在相空间的表现可以是绕着原点作圆周运动而从未经过原点。在更高维的空间类似的例子更容易列举。而解的数量更是任意,可以有唯一解,可以有无穷多解,可以有任意正整数个的解。
2. 问题条件的性质
先来考虑一维求函数在x处取值的条件数。对于求函数的算法,输入为x,输出为y,根据定义:$$cond(f)=\frac{|\delta y|}{|\delta x|}= \lim\limits_{\delta x\rightarrow 0}\frac{|\delta f(x)|}{|\delta x|}=\frac{|df(x)|}{|dx|}=|f'(x)|$$ 再来考虑一维非线性方程求解的条件数。对于求解的算法,在计算表达式f(或者过程)已知的条件下,输入为右端项0(或者说,右端项也就是该方程的解的残差,当残差恰好为零时解恰好为精确解),输出为x,此时条件数表达当右端项离开0产生微小扰动时造成的解的差异,则有:$$cond(f)=\frac{|\delta x|}{|\delta y|}=\lim\limits_{\delta y\rightarrow 0}\frac{|\delta x|}{|\delta y|}=\lim\limits_{\delta x\rightarrow 0}\frac{|\delta x|}{|\delta y|}=(\frac{|dy|}{|dx|})^{-1}=\frac{1}{|f'(x)|}|_{f(x)=0}$$ 求解非线性方程的条件数和计算取值的条件数恰好互为倒数。函数在零点附近导数绝对值越小,求解方程的条件数也越大,问题越病态。求解方程即函数零点的几何表示为求解一条弧线与x轴(即y=0)的交点(如下图)。当弧线在该处导数绝对值很小时,弧线在零点附近切线和x轴夹角很小,这使得二者交点的不确定度很大(可参考线性方程组章节中,当直线夹角越小时交点不确定度越大,矩阵越接近奇异,问题越病态),问题显得十分病态。
然后来考虑高维非线性方程的求解。首先引进一个矩阵,雅可比矩阵(Jacobian)。对于 $\boldsymbol{f}:\mathbb{R}^n\rightarrow \mathbb{R}^n$ :$$Jacobian:\quad \boldsymbol{J}_f(\boldsymbol{x}), \quad (\boldsymbol{J}_f(\boldsymbol{x}))_{ij}=\frac{\partial f_i(\boldsymbol{x})}{\partial x_j}$$ 雅可比矩阵在微积分中已经有过许多接触。当将面积分的积分区域转化为极坐标表示时,$rsin\theta$ 项即来自于雅可比行列式的贡献;在积分坐标变换的普遍方法中,从正交的A坐标系转化到正交的B坐标系需要乘以从B到A的映射f的雅可比行列式的绝对值。可以看出,雅可比行列式表达的是从一套坐标向另一套坐标转化的过程中,面积微元的伸缩率。把类似的概念转嫁到 $\boldsymbol{f}:\mathbb{R}^n\rightarrow \mathbb{R}$ 的变换上,那么雅可比矩阵应该表达的就是由一套坐标构成的向量 $\boldsymbol{x}$ 向另一套坐标构成的向量 $\boldsymbol{y}=\boldsymbol{f}(\boldsymbol{x})$ 转化的过程中,向量的伸缩比。讲到这里,雅可比矩阵的意义应该已经清楚了:它是一个类似于导数的概念,描述 $\boldsymbol{x}$ 的微小变化造成的 $\boldsymbol{y}$ 的改变。注意,这里粗体的 $\boldsymbol{x}$ 和 $\boldsymbol{y}$ 全部都是向量的概念。
雅可比矩阵的意义也可以用另一个方法来得到。微积分的知识给出,多元函数 $y=f(\boldsymbol{x})$ (注意这里y是一维的,x是n维的,即 $f:\mathbb{R}^n\rightarrow \mathbb{R}$ )的全微分为:$$dy=\sum\limits_{i=1}^n\frac{\partial f(\boldsymbol{x})}{\partial x_i}dx_i$$ 因而对于 $\boldsymbol{y}=\boldsymbol{f}(\boldsymbol{x})$ ,就有:$$\delta y_i=\sum\limits_{j=1}^n\frac{\partial f_i(\boldsymbol{x})}{\partial x_j}\delta x_j$$
$$\delta y_1=\frac{\partial f_1(\boldsymbol{x})}{\partial x_1}\cdot \delta x_1+\frac{\partial f_1(\boldsymbol{x})}{\partial x_2}\cdot \delta x_2...+\frac{\partial f_1(\boldsymbol{x})}{\partial x_n}\cdot \delta x_n$$
$$\delta y_2=\frac{\partial f_2(\boldsymbol{x})}{\partial x_1}\cdot \delta x_1+\frac{\partial f_2(\boldsymbol{x})}{\partial x_2}\cdot \delta x_2...+\frac{\partial f_2(\boldsymbol{x})}{\partial x_n}\cdot \delta x_n$$
$$...\qquad ...$$
$$\delta y_n=\frac{\partial f_n(\boldsymbol{x})}{\partial x_1}\cdot \delta x_1+\frac{\partial f_n(\boldsymbol{x})}{\partial x_2}\cdot \delta x_2...+\frac{\partial f_n(\boldsymbol{x})}{\partial x_n}\cdot \delta x_n$$
最终写成矩阵形式就得到了:
$$\boldsymbol{\delta y}=\begin{bmatrix}\frac{\partial f_1(\boldsymbol{x})}{\partial x_1} & \frac{\partial f_1(\boldsymbol{x})}{\partial x_2} & ... & \frac{\partial f_1(\boldsymbol{x})}{\partial x_n}\\ \frac{\partial f_2(\boldsymbol{x})}{\partial x_1} & \frac{\partial f_2(\boldsymbol{x})}{\partial x_2} & ... & \frac{\partial f_2(\boldsymbol{x})}{\partial x_n}\\ ... & ... & ... & ... \\ \frac{\partial f_n(\boldsymbol{x})}{\partial x_1} & \frac{\partial f_n(\boldsymbol{x})}{\partial x_2} & ... & \frac{\partial f_n(\boldsymbol{x})}{\partial x_n} \end{bmatrix}\cdot \boldsymbol{\delta x}=\boldsymbol{J}_f(\boldsymbol{x})\boldsymbol{\delta x}$$ 这就证明了 $\boldsymbol{J}_f(\boldsymbol{x})\boldsymbol{\delta x}$ 正是 $\boldsymbol{y}$ 的线性主部,也即其微分;而 $\boldsymbol{\delta x}$ 的系数雅可比矩阵 $\boldsymbol{J}_f(\boldsymbol{x})$ 也就是导数。
因此,可以推测,对于一维非线性函数成立的条件数公式,只要把导数换成雅可比矩阵就很有可能成立。事实也确实如此,但是所谓的导数的“倒数”操作和取绝对值操作有些不同,分别换成了取逆和取范数,即:$cond(\boldsymbol{f})=||\boldsymbol{J}_f^{-1}(\boldsymbol{x})||$.
3. 数值方法的收敛率和收敛速度
几乎主要的求解一般非线性方程的数值算法都是迭代法。衡量迭代法工作效率的一个因素是它的收敛速度,即通过多少步迭代可以达到所需精度。设真解(精确解)为 $\boldsymbol{x}^*$ ,k步迭代以后达到的解为 $\boldsymbol{x}_k$ ,则第k步迭代后距离真解的误差为 $\boldsymbol{e}_k=\boldsymbol{x}_k-\boldsymbol{x}^*$ . 量化收敛速度可以通过下式:$$\lim\limits_{k\rightarrow \infty}\frac{||\boldsymbol{e}_{k+1}||}{||\boldsymbol{e}_k||^r}=C$$ 其中r为收敛率,C为收敛常数。收敛率规定了足够多次迭代后,误差减小的次数;收敛常数则规定了误差减小的系数,即 $||\boldsymbol{e}_{k+1}||\approx C||\boldsymbol{e}_k||^r$ .
收敛率(rate)r | 收敛次数 | 每次迭代获得的有效位数 | 解释 | 常见算法 |
$r=1,C<1$ | 线性(Linear)收敛 | 常数位(如2位-4位-6位) |
$r=1$时,若$C\geq 1$ 则不收敛; 由于误差总是以系数C每次迭代减小,缩减比相同,获得有效位数一定 |
二分法;不动点迭代(导数非零) |
$r>1$ | 超线性(Superlinear)收敛 | 递增 (如2位-4位-7位) | 介于线性和二次收敛之间 |
割线法(线性插值法);正向/反向二次插值法; 一次分式插值法 |
$r=2$ | 二次(Quadratic)收敛 | 翻倍 (如2位-4位-8位) | 误差按平方的性质递减,获得的有效位数按照平方的性质翻倍 | 牛顿法;不动点迭代(导数为零) |