雅可比迭代实验报告

雅可比迭代实验报告
雅可比迭代实验报告

雅可比迭代法求解线性方程组的实验报告

一、实验题目

分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组:

使得误差不超过 0.00001。

二、实验引言

1.实验目的

①掌握用迭代法求解线性方程组的基本思想和步骤,熟悉计算机fortran 语言; ②了解雅可比迭代法在求解方程组过程中的优缺点。

2.实验意义

雅克比迭代法就是众多迭代法中比较早且较简单的一种,求解方便实用。

三、算法设计

1.雅可比迭代法原理:

设有线性方程组Ax=b 满足0≠ii a , 将方程组变形为: x=Bx+f, 则雅可比(Jacobi)迭代法是指f Bx X k k +=+)1(,即 由初始解逐步迭代即可得到方程组的解。 算法步骤如下:

步骤1.给定初始值)0()0(2)0(1,,,n x x x ?,精度e,最大容许迭代次数M ,令k=1。

步骤2.对i=1,2,…,n 依次计算

)0()1()0()1(11|

|)

n ,2,1,0(/)(i i i i i ii ii j n

i j j ij j x x x x e i a a x a b x →-=?=≠-=∑≠=,

步骤3.求出}{max 1i n

i e e ≤≤=,若ε

?????=+--=-+-=--2.453.82102.7210321

321321x x x x x x x x x

步骤4.若,

+

<转步骤2继续迭代。若,

M

k≥表明迭代失败,停止计k→

1

M

,k

k

算。

2.算法流程图

四、程序设计

program jacobi

implicit none

integer::i,j

integer::k

save k

real,parameter::e=0.001

integer,parameter::n=3

real::x(n),y(n),b(n)

data b/7.2,8.3,4.2/

real::D

real::a(n,n)

open (unit=10,file='1.txt')

data a/10,-1,-1,-1,10,-1,-2,-2,5/

write(10,*)"**********矩阵A的形式为**********"

write(10,"(1x,3f6.2,/)")a

forall(i=1:n)

x(i)=0

end forall

k=0

100 D=0

do i=1,n

y(i)=b(i)

do j=1,n

if(i/=j) y(i)=y(i)-a(i,j)*x(j)

end do

y(i)=y(i)/a(i,i)

end do

do j=1,n

D=abs(x(j)-y(j))

end do

forall(i=1:n)

x(i)=y(i)

end forall

if(D>=e) then

k=k+1

write(10,*)"迭代次数为:",k

goto 100

else

goto 200

end if

200 write(10,*)"****************************************"

write(10,*)"用jacobi方法解得的结果X[t]为:"

write(10,"(1x,3f6.2,/)")x(:)

stop

end program

五、结果及讨论

1.实验结果

**********矩阵A的形式为**********

10.00 -1.00 -1.00

-1.00 10.00 -1.00

-2.00 -2.00 5.00

迭代次数为: 1

迭代次数为: 2

迭代次数为: 3

迭代次数为: 4

迭代次数为: 5

迭代次数为: 6

迭代次数为:7

****************************************

用jacobi方法解得的结果X[t]为:

1.10 1.20 1.30

2.讨论分析

(1)误差

从上述输出结果中可以看出,当迭代次数k增大时,迭代值x1,y1,z1

会越来越逼近方程组的精确解x=1.0,y=1.2,z=1.3。

(2)收敛性

在本题目中, 用雅可比迭代法和高斯-塞德尔迭代法分别求解该线性方程组,得到的近似根是收敛的

六、算法评价

优点:迭代法算法简单,编制程序比较容易。

缺点:迭代法要求方程组的系数矩阵有某种特殊性质(譬如是所谓对角占优阵)以保证过程的收敛性。高斯—塞德尔迭代法比雅可比迭代法收敛快(达到同样的精度所需迭代次数少),但这个结论,在一定条件下才是对的,甚至有这样的方程组,雅可比方法收敛,而高斯—塞德尔迭代法却是发散的。在雅可比迭代法求解线性方程组时,只要误差截断设计的合理,原则上可以得到很正确的解。而通常我们选取设计误差限或设计最大迭代次数的方法来控制。由于它的准确性,故在

实际应用中比较常见,对于解一般线性方程组非常有效准确。通过该算法以及编程对求解的过程,我们不难发现,雅克比迭代法的优点明显,计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。然而这种迭代方式收敛速度较慢,而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改进方法。

附:

高斯—赛德尔程序

program G-S

implicit none

integer::i,j

integer::k

save k

real,parameter::e=0.001

integer,parameter::n=3

real::x(n),y(n),b(n)

data b/7.2,8.3,4.2/

real::D

real::a(n,n)

open (unit=10,file='1.txt')

data a/10,-1,-1,-1,10,-1,-2,-2,5/

write(10,*)"**********矩阵A的形式为**********"

write(10,"(1x,3f6.2,/)")a

forall(i=1:n)

x(i)=0

end forall

k=0

100 D=0

do i=1,n

y(i)=b(i)

do j=1,n

if(i

if(i>j) y(i)=y(i)-a(i,j)*y(j)

end do

y(i)=y(i)/a(i,i)

end do

do j=1,n

D=abs(x(j)-y(j))

end do

forall(i=1:n)

x(i)=y(i)

end forall

if(D>=e) then

k=k+1

write(10,*)"迭代次数为:",k

goto 100

else

goto 200

end if

200 write(10,*)"****************************************"

write(10,*)"用Gauss-seidel方法解得的结果X[t]为:"

write(10,"(1x,3f6.2,/)")x(:)

stop

end program

**********矩阵A的形式为**********

10.00 -1.00 -1.00

-1.00 10.00 -1.00

-2.00 -2.00 5.00

迭代次数为: 1

迭代次数为: 2

迭代次数为: 3

迭代次数为: 4

****************************************

用Gauss-seidel方法解得的结果X[t]为:

1.10 1.20 1.30

数值实验报告

数值实验报告五 班级:2017级学号:**** 姓名:*** 2017.12.5 1.数值实验问题 试用雅可比迭代法,高斯-赛德尔迭代法,超松驰迭代计算线性方程组: 取=(0,0,0,松弛因子分别取w=0.1t,1要求达到精度 。试通过数值计算得出不同的松弛因子所需要的迭代次数和收敛最快的松弛因子,并指出哪些松弛因子使得迭代发散。 2.数值方法 A=, L=-, U=-, D=diag() (1)雅可比迭代公式:

D. (2)高斯-赛德尔迭代法公式: (3)超松驰迭代方法公式: 其中w为松弛因子。 3.数值结果 如下表

最后四组,测得其在前10次内迭代所产生的结果,其中每一列为一

次迭代结果,分别如图: SOR-1.6 SOR-1.7 SOR-1.8 SOR-1.9 由于计算数据限制,其前五十列数据基本为空,所以取51到60列

由此看出,最后四组数据是发散的,数据结果不稳定,不收敛。所以最后四组得不到所需数据。 4.讨论 本次实验,分别用雅可比迭代公式,高斯-赛德尔迭代公式,超松驰迭代公式计算了此线性方程组。其中,雅可比和高斯迭代能够很好的进行运算,而超松驰迭代方法中,若松弛因子取得不够恰当,则会导致整个运算失败,得不到所需的结果,迭代不收敛,发散。此外,在进行初始值的赋值中,我是对每个矩阵都进行了赋值操作,而更简便的是,调用matlab中存在的函数,对矩阵进行运算,从而简化操作和代码,也使程序适用性更广。 程序代码: 1.雅可比迭代 function [x]=yakebi(D,L,U,b,j) format long B=D\(L+U);

雅可比迭代法

2013-2014(1)专业课程实践论文 题目:雅可比迭代法

一、算法理论 设有方程组),...,2,1(1 n i b x a i j n j ij ==∑= 记作,b Ax = (1) A 为非奇异阵且),,...,2,1(0n i a ij =≠将A 分裂为U L D A --=,其中 D =????????????????nn a a a 22 11,L =-??? ????? ???? ????-00001,21323121n n n n a a a a a a U =-?? ? ?? ? ? ? ????????-0000,122311312n n n n a a a a a a 将式(1)第)....2,1(n i i =个方程用ii a 去除再移项,得到等价方程组 (),,...,2,111n i x a b a x n i j j j ij i ii i =??? ? ? ?? -=∑≠= (2) 简记作 ,0f x B x += 其中 ().,111 0b D f U L D A D I B ---=+=-= 对方程组(2)应用迭代法,得到解式(1)的雅可比迭代公式 () () ()()()()()????????? ?? ? ??- ==∑≠=+,1,...,11002010n i j i k j ij i ii k i t n x a b a x x x x x , 初始向量 (3)

其中()()()()()T k n k k k x x x x ,,...,21=为第k 次迭代向量。设()k x 已经算出,由式(3)可计算下一次迭代向量()(),,...,2,1,...;2,1,01n i k x k ==+ 显然迭代公式(3)的矩阵形式为 ()()()()???+=+,010f x B x x k k ,初始向量 其中0B 称为雅可比方法迭代矩阵。

MATLAB样例之雅克比迭代法

要求: 下面分别使用雅克比迭代法和高斯-赛德尔迭代法求一个方程组的近似解用的线性方程组是按实验要求给的: 7*x1+x2+2*x3=10 x1+8*x2+2*x3=8 2*x1+2*x2+9*x3=6 雅克比迭代法的matlab代码:(老师写的) A=[7,1,2;1,8,2;2,2,9]; b=[10;8;6]; if(any(diag(A))==0) error('error,pause') end eps=input('误差限eps='); N=input('迭代次数N='); D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b; K=0; x0=zeros(size(b)); while 1 x1=B*x0+f K=K+1; fprintf('第-次迭代的近似解为',K) disp(x1'); if norm(x1-x0,inf)N fprintf('迭代超限') end x0=x1; end 高斯-赛德尔迭代法matlab代码:(自己改的)

A=[7,1,2;1,8,2;2,2,9]; b=[10;8;6]; if(all(diag(A))==0) error('error,pause') end eps=input('误差限eps='); N=input('迭代次数N='); D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b; K=0; x0=zeros(size(b)); x00=x0; while 1 x11=B*x0+f; x00(1,1)=x11(1,1); x12=B*x00+f; x00(2,1)=x12(2,1); x13=B*x00+f; x00(3,1)=x13(3,1); x1=x00 K=K+1; fprintf('第-次迭代的近似解为',K) disp(x1'); if norm(x1-x0,inf)N fprintf('迭代超限') end x0=x1; end

数学实验“线性方程组的J-迭代,GS-迭代,SOR-迭代解法”实验报告(内含matlab程序代码)

西京学院数学软件实验任务书 课程名称数学软件实验班级数0901 学号0912020107 姓名李亚强 实验课题线性方程组的J-迭代,GS-迭代,SOR-迭代方法。 实验目的 熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代方法。 实验要求运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成。 实验内容线性方程组的J-迭代;线性方程组的GS-迭代;线性方程组的SOR-迭代。 成绩教师

实验四实验报告 一、实验名称:线性方程组的J-迭代,GS-迭代,SOR-迭代。 二、实验目的:熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法,编程实现雅可比方法和高斯-赛德尔方法求解非线 性方程组121231 235210 64182514 x x x x x x x x +=?? ++=??++=-?的根,提高matlab 编程能力。 三、实验要求:已知线性方程矩阵,利用迭代思想编程求解线性方程组的解。 四、实验原理: 1、雅可比迭代法(J-迭代法): 线性方程组b X A =*,可以转变为: 迭代公式(0)(1)() k 0,1,2,....k k J X X B X f +???=+=?? 其中b M f U L M A M I B J 111),(---=+=-=,称J B 为求解 b X A =*的雅可比迭代法的迭代矩阵。以下给出雅可比迭代的 分量计算公式,令),....,() ()(2)(1)(k n k k k X X X X =,由雅可比迭代公式 有 b X U L MX k k ++=+) () 1()(,既有i n i j k i ij i j k i ij k i ij b X a X a X a +- -=∑∑+=-=+1 )(1 1 )() 1(, 于

用SOR迭代法

一、数值求解如下正方形域上的Poisson 方程边值问 二、2222(,)2,0,1 (0,)(1,)(1),01(,0)(,1)0, 01u u f x y x y x y u y u y y y y u x u x x ??? ??-+==<

Jacobi迭代法求解线性方程组实验报告

仿真平台与工具应用实践 Jacobi迭代法求解线性方程组 ^ 实验报告 : 院系: 专业班级: 姓名: 学号: 指导老师: }

一、 ; 二、 实验目的 熟悉Jacobi 迭代法原理; 学习使用Jacobi 迭代法求解线性方程组; { 编程实现该方法; 三、 实验内容 应用Jacobi 迭代法解如下线性方程组: , ?? ???=++--=+-=+-1552218474321321321x x x x x x x x x ,要求计算精度为710- 四、 ^ 五、 实验过程 (1)、算法理论 Jacobi 迭代格式的引出是依据迭代法的基本思想:构造一个向量系列(){}n X ,使其收敛至某个极限*X ,则*X 就是要求的方程组的准确解。 Jacobi 迭代

将方程组: ???????=+++=+++=+++n n 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 22112222212111212111 )1( ~ 在假设0≠ii a ,改写成()??? ????++++=++++=++++=--n n n n n n n n n n n g x b x b x b x g x b x b x b x g x b x b x b x 112211223231212113132121 )2( 如果引用系数矩阵 ??????????=nn n n a a a a A 1111,???? ??????=0011 n n b b B 及向量??????????=n x x X 1,??????????=n b b b 1,??????????=n g g g 1, 方程组(1)和(2)分别可写为:b AX =及g BX X +=,这样就得到了jacobi 迭代格式01g BX X k k +=+用jacobi 迭代解方程组b AX =时,就可任意取初值0X 带入迭代可知式g BX X k k +=+1,然后求k k X ∞ →lim 。但是,n 比较大的时候,写方程组)1(和)2(是很麻烦的,如果直接由A ,b 能直接得到B ,g 就是矩阵与向量的运算了,那么如何得到B ,g 呢实际上,如果引进非奇异对角矩阵 ()0≠ii a ???? ??????=nn a a D 00011 将A 分解成:,D D A A +-=要求b AX =的解,实质上就有,)(DX X D A AX +-=而D 是非奇异的,所以1-D 存在,,)(X A D AX DX -+=从而有,11b D AX D X --+=我们在这里不妨令,1A D I B --=b D g 1-=就得到jacobi 迭代格式:g BX X k k +=+1 】

jacobi迭代法和Gauss-Seidel迭代法

数值计算方法实验报告(五) 班级:地信10801 序号:姓名: 一、实验题目:jacobi迭代法和Gauss-Seidel迭代法 二、实验学时: 2学时 三、实验目的和要求: 1.掌握迭代法的基础原理。 2.掌握jacobi迭代法和Gauss-Seidel迭代法的步骤。 3.能用程序语言对jacobi迭代法和Gauss-Seidel迭代法进行编程实现。 四、实验过程代码及结果 1、代码: #include #include float x[100],xk[100]; float e; int N,M=1000; float a[100][101]; void initdata() { cout<<"输入方程阶数:"; cin>>N; cout<<"输入误差限e:"; cin>>e; cout<<"输入方程系数:"<>a[i][j]; cout<<"输入初始解向量x0:"<>xk[i]; } void jocobi() { int Nx=0,times=0; while(Nx=M){cout<<"发散"<

for(int i=1;i<=N;i++) { float sum=0; for(int j=1;j<=N;j++) if(i!=j)sum+=xk[j]*a[i][j]; x[i]=(a[i][N+1]-sum)/a[i][i]; if(fabs(x[i]-xk[i])>p[i][j]; } } int findMax(double** p,int start,int end){ int max=start; for(int i=start;iabs(p[max][start])) max=i; } return max; } void swapRow(double** p,int one,int other,int col){ double temp=0; for(int i=0;i

数值计算实验报告

线性方程的数值解法 一、课题名称:二分法求解非线性方程 二、引言: 目的:求方程f(x)=0的根 二分法所使用的方法主要是介值定理,它的基本思想是逐步缩小根存在的区间,搜索根所在的位置 许多实际算法表现为某种无穷递推过程的阶段,实现这类算法,不但需要建立计算公式,还需要解决精度控制问题,而我们下面介绍的二分法就是用来解决这一类问题,它是电子计算机上一种常用的算法。 三、算法: 首先,满足f(a)f(b)<0,给定ε(根的容许误差)或δ(|f(x)|的容许误差)。 1、对分【a,b 】,取x=(a+b)/2,计算f(0x ); 2、若|b-a|<ε,或|f(0x )|<δ,则取ζ=0x ,停机; 3、判断根所在新区间 若f(a)f(0x )≤0,则【11,b a 】=【a,0x 】 若f(a)f(0x )>0 ,则【11,b a 】=【0x ,b 】 11a b -=(b-a)/2 4、转向1,重复上述步骤。 四、结构程序设计(求013=--x x 的根) program main implicit none real :: a=1.0000 real :: b=1.5000 real,parameter :: c=0.0050 real x,y0,y do while( b-a>=c) y0=a**3-a-1 x=(a+b)/2 y=x**3-x-1 if( y*y0>0) then a=x else b=x end if write (*,*)x,y end do

stop end 五、结果及讨论分析 1、结果: 2、误差分析: 第k 次二分后,则在二分过程中可以获得一个近似根的序列,...,,210x x x ,该序列以根* x 为极限 在实际计算时,人们不可能也没有必要完成这种无穷过程,因为计算结果允许带有一点的误差。由于 )(2 1 )(21||1* a b a b x x k k k k -=-≤-+ 只要二分足够多次(即k 充分大),便有 ε<-||* k x x 这里ε为预定精度,数值计算中的近似是正常的,计算误差是不可避免的。 3、收敛性分析: 对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,而且总体上来说速度比较慢。牛顿法(程序见附),收敛速度要比二分法快,但是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结果可能不时预期需要得结果。 4、算法评价: 就二分法来说,它的优点有程序简单、方法可靠、收敛;缺点有无法解决多根、复根、一个切点的问题。

解线性方程组基本迭代法实验(ca)

Lab .解线性方程组的基本迭代法实验 【实验目的和要求】 1.使学生深入理解Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法; 2.通过对Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法的程序设计,以提高学生程序设计的能力; 3.应用编写的程序解决具体问题,掌握三种基本迭代法的使用,通过结果的分析了解每一种迭代法的特点。 【实验内容】 1.根据Matlab 语言特点,描述Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法。 2.编写Jacobi 迭代法、Gauss-Seidel 迭代法和SOR 迭代法的M 文件。 3.给定2020?∈R A 为五对角矩阵 ??????????????? ???????????????? ?---- -------- ------ 32 141213214 141213214141213214 141213 2141213 (1)选取不同的初始向量)0(x 及右端面项向量b ,给定迭代误差要求,分别用编写Jacobi 迭代 法和Gauss-Seidel 迭代法程序求解,观察得到的序列是否收敛?若收敛,通过迭代次数分析 计算结果并得出你的结论。 (2)用编写的SOR 迭代法程序,对于(1)所选取的初始向量) 0(x 及右端面项向量b 进行求解,松驰系数ω取1<ω<2的不同值,在5 )1()(10-+≤-k k x x 时停止迭代,通过迭代次数分析计算结果 并得出你的结论。 【实验仪器与软件】 1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ; 2.Matlab 6.0及以上版本。 实验讲评:

雅克比矩阵知识介绍

雅可比矩阵(Jacobi方法) Jacobi 方法 Jacobi方法是求对称矩阵的全部特征值以及相应的特征向量的一种方法,它是基于以下两个结论 1) 任何实对称矩阵A可以通过正交相似变换成对角型,即存在正交矩阵Q,使得 Q T AQ = diag(λ 1 ,λ 2 ,…,λ n ) (3.1) 其中λ i (i=1,2,…,n)是A的特征值,Q中各列为相应的特征向量。 2) 在正交相似变换下,矩阵元素的平方和不变。即设A=(a ij ) n×n ,Q交矩阵, 记B=Q T AQ=(b ij ) n×n , 则 Jacobi方法的基本思想是通过一次正交变换,将A中的一对非零的非对角化成零并且使得非对角元素的平方和减小。反复进行上述过程,使变换后的矩阵的非对角元素的平方和趋于零,从而使该矩阵近似为对角矩阵,得到全部特征值和特征向量。 1 矩阵的旋转变换 设A为n阶实对称矩阵,考虑矩阵 易见 V ij (φ)是正交矩阵, 记 注意到B=V ij A的第i,j行元素以及的第i,j列元素为

可得 ≠0,取φ使得则有 如果a ij 对A(1)重复上述的过程,可得A(2) ,这样继续下去, 得到一个矩阵序列{A(k) }。可以证明,虽然这种变换不一定能使矩阵中非对角元素零元素的个数单调增加,但可以保证非对角元素的平方和递减,我们以A与A(1)为例进行讨论。 设由式(3.4) 可得 这表明,在上述旋转变换下,非对角元素的平方和严格单调递减,因而由(3.2)可

知,对角元素的平方和单调增加。 2. Jacobi方法 通过一系列旋转变换将A变成A(k+1) ,求得A的全部特征值与特征向量的方法称为Jacobi方法。计算过程如下 1)令k=0, A(k) =A 2) 求整数i,j, 使得 3) 计算旋转矩阵 4) 计算A(k+1) 5) 计算 6) 若E(A(k+1))<ε, 则 为特征值,

