西京学院数学软件实验任务书
实验一实验报告
一、实验名称:线性方程组高斯消去法。
二、实验目的:进一步熟悉理解Guass消元法解法思路,提高matlab编程能力。
三、实验要求:已知线性方程矩阵,利用软件求解线性方程组的解。
四、实验原理:
消元过程:
设,令乘数,做(消去第i个方程组的)操作×第1个方程+第i个方程(i=2,3,.....n)
则第i个方程变为
这样消去第2,3,。。。,n个方程的变元后。原线性方程组变为:
这样就完成了第1步消元。
回代过程:
在最后的一方程中解出,得:
再将的值代入倒数第二个方程,解出,依次往上反推,即可求出方程组的解:
其通项为
五、实验内容:
function maintest2
clc
clear all
A=[1 3 4;2 4 5;1 4 6];%系数矩阵
b=[1 7 6]'%常数项
num=length(b)
for k=1:num-1
for i=k+1:num
if A(k,k)~=0
l=A(i,k)/A(k,k);
A(i,:)=A(i,:)-A(k,:).*l;
b(i)=b(i)-b(k)*l;
end
end
end
A
b
%回代求x
x(num)=b(num)/A(num,num);
for i=num-1:-1:1
sum=0;
for j=i+1:num
sum=sum+A(i,j)*x(j);
end
x(i)=(b(i)-sum)/A(i,i);
end
x
End
六、实验结果:
A =
1.0000 3.0000 4.0000
0 -2.0000 -3.0000
0 0 0.5000
b =
1.0000
5.0000
7.5000
x =
16 -25 15
第二篇:消元法实验报告8
西京学院数学软件实验任务书
实验1
线性方程组高斯消去法
高斯顺序消去法是一种古老的求解线性方程组的方法,对于线性方程组,作如下运算不会改变方程组的解:
1) 交换任意两个方程的顺序。
2) 方程中组任一方程乘上一个非零数。
3) 方程组中任一方程加上另一个方程的倍数。
这是高斯消元的理论依据。
实验内容及数据来源
用列主元消去法计算方程组
实验步骤
步骤一:编写列主元消去法的程序。
打开 Editor 编辑器,输入以下语句:
function maintest2
clc
clear all
%num=input('please input the order n=')
%A=zeros(num,num);
%for i=1:num
% for j=1:num
% A(i,j)=input('');
% end
%end
%A
%if det(A)~=0
%for i=1:num
% b(i)=input('');
%end
%b=b'
A=[1 2 3;1 3 5;1 3 6];%系数矩阵
b=[2 3 4]'%常数项
num=length(b)
for k=1:num-1
for i=k+1:num
if A(k,k)~=0
l=A(i,k)/A(k,k);
A(i,:)=A(i,:)-A(k,:).*l;
b(i)=b(i)-b(k)*l;
end
end
end
A
B
%回代求x
x(num)=b(num)/A(num,num);
for i=num-1:-1:1
sum=0;
for j=i+1:num
sum=sum+A(i,j)*x(j);
end
x(i)=(b(i)-sum)/A(i,i);
end
x
end
运算结果
A =
1 2 3
0 1 2
0 0 1
b =
2
1
1
x =
1 -1 1
实验结论
高斯消元能很好的求解线性方程组,和用克莱姆法则求解方程组该算法简单而且计算次数少。但是高斯顺序消元是有缺陷的,它并没有考虑主对角元素相对其他同列元素绝对值很小,有时会导致用绝对值较小的数字做分母而出现较大的数字与较小数字进行相加减运算而被“吞掉”的现象,以至于产出某一未知元较小的误差却引起其他元更大的误差。
实验2
列主元消去法计算线性方程组
高斯顺序消元法最后指出了在逐次消元过程中,如果主对角元素相对其他同列元素绝对值很小,有时会导致用绝对值较小的数字做分母而出现较大的数字与较小数字进行相加减运算而被“吞掉”的现象,以至于产出某一未知元较小的误差却引起其他元更大的误差。
为了使消元过程中见效舍入误差和不至于中断,我们可以不按照自然顺序进行消元。事实上,在第步消元的时候,我们不一定选取作为主元,而从同列中选择绝对值最大的作为主元素,即使
如此我们就得到了列主元消去法。
实验内容及数据来源
用列主元消去法计算方程组
实验步骤
步骤一:编写列主元消去法的程序。
打开 Editor 编辑器,输入以下语句:
function maintest
clc
clear all
n=input('please input the order n=')
A=zeros(n,n);
for i=1:n
for j=1:n
A(i,j)=input('');
end
end
A
if det(A)~=0
for i=1:n
b(i)=input('');
end
b=b'
zengguang=[A,b]
for k=1:n-1
% %取出各列绝对值最大的放在上面作为主元
[Y,j]=max(abs(zengguang(k:n,k)));
C=zengguang(k,:);
zengguang(k,:)= zengguang(j+k-1,:);
zengguang(j+k-1,:)=C;
%高斯消元
for i=k+1:n
m= zengguang(i,k)/ zengguang(k,k);
zengguang(i,k:n+1)= zengguang(i,k:n+1)-m* zengguang(k,k:n+1);
end
end
end
%回代求x
b=zengguang(1:n,n+1);
A=zengguang(1:n,1:n);
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
x
end
把文件以maintest.m为文件名保存。
步骤二:解方程。在命令窗口输入:
please input the order n=3
并且输入系数矩阵
A =
1 2 3
1 3 5
1 3 6
输入常数项为
b =
2
3
4
得到增广矩阵为:
zengguang =
1 2 3 2
1 3 5 3
1 3 6 4
运行结果得到
x =
1 -1 1
实验结论
把向量计算得到的解向量代入原方程,可以发现符合的还是比较好的。这说明了列主元消去法计算这一类方程的有效性。事实上,对于普通Gauss消去法的修正,还可以有行主元消去法,全主元消去法。但是全主元消去法相对于行、列主元消去法的工作量要大的多。所以列主元消去法是解线性方程组实用的方法之一。
实验3
高斯全主元消去法解线性方程组
全主元消去法是对于一般的矩阵,每一步都要处理的矩阵中选取绝对值最大的元素最为主元,从而使高斯消去具有更好的数值稳定性的方法。
实验内容及数据来源
用高斯全主元消去法计算方程组
实验步骤
步骤一:编写求上三角矩阵线性方程组的函数。
打开 Editor 编辑器,输入以下语句:
function x=SolveUpTriangle(A,b)
%求上三角系数矩阵的线性方程组Ax=b的解
%线性方程组的系数矩阵:A
%线性方程组中的常数向量:b
%线性方程组的解:x
N=size(A);
n=N(1);
for i=n:-1:1
if (i<n)
s=A(i,(i+1):n)*x((i+1):n,1);
else
s=0;
end
x(i,1)=(b(i)-s)/A(i,i);
end
把文件以SolveUpTriangle.m为文件名保存。
步骤二:编写高斯全主元消去的算法。
打开 Editor 编辑器,输入以下语句:
clc
clear all
%利用高斯全主元消去法求AX=b方程组的解
A=[3 2 0 0;1 4 2 0;0 1 2 1;0 0 -1 1]
b=[5 7 2 -2]'
N=size(A);
n = N(1);
index_l = 0;
index_r = 0;
order = 1:n; %记录未知数顺序的向量
for i=1:(n-1)
me = max(max(abs(A(i:n,i:n)))) %选取全主元
for k=i:n
for r=i:n
if(abs(A(k,r))==me)
index_l = k;
index_r = r; %保存主元所在的行和列
k=n;
break;
end
end
end
temp = A(i,1:n);
A(i,1:n) = A(index_l,1:n);
A(index_l,1:n) = temp;
bb = b(index_l);
b(index_l)=b(i);
b(i) = bb; %交换主行
temp = A(1:n,i);
A(1:n,i) = A(1:n,index_r);
A(1:n,index_r) = temp; %交换主列
pos = order(i);
order(i) = order(index_r);
order(index_r) = pos; %主列的交换会造成未知数顺序的变化
for j=(i+1):n
if(A(i,i)==0)
disp('对角元素为0!');
return;
end
l = A(j,i);
m = A(i,i);
A(j,1:n)=A(j,1:n)-l*A(i,1:n)/m
b(j)=b(j)-l*b(i)/m
end
end
x=SolveUpTriangle(A,b); %调用上三角系数矩阵求线性方程组的函数
y=zeros(n,1);
for i=1:n
for j=1:n
if(order(j)==i)
y(i)=x(j);
end
end
end %恢复未知数原来的顺序
x=y;
XA = A;
x
把文件以GaussQuanzhuyuan.m为文件名保存。
运行上面这段程序得到计算结果:
A =
4.0000 1.0000 2.0000 0
0 2.5000 -1.0000 0
0 0 1.4000 1.0000
0 0 0 1.7143
b =
7.0000
1.5000
0.4000
-1.7143
x =
1.0000
1.0000
1.0000
-1.0000
实验结论
虽然全主元消去法的求解结果更加可靠,高斯消去具有更好的数值稳定性。但是由于全选主元每步消耗的时间更多,而且要进行列交换,那么所求未知量x1,x2,……xn的顺序就会被打乱,因此,时间应用中一般使用列主元消去法。