共轭梯度法是介于梯度下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,既克服了梯度下降法收敛慢的缺点,又避免了牛顿法需要存储和计算海塞矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
共轭梯度法的迭代公式如下所示:
使用共轭梯度法对正定线性方程组进行求解,代码如下所示
function [er,k]=ConGra(A)
%共轭梯度法求解正定线性方程组Ax=b
%er:表示停机时实际的绝对误差
%k:表示停机时实际的迭代次数
tol=1e-6;%规定停机绝对误差限
[n,m]=size(A);
if n~=m %判断输入的合法性
error('wrong input');
end
x=zeros(n,1); %初始化解向量,产生n行1列的全零矩阵
b=ones(n,1);
r=b-A*x;%当前残量
k=0;%记录迭代次数
while norm(r,2)>tol %求r的2范数
k=k+1;
if k==1
p=r;%第一步即最速下降法,取残量方向,p为步长
else
q=(r'*r)/(rq'*rq);
p=r+q*p;
end
a=(r'*r)/(p'*A*p);
x=x+a*p;
rq=r;
r=r-a*A*p;
end
er=norm(A*x-b,2);
end
再编写一个m文件对矩阵A进行赋值即可求出相应的迭代次数和误差。