常微分方程的解线性方程组的迭代法.docx
《常微分方程的解线性方程组的迭代法.docx》由会员分享,可在线阅读,更多相关《常微分方程的解线性方程组的迭代法.docx(23页珍藏版)》请在冰豆网上搜索。
常微分方程的解线性方程组的迭代法
实验五解线性方程组的迭代法
【实验内容】
对1、设线性方程组
2、设对称正定系数阵线性方程组
3、三对角形线性方程组
试分别选用Jacobi迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
【实验方法或步骤】
1、体会迭代法求解线性方程组,并能与消去法加以比较;
2、分别对不同精度要求,如
由迭代次数体会该迭代法的收敛快慢;
3、对方程组2,3使用SOR方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
程序:
用雅可比方法求的程序:
function[x,n]=jacobi(A,b,x0,eps,varargin)
ifnargin==3
eps=1.0e-6;
M=200;
elseifnargin==5
M=varargin{1};
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
x=B*x0+f;
n=1;
whilenorm(x-x0)>=eps
x0=x;
x=B*x0+f;
n=n+1;
if(n>=M)
diso('不收敛!
')
return;
end
end
解1的程序为A=[42-3-1210000;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;],b=[51232346133819-21]'
A=
Columns1through4
42-3-1
86-5-3
42-2-1
0-215
-426-1
86-85
02-13
1610-11-9
462-7
00-18
Columns5through8
2100
6501
32-10
-13-11
67-33
71726
-4253
17342-1
13920
-3-24-86
Columns9through10
00
00
31
94
23
-35
01
22
124
3-1
b=
5
12
3
2
3
46
13
38
19
-21
>>x0=ones(10,1);
>>[x,n]=Jacobi(A,b,x0)
得到的结果为Warning:
FunctioncallJacobiinvokesinexactmatchd:
\MATLAB7\work\jacobi.m.
不收敛!
x=
1.0e+124*
-0.1794
-0.3275
-0.7094
1.5990
1.0311
0.3291
0.2464
4.3905
0.4927
-2.6574
n=
200即迭代了200次而且可能不收敛
A=
42-404200
22-121320
-4-1141-8-356
0-216-1-4-33
21-8-1224-10-3
43-3-44111-4
025-3-101142
0063-3-4219
b=0
-6
20
23
9
-22
-15
45
>>x0=ones(8,1);
>>[x,n]=Jacobi(A,b,x0)
不收敛!
x=
1.0e+047*
0.9627
1.0084
-0.4954
-0.5979
0.3097
0.6872
-0.0666
-0.2629
n=200此方程可能不收敛
A=[4-100000000;-14-10000000;0-14-1000000;00-14-100000;000-14-10000;0000-14-1000;00000-14-100;000000-14-10;0000000-14-1;00000000-14;],b=[75-1326-1214-45-5]'
A=
Columns1through5
4-1000
-14-100
0-14-10
00-14-1
000-14
0000-1
00000
00000
00000
00000
Columns6through10
00000
00000
00000
00000
-10000
4-1000
-14-100
0-14-10
00-14-1
000-14
b=
7
5
-13
2
6
-12
14
-4
5
-5
>>x0=ones(10,1);
>>[x,n]=Jacobi(A,b,x0)
x=
2.0000
1.0000
-3.0000
0.0000
1.0000
-2.0000
3.0000
0.0000
1.0000
-1.0000
n=22得到结果为迭代了22次得到近似解为x=2.00001.0000-3.00000.00001.0000-2.00003.00000.00001.0000-1.0000
用高斯赛德尔源程序
function[x,n]=gauseidel(A,b,x0,eps,M)
ifnargin==3
eps=1.0e-6;
M=200;
elseifnargin==4
M=200;
elseifnargin<3
error
return;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
G=(D-L)\U;
f=(D-L)\b;
x=G*x0+f;
n=1;
whilenorm(x-x0)>=eps
x0=x;
x=G*x0+f;
n=n+1;
if(n>=M)
disp('Warning:
不收敛!
');
return;
end
end
解上面3个方程组的程序分别为
第一个方程A=[42-3-1210000;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;],b=[51232346133819-21]'
A=
42-3-1210000
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
b=
5
12
3
2
3
46
13
38
19
-21
x0=zeros(10,1);
>>[x,n]=gauseidel(A,b,x0)
Warning:
不收敛!
x=
1.0e+247*
0.0165
-0.0271
0.2202
-0.4576
-0.5951
0.3138
-0.4381
2.2450
0.0413
7.4716
n=200即迭代200次后此方程可能不收敛
方程2的程序为A=[42-404200;22-121320;-4-1141-8-356;0-216-1-4-33;21-8-1224-10-3;43-3-44111-4;025-3-101142;0063-3-4219;],b=[0-620239-22-1545]'
A=
42-404200
22-121320
-4-1141-8-356
0-216-1-4-33
21-8-1224-10-3
43-3-44111-4
025-3-101142
0063-3-4219
b=
0
-6
20
23
9
-22
-15
45
>>x0=zeros(8,1);
>>[x,n]=gauseidel(A,b,x0)
x=
3.5441
-4.8877
1.9482
0.4525
1.4283
-1.1606
-0.1081
1.6743
n=
44即在迭代44次后可求的方程的近似解
第3个的程序为>>A=[4-100000000;-14-10000000;0-14-1000000;00-14-100000;000-14-10000;0000-14-1000;00000-14-100;000000-14-10;0000000-14-1;00000000-14;],b=[75-1326-1214-45-5]'
A=
4-100000000
-14-10000000
0-14-1000000
00-14-100000
000-14-10000
0000-14-1000
00000-14-100
000000-14-10
0000000-14-1
00000000-14
b=
7
5
-13
2
6
-12
14
-4
5
-5
>>x0=zeros(10,1);
>>[x,n]=gauseidel(A,b,x0)
x=
2.0000
1.0000
-3.0000
-0.0000
1.0000
-2.0000
3.0000
-0.0000
1.0000
-1.0000
n=12在迭代12次后得到方程的近似解
用超松弛迭代的源程序为function[x,n]=SOR(A,b,x0,w,eps,M)
ifnargin==4
eps=1.0e-6;
M=200;
elseifnargin<4
error
return
elseifnargin==5
M=200;
end
if(w<=0||w>=2)
error;
return;
end
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=B*x0+f;
n=1;
whilenorm(x-x0)>=eps
x0=x;
x=B*x0+f;
n=n+1;
if(n>=M)
disp('Warning:
不收敛!
');
return;
end
end
解第一个方程组选取抄松弛因子为1程序为:
A=[42-3-1210000;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;],b=[51232346133819-21]'
A=
42-3-1210000
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
b=
5
12
3
2
3
46
13
38
19
-21
x0=[0000000000]';
[x,n]=SOR(A,b,x0,1)
Warning:
不收敛!
x=
1.0e+247*
0.0165
-0.0271
0.2202
-0.4576
-0.5951
0.3138
-0.4381
2.2450
0.0413
7.4716
n=
200迭代次数太多可能不收敛
解第2个的程序为A=[42-404200;22-121320;-4-1141-8-356;0-216-1-4-33;21-8-1224-10-3;43-3-44111-4;025-3-101142;0063-3-4219;],b=[0-620239-22-1545]'
A=
42-404200
22-121320
-4-1141-8-356
0-216-1-4-33
21-8-1224-10-3
43-3-44111-4
025-3-101142
0063-3-4219
b=
0
-6
20
23
9
-22
-15
45
>>x0=[00000000]';
[x,n]=SOR(A,b,x0,0.8)
x=
3.5441
-4.8877
1.9482
0.4525
1.4283
-1.1606
-0.1081
1.6743
n=
52得到结果为迭代了52次得到近似解松弛因子为0.8
[x,n]=SOR(A,b,x0,0.9)
x=
3.5441
-4.8877
1.9482
0.4525
1.4283
-1.1606
-0.1081
1.6743
n=
47得到结果为迭代了47次得到近似解松弛因子为0.9
>[x,n]=SOR(A,b,x0,1)
x=
3.5441
-4.8877
1.9482
0.4525
1.4283
-1.1606
-0.1081
1.6743
n=
44得到结果为迭代了44次得到近似解松弛因子为1.0
解第3个的程序为>>A=[4-100000000;-14-10000000;0-14-1000000;00-14-100000;000-14-10000;0000-14-1000;00000-14-100;000000-14-10;0000000-14-1;00000000-14;],b=[75-1326-1214-45-5]'
A=
4-100000000
-14-10000000
0-14-1000000
00-14-100000
000-14-10000
0000-14-1000
00000-14-100
000000-14-10
0000000-14-1
00000000-14
b=
7
5
-13
2
6
-12
14
-4
5
-5
>>x0=[0000000000]';
>>[x,n]=SOR(A,b,x0,0.8)
x=
2.0000
1.0000
-3.0000
-0.0000
1.0000
-2.0000
3.0000
-0.0000
1.0000
-1.0000
n=19即迭代了19次得到方程的近似解松弛因子为0.8
>>[x,n]=SOR(A,b,x0,0.9)
x=
2.0000
1.0000
-3.0000
-0.0000
1.0000
-2.0000
3.0000
-0.0000
1.0000
-1.0000
n=16即迭代了16次得到方程的近似解松弛因子为0.9
[x,n]=SOR(A,b,x0,1)
x=
2.0000
1.0000
-3.0000
-0.0000
1.0000
-2.0000
3.0000
-0.0000
1.0000
-1.0000
n=12即迭代了12次得到方程的近似解松弛因子为1
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)