您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 数值分析实验报告-jacobi迭代和seidel迭代分析
数值分析实验报告一、实验目的1、了解熟悉jacobi迭代法和seidel迭代法的解法2、将原理与matlab语言结合起来,编程解决问题3、分析实验结果二、实验题目设线性方程组为1102151012402170183131204321xxxx考察用jacobi迭代法和seidel迭代法求解该线性方程组的收敛情况。如果收敛,给出误差满足4)1()(10kkxx的解。三、实验原理将A作如下分解ULDA这里000000,000000,211221212211nnnnnnaaaUaaaLaaaDJacobi迭代矩阵为)(1ULDBJSeidel迭代矩阵为ULDBS1)(它们的迭代格式都可化为gBxxkk)()1(则迭代格式对任何初值都瘦脸的充要条件是迭代矩阵谱半径n2,1kn,1max)(k1,个特征值,的是矩阵其中,BBknkJacobi迭代矩阵的特征方程为0)det(JBISeidel迭代矩阵的特征方程为0))(det()det(ULDBIS四、实验内容用matlab编写计算jacobi迭代矩程序,建立m文件如下:function[M]=BJ(A)D=diag(diag(A));L=tril(-A)+D;U=triu(-A)+D;M=inv(D)*(L+U);输入:A=[201-3-1;31807;-1240-2;10-15];[M]=BJ(A)M:M=0-0.05000.15000.0500-0.166700-0.38890.0250-0.050000.0500-0.200000.20000则jacobi迭代矩阵为:02.002.005.0005.0025.03889.0001667.005.015.005.00JB用matlab求jacobi迭代矩阵的特征根的算法如下:A=[0-0.050.15-0.05;-0.6700-0.39;0.025-0.0500.05;-0.200.20];[V,D]=eig(A)V=-0.1892+0.0450i-0.1892-0.0450i-0.3812-0.5005-0.9467-0.94670.88670.5461-0.1528-0.1181i-0.1528+0.1181i-0.2099-0.0466-0.1056+0.1325i-0.1056-0.1325i0.15610.6701D=-0.1774+0.0864i0000-0.1774-0.0864i00000.219400000.1355则最大特征根为:0.2194则12194.0)(JB,所以jacobi迭代法收敛用matlab编程jacobi迭代法求根的算法:function[n,x]=jacobi(A,b,X,nm,w)%用雅克比迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度%输出:x为求得的方程组的解构成的列向量,n为迭代次数n=1;m=length(A);D=diag(diag(A));%令A=D-L-U,计算矩阵DL=tril(-A)+D;%令A=D-L-U,计算矩阵LU=triu(-A)+D;%令A=D-L-U,计算矩阵UM=inv(D)*(L+U);%计算迭代矩阵g=inv(D)*b;%计算迭代格式中的常数项%下面是迭代过程whilen=nmx=M*X+g;%用迭代格式进行迭代ifnorm(x-X,2)wdisp('迭代次数为');ndisp('方程组的解为');xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp('在最大迭代次数内不收敛!');输入数据:A=[201-3-1;31807;-1240-2;10-15];b=[1;2;10;-1];X=[0;0;0;0];nm=100;w=1e-4;[n,x]=jacobi1(A,b,X,nm,w)迭代次数为n=6方程组的解为x=0.06870.16450.2352-0.1667n=6x=0.06870.16450.2352-0.1667所以,满足精度的根为x=0.06870.16450.2352-0.1667迭代次数为6次用matlab编程计算seidel迭代矩阵算法为:function[M]=BS(A)D=diag(diag(A));L=tril(-A)+D;U=triu(-A)+D;M=inv(D-L)*U;输入:A=[201-3-1;31807;-1240-2;10-15];[M]=BS(A)M=0-0.05000.15000.050000.0083-0.0250-0.39720-0.00170.00500.071100.0097-0.02900.0042则seidel迭代矩阵为:0042.0029.00097.000711.0005.00017.003972.0025.00083.0005.015.005.00SB用matlab编程求得seidel矩阵的算法为:A=[0-0.050.150.05;00.0083-0.025-0.3972;0-0.00170.0050.0711;00.0097-0.0290.0042];[V,D]=eig(A)V=1.0000-0.1596+0.6750i-0.1596-0.6750i-0.910400.69650.69650.39240-0.1250+0.0028i-0.1250-0.0028i0.131300.0070-0.1348i0.0070+0.1348i0.0000D=000000.0088+0.0768i00000.0088-0.0768i0000-0.0001则特征根为00.008+0.0768i0.0088-0.0768i-0.0001则108.0)(SB,所以seidel迭代法收敛用seidel迭代法求根的算法为:function[n,x]=gaussseidel(A,b,X,nm,w)%用高斯-赛德尔迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度%输出:x为求得的方程组的解构成的列向量,n为迭代次数n=1;m=length(A);I=eye(m);%生成m*m阶的单位矩阵D=diag(diag(A));%令A=D-L-U,计算矩阵DL=tril(-A)+D;%令A=D-L-U,计算矩阵LU=triu(-A)+D;%令A=D-L-U,计算矩阵UM=inv(D-L)*U;%计算迭代矩阵g=inv(I-inv(D)*L)*(inv(D)*b);%计算迭代格式中的常数项%下面是迭代过程whilen=nmx=M*X+g;%用迭代格式进行迭代ifnorm(x-X,2)wdisp('迭代次数为');ndisp('方程组的解为');xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp('在最大迭代次数内不收敛!');disp('最大迭代次数后的结果为');x输入数据:A=[201-3-1;31807;-1240-2;10-15];b=[1;2;10;-1];X=[0;0;0;0];nm=100;w=1e-4;[n,x]=gaussseidel(A,b,X,nm,w)迭代次数为n=5方程组的解为x=0.06870.16450.2352-0.1667n=5x=0.06870.16450.2352-0.166满足精度的根为x=0.06870.16450.2352-0.1667迭代次数为5次五、实验分析从实验过程可以看到求出满足精度的根,seidel迭代要比jacobi迭代快,这是因为在jacobi迭代计算中,计算向量)1(kx时是按分量的角标由小到大依次计算的。如果)1(kx随着k的增大不断靠近解*x,可以期盼分量ikikixxx*)()1(更靠近比,于是seidel迭代法的收敛速度比jacobi迭代法的收敛速度快,所以迭代次数少。
本文标题:数值分析实验报告-jacobi迭代和seidel迭代分析
链接地址:https://www.777doc.com/doc-6362290 .html