迭代法解线性方程组-数值分析实验报告 (1).doc

上传人:wj 文档编号:498827 上传时间:2023-04-29 格式:DOC 页数:22 大小:377.97KB
下载 相关 举报
迭代法解线性方程组-数值分析实验报告 (1).doc_第1页
第1页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第2页
第2页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第3页
第3页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第4页
第4页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第5页
第5页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第6页
第6页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第7页
第7页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第8页
第8页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第9页
第9页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第10页
第10页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第11页
第11页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第12页
第12页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第13页
第13页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第14页
第14页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第15页
第15页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第16页
第16页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第17页
第17页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第18页
第18页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第19页
第19页 / 共22页
迭代法解线性方程组-数值分析实验报告 (1).doc_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

迭代法解线性方程组-数值分析实验报告 (1).doc

《迭代法解线性方程组-数值分析实验报告 (1).doc》由会员分享,可在线阅读,更多相关《迭代法解线性方程组-数值分析实验报告 (1).doc(22页珍藏版)》请在冰点文库上搜索。

迭代法解线性方程组-数值分析实验报告 (1).doc

数学与计算科学学院

《数值分析》课程设计

题目:

迭代法解线性方程组

专业:

信息与计算科学

学号:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2