数学实验“线性方程组的J迭代,GS迭代,SOR迭代解法”实验研究报告(内含matlab程序代码)
西京学院数学软件实验任务书
实验四实验报告
一、实验名称:线性方程组的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(,于
是,解b X A =*的雅可比迭代法的计算公式为
⎪⎩
⎪⎨⎧--==∑∑-=+=+)(1),....,(111)
()()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k i
T
n X a X a b a X X X X X 2、 高斯-赛德尔迭代法(GS-迭代法):
GS-迭代法可以看作是雅可比迭代法的一种改进,给出了
迭代公式:⎪⎩
⎪⎨⎧--==∑∑-=+=+++)(1)
,....,(111)
1()1()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k i
T
n X a X a b a X X X X X 其余部分与雅克比迭代类似。
3、逐次超松弛迭代法(SOR-迭代法):
选取矩阵A 的下三角矩阵分量并赋予参数w ,将之作为分裂矩阵M ,)(1
wL D w
M -=
,其中,w>0,为可选择的松弛因子,又(1)公式构造一个迭代法,其迭代矩阵为A wL D w I B s 1)(---≡从而得到解b X A =*的逐次超松弛迭代法。
(0)(1)()
k 0,1,2,....k k s X
X
B X f +⎧⎪⎨=+=⎪⎩ 其中:
b
wL D w f wU D w wL D B s 1
1)())1(()(---=+--=
由此,解b X A =*的SOR-迭代法的计算公式为
⎪⎩
⎪⎨⎧--+==∑∑-=+=+++)(),....,(111)1()1()()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k i k i
T
n X a X a b a w X X X X X X (2) 观察(2)式,可得结论:
(1)、当w=1时,SOR-迭代法为J-迭代法。
(2)、当w>1时,称为超松弛迭代法,当w<1时,称为低松弛迭代法。
五、实验内容:
%1.J-迭代
function x1=jacobi(A,b,y);
m=input('请输入迭代次数m:');
eps=input('请输入精度eps:');
D=diag(diag(A));
L=triu(A)-A;
U=tril(A)-A;
M=D\(L+U);
g=D\b;
a=1;
k=0;
while a>eps
x2=M*x1+g;
a=norm(x2-x1,inf);
x1=x2;
k=k+1;
end
%输出方程组的近似解、精确值及误差
disp('近似解:');
disp(x1);
x2=x1-y;
a=norm(x2,inf);
fprintf('误差:%.6f;迭代次数:%d\n',a,k);
%2.GS-迭代
function x1=G_S(A,b,y)
n=100;
m=input('请输入迭代次数m:');
eps=input('请输入精度eps:');
D=diag(diag(A));
L=triu(A)-A;
U=tril(A)-A;
%生成矩阵M,向量g
M=(D-L)\U;
g=(D-L)\b;
%迭代首项
x1=eye(n-1,1);
x2=eye(n-1,1);
for i=1:n-1
x1(i)=1;
x2(i)=0;
end
a=1;
k=0;
while a>eps
x2=M*x1+g;
a=norm(x2-x1,inf); x1=x2;
k=k+1;
end
%输出方程组的近似解、精确值及误差
disp('近似解:');
x2=x1-y;
a=norm(x2,inf);
fprintf('误差:%.4f;迭代次数:%d\n',a,k);
%3.SOR-迭代
function a=p(A)
[n,n]=size(A);
x=eig(A);
a=0;
for i=1:n
b=abs(x(i));
if b>a
a=x(i);
end
end
a=abs(a);
function x1=SOR(A,b,y) %y为精确解
%超松弛迭代
D=diag(diag(A));
L=triu(A)-A;
U=tril(A)-A;
%求最佳松弛因子w
M=D\(L+U);
w=p(M);
w=2/(1+sqrt(1-w^2));
if w<0||w>2
disp('迭代不收敛'); return;
end
%生成矩阵M,向量g
M=(D-w*L)\((1-w)*D+w*U); g=(D-w*L)\b*w;
%进行迭代
w=1;
k=0;
%x1=eye(n,1);
while w>1e-6
x2=M*x1+g;
w=norm(x2-x1,inf);
x1=x2;
k=k+1;
end
%输出方程组的近似解、精确值及误差
disp('近似解:');
disp(x1);
x2=x1-y;
w=norm(x2,inf);
disp('误差:');
disp(w);
disp('迭代次数:');
disp(k);
六、实验结果:
A=[5 2 0;6 4 1;1 2 5];b=[10 18 -14]';
X1= G_S (A,b,[0 0 0]')
X1 =
-0.8750 7.1874 -5.5000。
迭代法解线性方程组数值分析实验报告
迭代法解线性方程组数值分析实验报告一、实验目的本次实验旨在深入研究和掌握迭代法求解线性方程组的基本原理和方法,并通过数值实验分析其性能和特点。
具体目标包括:1、理解迭代法的基本思想和迭代公式的推导过程。
2、掌握雅克比(Jacobi)迭代法、高斯赛德尔(GaussSeidel)迭代法和超松弛(SOR)迭代法的算法实现。
3、通过实验比较不同迭代法在求解不同类型线性方程组时的收敛速度和精度。
4、分析迭代法的收敛性条件和影响收敛速度的因素。
二、实验原理1、线性方程组的一般形式对于线性方程组$Ax = b$,其中$A$ 是$n×n$ 的系数矩阵,$x$ 是$n$ 维未知向量,$b$ 是$n$ 维常向量。
2、迭代法的基本思想迭代法是从一个初始向量$x^{(0)}$出发,按照某种迭代公式逐步生成近似解序列$\{x^{(k)}\}$,当迭代次数$k$ 足够大时,$x^{(k)}$逼近方程组的精确解。
3、雅克比迭代法将系数矩阵$A$ 分解为$A = D L U$,其中$D$ 是对角矩阵,$L$ 和$U$ 分别是下三角矩阵和上三角矩阵。
雅克比迭代公式为:$x^{(k+1)}= D^{-1}(b +(L + U)x^{(k)})$。
4、高斯赛德尔迭代法在雅克比迭代法的基础上,每次计算新的分量时立即使用刚得到的最新值,迭代公式为:$x_i^{(k+1)}=(b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i+1}^{n}a_{ij}x_j^{(k)})/a_{ii}$。
5、超松弛迭代法在高斯赛德尔迭代法的基础上引入松弛因子$\omega$,迭代公式为:$x_i^{(k+1)}= x_i^{(k)}+\omega((b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i}^{n}a_{ij}x_j^{(k)})/ a_{ii} x_i^{(k)})$。
迭代法求解线性方程组的研究(精选.)
迭代法求解线性方程组的研究【摘要】:本文总结了解线性方程组的三个迭代法,Jacobi 迭代法,Gauss-seidel 迭代法,SOR迭代法,并且介绍了现代数值计算软件MATLAB 在这方面的应用,即分别给出三个迭代法的数值实验。
【关键字】:Jacobi 迭代法 Gauss-seidel 迭代法 SOR 迭代法 数值实验一. 引言迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,它是解高阶稀疏方程组的重要方法。
迭代法的基本思想是用逐次逼近的方法求解线性方程组。
设有方程组b Ax = …① 将其转化为等价的,便于迭代的形式f Bx x += …② (这种转化总能实现,如令b f A I B =-=,), 并由此构造迭代公式 f Bx xk k +=+)()1( …③式中B 称为迭代矩阵,f 称为迭代向量。
对任意的初始向量)0(x,由式③可求得向量序列∞0)(}{k x ,若*)(lim x xk k =∞→,则*x 就是方程①或方程②的解。
此时迭代公式②是收敛的,否则称为发散的。
构造的迭代公式③是否收敛,取决于迭代矩阵B 的性质。
本文介绍三种解线性方程组的最主要的三种迭代法:Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 迭代法。
本文结构如下:第二部分介绍Jacobi 迭代法及其数值实验,第三部分介绍Gauss-Seidel 迭代法及其数值实验,第四部分介绍SOR 迭代法及其数值实验,第五部分总结。
二. 雅克比(Jacobi )迭代法1. 雅克比迭代法的格式设有方程组),,3,2,1(1n i b x aj j nj ij==∑= …①矩阵形式为b Ax =,设系数矩阵A 为非奇异矩阵,且),,3,2,1(,0n i a ii =≠从式①中第i 个方程中解出x ,得其等价形式)(111j nj j ijiii x ab a x ∑≠=-= …②取初始向量),,,()0()0(2)0(1)0(n x x x x=,对式②应用迭代法,可建立相应的迭代公式:)(111)()1(∑≠=++-=nj j i k j ij ii k ib x a a x …③ 也可记为矩阵形式:J x J k F B xk +==)()1( …④若将系数矩阵A 分解为A=D-L-U ,式中⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=nn a a a D2211,⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=--0000121323121nn n n a a a a a a L ,⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=--0000122311312n n n n a a a a a a D 。
数值分析实验报告
实验五 解线性方程组的直接方法实验5.1 (主元的选取与算法的稳定性)问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。
主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。
实验内容:考虑线性方程组n n n R b R A b Ax ∈∈=⨯,,编制一个能自动选取主元,又能手动选取主元的求解线性方程组的Gauss消去过程。
实验要求:(1)取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816M O O O b A ,则方程有解T x )1,,1,1(*Λ=。
取n=10计算矩阵的条件数。
让程序自动选取主元,结果如何?(2)现选择程序中手动选取主元的功能。
每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。
若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。
(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。
(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。
重复上述实验,观察记录并分析实验结果。
思考题一:(Vadermonde 矩阵)设⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=∑∑∑∑====n i i n n i i n i i n i i n n n n n n n x x x x b x x x x x x x x x x x x A 002010022222121102001111M ΛM ΛM M M ΛΛΛ,, 其中,n k k x k ,,1,0,1.01Λ=+=,(1)对n=2,5,8,计算A 的条件数;随n 增大,矩阵性态如何变化?(2)对n=5,解方程组Ax=b ;设A 的最后一个元素有扰动10-4,再求解Ax=b(3)计算(2)扰动相对误差与解的相对偏差,分析它们与条件数的关系。
实验一线性方程组迭代法实验
实验一线性方程组迭代法实验实验一线性方程组迭代法实验一、实验目的1.掌握用迭代法求解线性方程组的基本思想和计算步骤;2.能熟练地写出Jacobi迭代法的迭代格式的分量形式,并能比较它们各自的特点及误差估计;3.理解迭代法的基本原理及特点,并掌握Jacobi迭代Gauss-Seidel迭代和SOR迭代格式的分量形式、矩阵形式及其各自的特点;4.掌握Jacobi迭代Gauss-Seidel迭代和SOR 迭代算法的MATLAB程序实现方法,及了解松弛因子对SOR迭代的影响;5.用SOR迭代法求解线性方程组时,超松弛因子ω的取值大小会对方程组的解造成影响,目的就是能够探索超松弛因子ω怎样对解造成影响,通过这个实验我们可以了解ω的大致取值范围。
二、实验题目1、迭代法的收敛速度用迭代法分别对n=20,n=200解方程组Ax=b,其中n n A ⨯ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫------------------=444...444315131315151313151513131515131315131 (1)选取不同的初值x0和不同的右端向量b ,给定迭代误差,用两种迭代法计算,观测得到的迭代向量并分析计算结果给出结论;(2)取定初值x0和右端向量b ,给定迭代误差,将A 的主对角元成倍放大,其余元素不变,用Jacobi 迭代法计算多次,比较收敛速度,分析计算结果并给出结论。
2、SOR 迭代法松弛因子的选取不同的松弛因子对解得影响。
然后利用雅可比迭代求的的解与它们比较;三、 实验原理1、迭代法的收敛速度运用了Jacobi 迭代,Gauss-Seidel 迭代1)Jacobi 迭代算法:1. 取初始点x(0),精度要求ε,最大迭代次数N ,置k :=0;2. 由n 1i ),x a -(b x n i j 1,j (k)j j i i 11)(k i ,,⋯==∑≠=+ii a ,计算出x (k+1);3. 若ε≤-∞+)()1(k k x x ,则停算,输出x(k+1)作为方程组的近似解; 4. 若k=N ,则停算,输出迭代失败信息;否则置k :=k+1,转步2。
解线性方程组的迭代法数值计算上机实习报告
解线性方程组的迭代法数值计算上机实习报告一.综述:考虑用迭代法求解线性方程组,取真解为,初始向量取为零,以范数为度量工具,取误差指标为.其中。
分别完成下面各小题:第六题:编制程序实现Jacobi迭代方法和Gauss-Seidel 方法。
对应不同的停机标准(例如残量,相邻误差,后验误差停机标准),比较迭代次数以及算法停止时的真实误差。
其中残量准则:、相邻误差准则:后验误差停机准则:解:为了结果的可靠性,这里我分别对矩阵阶数为400、2500、10000进行试验,得到对应不同的方法、取不同的停机标准,迭代次数和真实误差的数据如下:分析上面数据可知,对应不同的停机标准,GS方法的迭代次数都近似为J方法的一半,这与理论分析一致。
而且从迭代次数可以看出,在这个例子中,作为停机标准,最强的依次为后验误差,再到残量,再到相邻误差。
第七题:编写程序实现SOR 迭代方法。
以真实误差作为停机标准,数值观测SOR 迭代方法中松弛因子对迭代次数的影响,找到最佳迭代因子的取值。
解:本题中考虑n=50,即对2500阶的矩阵A。
由于我们已经知道要使SOR方法收敛,松弛因子需要位于。
下面来求SOR方法中对应的最佳松弛因子。
应用筛选法的思想,第一次我们取松弛因子,间距为0.05,得到的对应的图像如下,从图中可以看出迭代次数随着的增大,先减小后变大,这与理论相符。
同时可以看出最佳松弛因子.第二次将区间细分为10份,即取,可得下面第二幅图像,从图像中可以看出最佳松弛因子第八题:对于J 方法,GS方法和(带有最佳松弛因子的)SOR 方法,分别绘制误差下降曲线以及残量的下降曲线(采用对数坐标系),绘制(按真实误差)迭代次数与矩阵阶数倒数的关系;解:对于J方法,考虑n=50时,采用相邻误差为迭代的终止条件,误差下降曲线及残量的下降曲线如下:对于GS方法,考虑n=50的时候,采用相邻误差作为迭代的终止条件,所得到的残量和误差的下降曲线如下图:从中可以看出,当相邻误差满足误差指标时,真实误差却并不小于误差指标,而为2.6281e-04。
实验报告四线性方程组的求解_迭代
浙江大学城市学院实验报告课程名称 科学计算实验项目名称 线性方程组的求解-迭代法实验成绩 指导老师(签名 ) 日期 2012-4-6一. 实验目的和要求1. 掌握Jacobi 迭代方法.Gauss-Seidel 迭代方法.SOR 迭代方法的编程思想.能够分别用分量形式和矩阵形式编写相关程序。
2. 观察SOR 迭代法中松弛因子变化情况对收敛的影响。
3. 了解Hilbert 矩阵的病态性和作为线性方程组系数矩阵的收敛性。
二. 实验内容和原理编程题2-1要求写出Matlab 源程序(m 文件).并有适当的注释语句;分析应用题2-2.2-3.2-4要求将问题的分析过程、Matlab 源程序和运行结果和结果的解释、算法的分析写在实验报告上。
2-1 编程注释 设11121121222212,n n n n nn n a a a b a a a b A b a a a b ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦对下述求解线性方程组的Matlab 程序添上注释语句.其中A 和b 分别为线性方程组的系数矩阵和右端向量;0x 为迭代初始向量(0)X;max N 为容许迭代最大次数.eps 为迭代终止条件的精度(容许误差).终止条件为前后两次迭代解的差的向量2-范数。
1) Jacobi 迭代:Jacobimethod(A,b,x0,Nmax,eps)2) Gauss-Seidel 迭代:GaussSeidelmethod(A,b,x0,Nmax,eps)3) 松弛迭代:SORmethod(A,b,x0,Nmax,eps,w)2-2 分析应用题利用2-1中的程序来分析用下列迭代法解线性方程组:123456410100014101050141012101410501014120010146x x x x x x --⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 的收敛性.并求出使(1)()20.0001k k X X +-≤的近似解及相应的迭代次数.其中取迭代初始向量(0)X 为零向量。
《数学实验》实验报告——迭代法
3.线性方程组的迭代求解
给定一个 n 元线性方程组
a11 x1 a12 x 2 a1 n xn 0 a x a x a x 0 21 1 22 2 2n n am 1 x1 am 2 x 2 amn xn 0
9
观察序列,并且判断极限。 Mathematica 程序如下:
当 x0=0.1,n=10 时,运行程序得
当 x0=0.5,n=10 时,运行程序得
当 x0=0.9,n=10 时,运行程序得
当 x0=1,n=10 时,运行程序得
实验结论:
10
由以上实验可得,函数 f(x)=x/2+1/x 的极限为 1.41421
运行程序结果如下:
实验结论:
试验中假设矩阵 A 的对角元素 aii<>0,i=1,2,3,…n.令 D=diag(a11,a12,,,….ann),则可以将 方程 Ax=b 转化成 x=(U+L)x+D-1b 其中 U 为下三角阵,L 为上三角阵。如果 U+L 的行列式 最大特征值的绝对值小于 1,则线性方程组有解且唯一。
写成 Ax=b 的形式, 再将其改写成 x=M*x=f 其中 M 是 n 阶矩阵, f=(f1,f2,f3,f4….fn)T 是 n 维列向量,给定 x0,由迭代 x(n+1)=M*x^n+f,n=0,1,2,3,4…..对给定的矩阵 M 数组 f 和 初始值 x0,由 x(n+1)=M*x^n+f,n=0,1,2,3,4…..用 mathematic 可得迭代结果。 迭代程序如下:
《数学实验》实验报告
班级 实验 内容 **** 学号 **** 姓名 实验 类别 **** 成绩 实验 时间
实验报告四 线性方程组的求解-迭代
浙江大学城市学院实验报告课程名称科学计算实验项目名称线性方程组的求解-迭代法实验成绩指导老师(签名)日期2012-4-6一.实验目的和要求1.掌握Jacobi 迭代方法,Gauss-Seidel 迭代方法,SOR 迭代方法的编程思想,能够分别用分量形式和矩阵形式编写相关程序。
2.观察SOR 迭代法中松弛因子变化情况对收敛的影响。
3.了解Hilbert 矩阵的病态性和作为线性方程组系数矩阵的收敛性。
二.实验内容和原理编程题2-1要求写出Matlab 源程序(m 文件),并有适当的注释语句;分析应用题2-2,2-3,2-4要求将问题的分析过程、Matlab 源程序和运行结果和结果的解释、算法的分析写在实验报告上。
2-1编程注释设11121121222212,n n n n nn n a a a b a a a b A b a a a b ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦ 对下述求解线性方程组的Matlab 程序添上注释语句,其中A 和b 分别为线性方程组的系数矩阵和右端向量;0x 为迭代初始向量(0)X;max N 为容许迭代最大次数,eps 为迭代终止条件的精度(容许误差),终止条件为前后两次迭代解的差的向量2-范数。
1)Jacobi 迭代:Jacobimethod(A,b,x0,Nmax,eps)2)Gauss-Seidel 迭代:GaussSeidelmethod(A,b,x0,Nmax,eps)3)松弛迭代:SORmethod(A,b,x0,Nmax,eps,w)2-2分析应用题利用2-1中的程序来分析用下列迭代法解线性方程组:123456410100014101050141012101410501014120010146x x x x x x --⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----=⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦的收敛性,并求出使(1)()20.0001k k X X +-≤的近似解及相应的迭代次数,其中取迭代初始向量(0)X为零向量。
解线性方程组的迭代法
实验三 解线性方程组的迭代法(1) 实验目的1: 掌握Jacobi 迭代法,Gauss-Seidel 法和SOR 算法的基本思想和迭代步骤;2:编写上述算法的Matlab程序,通过上机计算理解迭代法求解线性方程组的特点,并能和消去法比较;运用所学的迭代法算法; 3: 理解终止步骤终止步骤∞+-)()1(k k x x < ε对迭代法敛散性的意义;了解初始解x (0)、松弛因子的选取对计算结果的影响。
其解。
(2)【实验要求】1、理解迭代法求解线性方程组,并能与消去法比较;2、分别对不同精度要求,如ε = 10−3 ,10−4 ,10−5由迭代次数体会该迭代法的收敛快慢;3、使用SOR 方法时,选取松弛因子ω =0.8,0.9,1,1.1,1.2 等,讨论对该算法收敛性的影响,并能找出你所选用的最佳松弛因子;4、给出各种算法的设计程序和计算结果。
5、上机计算时,终止步骤∞+-)()1(k k x x < ε 或k >(预给的迭代次数),对迭代法敛散性的影响;(3)【实验内容】1.编写Jacobi算法的Matlab程序,并选取不同的初始点求解问题14-2和16,分析该算法的收敛性;function [x, k, index]=Jacobi(A, b, ep, it_max)% 求解线性方程组的Jacobi 迭代法,其中% A --- 方程组的系数矩阵% b --- 方程组的右端项% ep --- 精度要求。
省缺为1e-5% it_max --- 最大迭代次数,省缺为100% x --- 方程组的解% k --- 迭代次数% index --- index=1表示迭代收敛到指定要求;% index=0表示迭代失败if nargin <4 it_max=100; endif nargin <3 ep=1e-5; endn=length(A); k=0;x=zeros(n,1); y=zeros(n,1); index=1;while 1for i=1:ny(i)=b(i);for j=1:nif j~=iy(i)=y(i)-A(i,j)*x(j);endendif abs(A(i,i))<1e-10 | k==it_maxindex=0; return;endy(i)=y(i)/A(i,i);endif norm(y-x,inf)<epbreak;endx=y; k=k+1;endA=[4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 0 0 -1-1 0 0 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4];>> b=[2 1 2 2 1 2]';[x, k, index]=Jacobi(A, b, 1e-5, 100)不同初始点:2.编写GS算法的Matlab程序,并选取不同的初始点求解问题14-2和17,分析该算法的收敛性;3. 编写SOR算法的Matlab程序,并选取不同的初始点求解问题15, 选取松弛因子ω=0.8,0.9,1,1.1,1.2 等,讨论对该算法收敛性的影响,并能找出你所选用的最佳松弛因子4.对实验二所列线性方程组,试用Jacobi 迭代法,Gauss-Seidol 迭代法和SOR 方法进行求解,并与直接算法进行比较.。
实验五-解线性方程组的迭代法报告
实验五 解线性方程组的迭代法一、问题提出对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如34510,10,10ε---=由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(1)k k xx ε+∞-<或k>(给予的迭代次数),对迭代法敛散性的意义;4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。
四、实验学时:2学时五、实验步骤:1.进入C 或matlab 开发环境;2.根据实验内容和要求编写程序;3.调试程序;4.运行程序;5.撰写报告,讨论分析实验结果.解:J迭代算法:程序设计流程图:源程序代码:#include<stdlib.h>#include<stdio.h>#include<math.h>void main(){float a[50][51],x1[50],x2[50],temp=0,fnum=0;int i,j,m,n,e,bk=0;printf("使用Jacobi迭代法求解方程组:\n");printf("输入方程组的元:\nn=");scanf("%d",&n);for(i=1;i<n+1;i++)x1[i]=0;printf("输入方程组的系数矩阵:\n");for(i=1;i<n+1;i++){j=1;while(j<n+1){scanf("%f",&a[i][j]);j++;}}printf("输入方程组的常数项:\n");for(i=1;i<n+1;i++){scanf("%f",&a[i][n+1]);}printf("\n");printf("请输入迭代次数:\n");scanf("%d",&m);printf("请输入迭代精度:\n");scanf("%d",&e);while(m!=0){for(i=1;i<n+1;i++){for(j=1;j<n+1;j++){if (j!=i)temp=a[i][j]*x1[j]+temp;}x2[i]=(a[i][n+1]-temp)/a[i][i];temp=0;}for(i=1;i<n+1;i++){fnum=float(fabs(x1[i]-x2[i]));if(fnum>temp) temp=fnum;}if(temp<=pow(10,-4)) bk=1;for(i=1;i<n+1;i++)x1[i]=x2[i];m--;}printf("原方程组的解为:\n");for(i=1;i<n+1;i++){if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e){printf("x%d=%7.4f ",i,x1[i]);}}}运行结果:GS迭代算法:#include<iostream.h>#include<math.h>#include<stdio.h>const int m=11;void main(){int choice=1;while(choice==1){double a[m][m],b[m],e,x[m],y[m],w,se,max; int n,i,j,N,k;cout<<"Gauss-Seidol迭代法"<<endl;cout<<"请输入方程的个数:";cin>>n;for(i=1;i<=n;i++){cout<<"请输入第"<<i<<"个方程的各项系数:"; for(j=1;j<=n;j++)cin>>a[i][j];}cout<<"请输入各个方程等号右边的常数项:\n"; for(i=1;i<=n;i++){cin>>b[i];}cout<<"请输入最大迭代次数:";cin>>N;cout<<"请输入最大偏差:";cin>>e;for(i=1;i<=n;i++){x[i]=0;y[i]=x[i];}k=0;while(k!=N){k++;for(i=1;i<=n;i++){w=0;for(j=1;j<=n;j++){if(j!=i)w=w+a[i][j]*y[j];}y[i]=(b[i]-w)/double(a[i][i]);}max=fabs(x[1]-y[1]);for(i=1;i<=n;i++){se=fabs(x[i]-y[i]);if(se>max)max=se;}if(max<e){cout<<endl;for(i=1;i<=n;i++)cout<<"x"<<i<<"="<<y[i]<<endl; break;}for(i=1;i<=n;i++){x[i]=y[i];}}if(k==N)cout<<"迭代失败!!"<<endl;choice=0;}}SOR方法:# include <stdio.h># include <math.h>#include<stdlib.h>/**********定义全局变量**********/float **a; /*存放A矩阵*/float *b; /*存放b矩阵*/float *x; /*存放x矩阵*/float p; /*精确度*/float w; /*松弛因子*/int n; /*未知数个数*/int c; /*最大迭代次数*/int k=1; /*实际迭代次数*//**********SOR迭代法**********/void SOR(float xk[]){int i,j;float t=0.0;float tt=0.0;float *xl;xl=(float *)malloc(sizeof(float)*(n+1)); for(i=1;i<n+1;i++){t=0.0;tt=0.0;for(j=1;j<i;j++)t=t+a[i][j]*xl[j];for(j=i;j<n+1;j++)tt=tt+a[i][j]*xk[j];xl[i]=xk[i]+w*(b[i]-t-tt)/a[i][i];}t=0.0;for(i=1;i<n+1;i++){tt=fabs(xl[i]-xk[i]);tt=tt*tt;t+=tt;}t=sqrt(t);for(i=1;i<n+1;i++)xk[i]=xl[i];if(k+1>c){if(t<=p)printf("\nReach the given precision!\n"); elseprintf("\nover the maximal count!\n");printf("\nCount number is %d\n",k);}elseif(t>p){k++;SOR(xk);}else{printf("\nReach the given precision!\n"); printf("\nCount number is %d\n",k);}}/**********程序*****开始**********/void main(){int i,j;printf("SOR方法\n");printf("请输入方程个数:\n");scanf("%d",&n);a=(float **)malloc(sizeof(float)*(n+1)); for(i=0;i<n+1;i++)a[i]=(float*)malloc(sizeof(float)*(n+1));printf("请输入三对角矩阵:\n");for(i=1;i<n+1;i++)for(j=1;j<n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<n+1;i++)for(j=1;j<n;j++)b=(float *)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值:\n");for(i=1;i<n+1;i++)scanf("%f",&b[i]);x=(float *)malloc(sizeof(float)*(n+1)); printf("请输入初始的x:");for(i=1;i<n+1;i++)scanf("%f",&x[i]);printf("请输入精确度:");scanf("%f",&p);printf("请输入迭代次数:");scanf("%d",&c);printf("请输入w(0<w<2):\n");scanf("%f",&w);SOR(x);printf("方程的结果为:\n");for(i=1;i<n+1;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果讨论和分析:①迭代法具有需要计算机的存贮单元较少,程序设计简单,原始系数矩阵在计算过程中始终不变等优点.②迭代法在收敛性及收敛速度等方面存在问题.[注:A必须满足一定的条件下才能运用以下三种迭代法之一.在Jacobi中不用产生的新数据信息,每次都要计算一次矩阵与向量的乘法,而在Gauss利用新产生的信息数据来计算矩阵与向量的乘法.在SOR中必须选择一个最佳的松弛因子,才能使收敛加速.]经过计算可知Gauss-Seidel方法比Jacobi方法剩点计算量,也是Jacobi方法的改进.可是精确度底,计算量高,费时间,需要改进.SOR是进一步改进Gauss-Seidel 而得到的比Jacobi,Gauss-Seidel方法收敛速度快,综合性强.改变松弛因子的取值范围来可以得到Jacobi,Gauss-Seidel方法.③选择一个适当的松弛因子是关键.结论:线性方程组1和2对于Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法均不收敛,线性方程组3收敛。
