大型稀疏矩阵数值方法.docx

上传人:b****5 文档编号:7362101 上传时间:2023-01-23 格式:DOCX 页数:12 大小:61.83KB
下载 相关 举报
大型稀疏矩阵数值方法.docx_第1页
第1页 / 共12页
大型稀疏矩阵数值方法.docx_第2页
第2页 / 共12页
大型稀疏矩阵数值方法.docx_第3页
第3页 / 共12页
大型稀疏矩阵数值方法.docx_第4页
第4页 / 共12页
大型稀疏矩阵数值方法.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

大型稀疏矩阵数值方法.docx

《大型稀疏矩阵数值方法.docx》由会员分享,可在线阅读,更多相关《大型稀疏矩阵数值方法.docx(12页珍藏版)》请在冰豆网上搜索。

大型稀疏矩阵数值方法.docx

大型稀疏矩阵数值方法

 

《大型稀疏矩阵数值方法》课程设计

 

学院

专业

班级

姓名

学号

目录

1、问题的提出3

2、数学原理3

2.1Jacobi迭代法3

2.2Gauss-Seidol迭代法4

2.3SOR方法5

3、程序设计6

3.1Jacobi迭代法6

3.2Gauss-Seidel迭代法7

3.3SOR方法7

3.4主程序8

4、结果分析和讨论9

4.1Jacobi迭代法9

4.2Gauss-Seidel迭代法10

3.3SOR方法(精度取

)10

5、心得体会11

1、问题的提出

在阶数较大、系数阵为稀疏阵的情况下,可以采用迭代法求解线性方程组。

用迭代法(IterativeMethod)求解线性方程组的优点是方法简单,便于编制计算机程序,但必须选取合适的迭代格式及初始向量,以使迭代过程尽快地收敛。

迭代法根据迭代格式的不同分成雅可比(Jacobi)迭代、高斯-塞德尔(Gauss-Seidel)迭代和松弛(Relaxation)法等几种。

对下列线性方程组,试用Jacobi迭代法,Gauss-Seidol迭代法和SOR方法求解。

(1)

(2)

2、数学原理

2.1Jacobi迭代法

设线性方程组

(1)

的系数矩阵A可逆且主对角元素均

不为零,令

并将

分解成

从而

(1)可写成

其中

.

为迭代矩阵的迭代法(公式)

称为雅可比(Jacobi)迭代法,其分量形式为

其中

为初始向量.

2.2Gauss-Seidol迭代法

由雅可比迭代公式可知,在迭代的每一步计算过程中是用

的全部分量来计算

的所有分量,显然在计算第

个分量

时,已经计算出的最新分量

没有被利用。

把矩阵

分解成

其中

分别为

的主对角元除外的下三角和上三角部分,于是,方程组便可以写成

其中

为迭代矩阵构成的迭代法(公式)

称为高斯—塞德尔迭代法,用分量表示的形式为

其中

为初始向量.

2.3SOR方法

逐次超松弛迭代法是对高斯—赛德尔迭代的一种改进,在高斯—赛德尔迭代的基础上加入松弛因子

,使得

的误差

控制。

由高斯—赛德尔迭代公式:

得出SOR迭代算法:

,其中,

为松弛因子。

迭代的控制条件为:

得出SOR的计算公式为:

则存在,

则,

3、程序设计

3.1Jacobi迭代法

function[x2,k]=Jacobi(A,b,eps,num)

%用雅克比迭代法求解方程组Ax=b

%输入:

A为方程组的系数矩阵,b为方程组右端的列向量,nm为最大迭代次数,eps为误差精度

%输出:

x为求得的方程组的解构成的列向量,k为迭代次数[m,n]=size(A);

D=diag(diag(A));%求矩阵D

x1=zeros(m,1);

k=0;

G=eye(m)-inv(D)*A;%计算迭代矩阵

ifmax(abs(eig(G)))>1%谱半径大于1,迭代不收敛……

disp('谱半径大于1,迭代不收敛');

end

H=inv(D)*b;

whilek

k=k+1;%记录循环次数

x2=G*x1+H;%雅克比迭代公式

norm(x2-x1),

ifnorm(x2-x1)

