《基于matlab平台的三种迭代法求解矩阵方程》由会员分享,可在线阅读,更多相关《基于matlab平台的三种迭代法求解矩阵方程(7页珍藏版)》请在金锄头文库上搜索。
1、.数值分析第二次作业 学院:电子工程学院基于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程序
2、,求解结果如下:(求解精度为10e-4,最大迭代次数1000)1、 方程的解:如下图1所示图1 三种方法求解的结果对比图2 Gause_Sedel算法收敛特性 图3 最速下降法收敛特性图3 共轭梯度法收敛特性从图中可以看到,在相同的最大迭代次数和预设求解精度条件下,共轭梯度算法仅需要4次迭代便可求出方程组的解,耗时0.000454秒,而且求出解的精度最高;Gauss_Sedel方法需要465次迭代,耗时0.006779秒,求解精度最差;最速下降法需要398次迭代,耗时0.007595秒,求解精度与共轭梯度算法差不多,因此两者求出的解也几乎相同。从中可以得出结论,共轭梯度算法无论从求解精度还是求
3、解速度上都优于其他两种,最速下降法在求解精度上几乎与共轭梯度算法持平,但求解速度更慢。Gauss_Sedel方法在求解精度和速度两方面都最差。具体的解为:Gauss_Sedel迭代法: (共需465次迭代,求解精度达到9.97e-5)X=0.9953283608331921.014317324978041.052861239300110.9340069741379980.9314933738088380.9665081384030661.006618485113411.037997898092581.051806903036541.062158499485721.048576764312231
4、.028561990411131.019991701626380.9718318315195150.9525261666348130.916996019179182.最速下降法: (共需398次迭代,求解精度达到9.94e-5)X=0.9988353797443221.015074634729000.982589093720185 0.9801914607592430.9912451697136281.003780222253291.013508843744781.019283379058161.020859096651941.019303141970281.014447773816511.0
5、07040589892970.9983844522508090.9873994046443770.9757678149709120.963209150871750.共轭梯度法: (共需4次迭代,求解精度达到3.98e-5)X= 0.9964727511794561.027078401890490.977623373409853 0.9732066953215900.9861330329676071.001289025642341.013221584969141.020473865022931.023009050605651.021630150839751.016780894543991.009
6、203108638740.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/
7、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); % mat
8、lab内置双共轭梯度算法求解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)% 利用迭
9、代方法求解矩阵方程 这里是高斯赛尔得迭代方法% A 为系数矩阵 b 为右端向量 err为精度大小 返回求解所得向量x及迭代次数 % M 为最大迭代次数 cc 迭代矩阵普半径 jingdu 求解过程的精度 n 所需迭代次数 xx 存储求解过程中每次迭代产生的解for ii=1:length(b) if A(ii,ii)=0 x=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
10、;xx(:,1)=x;while norm(A*x-b)err x0=x; x=B*x0+FG; k=k+1; xx(:,k+1)=x; if k=M disp(迭代次数太多可能不收敛!); break; end n=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
11、 所需迭代次数 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;while norm(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;if k=M disp(迭代次数太多可能不收敛!); break; endn=k;jingdu(k)=norm(r);endend子函31(共轭梯度法):function x,xx,n,jingdu=con_grad(A,b,eps
12、,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;while norm(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;if k=M disp(迭代次数太多可能不收敛!); break;end n=k;jingdu(k)=norm(r);end end单纯的课本内容,并不能满足学生的需要,通过补充,达到内容的完善 教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。.