实验解线性方程组的基本迭代法实验.docx
- 文档编号:29999599
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:22
- 大小:24.53KB
实验解线性方程组的基本迭代法实验.docx
《实验解线性方程组的基本迭代法实验.docx》由会员分享,可在线阅读,更多相关《实验解线性方程组的基本迭代法实验.docx(22页珍藏版)》请在冰豆网上搜索。
实验解线性方程组的基本迭代法实验
数值分析实验报告
姓名
忘川
学号
1205025106
系别
数学系
班级
12级
主讲教师
指导教师
实验日期
2014/6/25
专业
信息与计算科学专业
课程名称
数值分析
同组实验者
无
一、实验名称:
实验八、解线性方程组的基本迭代法实验
二、实验目的:
1.深入理解Jacobi迭代法、Gauss-Seidel迭代法和SOR迭代法;
2.通过对Jacobi迭代法、Gauss-Seidel迭代法和SOR迭代法的程序设计,提高程序设计的能力;3.应用编写的程序解决具体问题,掌握三种基本迭代法的使用,通过结果的分析了解每一种迭代法的特点。
三、实验内容及要求:
1.根据Matlab语言特点,描述Jacobi迭代法、Gauss-Seidel迭代法和SOR迭代法。
2.编写Jacobi迭代法、Gauss-Seidel迭代法和SOR迭代法的M文件。
2020
3.给定AR2020为五对角矩阵
11
3
24
111
3
224
1111
3
4224
1111
3
4224
111
3
422
113
42
(1)选取不同的初始向量x(0)及右端面项向量b,给定迭代误差要求,分别用编写的Jacobi迭代法和
Gauss-Seidel迭代法程序求解,观察得到的序列是否收敛?
若收敛,通过迭代次数分析计算结果并得出你的
结论。
(2)用编写的SOR迭代法程序,对于
(1)所选取的初始向量x(0)及右端面项向量b进行求解,松驰系数ω
取1<ω<2的不同值,在x(k)x(k1)105时停止迭代,通过迭代次数分析计算结果并得出你的结论。
四、实验步骤(或记录)
一、算法描述
a11
a12L
a1na11
A
a21
a22L
a2na22
M
MM
MO
an1
an2L
ann
a11
得到
D
a22
O
ann
由
0
a21
0
M
M
O
an1,1
an1,2
L
0
ann
an1
an2
L
an,n
0
a21
0
L
M
M
O
an1,1
an1,2
L
an1
an2
L
0
an,n10
0
a12
K
a1,n1
a1n
0
K
a2,n1
a2n
O
M
M
0
an1,n
10
0
0a12
K
a1,n1
0
K
a2,n1
U
O
M
0
则有:
第一步:
Jacobi迭代法
a1n
a2n
M,则有:
ADLU
an1,n
0
Axb
AAxDbLU(DLU)xbDx(LU)xbxD(LU)xDb
令JD(LU)则称J为雅克比迭代矩阵fDb
由此可得雅克比迭代的迭代格式如下:
x(0),初始向量
x(k1)Jx(k)f,k0,1,2,L
第二步
Gauss-Seidel迭代法
Axb
(DLU)xb(DL)xUxbx(DL)Ux(DL)bADLU
令G(DL)U,则称G为Gauss-Seidel迭代矩阵f(DL)b
由此可得Gauss-Seidel迭代的迭代格式如下:
x(0),初始向量
第三步
SOR迭代法
w0
AD
L
U1(
D
1
wL((1w)DwU))(D
1wL)
((1w)DwU)
w
w
w
令M
w1(D
wL),
N
1
((1w)DwU)则有:
A
MN
w
w
Axb
AM
LW
N
M
(M
N
)xbMxNxbxM
NxM
b
N
M,
令Wf
Mb
带入
N的值可有
LW((1w)DwU)(DwL)1((1w)DwU)(DwL)
f1bw1(DwL)1b
1(DwL)
w
称LW为SOR迭代矩阵,由此可得SOR迭代的迭代格式如下:
x(0),初始向量
二、算法程序
Jacobi迭代法的M文件:
function[y,n]=Jacobi(A,b,x0,eps)
%*************************************************
%函数名称
Jacobi
雅克比迭代函数
%参数解释
A
系数矩阵
%
b
常数项
%
x0
估计解向量
%
eps
误差范围
%返回值
%
y
解向量
%
n
迭代次数
%函数功能
实现线性方程组的Jacobi迭代求解
%*************************************************
n=length(A);
ifnargin<3
error('输入错误,最少要输入三个参数');return;
end
ifnargin==3
eps=1e-6;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
M=D;
N=L+U;
B=M\N;
f=M\b;
ifmax(abs(eig(B)))>=1
disp('谱半径大于等于1,迭代不收敛,无法进行');return;
end
n=1;
fori=1:
1:
n
ifsum(A(i,i)~=n)~=n
error('输入的A矩阵的对角线元素不能为0');return;
end
end
y=B*x0+f;
whilenorm(y-x0)>=eps&n<100
x0=y;
y=B*x0+f;
n=n+1;
end
Gauss-Seidel迭代法的M文件和function[y,n]=GaussSeidel(A,b,x0,eps)%*************************************************
%函数名称
GaussSeidel
高斯赛德尔迭代函数
%参数解释
A
系数矩阵
%
b
常数项
%
x0
估计解向量
%
eps
误差范围
%返回值
%
y
解向量
%
n
迭代次数
%函数功能
实现线性方程组的Jacobi迭代求解
%*************************************************
n=length(A);
ifnargin<3%针对这个nargin我还有一个疑问,过一段时间在来处理他
error('输入错误,最少要输入三个参数');
return;
end
ifnargin==3
eps=1e-6;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
M=D-L;
N=U;
B=M\N;
f=M\b;
ifmax(abs(eig(B)))>=1
disp('谱半径大于等于1,迭代不收敛,无法进行');
return;
n=1;
fori=1:
1:
n
ifsum(A(i,i)~=n)~=n
0');
error('输入的A矩阵的对角线元素不能为return;
end
end
y=B*x0+f;
whilenorm(y-x0)>=eps&n<100
x0=y;
y=B*x0+f;
n=n+1;
end
SOR迭代法的M文件
function[y,n]=SOR(A,b,x0,w,eps)
%*************************************************
%函数名称
SOR
松弛迭代函数
%参数解释
A
系数矩阵
%
w
松弛因子
%
b
常数项
%
x0
估计解向量
%
eps
误差范围
%返回值
%
y
解向量
迭代次数
%函数功能实现线性方程组的Jacobi迭代求解
%*************************************************
n=length(A);
ifnargin<3%针对这个nargin我还有一个疑问,过一段时间在来处理他
error('输入错误,最少要输入三个参数');
return;
end
ifnargin==3
eps=1e-6;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B1=D\(L+U);
M=1/w*(D-w*L);
N=1/w*((1-w)*D-w*U);
B=M\N;
f=M\b;
n=1;
fori=1:
1:
n
ifsum(A(i,i)~=n)~=n
error('输入的A矩阵的对角线元素不能为0');
return;
endy=B*x0+f;
whilenorm(y-x0)>=eps&n<100
x0=y;
y=B*x0+f;
n=n+1;
end
三、数值计算
1)首先编写如下程序实现输入大矩阵A:
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==2
A(i,j)=-1/4;
end
end
列的0,
第一次给定初始向量为20行一
右端面项向量b=20行一列的1
迭代误差要求0.005
Jacobi迭代法求解:
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==2
A(i,j)=-1/4;
end
end
end
>>b=ones(20,1);
>>x0=zeros(20,1);
>>eps=0.005;
>>[y,n]=Jacobi(A,b,x0,eps)y=
0.4813
0.5729
0.6321
0.6513
0.6600
0.6632
0.6646
0.6651
0.6653
0.6653
0.6653
0.6653
0.6651
0.6646
0.6632
0.6600
0.6513
0.6321
0.5729
0.4813
n=
9
>>
在CommandWindow中输入:
Gauss-Seidel迭代法求解:
在CommandWindow中输入:
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==2
A(i,j)=-1/4;
end
end
end
>>b=ones(20,1);
>>x0=zeros(20,1);
>>eps=0.005;
>>[y,n]=GaussSeidel(A,b,x0,eps)
y=
0.4814
0.5732
0.6325
0.6518
0.6606
0.6640
0.6654
0.6660
0.6662
0.6663
0.6663
0.6663
0.6661
0.6656
0.6642
0.6609
0.6521
0.6328
13/22
0.4816n=
7
>>
第二次给定初始向量为20行一列的0右端面项向量b=20行一列的1.001迭代误差要求0.005
Jacobi迭代法求解:
在CommandWindow中输入
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
>>
>>b=1.001*ones(20,1);
>>x0=zeros(20,1);
>>eps=0.005;
>>[y,n]=Jacobi(A,b,x0,eps)
y=
0.4146
0.4856
0.4978
0.4999
0.5002
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5002
0.4999
0.4978
0.4856
0.4146
7
>>
Gauss-Seidel迭代法求解:
在CommandWindow中输入A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
>>b=1.001*ones(20,1);
>>x0=zeros(20,1);
>>eps=0.005;
>>[y,n]=GaussSeidel(A,b,x0,eps)
y=
0.4145
0.4856
0.4978
0.4999
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5003
0.5000
0.4980
0.4858
0.4146
n=5
在较少的迭代次数下即可的到满足误差要求的解。
观察计算结果得到的序列可以看出其是收敛,
2)第一次给定初始向量为20行一列的0,
右端面项向量b=20行一列的1迭代误差要求0.00005松弛因子为1.5在CommandWindow中输入
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==2
A(i,j)=-1/4;
end
end
end
>>b=ones(20,1);
>>x0=zeros(20,1);
>>w=1.5;
>>eps=1e-5;
>>[y,n]=SOR(A,b,x0,w,eps)
y=
1.0e+012*
-0.5082
-0.9690
-1.5400
-2.1738
-2.8767
-3.6356
-4.4375
-5.2635
-6.0901
-6.8885
-7.6243
-8.2578
-8.7437
-9.0319
-9.0675
-8.7940
-7.0831
-5.4598
-3.5651
n=
100
列的0,
第二次给定初始向量为20行一右端面项向量b=20行一列的1迭代误差要求0.00005松弛因子为1.2
在CommandWindow中输入
A=zeros(20,20);
fori=1:
1:
20
A(i,i)=3;
end
fori=1:
1:
20
forj=1:
1:
20
ifabs(i-j)==1
A(i,j)=-1/2;
end
end
end
>>b=ones(20,1);
>>x0=zeros(20,1);
>>w=1.2;
>>eps=1e-5;
>>[y,n]=SOR(A,b,x0,w,eps)
y=
0.2792
0.3246
0.3319
0.3331
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3334
0.3331
0.3348
0.3246
0.3874
19
分析结果:
通过对迭代次数及其迭代结果的分析,我的得出的结论是松驰系数ω在SOR迭代中起着相当重要的作用,不同的松驰系数ω,可能对迭代结果带来很大的影响,恰当的松驰系数ω可以加速收敛,得到较为良好的迭代结果,而不恰当的松驰系数ω选取,则可能会得导致无法获得理想的结果,甚至还可能影响到迭代的收敛性。
五、教师评语(或成绩)
教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 线性方程组 基本 迭代法