迭代法实验报告

迭代法实验报告 一. 实验目的:掌握迭代方法的用处 二. 实验环境:Cfree5.0 三. 实验时间:2013年6月20日 四. 实验地点:电子信息楼1201教室 五. 实验内容:运用编程实现迭代方法可以更好的解线性方程组,得到线性方程的解。 六. 实验理论依据: 高斯-赛德尔(Gauss-Seidel )迭代公式 我们注意到在雅可比迭代法中并没有对新算出的分量11k x +,12k x +, , 11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把 (1)()()()11211331111(1)()()()22112332222(1)()()()1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++--?=---+???=---+?????=---+?? 式中第一个方程算出的11k x +立即投入到第二个方程中,代替()1k x 进行计算,当12 k x +算出后代替()2k x 马上投入到第三个方程中计算,依次进行下去,这样也许会得到 更好的收敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seidel )迭代公式, 高斯=赛德尔迭代法的分量形式:

(1)()()()11211331111(1)(1)()()22112332222(1)(1)(1)(1)1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++++++--?=---+???=---+?????=---+?? 高斯-赛德尔迭代法的矩阵形式: (1)(),(0,1,2,)k k x Bx f k +=+= 其中 1()B D L U -=- ,1()f D L b -=- B 称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量.. 七. 运行代码如下: #include"stdio.h" #include"math.h" int main() { bool pan1=true; int n,n1,n2=0,k=0; double num[100][100],L[100][100],U[100][100],x[100],y[100],num1=0,b[100],D[100][100],x1[200][200],x2[200][200]; printf("\n"); printf("*******************************高斯迭代法解如下********************************"); printf("输入要输入矩阵的阶数为(按Enter 输入矩阵数字):");//