disp('在最大迭代次数内收敛!

');

x2,

return;

end

x1=x2;

end

disp('在最大迭代次数内不收敛!

');

x2,

3.2Gauss-Seidel迭代法

function[x,k]=Gauss_Seidel(A,b,eps,num)

%用Gauss-Seidel迭代法求解方程组Ax=b

%输入:

A为方程组的系数矩阵,b为方程组右端的列向量,nm为最大迭代次数,eps为误差精度

%输出:

x为求得的方程组的解构成的列向量,k为迭代次数

[m,n]=size(A);

D=diag(diag(A));%求矩阵D

L=tril(A)-D;%求矩阵L

U=triu(A)-D;%求矩阵U

x1=zeros(m,1);

k=0;

G=inv(D-L)*U;%计算迭代矩阵

ifmax(abs(eig(G)))>1%谱半径大于1,迭代不收敛……

disp('谱半径大于1,迭代不收敛');

end

H=inv(D-L)*b;

whilek

k=k+1;%记录循环次数

x2=G*x1+H;%雅克比迭代公式

ifnorm(x2-x1)

disp('在最大迭代次数内收敛!

');

k,x2',

return;

end

x1=x2;

end

disp('在最大迭代次数内不收敛!

');

k,x2',

3.3SOR方法

function[x,k]=SOR(A,b,omega,eps,num)

%用SOR法求解方程组Ax=b

%输入:

A为方程组的系数矩阵,b为方程组右端的列向量,nm为最大迭代次数,eps为误差精度,omega松弛因子

%输出:

x为求得的方程组的解构成的列向量,k为迭代次数

[m,n]=size(A);

D=diag(diag(A));%求矩阵D

L=tril(A)-D;%求矩阵L

U=triu(A)-D;%求矩阵U

x1=zeros(m,1);

k=0;

fs=omega*inv(D-omega*L)*b;

bs=inv(D-omega*L)*((1-omega)*D+omega*U);

ifmax(abs(eig(bs)))>1%谱半径大于1,迭代不收敛……

disp('谱半径大于1,迭代不收敛');

end

whilek

k=k+1;%记录循环次数

x2=bs*x1+fs;%雅克比迭代公式

ifnorm(x2-x1)

disp('在最大迭代次数内收敛!

');

k,

return;

end

x1=x2;

end

disp('在最大迭代次数内不收敛!

');

k,

3.4主程序

clc;clear;

A1=[42-31210000;

86-5-3650100;

42-2-132-1031;

0-215-13-1194;

-426-167-3323;

86-8571726-35;

02-13-425301;

1610-11-917342-122;

462-713920124;

00-18-3-24-863-1;

];

b1=[51232346232619-21]';

maxnum=10^5;

fori=3:

5

disp('----------------------精度--------------------');

eps=10^(-i);

disp(eps);

disp('雅克比迭代法');

Jacobi(A1,b1,eps,maxnum);

disp('Gauss-Seidel方法');

Gauss_Seidel(A1,b1,eps,maxnum);

end

fori=8:

12

disp('----------------------松弛因子--------------------');

omega=i/10.0;

disp(omega);

disp('SOR方法');

SOR(A1,b1,omega,10^(-5),maxnum);

end

zeros9=zeros(9,1);

zeros10=zeros(1,10);

diag1=-1*eye(9);

tempU=[[zeros9,diag1];zeros10];

tempL=[zeros10;[diag1,zeros9]];

A2=4*eye(10)+tempU+tempL;

b2=[75-1326-1214-45-5]';

maxnum=10^5;

fori=3:

5

disp('----------------------精度--------------------');

eps=10^(-i);

disp(eps);

disp('雅克比迭代法');

Jacobi(A2,b2,eps,maxnum);

disp('Gauss-Seidel方法');

Gauss_Seidel(A2,b2,eps,maxnum);

end

fori=8:

12

disp('----------------------松弛因子--------------------');

omega=i/10.0;

disp(omega);

disp('SOR方法');

SOR(A2,b2,omega,10^(-5),maxnum);

end

4、结果分析和讨论

4.1Jacobi迭代法

精度

方程组

方程组一谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛

方程组二121519

结果分析:

(1)、对于方程组一,通过计算,因谱半径大于1,迭代不收敛,不可使用Jacobi迭代法求解。

(2)、对于方程组一,因谱半径小于1,迭代收敛。

同时可以发现:

随着精度要求的提高,迭代次数提高。

4.2Gauss-Seidel迭代法

精度

方程组

方程组一谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛

方程组二91113

结果分析:

(1)、对于方程组一,通过计算,因谱半径大于1,迭代不收敛,不可使用Jacobi迭代法求解。

(2)、对于方程组一,因谱半径小于1,迭代收敛。

同时可以发现:

随着精度要求的提高,迭代次数提高。

3.3SOR方法(精度取

松弛因子

方程组0.80.91.01.11.2方程组一谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛谱半径大于1,迭代不收敛方程组二1916131113结果分析:

(1)、对于方程组一,通过计算,因谱半径大于1,迭代不收敛,不可使用Jacobi迭代法求解。

(2)、对于方程组一,因谱半径小于1,迭代收敛。

同时可以发现:

当松弛因子取1.1时,迭代次数较小。

(3)、综上可得:

SOR方法的迭代次数最少。

5、心得体会

本次试验涉及到了用Jacobi迭代法,Gauss-Seidol迭代法和SOR方法3种方法。

需要对这些方法的原理都要掌握才能写出程序,由于理论知识的欠缺,我花了很大一部分时间在看懂实验的原理上,看懂了实验原理之后就开始根据原理编写程序,程序中还是出现了很多的低级错误导致调试很久才能运行。

通过这次试验使我深刻的体会到理论知识的重要性,没有理论知识的支撑是写不出程序来的。

写程序时还会犯很多低级的错误,以后一定要加强理论知识的学习,减少编程时低级错误的产生。

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

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1