您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数值分析线性方程组迭代法实验
实验报告一、实验目的体会求解线性方程组的Jacobi迭代法和Gauss-Seidel迭代法的收敛速度。二、实验题目用迭代法分别对200,20nn解方程组bAx,其中nnA431513143151513143151513143151513143151314(1)选取不同的初值0x和不同的右端向量b,给定迭代误差,用Jacobi迭代法和Gauss-Seidel迭代法计算,观测得到的迭代向量并分析计算结果给出结论;(2)取定初值0x和右端向量b,给定迭代误差,将A的主对角元成倍放大,其余元素不变,用Jacobi迭代法计算多次,比较收敛速度,分析计算结果并给出结论。三、实验原理求解线性方程组的Jacobi迭代法和Gauss-Seidel迭代法四、实验内容及结果1.Jacobi迭代法:1)先输入Jacobi迭代的M程序,在MATLAB的M文件窗口中输入以下内容并保存:functionx=majacobi(A,b,x0,ep,N)n=length(b);ifnargin5,N=500;endifnargin4,ep=1e-6;endifnargin3,x0=zeros(n,1);endx=zeros(n,1);k=0;whilekNfori=1:nx(i)=(b(i)-A(i,[1:i-1,i+1:n])*x0([1:i-1,i+1:n]))/A(i,i);endifnorm(x-x0,inf)ep,break;endx0=x;k=k+1;endifk==N,Warning('已达到迭代次数上限');enddisp(['k=',num2str(k)])2)再输入A,b,x0,在M文件窗口输入以下内容并保存:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=A+B+C+B'+C';b=ones(n,1);x0=zeros(n,1);x=majacobi(A,b,x0)x’3)在MATLAB的主程序窗口输出以下结果:k=10ans=Columns1through100.29350.31950.33660.33940.34060.34080.34090.34090.34090.3409Columns11through200.34090.34090.34090.34090.34080.34060.33940.33660.31950.29352.Gauss-Seidel迭代法:1)先输Gauss-Seidel迭代的M程序,在MATLAB的M文件窗口中输入以下内容并保存:functionx=maseidel(A,b,x0,ep,N)n=length(b);ifnargin5,N=500;endifnargin4,ep=1e-6;endifnargin3,x0=zeros(n,1);endx=zeros(n,1);k=0;whilekNfori=1:nifi==1x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);elseifi==nx(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);elsex(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);endendendifnorm(x-x0,inf)ep,break;endx0=x;k=k+1;endifk==N,Warning('已达到迭代次数上限');enddisp(['k=',num2str(k)])2)再输入A,b,x0,在M文件窗口输入以下内容并保存:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=A+B+C+B'+C';b=ones(n,1);x0=zeros(n,1);x=maseidel(A,b,x0);x'3)在MATLAB的主程序窗口输出以下结果:k=7ans=Columns1through100.29350.31950.33660.33940.34060.34080.34090.34090.34090.3409Columns11through200.34090.34090.34090.34090.34080.34060.33940.33660.31950.29353.选区不同的x0值和不同的右端向量b,只需要改变第二步中的b和x0值,具体程序如下:Jacobi的第二次迭代:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=A+B+C+B'+C';b=2*ones(n,1);x0=ones(n,1);x=majacobi(A,b,x0)x’Gauss-seidel的第二次迭代:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=A+B+C+B'+C';b=2*ones(n,1);x0=ones(n,1);x=maseidel(A,b,x0);x'输出结果分别如下:k=10ans=Columns1through100.58690.63900.67320.67890.68110.68160.68180.68180.68180.6818Columns11through200.68180.68180.68180.68180.68160.68110.67890.67320.63900.5869k=7ans=Columns1through100.58690.63900.67320.67890.68110.68160.68180.68180.68180.6818Columns11through200.68180.68180.68180.68180.68160.68110.67890.67320.63900.58694.设取定的初值x0=ones(n,1),b=2*ones(n,1);改变A的主对角线元素成倍放大,只需要将第二步中的A=A+B+C+B’+C’改成A=n*A+B+C+B’+C’(其中n为要放大的倍数,本题取2、3、4、8)。具体程序如下:Jacobi的第三次迭代:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=3*A+B+C+B'+C';b=2*ones(n,1);x0=ones(n,1);x=majacobi(A,b,x0);x'Gauss-seidel的第三次迭代:n=20;A=diag(4*ones(1,n));B=diag(-1/3*ones(1,n-1),1);C=diag(-1/5*ones(1,n-2),2);A=3*A+B+C+B'+C';b=2*ones(n,1);x0=ones(n,1);x=maseidel(A,b,x0);x'因为需要的是迭代的速度,所以只需要看k的值,所以输出结果只给出k的值如下:Jacobi2倍时k=73倍时k=64倍时k=58倍时k=5Gauss-seidel2倍时k=53倍时k=54倍时k=48倍时k=4五、实验结果分析(1)前面四个程序输出的结果,都有迭代次数和x的值,说明矩阵是收敛的。Gauss-seidel的迭代速度比Jacobi的迭代速度快。(2)观察k值发现迭代次数是减少的,再根据已学的知识,可以推断出随着A的主对角元值的成倍放大收敛的速度加快。
本文标题:数值分析线性方程组迭代法实验
链接地址:https://www.777doc.com/doc-5792841 .html