1数值计算方法短学期实验报告实验序号:实验1日期:年月日班级姓名学号实验名称逐次超松弛迭代法求线性方程组AX=B的解硬件需求:软件需求:MATLABR2014a任务描述:1.逐次超松弛迭代法(SOR法)求线性方程组AX=B的解的程序设计。输入参数:---A:线性方程组的系数矩阵---B:线性方程组的右端项---ω:松弛因子02ω∈(,)---X0:初始向量,默认值为零向量---EPS:精度要求,默认值为-610---K_MAX:最大迭代次数,默认值为100输出参数:---X:线性方程组的近似解---K:迭代次数---EXITFLAG:迭代成功与否的标志:1表示迭代成功,0表示迭代失败2.比较迭代次数与不同松弛因子的关系,适当选取ω可望使SOR法的收敛速度更快。3.扩展内容将Jacobi迭代、Gauss-Seidel迭代、逐次超松弛迭代法融合在一个程序中,并对比三种迭代法的迭代次数。2否是否是否流程图输入系数矩阵A,向量b,松弛因子ω,初始向量x0,精度要求EPS和最大迭代次数k_max计算D、L、U输入参数的选择及合法性判断终止开始计算B,gkk_maxx=B*x0+gx0=x;k=k+1;norm(x-x0,inf)eps3算法详细描述(程序和注解)1.SOR法函数function[x,k,exitflag]=sor(varargin)%varargin调用函数时根据需要来改变输入参数的个数.以元胞数组保存%SOR逐次超松弛迭代法求线性方程组AX=B的解%X=SOR(A,B,W)SOR方法求线性方程组AX=B的解X,初始迭代点X0、%精度EPS和最大迭代次数K_MAX均取默认值%X=SOR(A,B,W,X0,EPS,K_MAX)SOR方法求线性方程组AX=B的解X%[X,K]=SOR(A,B,W,X0,EPS,K_MAX)SOR方法求线性方程组AX=B的解X并%返回迭代次数%[X,K,EXITFLAG]=SOR(A,B,W,X0,EPS,K_MAX)SOR方法求线性方程组AX=B%的解X,并返回迭代次数和成功标志%%输入参数:%---A:线性方程组的系数矩阵%---B:线性方程组的右端项%---W:松弛因子%---X0:初始向量,默认值为零向量%---EPS:精度要求,默认值为1e-6%---K_MAX:最大迭代次数,默认值为100%输出参数:%---X:线性方程组的近似解%---K:迭代次数%---EXITFLAG:迭代成功与否的标志:1表示迭代成功,0表示迭代失败args=varargin;A=args{1};%元胞数组名加大括号{}调用数据,大括号中数值表示元胞的下标b=args{2};[m,n]=size(A);%提取矩阵A的行列数:m=A的行数;n=A的列数ifm~=n||length(b)~=merror('线性方程组的系数矩阵和常数项维数不匹配.')endk=0;exitflag=1;%A=D+L+UD=diag(diag(A));%构建一个以A对角元为对角的对角矩阵DL=tril(A,-1);%提取系数矩阵A的下三角矩阵U=triu(A,1);%提取系数矩阵A的上三角矩阵w=args{3};%以下if循环实现输入参数的选择及合法性判断ifnargin==3%nargin用来判断输入变量个数的函数x0=zeros(n,1);eps=1e-6;k_max=100;elseifnargin==6[x0,eps,k_max]=deal(args{4:6});%将元胞数组的内容复制到变量x0,eps,k_max4elseerror('输入参数个数有误.')endB=(D+w*L)\((1-w)*D-w*U);g=w*((D+w*L)\b);whilekk_maxx=B*x0+g;%迭代公式ifnorm(x-x0,inf)epsbreakendx0=x;k=k+1;endifk==k_maxexitflag=0;end2.test主程序A=[10-0.25-0.25;01-0.25-0.25;-0.25-0.2510;-0.25-0.2501];b=0.5*ones(4,1);w=1.5;%取w=1.5[x,k,exitflag]=sor(A,b,w)w=0.05:0.05:2;fori=1:length(w)[x,k,exitflag]=sor(A,b,w(i));n(i)=k;endscatter(w,n,'filled','r');%绘制迭代次数与松弛因子关系的曲线title('SOR法迭代次数k与松弛因子\omega的关系图');xlabel('松弛因子\omega');ylabel('迭代次数k');w_opt=w(n==min(n))%输出此方程下的最佳松弛因子3.迭代法求线性方程组的解function[x,k,exitflag]=Equ_iter(varargin)%EQU_ITER迭代法求线性方程组的解%X=EQU_ITER(A,B,'jacobi')雅可比迭代法求线性方程组AX=B的解X,初始迭%代点X0、精度EPS和最大迭代次数K_MAX均取默认值%X=EQU_ITER(A,B,X0,EPS,K_MAX,'jacobi')雅可比迭代法求线性方程组AX=B%的解X%[X,K]=EQU_ITER(...)雅可比迭代法求线性方程组的解并返回迭代次数%[X,K,EXITFLAG]=EQU_ITER(...)雅可比迭代法求线性方程组的解并返回迭代%次数和成功标志%X=EQU_ITER(A,B,'seidel')高斯赛德尔方法求线性方程组AX=B的解X,初始%迭代点X0、精度EPS和最大迭代次数K_MAX均取默认值5%X=EQU_ITER(A,B,X0,EPS,K_MAX,'seidel')高斯赛德尔方法求线性方程组%AX=B的解X%[X,K]=EQU_ITER(...,'seidel')高斯赛德尔方法求线性方程组AX=B的解X并返%回迭代次数%[X,K,EXITFLAG]=EQU_ITER(...,'seidel')高斯赛德尔方法求线性方程组AX=B%的解X,并返回迭代次数和成功标志%X=EQU_ITER(A,B,W,'sor')SOR方法求线性方程组AX=B的解X,初始迭代点%X0、精度EPS和最大迭代次数K_MAX均取默认值%X=EQU_ITER(A,B,W,X0,EPS,K_MAX,'sor')SOR方法求线性方程组AX=B的%解X%[X,K]=EQU_ITER(...,'sor')SOR方法求方程组AX=B的解X并返回迭代次数%[X,K,EXITFLAG]=EQU_ITER(...,'sor')SOR方法求线性方程组AX=B的解X,%并返回迭代次数和成功标志%%输入参数:%---A:线性方程组的系数矩阵%---B:线性方程组的右端项%---W:松弛因子%---X0:初始向量,默认值为零向量%---EPS:精度要求,默认值为1e-6%---K_MAX:最大迭代次数,默认值为100%---TYPE:迭代方法类型,TYPE有以下几种取值:%1.'jacobi'或1:雅可比迭代法%2.'seidel'或2:高斯赛德尔迭代法%3.'sor'或3:SOR迭代法%输出参数:%---X:线性方程组的近似解%---K:迭代次数%---EXITFLAG:迭代成功与否的标志:1表示迭代成功,0表示迭代失败args=varargin;style=args{end};A=args{1};b=args{2};[m,n]=size(A);ifm~=n||length(b)~=merror('线性方程组的系数矩阵和常数项维数不匹配.')endk=0;exitflag=1;D=diag(diag(A));L=tril(A,-1);U=triu(A,1);switchlower(style)case{1,'jacobi'}%Jacobi迭代法6ifnargin==3x0=zeros(n,1);eps=1e-6;k_max=100;elseifnargin==6[x0,eps,k_max]=deal(args{3:5});elseerror('输入参数个数有误.')endJ=-inv(D)*(L+U);f=D\b;whilekk_maxx=J*x0+f;ifnorm(x-x0,inf)epsbreakendx0=x;k=k+1;endcase{2,'seidel'}%Gauss-Seidel迭代法ifnargin==3x0=zeros(n,1);eps=1e-6;k_max=100;elseifnargin==6[x0,eps,k_max]=deal(args{3:5});elseerror('输入参数个数有误.')endG=-inv(D+L)*U;f_G=(D+L)\b;whilekk_maxx=G*x0+f_G;ifnorm(x-x0,inf)epsbreakendx0=x;k=k+1;endcase{3,'sor'}%SOR迭代法w=args{3};ifnargin==4x0=zeros(n,1);eps=1e-6;k_max=100;elseifnargin==7[x0,eps,k_max]=deal(args{4:6});elseerror('输入参数个数有误.')endB=(D+w*L)\((1-w)*D-w*U);g=w*((D+w*L)\b);7whilekk_maxx=B*x0+g;ifnorm(x-x0,inf)epsbreakendx0=x;k=k+1;endotherwiseerror('无效选项')endifk==k_maxexitflag=0;end实验结果报告(图和表)实验选取的线性方程组的系数矩阵A和右端项b分别为100.250.25010.250.250.250.25100.250.2501A−−−−=−−−−0.50.5b0.50.5=1、选取=1.5ω,在初始迭代点X0、精度EPS和最大迭代次数K_MAX均取默认值的情况下用SOR法求解上述线性方程,得到x=1.00001.00001.00001.0000k=21exitflag=182、SOR法迭代次数k与松弛因子ω的关系图如下:由上图可以看出,此方程下为使SOR法迭代次数最小,速度最快,松弛因子选为ω=1.1,此时的迭代次数为6次。3、Jacobi迭代、Gauss-Seidel迭代、逐次超松弛迭代的比较由上图可得,SOR法此时的最佳松弛因子为ω=1.1,在此松弛因子下我们对比三种迭代法的输出结果如下:Jacobi迭代Gauss-Seidel迭代逐次超松弛迭代(ω=1.1)x[]x1111T=[]x1111T=[]x1111T=k19116exitflag111显然,三种迭代方法的收敛速度不同。,我们Gauss-Seidel迭代比Jacobi迭代收敛的更快。结合2中的结果,适当选取ω,可望使SOR法比Gauss-Seidel迭代法收敛得更快。参考文献[1]JohnH.Mathews,KurtisD.Fink著,周璐,陈瑜等译.数值方法(MATLAB版).第四版.北京:电子工业出版社,2012[2]占海明.基于MATLAB的高等数学问题求解.北京:清华大学出版社,201300.20.40.60.811.21.41.61.820102030405060708090100SOR法迭代次数k与松弛因子ω的关系图松弛因子ω迭代次数k9