SOR迭代法超松弛因子选取

《计算方法》实验报告(二) 实验名称:SOR 迭代法松弛因子的选取 班级: 数学1402班 姓名: 高艺萌 学号:14404210 一、 实验目的 通过本实验学习线性方程组的SOR 迭代解法以及SOR 迭代法的编程与应用。对比分析不同条件下的超松弛因子w 的取值大小会对方程组的解造成影响,通过这个实验我们可以了解的w 不同取值会对方程组的解产生的影响。培养编程与上机调试能力。 二、 实验题目 用逐次超松弛(SOR )迭代法求解方程组b Ax =,其中 ?????????? ????????????=????????????????????????????????????????????=555555122-12-122-112-122-112-122-112-122-12-12201918321 x x x x x x A (1)给定迭代误差,选取不同的超松弛因子1>ω进行计算,观察得到的近似解向量并分析计算结果,给出你的结论; (2)给定迭代误差,选取不同的超松弛因子1<ω进行计算,观察得到的近似解向量并分析计算结果,给出你的结论; 三、 实验原理 1.逐次超松弛迭代法可以看作Gauss-Seidel 迭代法的加速, b D Ux D Lx D x k k k 1)(1)1(1)1(--+-+++= 2.SOR 迭代计算格式 b D L wD I w x U wD I w L wD x k k 111)(111)1()(])1[()-1(------+-++-= 其中,w 叫松弛因子,当w>1时叫超松弛,0

SOR迭代法求解线性方程组

实验三:用SOR 迭代法求解线性方程组 ?????? ? ??=??????? ????????? ??----------74.012.018.168.072.012.006.016.012.001.103.014.006.003.088.001.016.014.001.076.04321x x x x 取初始点T x )0,0,0,0()0(=,松弛因子05.1=ω,精度要求610-=ε。 1,建立SOR.m 函数文件,此函数文件可调用,程序源码如下: function [x,n]=SOR(A,b,x0,w,eps,M) if nargin==4 eps= 1.0e-6;%精度要求 M = 200; elseif nargin<4 error; return elseif nargin ==5 M = 200; end if(w<=0 || w>=2) error; return; end D=diag(diag(A)); %求A 的对角矩阵 L=-tril(A,-1); %求A 的下三角阵 U=-triu(A,1); %求A 的上三角阵 B=inv(D-L*w)*((1-w)*D+w*U); f=w*inv((D-L*w))*b; x=B*x0+f; n=1; %迭代次数 while norm(x-x0)>=eps x0=x; x =B*x0+f; n=n+1; if(n>=M) disp('Warning: 迭代次数太多,可能不收敛!'); return; end end

2,输入矩阵。并根据要求调用函数,运行结果如下图所示: 即经过7次迭代算出结果,且求得: 1.27151.28440.48581.2843x ?? ? ?= ? ???

数值分析实验报告-Sor法分析

数值分析实验报告 一、 实验目的 1、会使用Sor 法求解一个线性方程组 2、熟悉matlab 语言并结合原理编程求方程组 3、改变ω的值观察实验结果 4、会分析实验结果 二、实验题目 编制Sor 迭代格式程序进行求解一个线性方程组的迭代计算情况,运行中要选用不同的松弛因子ω进行尝试 三、 实验原理 Jacobi 迭代和seidel 迭代对具体的线性方程组来说,逼近*x 的速度是固定不变的,遇到收敛很慢的情况时就显得很不实用。 Sor 法是一seidel 迭代为基础,并在迭代中引入参数ω以增加迭代选择的灵活性,具体为: ! 用seidel 迭代算出的,)()1()()1(k k J k k J x x x x x -=?++相减得到差向量与再用参数ω乘之再加上 )1()()()1()1()()()1(++++-=?+=k J k k k k k k x x x x x x x x ωωω,即的下一步迭代作为,由seidel 迭代的公式可以得到Sor 法的迭代格式为 n i x a x a b a x x k j n i j ij k j i j ij i ii k i k i ,2,1),()1()(1)1(11)()1( =--+-=∑∑+=+-=+ω ω 式中ω称为松弛因子。 四、 实验内容 用matlab 编程得到Sor 法求线性方程组的算法为: function [x,n]=SOR(A,b,x0,w,eps,M) if nargin==4

eps= ; M = 200; elseif nargin<4 error return : elseif nargin ==5 M = 200; end if(w<=0 || w>=2) error; return; end D=diag(diag(A)); %求A的对角矩阵L=-tril(A,-1); %求A的下三角阵( U=-triu(A,1); %求A的上三角阵B=inv(D-L*w)*((1-w)*D+w*U); f=w*inv((D-L*w))*b; x=B*x0+f; n=1; %迭代次数 while norm(x-x0)>=eps x0=x; x =B*x0+f; n=n+1; if(n>=M) (

雅克比迭代法和高斯-赛德尔法解线性方程组(C++)

作业:① 分别用J 法和G-S 法求解下列方程,并讨论结果。 123122*********x x x -?????? ??? ?= ??? ? ??? ??????? #include using namespace std; //J 法解线性方程 int main(){ int m,n,i,j,times=0,mtimes; double s,sum,max; cout<<"请输入系数矩阵行数m 、列数n :"<>m>>n; if(m>A[i][j]; cout<<"请输入常数向量B :"<>B[i]; cout<<"请输入最大允许误差s:"<>s; cout<<"请输入最大迭代次数:"<>mtimes; cout<<"请输入一零级向量X:"<>X[i]; T[i]=X[i];//T[]存放上一次迭代结果 }

matlab Jacobi迭代法Gauss-seidel和SOR迭代

1.Jacobi迭代法 例1 用jacobi迭代法求解代数线性代数方程组,保留四位有效数字(err=1e-4) 其中A=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3]。 解:编写jacobi迭代法的函数文件,保存为jacobi.m function [x,k]=jacobi(A,b,x0,eps,N) % 求解Ax=b;x0为初始列向量;eps为误差容限;N为最大迭代次数 % 输出x为近似解;k为迭代次数 n=length(A); x=zeros(n,1); for k=1:N for i=1:n ――――――― end if norm(x-x0,inf)

end x0=x; end 编写主程序如下 format long clear A=[8 -1 1;2 10 -1;1 1 -5]; b=[1 ;4; 3]; x0=[0.125; 0.4 ;-0.6 ]; % x0为初始列向量N为最大迭代次数err=1e-4; % err为误差容限 N=25; % N为最大迭代次数 [x,k]=jacobi(A,b,x0,err,N) 得到结果如下 x = 0.22492315625000 0.30561995000000 -0.49388680000000

k = 6 2.Gauss-seidel迭代法 例2 用Gauss-seidel迭代法求解代数线性代数方程组,保留四位有效数字(err=1e-4) 其中A=[8 -1 1;2 10 -1;1 1 -5];b=[1 ;4; 3]。 解:编写Gauss-seidel迭代法的函数文件,保存为gaus.m function [x,k]=gaus(A,b,x0,eps,N) % 求解Ax=b;x0为初始列向量;eps为误差容限;N为最大迭代次数% 输出x为近似解;k为迭代次数 n=length(A); x=zeros(n,1); for k=1:N for i=1:n ―――――― end if norm(x-x0,inf)

实验五矩阵的LU分解法雅可比迭代

实验五矩阵的LU分解法,雅可比迭代 实 验 报 告 学院:计算机科学与软件学院班级:116班 姓名:薛捷星 学号:112547

一、目的与要求: 熟悉求解线性方程组的有关理论和方法; 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序; 通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。 二、 实验内容: 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解各种方法的优缺点。 三、 程序与实例 列主元高斯消去法 算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+?表示 1) 消元过程 对k=1,2,…,n-1 ①选主元,找{}n ,,1k ,k i k +∈使得 k ,i k a =ik a n i k max ≤≤ ②如果0a k ,i k =,则矩阵A 奇异,程序结束;否则执行③。 ③如果k i k ≠,则交换第k 行与第k i 行对应元素位置, j i kj k a a ? j=k,┅,n+1 ④消元,对i=k+1, ┅,n 计算 kk ik ik a a l /=

对j=l+1, ┅,n+1计算 kj ik ij ij a l a a -= 2) 回代过程 ①若0=nn a ,则矩阵A 奇异,程序结束;否则执行②。 ②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算 ii n i j j ij n i i a x a a x /11,??? ? ? ?- =∑+=+ 程序与实例 例1 解方程组 ?? ? ??=++-=++-=++035 .3643x .5072x .1835x .2137.2623x .43712x 347x .1 1.183 3.555x 2.304x 0.101x 321321321 输出结果如下: X[0]=-0.398234 X[1]= 0.013795 X[2]= 0.335144 程序如下: #include #include main() { int i,j,p,o,l,q; double a[3][4]={{0.101,2.304,3.555,1.183},{-1.347,3.712,4.623,2.137},{-2.835,1.072,5.643,3.035}}; double x[3],z[4]; printf("列主元消去法\n"); for(j=0;j<2;j++) { for(i=j+1;i<3;i++) { if(fabs(a[j][j])

实验五 线性方程组的迭代法实验

《计算方法》实验报告 学院:信息学院 专业:计算机科学与技术 指导教师:郭卫斌 班级学号:10101438 计102 姓名:闻翰 计算机科学与工程系

实验五 线性方程组的迭代法实验 一. 实验目的 (1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭 代过程的收敛性,以及解决某些实际的线性方程组求解问题。 (2)熟悉Matlab 编程环境,利用Matlab 解决具体的方程求根问题。 二. 实验要求 建立Jacobi 迭代公式、Gauss-Seidel 迭代公式和超松弛迭代公式,用Matlab 软件实现线性方程组求解的Jacobi 迭代法、Gauss-Seidel 迭代法和超松弛迭代法,并用实例在计算机上计算。 三. 实验内容 1. 实验题目 (1)分别利用Jacobi 迭代和Gauss-Seidel 迭代求解下列线性方程组,取 ()T 0,0,0,0,0,0=x ,要求精度5 10-=ε: ?????????? ? ?????????=????????????????????????????????????????---------------62605041 1 141010014001100410010141001014654321x x x x x x (2)分别取1=ω、1.05、1.1、1.25和1.8,用超松弛法求解上面的方程组,要求精度 为510-=ε。 2. 设计思想 1.Jacobi 迭代: Jacobi 迭代的设计思想是将所给线性方程组逐步对角化,将一般形式的线性方程组的求解归结为对角方程组求解过程的重复。 2.Gauss-Seidel 迭代: Gauss-Seidel 迭代的设计思想是将一般形式的线性方程组的求解过程归结为下三角方程组求解过程的重复。 3.超松弛迭代: 基于Gauss-Seidel 迭代,对i=1,2,…反复执行计算迭代公式,即为超松弛迭代。 3. 对应程序 1.Jacobi 迭代: function [x,k]=Jacobimethod(A,b,x0,N,emg) %A 是线性方程组的左端矩阵,b 是右端向量,x0是迭代初始值

相关文档
最新文档