共轭梯度法求解线性方程组

1.1算法原理及程序框图

当线性方程组Ax= b的系数矩阵A是对称正定矩阵时,可以采用共轭梯度法对该方程组进行求解,可以证明,式(1)所示的n元二次函数

                                       (1)      

取得极小值点x*是方程Ax= b的解。共轭梯度法是把求解线性方程组的问题转化为求解一个与之等价的二次函数极小值的问题。从任意给定的初始点出发,沿一组关于矩阵A的共轭方向进行线性搜索,在无舍入误差的假定下,最多迭代n次(其中n为矩阵A的阶数),就可求得二次函数的极小点,也就求得线性方程组Ax= b的解。其迭代格式为:

                                        (2)     

经过一系列的证明和简化,最终可得共轭梯度法的计算过程如下:

(1) 给定初始计算向量x(0)即精度ε>0;

(2) 计算r(0)= b-Ax(0),取d(0) =r(0)

(3) for k =0 to n-1 do

(i);

(ii);

(iii);

(iv)

(v);

(vi);

End do

计算程序如下:

1.2程序使用说明

共轭梯度法求解线性方程组的matlab已提交,该程序可以求解系数矩阵为对称正定矩阵的线性方程组。直接双击打开程序软件即可,在程序中根据问题需要更改系数矩阵A和矩阵b(直接输入矩阵或者用简单命令生成矩阵)。根据计算需要修改计算精度eps,点击运行即可得到结果。

1.3算例计算

选择课本第113页计算习题3.2计算。例题要求在N=100,N=200,N=400下的计算结果,以N=200为例先将N=100和N=400注释掉,通过diag()命令生成矩阵A和b,运行计算结果。当n=100,n=200,n=400时分别需要迭代的次数是50次,100次,200次,x的各元素为1。

% ** 文件名:Conjugate Gradient.m
% 
% ** 日 期:2016.12.14
% 
% ** 描 述:共轭梯度法解线性方程组(Conjugate Gradient method)
% 
% ** 函数:113页计算实习3.2  
% 
% ** 参考教材:《数值分析》李乃成,梅立泉,科学出版社
%
clear;
clc;
%%
%获得需要的N阶矩阵A
N=100; %解向量的维数
%N=200;
%N=400;
a0=eye(N);%a0为n阶的单位阵
a1=eye(N-1);%a1为n-1阶的单位阵
a11=diag(a1);%a11是a1的单位阵的元素
a12=diag(a11,1);%a12是一个把a11的值放到其对角阵上一层的 矩阵
A=a12'+a12+(-2)*a0;%A是对角线及其对角线上下(第n-1,n+1条对角线)有元素的矩阵
%%
%获得矩阵b
b=zeros(N,1);
b(1)=-1;
b(N)=-1;
b;
%%  
fprintf('库函数计算结果:');
x=inv(A)*b      %库函数计算结果
x=zeros(N,1);%迭代近似向量
eps=0.0000001;%精度
r=b-A*x;
d=r;
for k=0:N-1
    fprintf('第%d次迭代:',k+1);
    a=(norm(r)^2)/(d'*A*d)
    x=x+a*d;
    rr=b-A*x;    %rr=r(k+1)
    if (norm(rr)<=eps)||(k==N-1)
        break;
    end
    B=(norm(rr)^2)/(norm(r)^2);
    d=rr+B*d;
    r=rr;
end
x
    
%由上述结果可知方程组由共轭梯度法求解所得的解与计算机直接计算所得的解相同,
%故所得的的解释可靠的。
%当n=100,n=200,n=400时分别需要迭代的次数是50次,100次,200次



你可能感兴趣的:(matlab)