线性方程组的数值解法
实验
题目
用Gauss消元法和Seidel迭代法求线性方程组的解。
实验目的
通过本次实验了解Gauss消元法和Seidel迭代法的基本原理,掌握其算法,学会用Matlab编程进行计算,并能用这些方法解决实际问题。
Gauss 顺序消元法的基本原理算法:
(1)输入:,.
A b
(2)对1,2,,1
k n
=⋅⋅⋅-做
1)if0
kk
a=then输出算法失败信息,停机;
2)对1,,
i k n
=+⋅⋅⋅做
1/;
ik ik ik kk
a l a a
←=
2;
i i ik k
b b l b
=-
3对1,,
j k n
=+⋅⋅⋅做;
ij ij ik kj
a a l a
=-
(3)if0
nn
a=then输出算法失败信息,并停机else做
1)/;
n n n nn
b x b a
←=
2)对1,,2,1
i n
=-⋅⋅⋅做
1
()/;
n
i i i ij j ii
j i
b x b a x a
=+
←=-∑
(4)输出方程组的解.X
流程图见附页
Seidel 迭代法的基本原理算法:
(1)输入:,;
A b
(2)输入:初始解向量
;x
(3)对1,2,,
i n
=⋅⋅⋅做
1)
1
()/;
n
i i ij j ii
j
j i
y b a x a
=
≠
=-∑
2);
i i i
e y x
=-
3);
i i
x y
=
(4)if
1
{||}
max i
i n
eε
≤≤
<then输出:(1,2,,),
i
x i n
=⋅⋅⋅停机;else返回第(3)步。
Gauss 顺序消元法的实验步骤步骤:
(1)利用Gauss顺序消元法设计主程序:
①根据RB RA
-的值判断方程组是否有解,当RB RA
>时方程组无解,当RB RA n
==时方程组有唯一解,当RB RA n
=<时,方程组有无穷多解;
②根据公式
(1)()()
(1)()()
(,1,,)
(1,,)
k k k
ij ij ik kj
k k k
i i ik k
a a l a i j k n
b b l b i k n
+
+
=-=+⋅⋅⋅
=-=+⋅⋅⋅
将增广矩阵[,]
B A b
=化为上三角形矩阵;
(2)建立.
backsub m文件;
(3)调用.
backsub m文件,在Matlab命令窗口输入,A b矩阵,再输入[,,,](,)
RA RB n X gaus A b
=,进行Matlab实现得出方程的解。
Seidel 迭代法的实验步骤步骤:
(1)利用Seidel迭代法设计主程序:
①确定精确度;ε
②当<
err relerr
εε
<或时,
(ⅰ)若=1,
j则 X(1)=(b(1)-A(1,2:n)*P(2:n))/A(1,1);
(ⅱ)若=,
j n则 X(n)=(b(n)-A(n,1:n-1)*(X(1:n-1))')/A(n,n);
(ⅲ)对于2,3,,1
j n
=⋅⋅⋅-
X(j)=(b(j)-A(j,1:j-1)*X(1:j-1)'-A(j,j+1:n)*P(j+1:n))/A(j,j);
(2)在Matlab命令窗口输入
,,
A b x矩阵,再输入
(,,,0.0005,15)
Seidel A b x,进行Matlab实现得出方程的解,输出X。
Gauss 顺序消元法的Matlab 原代码
Gauss 顺序消元法的实验结果在Matlab命令窗口输入:
A=[-2 1 1;1 -2 1;1 1 -2] ;
[1;2;4];
b=-
[,,,](,)
RA RB n X gaus A b
=
A=[1 1 1;1 1 1;1 1 1] ;
[1;1;1];
b=
[,,,](,)
RA RB n X gaus A b
=
结果显示:
在Matlab命令窗口输入:
A=[2 1 1;1 2 1;1 1 2] ;
b=
[1;2;4];
=
[,,,](,)
RA RB n X gaus A b 结果显示:
Gauss 顺序消元法的数据实现求线性方程组
123
123
123
21
22
24
x x x
x x x
x x x
++=
++=
++=
的解.
解:32
21
31
1
1
3
2
1
2
21112111 2111
313313 [|]121200
222222 1124
1374
0003
2223
r r
r r
r r
A b
-
-
-
⎛⎫
⎛⎫
⎪
⎪
⎛⎫ ⎪
⎪
⎪ ⎪
⎪
= ⎪
⎪
⎪
⎪ ⎪
⎪
⎝⎭
⎪
⎪
⎝⎭⎝⎭
→→
123
21
x x x
++=
即方程组同解变形为
23
313
222
x x
+=
3
4
3
3
x=
解得:
1
2
3
3
0.75
4
1
0.25
4
9
2.25
4
x
x
x
=-=-
==
==
即
0.75
0.25
2.25
X
-⎛⎫
⎪
= ⎪
⎪
⎝⎭
Seidel 迭代法的Matlab 原代码
Seidel 迭代法的实验结果在Matlab命令窗口输入:
A=[2 1 1;1 2 1;1 1 2] ;
[1;2;4];
b=
[0;0;0];
x=
(,,,0.0005,15)
Seidel A b x
结果显示:
Seidel 迭代法的数据实现Seidel迭代法格式为
(1)()()
123
(1)(1)()
213
(1)(1)(1)
312
0.50.50.5
0.50.51
0.50.52
k k k
k k k
k k k
x x x
x x x
x x x
+
++
+++
=--+
=--+
=--+
33
0.408648635100.510
err--
=⨯<⨯
故
0.749782071
0.249850504
2.249965784
X
-⎡⎤
⎢⎥
=⎢⎥
⎢⎥
⎣⎦
k
1
x
2
x
3
x 0000
10.512
21-0.5 2.25
30.875
-0.3125 2.28125
40.796875
-0.2578125 2.26953125
50.763671875
-0.247070312 2.258300782
60.752685547
-0.247192382 2.252746583
70.749969482
-0.248611449 2.250679017
80.749645233
-0.249483108 2.250081063
90.749782071
-0.249850504 2.249965784
实验分析Gauss消元法适用于中、小规模的线性方程组,运算量小,效率高,可以求精确解。
Seidel迭代法占存储单元少,程序设计简单,原始系数矩阵在迭代过程中不变,Seidel迭代法收敛速度较Jacobi迭代法较快。
但是,Gauss消元法和Seidel迭代法都具有局限性,Gauss消元法对于大型线性方程组很难求解,Seidel
迭代法受收敛性的局限且收敛速度慢。
实验小结
本次实验学习到了Gauss消元法和Seidel迭代法解线性方程组的基本原理,掌握了用Gauss消元法和Seidel迭代法进行Matlab编程。
同时了解到Matlab在处理用Gauss消元法和Seidel 迭代法求方程组解的问题上非常的方便,程序简单,容易掌握;Gauss消元法程序比Seidel迭代法程序较复杂,但Seidel迭代法得到的是近似解,且受收敛性和收敛速度的局限。
流程图:。