大型稀疏矩阵数值方法.docx
《大型稀疏矩阵数值方法.docx》由会员分享,可在线阅读,更多相关《大型稀疏矩阵数值方法.docx(12页珍藏版)》请在冰豆网上搜索。
大型稀疏矩阵数值方法
《大型稀疏矩阵数值方法》课程设计
学院
专业
班级
姓名
学号
目录
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;
whilekk=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;
whilekk=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
whilekk=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种方法。
需要对这些方法的原理都要掌握才能写出程序,由于理论知识的欠缺,我花了很大一部分时间在看懂实验的原理上,看懂了实验原理之后就开始根据原理编写程序,程序中还是出现了很多的低级错误导致调试很久才能运行。
通过这次试验使我深刻的体会到理论知识的重要性,没有理论知识的支撑是写不出程序来的。
写程序时还会犯很多低级的错误,以后一定要加强理论知识的学习,减少编程时低级错误的产生。