迭代法解线性方程组-数值分析实验报告 (1).doc
《迭代法解线性方程组-数值分析实验报告 (1).doc》由会员分享,可在线阅读,更多相关《迭代法解线性方程组-数值分析实验报告 (1).doc(22页珍藏版)》请在冰点文库上搜索。
数学与计算科学学院
《数值分析》课程设计
题目:
迭代法解线性方程组
专业:
信息与计算科学
学号:
1309302-24
姓名:
谭孜
指导教师:
郭兵
成绩:
二零一六年六月二十日
一、前言:
(目的和意义)
1.实验目的
①掌握用迭代法求解线性方程组的基本思想和步骤。
②了解雅可比迭代法,高斯-赛德尔法和松弛法在求解方程组过程中的优缺点。
2.实验意义
迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,它是解高阶稀疏方程组的重要方法。
迭代法的基本思想是用逐次逼近的方法求解线性方程组。
比较雅可比迭代法,高斯-赛德尔迭代方法和松弛法,举例子说明每种方法的试用范围和优缺点并进行比较。
二、数学原理:
设有方程组
…①
将其转化为等价的,便于迭代的形式
…②
(这种转化总能实现,如令),
并由此构造迭代公式
…③
式中B称为迭代矩阵,f称为迭代向量。
对任意的初始向量,由式③可求得向量序列,若,则就是方程①或方程②的解。
此时迭代公式②是收敛的,否则称为发散的。
构造的迭代公式③是否收敛,取决于迭代矩阵B的性
1.雅可比迭代法基本原理
设有方程组
…①
矩阵形式为,设系数矩阵A为非奇异矩阵,且
从式①中第i个方程中解出x,得其等价形式
…②
取初始向量,对式②应用迭代法,可建立相应的迭代公式:
…③
也可记为矩阵形式:
…④
若将系数矩阵A分解为A=D-L-U,
式中
,
,
。
则方程Ax=b变为
得
于是
于是式中④中的。
式③和式④分别称为雅克比迭代法的分量形式和矩阵形式,分量形式用于编程计算,矩阵型式用于讨论迭代法的收敛性。
2.高斯—赛德尔迭代法
高斯—赛德尔(Gauss-Seidel)迭代法,其迭代公式为
(i=1,2,…,n)
也可以写成矩阵形式
仍将系数矩阵A分解为
则方程组变为
得
将最新分量代替为旧分量,得
即
于是有
所以
3.超松弛迭代法
设已知第k次迭代向量,及第k+1次迭代向量的前i-1个分量,(j=1,2,…i-1),现在研究如何求向量的第i个分量。
首先,有高斯—赛德尔迭代法求出一个值,记为
(i=1,2,…n)
再将第k次迭代向量的第i个分量与进行加权平均,
得,即:
于是的SOR迭代公式
(i=1,2,…n)…①
或
(i=1,2,…n)…②
当=1时,式①即为高斯—赛德尔迭代法;
当0<<1时,式①称为低松弛方法,当某些方程组用高斯—赛德尔迭代法不收敛时,可以用低松弛方法获得收敛;
当>1时,式①称为超松弛方法,可以用来提高收敛速度。
将式②写成矩阵的形式,得:
即
于是得SOR迭代的矩阵表示
式中
三、举例说明及代码
例1:
解下面方程组.(雅克比迭代方法、高斯-赛德尔和松弛法的比较)
解:
先计算迭代矩阵:
BJ与BG的特征值跟收敛半径为
所以,用雅可比迭代法求解,迭代过程收敛,而用高斯-塞德尔迭代法求解,迭代过程发散。
取x0=(0;0;0),为达到精度10-5,取w=0.1。
雅可比迭代法
松弛法
3
184
代码:
1.雅可比迭代法
function[x,k]=jacobi(A,b,x0,esp)%k为迭
A=input('InputA=');
b=input('Inputb=');
x0=input('Inputx0=');
esp=1.0e-5;
k=0;
n=length(b);
x=x0;
whilemax(abs(b-A*x0))>esp&k<=500;fori=1:
n
sum=0;
forj=1:
n
ifj~=i
sum=sum+A(i,j)*x0(j);end
end
x(i)=(b(i)-sum)/A(i,i);end
x0=x;
k=k+1;
ifk>500
fprintf('迭代达到上限')
return
end
end
k
InputA=[12-2;111;221];
Inputb=[111]';
Inputx0=[000]'
运行结果:
k=
3
ans=
-3
3
1
2.高斯-赛德尔迭代法
clear;clc;
A=[12-2;111;221];
b=[111]';
N=length(b);%解向量的维数
fprintf('库函数计算结果:
');
x=inv(A)*b%库函数计算结果
x=zeros(N,1);%迭代初始值
%-----(A=D-E-F)------
D=diag(diag(A));
E=-tril(A,-1);%下三角
F=-triu(A,1);%上三角
B=inv(D-E)*F;g=inv(D-E)*b;
eps=0.0001;%相邻解的距离小于该数时,结束迭代
%--------开始迭代-------
fork=1:
1000%最大迭代次数为100
fprintf('第%d次迭代:
',k);
y=B*x+g;
fprintf('\n与上次计算结果的距离(2范数):
%f?
\n',norm(x-y)^2);ifnorm(x-y)break;
end
x=y
end
x
运行结果:
(因为发散结果不能确定)
3.松弛迭代法
w=0.1;dalt=1.0e-5;
A=[12-2;111;221];
b=[111]';
r=size(b);a=b;
x0=zeros(3,1);
x=x0;
r=r
(1);m=0;e=1;
fort=1:
r
a(t)=A(t,t);
A(t,t)=0;
A(t,:
)=A(t,:
)/a(t);
end
b=b./a;
root=[0x']
whilee>dalt
root=m;
e=0;
fori=1:
r
t=x(i);
x(i)=(1-w)*x(i)+w*(b(i)-A(i,:
)*x);
root=[rootx(i)];
t=abs(x(i)-t);
ift>e
e=t;
end
end
root
m=m+1;
end
运行结果:
root=
184.0000-3.00013.00001.0000
例2:
(超松弛法)达到同样的精度10-5,松弛因子的不同,会使得收敛速度大大不同(w取1.0—1.9)
代码:
w=1;dalt=1.0e-5;
A=[4111;1-411;11-41;111-4];
b=[1;1;1;1];
r=size(b);a=b;
x0=zeros(4,1);
x=x0;
r=r
(1);m=0;e=1;
fort=1:
r
a(t)=A(t,t);
A(t,t)=0;
A(t,:
)=A(t,:
)/a(t);
end
b=b./a;
root=[0x']
whilee>dalt
root=m;
e=0;
fori=1:
r
t=x(i);
x(i)=(1-w)*x(i)+w*(b(i)-A(i,:
)*x);
root=[rootx(i)];
t=abs(x(i)-t);
ift>e
e=t;
end
end
root
m=m+1;
end
运行结果整理:
松弛因子
迭代次数
松弛因子
迭代次数
1.0
7
1.6
32
1.1
8
1.7
3368(不收敛)
1.2
10
1.8
1946(不收敛)
1.3
13
1.9
1372(不收敛)
1.4
17
1.5
23
例3:
用三种方法分别计算下列方程组并进行比较:
解:
雅克比迭代法
1)改写成等价形式
2)构造迭代公式,即为雅可比迭代公式
3)取初始向量,即代入上式,求出
依次迭代,计算结果如下表:
要求精度
迭代次数
方程组的近似解
0.01
7
(1.0994,1.1994,1.2993)
0.001
9
(1.0999,1.1999,1.2999)
0.0001
13
(1.1000,1.2000,1.3000)
高斯-赛德尔迭代法
1)原方程组改为等价方程组
2)构造迭代公式,即为高斯-赛德尔迭代公式
3)取初始向量,即代入上式,求出
迭代计算下去,得下表.
要求精度
迭代次数
方程组的近似解
0.01
4
(1.0931,1.1957,1.2978)
0.001
5
(1.0991,1.1995,1.2997)
0.0001
7
(1.1000,1.2000,1.3000)
超松驰迭代法(取松驰因子).
利用SOR方法,构造迭代公式
与高斯-赛德尔方法相同,初值为.迭代计算结果列于下表.
要求精度
迭代次数
方程组的近似解
0.01
5
(1.0986,1.1998,1.0331)
0.001
7
(1.0999,1.2000,1.2999)
0.0001
8
(1.1000,1.2000,1.3000)
代码:
1.雅可比迭代法
function[x,k]=jacobi(A,b,x0,esp)%k为迭
A=input('InputA=');
b=input('Inputb=');
x0=input('Inputx0=');
esp=1.0e-5;
k=0;
n=length(b);
x=x0;
whilemax(abs(b-A*x0))>esp&k<=500;fori=1:
n
sum=0;
forj=1:
n
ifj~=i
sum=sum+A(i,j)*x0(j);end
end
x(i)=(b(i)-sum)/A(i,i);end
x0=x;
k=k+1;
ifk>500
fprintf('迭代达到上限')
return
end
end
k
InputA=[10-1-2;-110-2;-1-15];
Inputb=[7.28.34.2]';
Inputx0=[000]'
运行结果:
k=
13
ans=
1.1000
1.2000
1.3000
2.高斯-赛德尔迭代法
clear;clc;
A=[1031;2-103;1310];
b=[14-514]';
N=length(b);%解向量的维数
fprintf('库函数计算结果:
');
x=inv(A)*b%库函数计算结果
x=zeros(N,1);%迭代初始值
%-----(A=D-E-F)------
D=diag(diag(A));
E=-tril(A,-1);%下三角
F=-triu(A,1);%上三角
B=inv(D-E)*F;g=inv(D-E)*b;
eps=0.0001;%相邻解的距离小于该数时,结束迭代
%--------开始迭代-------
fork=1:
100%最大迭代次数为100
fprintf('第%d次迭代:
',k);
y=B*x+g;
fprintf('\n与上次计算结果的距离(2范数):
%f?
\n',norm(x-y)^2);ifnorm(x-y)break;
end
x=y
end
x
运行结果:
k=
7
x=
1.0000
1.0000
1.0000
3.松弛迭代法
w=1.3;dalt=1.0e-2;
A=[10,-1,-2;-1,10,-2;-1,-1,5];
b=[7.2,8.3,4.2]';
r=size(b);a=b;
x0=zeros(3,1);
x=x0;
r=r
(1);m=0;e=1;
fort=1:
r
a(t)=A(t,t);
A(t,t)=0;
A(t,:
)=A(t,:
)/a(t);
end
b=b./a;
root=[0x']
whilee>dalt
root=m;
e=0;
fori=1:
r
t=x(i);
x(i)=(1-w)*x(i)+w*(b(i)-A(i,:
)*x);
root=[rootx(i)];
t=abs(x(i)-t);
ift>e
e=t;
end
end
root
m=m+1;
end
运行结果:
root=
0000
root=
00.93601.20071.6475
root=
1.00001.23961.30831.2602
root=
2.00001.06181.15221.2896
root=
3.00001.10251.21201.3069
root=
4.00001.10261.19851.2982
root=
5.00001.09861.19981.3001
例4:
用三种方法分别计算下列方程组并进行比较:
解:
雅克比迭代法
2)改写成等价形式
2)构造迭代公式,即为雅可比迭代公式
3)取初始向量,即代入上式,求出
依次迭代,计算结果如下表:
要求精度
迭代次数
方程组的近似解
0.01
21
(1.1986,1.3939,1.5977,0.7962)
0.001
32
(1.1996,1.3998,1.5994,0.7999)
0.0001
53
(1.2000,1.4000,1.6000,0.8000)
高斯-赛德尔迭代法
1)原方程组改为等价方程组
2)构造迭代公式,即为高斯-赛德尔迭代公式
3)取初始向量,即代入上式,求出
迭代计算下去,得下表.
要求精度
迭代次数
方程组的近似解
0.01
8
(1.1880,1.3843,1.5873,0.7936)
0.001
14
(1.1991,1.3988,1.5990,0.7995)
0.0001
19
(1.1999,1.3999,1.5999,0.7999)
超松驰迭代法(取松驰因子).
利用SOR方法,构造迭代公式
与高斯-赛德尔方法相同,初值为.迭代计算结果列于下表.
要求精度
迭代次数
方程组的近似解
0.01
6
(1.1961,1.3984,1.5987,0.7994)
0.001
8
(1.1998,1.4000,1.6002,0.8000)
0.0001
12
(1.2000,1.4000,1.6000,0.8000)
代码:
1.雅可比迭代法
function[x,k]=jacobi(A,b,x0,esp)%k为迭
A=input('InputA=');
b=input('Inputb=');
x0=input('Inputx0=');
esp=1.0e-2;
k=0;
n=length(b);
x=x0;
whilemax(abs(b-A*x0))>esp&k<=500;fori=1:
n
sum=0;
forj=1:
n
ifj~=i
sum=sum+A(i,j)*x0(j);end
end
x(i)=(b(i)-sum)/A(i,i);end
x0=x;
k=k+1;
ifk>500
fprintf('迭代达到上限')
return
end
end
k
InputA=[2-100;-12-10;0-12-1;00-12];
Inputb=[1010]';
Inputx0=[1111]'
运行结果:
k=
21
ans=
1.1986
1.3939
1.5977
0.7962
2.高斯-赛德尔迭代法
clear;clc;
A=[2-100;-12-10;0-12-1;00-12];
b=[1010]';
N=length(b);%解向量的维数
fprintf('库函数计算结果:
');
x=inv(A)*b%库函数计算结果
x=ones(N,1);%迭代初始值
%-----(A=D-E-F)------
D=diag(diag(A));
E=-tril(A,-1);%下三角
F=-triu(A,1);%上三角
B=inv(D-E)*F;g=inv(D-E)*b;
eps=0.01;%相邻解的距离小于该数时,结束迭代
%--------开始迭代-------
fork=1:
100%最大迭代次数为100
fprintf('第%d次迭代:
',k);
y=B*x+g;
fprintf('\n与上次计算结果的距离(2范数):
%f?
\n',norm(x-y)^2);ifnorm(x-y)break;
end
x=y
end
x
运行结果:
k=
8
x=
1.1880
1.3843
1.5873
0.7936
3.松弛迭代法
w=1.4;dalt=1.0e-2;
A=[2-100;-12-10;0-12-1;00-12];
b=[1010]';
r=size(b);a=b;
x0=ones(4,1);
x=x0;
r=r
(1);m=0;e=1;
fort=1:
r
a(t)=A(t,t);
A(t,t)=0;
A(t,:
)=A(t,:
)/a(t);
end
b=b./a;
root=[0x']
whilee>dalt
root=m;
e=0;
fori=1:
r
t=x(i);
x(i)=(1-w)*x(i)+w*(b(i)-A(i,:
)*x);
root=[rootx(i)];
t=abs(x(i)-t);
ift>e
e=t;
end
end
root
m=m+1;
end
运行结果:
root=
01.00001.00001.70000.7900
root=
1.00001.00001.49001.61600.8152
root=
2.00001.34301.47531.65690.8338
root=
3.00001.19551.40661.60550.7903
root=
4.00001.20641.40571.59500.8004
root=
5.00001.20141.39521.59890.7991
root=
6.00001.19611.39841.59870.7994
四、实验结果比较和分析
由例1可得,如果高斯-塞德尔迭代法不收敛,雅可比迭代法收敛,松弛法的迭代因子没取好,雅可比迭代法收敛更快。
由例2可得对于松弛法,不同的收敛因子,会得到不同的收敛结果。
由例3可得,如果雅可比迭代法和高斯-塞德尔迭代法同时收敛,松弛法的松弛因子选定较差,高斯-塞德尔迭代法的收敛速度比较快。
由例4可得,当松弛法的松弛因子取得比较好时,在三种方法同时收敛的情况下,松弛法收敛比较快。
五、成员分工:
组长:
谭孜任务:
查找资料,完善整个设计文档
成员:
李德辉任务:
上机操作,输出结果及调试
成员:
叶青青任务:
整篇文档的设计及部分代码的修改
成员:
琚超人任务:
整理完成结果分析
六、参考文献
[1]李庆扬、王能超、易大义《数值分析第5版》清华大学出版社
[2]宋岱才SOR迭代法的一个收敛性定理
[3