目录
3 习题三
3.1 题目
给定方程组
(1)编写Gauss消元法程序解所给的方程组;
(2)编写列主元素消去法程序解所给的方程组,并与(1)比较结果。
3.2 问题背景
许多实际问题的模型最终需归结为求解线性方程组,例如数值天气预报,为赶上每天发布天气预报 的需要,只有几个小时的计算时间。如何快速有效地求解线性方程组是科学与工程计算的核心问题之一。 线性方程组的主要解法有直接法和迭代法。迭代法采用逐次逼近的方法,即从一个初始近似解开始, 逐步地接近精确解,直到满足精度为止;直接法是指在没有舍入误差地情况下经过有限次
运算可求得方 程组精确解的方法。对于系数矩阵为大型系数矩阵的线性方程组,一般采用迭代法;系数矩阵为低阶稠 密型矩阵的线性方程组,一般采用直接法计算。高斯消元法是最常用的求解线性方程组的直接解法,其基本思想就是线性代数中的消去法,逐个求 解未知数的办法。高斯消元法是在较强条件下,即各主元 a(ii) ≠ 0,(i = 1, 2, · · · , n)。当其中一个主元为 0 便无法进行下去,此外,高斯消元法存在数值不稳定性,因而,在每一步消元前增加一个选主元的过程, 即在每次消元时选择最大的元素作为主元,该方法称为 Gauss 列主元素消元法。
3.3 算法
由于高斯列主元素消元法与高斯消元法的不同点,仅仅在于在每次消元前按列选择主元,故算法讲解以高斯列主元素消元法为主,使用高斯消元法时不需要选主元。
设有线性方程组
Ax=b
其中,A 为非奇异矩阵。方程组的增广矩阵为
3.4 matlab编程实现
(将函数文件放在与主程序同一个文件夹下,然后运行主程序)
(1)高斯消元法
主程序:
clear;
A=[0.4096 0.1234 0.3678 0.2943;0.2246 0.3872 0.4015 0.1129;0.3645 0.1920 0.3781 0.0643;0.1784 0.4002 0.2786 0.3927];
b=[0.4043;0.1550;0.4240;-0.2557];
%课本例题测试数据:A=[1 -1 1;-3 1 -2;3 1 -1];b=[2;6;12];
disp('方程组的等价增广矩阵A1和方程的解分别为:');
[A1,x]= gauss(A,b)
函数:
function [A1,x]= gauss(A,b)
%高斯消元法
n=length(b);
x=zeros(n,1);
for j=1:(n-1)
%依照行顺序,用对角线以下的行向量减去主元所在行
for i=(j+1):n
l=A(i,j)/A(j,j);
b(i)=b(i)-l*b(j);
for k=1:n
A(i,k)=A(i,k)-l*A(j,k);
end
end
end
A1=[A b];%保存局部变量-等价变换后的增广矩阵
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
%对等价方程组回代求解
sum=0;
for j=i+1:n
sum=sum+A(i,j)*x(j);
end
x(i)=(b(i)-sum)/A(i,i);
end
end
(2)高斯列主元素消元法
主程序:
clear;
A=[0.4096 0.1234 0.3678 0.2943;0.2246 0.3872 0.4015 0.1129;0.3645 0.1920 0.3781 0.0643;0.1784 0.4002 0.2786 0.3927];
b=[0.4043;0.1550;0.4240;-0.2557];
%课本例题测试数据1:A=[1 -1 1;-3 1 -2;3 1 -1];b=[2;6;12];
%课本例题测试数据2:A=[2 0 5;2 -1 3;2 -1 1];b=[5;3;1];
disp('方程组的等价增广矩阵A2和方程的解分别为:');
[A2,x]= maingauss(A,b)
%返回值A2为等价上三角增广矩阵,x为方程组的数值解
函数:
function [A2,x]= maingauss(A,b)
%列主元素消去法
n=length(b);
x=zeros(n,1);m=0;
for j=1:(n-1)
%依照列顺序消元,化系数矩阵为上三角矩阵
for k=n:2
%选主元
bottom=abs(A(k,j));m=k;
up=abs(A(k-1,j));
if bottom>up
m=k;
else
m=k-1;
end
end
if m>j
%若主元非对角线元素,则需要换行
max_r=A(m,1:n);
A(m,1:n)=A(j,1:n);
A(j,1:n)=max_r;
max_b=b(m);
b(m)=b(j);
b(j)=max_b;
end
for i=(j+1):n
%依照行顺序,用对角线以下的行向量减去主元所在行
l=A(i,j)/A(j,j);
b(i)=b(i)-l*b(j);
for k=1:n
A(i,k)=A(i,k)-l*A(j,k);
end
end
end
A2=[A b];%保存局部变量-等价变换后的增广矩阵
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
%对等价方程组回代求解
sum=0;
for j=i+1:n
sum=sum+A(i,j)*x(j);
end
x(i)=(b(i)-sum)/A(i,i);
end
end
3.5 结果展示
(1)高斯消元法
>> work3
方程组的等价增广矩阵A1和方程的解分别为:
A1 =
0.4096 0.1234 0.3678 0.2943 0.4043
0 0.3195 0.1998 -0.0485 -0.0667
0 0 -0.0982 0.3171 -0.3595
0 0 0 -0.1871 0.0836
x =
-0.1819
-1.6630
2.2172
-0.4467
(2)高斯列主元消元法
>> work3
方程组的等价增广矩阵A2和方程的解分别为:
A2 =
0.4096 0.1234 0.3678 0.2943 0.4043
-0.0000 0.3195 0.1998 -0.0485 -0.0667
0.0000 0 -0.0006 -0.1851 0.0814
-0.0000 0 0.0000 30.7245 -13.7248
x =
-0.1819
-1.6630
2.2172
-0.4467
3.6 讨论
针对于本题,变换过程中的各主元皆满足 a(ii) ≠ 0,因此高斯消元法与高斯列主元消元法同样能计算出正确结果,二者变换得到的增广矩阵A1与A2不同但等价,不影响计算结果。