资源描述:
《迭代法实验报告_米瑞琪.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、数值实验报告Ⅱ实验名称迭代法求解Poisson方程实验时间2016年4月10日姓名米瑞琪班级信息1303学号成绩一、实验目的,内容1、理解并掌握三类迭代方法(Jacobi,Gauss-Siedel,SOR)迭代方法的构造原理;2、了解矩阵在matlab中不同的存储方式会导致不同的计算效率,学会采用最高效的方式存储矩阵;3、学会在计算机上实现迭代法,并比较不同方法的效率与误差;二、算法描述(一)Jacobi迭代对于线性方程组:Au=b(1)为了构造迭代格式,可将上式改写为:u=Tu+d(2)假定A的对角元均不为0,将A分裂为:A=D-B(3)其中D为:D=diag
2、A11,A22,A33,…,Ann(4)则(1)式可写为:Du=Bu+b(5)形成Jacobi迭代:uk+1=D-1Buk+D-1b(6)为了在迭代格式中不出现B,将B=D-A代入(6)式有:uk+1=(I-D-1A)uk+D-1b(7)为了保证迭代格式的收敛,需要使迭代矩阵的谱半径ρT<1.(二)SOR迭代对于(1)式中的线性方程组,将A分裂为:A=D-L-U(8)其中L,U分别为A对应的上三角与下三角矩阵的负值。由Gauss-Siedel迭代格式的中间步骤:Duk+1=Luk+1+Ruk+f(9)引入非零参数ω作为松弛因子,则有:uk+1=uk+ωuk+1-
3、uk(10)将(9)式代入(10)式,整理之后可以得到SOR迭代格式:uk+1=(D-ωL)-11-ωD+ωRuk+(D-ωL)-1ωf(11)计算可得最佳松弛因子为:ωopt=21+1-μ212其中μ=cosπh(13)(三)Gauss-Siedel迭代在SOR方法中令松弛因子ω=1,则有uk+1=uk+1(14)则有迭代格式:Duk+1=Luk+1+Ruk+f(15)可见Jacobi迭代与Gauss-Siedel迭代的区别在于Jacobi迭代将A分解为D,L+R,Gauss-Siedel迭代将A分解为D-L,R。三.程序代码按照上述三种格式分别在matlab
4、中实现,代码如下:(一)Jacobi迭代说明:u为最终的运算结果,A为系数矩阵,tol为允许的最大迭代步数,steps记录当前已经经过的迭代步数,eps为规定的计算精度,u0为初值function[u,steps]=Jacobian_Iteration(A,u0,b,eps,tol)%uisthefinalresult,Aistheiterationmatrix,tolisthepermittedbiggeststep,%stepsshowshowmanystepsoftheiteration,epsistheprecisionofthe%result%u0为初
5、值ifnargin<5tol=;endifnargin<4eps=1e-5;endsteps=0;[m,n]=size(A);ifm~=nfprintf('thenumberofcolumnsandrowsareunequal');returnend%生成对角矩阵D,采用稀疏存储spdiags而不是diag可以大大节省内存空间并提高计算效率d=diag(A);e1=ones(n,1);e2=zeros(n,1);D=spdiags([e2de2],[-101],n,n);I=spdiags([e2e1e2],[-101],n,n);%生成迭代矩阵M=I-(DA
6、);%{[vecval]=eig(M);spec_r=max(max(abs(val)));%检验迭代法是否收敛的话需要添加此段代码if(spec_r>=1)fprintf('invaliditeration:thespectralradiusislargerthan1');u=u0;k=0;return;end%}d=Db;err=A*u0-b;%误差的计算采用前后两步迭代之间向量的差,提高计算效率whilemax(abs(err))>eps&&steps7、eps>=tol)fprintf('iterationexceedslimit,Jacobian');stepsu=u0;return;endu=u0;end(一)SOR迭代function[u,steps]=SOR_Iteration(A,u0,b,eps,tol)ifnargin<5tol=10000;endifnargin<4eps=1e-5;end%检查矩阵是否是方阵[m,n]=size(A);ifm~=nfprintf('invalidA:matrixdimentionsshouldagree');endsteps=0;%生成迭代矩阵d=diag(A)
8、;e1=zeros(n,