当前位置:文档之家› 数值计算方法课程设计

数值计算方法课程设计

重庆邮电大学数学与应用数学 专业《数值计算方法》课程设计姓名: 李金徽 王莹 刘姝楠班级: 1131001 1131002 1131002 学号: 2010213542 2010213570 2010213571设计时间:2012-6-4指导教师:朱伟一、课程设计目的在科学计算与工程设计中,我们常会遇到求解线性方程组的问题,对于系数矩阵为低阶稠密矩阵的线性方程组,可以用直接法进行消元,而对于系数矩阵为大型稀疏矩阵的情况,直接法就显得比较繁琐,而迭代法比较适用。

比较常用的迭代法有Jacobi 迭代与Gauss - seidel 迭代。

本文基于两种方法设计算法,并比较他们的优劣。

二、课程设计内容给出Jacobi 迭代法和Gauss-Seidel 迭代法求解线性方程组的算法思想和MATLAB 程序实现,并对比分析这两种算法的优劣。

三、问题的分析(含涉及的理论知识、算法等)Jacobi 迭代法方程组迭代法的基本思想和求根的迭代法思想类似,即对于线性方程组Ax = b( 其中nn n R b R R A ∈⨯∈,),即方程组)1(22112222212111212111⎪⎪⎩⎪⎪⎨⎧=+⋯++⋯⋯=+⋯++=+⋯++nn nn n n n n n n b x a x a x a b x a x a x a b x a x a x a将系数矩阵A 写为)2(000000211221212211UL D a a a a a a a a a A n n n n nn --≡⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----⎪⎪⎪⎪⎪⎭⎫⎝⎛----⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=若选取D M =,则U L A M N +=-=,方程组)1(转化为等价方程组b x U L Dx ++=)(迭代公式:于是,得可逆,所以因为Jacobi b D x U L D x D n i a ii .)(),,,1(011--++==≠)3()()()1()0(⎪⎩⎪⎨⎧+=+f x B x x k J k 初始向量迭代公式的分量形式:。

)(其中,迭代矩阵Jacobi b D f U L D B J 11-,-=+=)可写为次近似,则式(为第引进记号:3),,,()()(2)(1)(k x x x x Tk n k k k =∑≠=+-=nij j k j ij i k iii x a b xa 1)()1(或)4(),2,1,0;,2,1(,),,,(1)()1()0()0(2)0(1)0(⎪⎪⎩⎪⎪⎨⎧==-==∑≠=+ k n i a x a b x x x x x ii ni j j k j ij i k iTn ,为其精度||||)()1(k k x x -+。

Gauss-Seidel 迭代法的等价方程组为方程组下三角矩阵),于是若取)1(.(U A M N D L M =-=-=bUx x L D +=-)(赛德尔迭代公式:于是,得到高斯-)(初始向量)5()()1()0(⎪⎩⎪⎨⎧+=+f x B x x k G k阵。

赛德尔迭代法的迭代矩为解方程组的高斯称。

其中,-)(,)(11G G B b L D f U L D B ---=-=)可写成公式(记5,)()(2)(1),,,()(x x x xk n k k Tk =bUx L D xk k +=-+)()1()(b xa x a xa ik jni j iik ji j ii k iii+--=∑∑+=+-=+)(1)1(11)1(⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧==--==∑∑+=+-=+),2,1,0;,2,1(),,,(1)()1(11)1()0()0(2)0(1)0( k n i x x a b x x x x x ii n i j k j k j i j ii i k i Tn,或算法步骤: Jacobi 步骤第一步:输入A ,b,x0,e 的初始值第二步:求出b 的长度,和A 的大小;判断输入变量的个数,使x 与x0之间产生差值,设定x x x x k k ==+,0)1(,给定k 的初始值; 第三步:求出上下三角矩阵进而求出对角矩阵的逆;第四步:求出谱半径,当谱半径小于一时,用while 循环,当满足e x x k k >-∞+||||)1(时,k=k+1;),2,1,0;,,2,1(,1)()1( ==-=∑≠=+k n i a x a b xiinij j k j ij i k i。

若谱半径不小于一,则迭代法发散。

Gauss-Seidel 步骤:第一步:输入A ,b,x0,e 的初始值第二步:求出b 的长度,和A 的大小;判断输入变量的个数,使x 与x0之间产生差值,设定x x x x k k ==+,0)1(,给定k 的初始值;第三步:求出下三角矩阵并求出它的逆;第四步:求出谱半径,当谱半径小于一时,用while 循环,当满足e x x k k >-∞+||||)1(时,k=k+1;),2,1,0;,,2,1(,111)()1()1( ==--=∑∑-=+=++k n i a xxa b x iii j ni j k jk jij i k i 。

若谱半径不小于一,则迭代法发散。

四、计算过程(含涉及编写的程序、计算结果截屏等)Jacobi 程序:先建立一个m 文件程序为:function [x,k]=Jacobi(A,b,x0,e) n=length(b);if nargin<4,e=1e-4;endif nargin<3,x0=zeros(n,1);end x=x0;x0=x+2*e;k=0; m=size(A); for i=1:mAl(i:m,i)=A(i:m,i); Au(i,i:m)=A(i,i:m); a(i,i)=1; endiAl=a/Al;iAu=a/(Al+Au-A); B=-iAu*(2*A-Au-Al); C=eig(B);p=max(abs(C)) if p<1while norm(x0 -x,inf)>e k=k+1;x0=x;x=-iAu*(2*A-Au-Al)*x0+iAu*b; disp(x') endelseif p>=1,warning('reached the Max-number of iterations'); end在matlab 中的举例运行的计算结果为:>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5];>> b=[7.2 8.3 4.2]';>> [x,k]=Jacobi(A,b,[0 0 0]',1e-4)p =0.9458x =24.499624.5996106.5983k =198Gauss-Seidel程序:先建立一个m文件程序为:function [x,k]=GaussSeidel(A,b,x0,e)n=length(b);if nargin<4,e=1e-4;endif nargin<3,x0=zeros(n,1);endx=x0;x0=x+3*e;k=0;m=size(A);for i=1:mAl(i:m,i)=A(i:m,i);a(i,i)=1;endiAl=a/Al;B=-iAl*(A-Al);C=eig(B);p=max(abs(C))if p<1while norm(x0 -x,inf)>ek=k+1;x0=x;x=-iAl*(A-Al)*x0+iAl*b;disp(x')endelseif p>=1,warning('reached the Max-number of iterations'); end在matlab中的举例运行的计算结果为:>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5];>> b=[7.2 8.3 4.2]';>> [x,k]=GaussSeidel(A,b,[0 0 0]',1e-4)p =0.8947x =24.499824.5998106.5992k =106由于147<198,所以Gauss-Seidel迭代法的收敛速度总是比Jacobi迭代法的收敛速度快。

但是当初始值变成如下时有:>> A=[1 2 -2;1 1 1;2 2 1];>> b=[1 2 2]';>> [x,k]=Jacobi(A,b,[0 0 0]',1e-4)p =9.1754e-0061 2 21 -1 -4-5 5 2-5 5 2x =-552k =4>> A=[1 2 -2;1 1 1;2 2 1];>> b=[1 2 2]';>> [x,k]=GaussSeidel(A,b,[1 1 1]',1e-4)p =2Warning: reached the Max-number of iterations> In GaussSeidel at 22x =111k =此时雅可比(Jacobi)可以迭代而高斯-塞德尔(Gauss-Seidel)则发散。

五、问题求解结果的分析与结论雅可比(Jacobi)迭代法和高斯-塞德尔(Gauss-Seidel)迭代法是迭代法中的两种。

两种迭代法的本质区别在于:Gauss-Seidel迭代不断地运用新值替代旧值,而Jacobi迭代却不是。

在实际计算时,Gauss-Seidel迭代法的迭代格式比Jacobi迭代格式紧凑,并且只需要一套存放迭代向量单元。

凡是迭代法都有收敛性与识差估计的问题,对于一个给定的方程组,某些迭代法收敛的快,而有些迭代法可能不收敛,或收敛的慢,以至于无实用价值。

对于A满足一定条件时Gauss-Seidel迭代法的收敛速度是比Jacobi迭代法的收敛速度快的结论得到了验证。

六、课程设计的总结与体会(含每位同学承担的主要工作等)程序设计体会王莹(2010213570):在这次程序设计中我主要担任编写运行程序。

这次程序设计,给我带来了很多收获。

数值已经学了一个学期了,许多知识都在似懂非懂的现象,但这种现象通过实际的上机操作,已经减少了许多。

对这些知识也有了更深的理解和很好的掌握。

也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。

这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。

只能避过这些方法,换方法实现。

在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。

相关主题