数值计算:线性方程组的迭代解法 02 非静态迭代法
上一节记录了线性方程组的静态迭代方法
本节主要介绍非静态迭代方法中的最速下降法与共轭梯度法。
非静态迭代法的基本原理
基于变分原理,考虑以下函数
若\(\boldsymbol A\)对称,则函数的梯度为
若\(\boldsymbol A\)对称正定的,则解方程\(\boldsymbol A\vec{x}=\vec{b}\)等价于求函数\(\Phi(\vec{x})\)的最小值,令\(\vec{r}=\vec{b}-\boldsymbol A\vec{x}\),则\(\vec{r}\)表示函数\(\Phi(\vec{x})\)的负梯度方向。
假设现已经得到\(k-1\)步迭代的解\(\vec{x}_{(k-1)}\),在第\(k\)步中,沿着\(\vec{p_k}\)方向进行搜素,即
带入\(\Phi(\vec{x})\)函数表达式可以得到
可以视作\(\Phi(\alpha_k)\)函数取最小值时,\(\frac{\partial\Phi(\alpha_k)}{\partial \alpha_k}=0\),则可以得到
由以上推导,可以发现,迭代过程中最核心的两个部分分别是1、迭代搜索方向\(\vec{p}_k\),2、迭代步长\(\alpha_k\),其中迭代步长\(\alpha_k\)的最优解已经确定,它与负梯度方向\(\vec{r}_k\)与迭代搜索方向\(\vec{p}_k\)相关。
最速下降法
(steepest descent method)
对于最速下降法,迭代搜索方向简单得选择为负梯度方向,即:\(\vec{p_k}=\vec{r}_{k}\),按照下降最快的方向去搜索。
A=[4 3 0;3 4 -1;0 -1 4];
b=[3;5;-5];
x0=[0;0;0];
[x,iter,Residual]=Steepest_Descent(A,b,x0,1e-6,100);
function [x,iter,Residual]=Steepest_Descent(A,b,x0,epsilon,iter_max)
%系数矩阵A,b,初始值x0,误差限制epsilon,最大迭代步数iter_max
iter=0;
x=x0;
r=b-A*x0;
while sqrt(dot(r,r))>=epsilon&&iter<iter_max
iter=iter+1;
Ar=A*r;
alpha=dot(r,r)/dot(r, Ar);
x_new=x+alpha*r;
Residual=norm(x-x_new,2);
x=x_new;
r=r-alpha*Ar;
end
end
共轭梯度法
(conjugate gradient method)
最速下降法简单地选择负梯度方向为搜索方向,搜索效率较低,因为\(\{\vec{p}_k\}\)之间并没有相对限制关系,如果能够对迭代搜索方向加以限制,回大大提高收敛效率。
共轭梯度法是一种求解大型稀疏对称正定方程组的有效方法。搜索方向不再是简单的负梯度方向,共轭梯度法要求\(\{\vec{p}_k\}_{i=0}^{n}\)之间相互独立,理论上,对于\(n\)维空间,可以在\(n\)步之内得到收敛结果。
现在引入共轭的定义
1、若向量\(\vec{x},\vec{y}\ne0\),且\(\vec{x},\vec{y}\)关于\(\boldsymbol A\)共轭,则有\(\vec{x}^T\boldsymbol A\vec{y}=0\);
2、若\(\boldsymbol A\)对称正定,\(\{d_i\}\)关于\(\boldsymbol A\)共轭,则\(\{d_i\}\)相互独立;
同样的迭代格式
假设现在已经存在线性无关的向量\(\vec{p}_1,\vec{p}_2,\cdots,\vec{p}_{k}\)关于\(\boldsymbol A\)共轭,现在要找到\(\vec{p}_{k+1}\)方向,可以认为
迭代公式含义可以理解为,\(\vec{p}_{k+1}\)等于\(\vec{r}_{k}\)减去\(\vec{p}_{k}\)的分量,\(\beta\)好比是\(\vec{r}_{k}\)在\(\vec{p}_{k}\)上的负投影.
\(\vec{p}_{k+1}\)与\(\vec{p}_1,\vec{p}_2,\cdots,\vec{p}_{k}\)关于\(\boldsymbol A\)共轭,等效于\(\vec{p}_{k+1}\)与\(\vec{p}_{k}\)关于\(\boldsymbol A\)共轭。则存在
之前推导的\(\alpha_k\)可以作进一步简化
到此,便是完整的梯度下降法,详细的数学推导公式见参考文章
伪代码:
clc;clear;
A=[4 3 0;3 4 -1;0 -1 4];
b=[3;5;-5];
x0=[0;0;0];
[x,iter,Residual]=Conjugate_Gradient(A,b,x0,1e-6,100);
function [x,iter,Residual]=Conjugate_Gradient(A,b,x0,epsilon,iter_max)
%系数矩阵A,b,初始值x0,误差限制epsilon,最大迭代步数iter_max
iter=0;
x=x0;
r=b-A*x0;
p=r;
Ap=A*p;
while sqrt(dot(r,r))>=epsilon&&iter<iter_max
iter=iter+1;
alpha=dot(r,r)/dot(p,Ap);
x_new=x+alpha*p;
Residual=norm(x-x_new,2);
x=x_new;
r=r-alpha*Ap;
Ar=A*r;
beta=-dot(p,Ar)/dot(p,Ap);
p=r+beta*p;
Ap=Ar+beta*Ap;
end
end
除此之外,还有基于共轭梯度法的改进方法,等用到了再来续写。
双共轭梯度法
(Bi-conjugate gradient method)
显然,共轭梯度法针对的是对称正定矩阵,而双共轭梯度法是针对于非对称矩阵的一类改进方法
稳定双共轭梯度法
(Bi-conjugate gradient stabilized method)