数值分析第二次作业学院:电子工程学院基于matlab平台的三种迭代法求解矩阵方程组求解系数矩阵由16阶Hilbert方程组构成的线性方程组的解,其中右端项为[2877/851,3491/1431,816/409,2035/1187,2155/1423,538/395,1587/1279,573/502,947/895,1669/1691,1589/1717,414/475,337/409,905/1158,1272/1711,173/244].要求:1)Gauss_Sedel迭代法;2)最速下降法;3)共轭梯度法;4)将结果进行分析对比。解:根据题目要求,编写了对应算法的matlab程序,求解结果如下:(求解精度为10e-4,最大迭代次数1000)1、方程的解:如下图1所示图1三种方法求解的结果对比图2Gause_Sedel算法收敛特性图3最速下降法收敛特性图3共轭梯度法收敛特性从图中可以看到,在相同的最大迭代次数和预设求解精度条件下,共轭梯度算法仅需要4次迭代便可求出方程组的解,耗时0.000454秒,而且求出解的精度最高;Gauss_Sedel方法需要465次迭代,耗时0.006779秒,求解精度最差;最速下降法需要398次迭代,耗时0.007595秒,求解精度与共轭梯度算法差不多,因此两者求出的解也几乎相同。从中可以得出结论,共轭梯度算法无论从求解精度还是求解速度上都优于其他两种,最速下降法在求解精度上几乎与共轭梯度算法持平,但求解速度更慢。Gauss_Sedel方法在求解精度和速度两方面都最差。具体的解为:Gauss_Sedel迭代法:(共需465次迭代,求解精度达到9.97e-5)X=[0.9953283608331921.014317324978041.052861239300110.9340069741379980.9314933738088380.9665081384030661.006618485113411.037997898092581.051806903036541.062158499485721.048576764312231.028561990411131.019991701626380.9718318315195150.9525261666348130.916996019179182].最速下降法:(共需398次迭代,求解精度达到9.94e-5)X=[0.9988353797443221.015074634729000.9825890937201850.9801914607592430.9912451697136281.003780222253291.013508843744781.019283379058161.020859096651941.019303141970281.014447773816511.007040589892970.9983844522508090.9873994046443770.9757678149709120.963209150871750].共轭梯度法:(共需4次迭代,求解精度达到3.98e-5)X=[0.9964727511794561.027078401890490.9776233734098530.9732066953215900.9861330329676071.001289025642341.013221584969141.020473865022931.023009050605651.021630150839751.016780894543991.009203108638740.9997724060551550.9884438274988590.9760941924969490.962844741655005].Matlab程序主程序:clc;clear;%%本程序用于计算第二次数值分析作业,关于希尔伯特矩阵方程的解,用三种方法,分析并比较,也可推广至任意n维的矩阵方程%%A=hilb(16);%生成希尔伯特系数矩阵b=[2877/851;3491/1431;816/409;2035/1187;2155/1423;538/395;1587/1279;573/502;947/895;1669/1691;1589/1717;414/475;337/409;905/1158;1272/1711;173/244];%右端向量M=1000;%最大迭代次数err=1.0e-4;%求解精度[x,n,xx,cc,jingdu]=yakebi_diedai(A,b,err,M);%雅克比算法求解tic;[x1,n1,xx1,cc1,jingdu1]=gauss_seidel(A,b,err,M);%gauss_seidel算法求解toc;tic;[x2,n2,xx2,jingdu2]=zuisuxiajiangfa(A,b,err,M);%最速下降法求解toc;tic;[x3,flag,jingdu3,n3]=bicg(A,b,err);%matlab内置双共轭梯度算法求解toc;tic;[x4,xx4,n4,jingdu4]=con_grad(A,b,err,M);%教材共轭梯度算法求解toc;%%计算相应结果,用于作图%%num=[1:16]';jie=[num,x1,x2,x4];%三者的解对比%三者的收敛情况对比num1=[1:n1]';fit1=[num1,jingdu1'];num2=[1:n2]';fit2=[num2,jingdu2'];num4=[1:n4]';fit4=[num4,jingdu4'];子函数1(Gause_Sedel算法):function[x,n,xx,cc,jingdu]=gauss_seidel(A,b,err,M)%利用迭代方法求解矩阵方程这里是高斯赛尔得迭代方法%A为系数矩阵b为右端向量err为精度大小返回求解所得向量x及迭代次数%M为最大迭代次数cc迭代矩阵普半径jingdu求解过程的精度n所需迭代次数xx存储求解过程中每次迭代产生的解forii=1:length(b)ifA(ii,ii)==0x='error';break;endendD=diag(diag(A));L=-tril(A,-1);U=-triu(A,1);B=(D-L)\U;cc=vrho(B);%迭代矩阵普半径FG=(D-L)\b;x0=zeros(length(b),1);x=B*x0+FG;k=0;xx(:,1)=x;whilenorm(A*x-b)errx0=x;x=B*x0+FG;k=k+1;xx(:,k+1)=x;ifk=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(A*x-b);endend子函数2(最速下降算法):function[x,n,xx,jingdu]=zuisuxiajiangfa(A,b,eps,M)%利用迭代方法求解矩阵方程这里是最速下降迭代方法%A为系数矩阵b为右端向量err为精度大小返回求解所得向量x及迭代次数%%M为最大迭代次数jingdu求解过程的精度n所需迭代次数xx存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;t0=r0'*r0/(r0'*A*r0);x=x0+t0*r0;r=b-A*x;xx(:,1)=x;k=0;whilenorm(r)epsr=r;x=x;t=r'*r/(r'*A*r);x=x+t*r;r=b-A*x;k=k+1;xx(:,k+1)=x;ifk=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend子函31(共轭梯度法):function[x,xx,n,jingdu]=con_grad(A,b,eps,M)%利用迭代方法求解矩阵方程这里是共轭梯度迭代方法%A为系数矩阵b为右端向量err为精度大小返回求解所得向量x及迭代次数%M为最大迭代次数jingdu求解过程的精度n所需迭代次数xx存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;p0=r0;%t0=r0'*r0/(r0'*A*r0);%x=x0+t0*r0;%r=b-A*x;%xx(:,1)=x;k=0;x=x0;r=r0;p=p0;whilenorm(r)epsx=x;r=r;p=p;afa=r'*r/(p'*A*p);x1=x+afa*p;r1=r-afa*A*p;beta=r1'*r1/(r'*r);p1=r1+beta*p;x=x1;r=r1;p=p1;k=k+1;xx(:,k)=x;ifk=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend