目录
1 原理
2 案例
3 代码
%高斯消元
function x = Guass(A,b)
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]
n = length(b);
for j=1:n
for i=j+1:n
if A(j,j)~=0
M(i,j)=A(i,j)/A(j,j);
for k=j:n
A(i,k)=A(i,k)-M(i,j)*A(j,k);
end
b(i)=b(i)-M(i,j)*b(j);
else
error('无法用高斯法求解')
end
end
end
x(n)=b(n)/A(n,n);
i=n-1;
while i>0
s=0;
for j=i+1:n
s=A(i,j)*x(j)+s;
end
x(i)=(b(i)-s)/A(i,i);
i=i-1;
end
%列主消元法:
function x = ColGuass(A,b)
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]
n = length(b);
for j=1:n
for i=j+1:n
for k=i:n
if abs(A(k,j))>abs(A(j,j))
for k1=j:n
a1=A(j,k1);
a2=A(k,k1);
A(j,k1)=a2;
A(k,k1)=a1;
end
t=b(k);
b(k)=b(j);
b(j)=t;
end
end
if A(j,j)~=0
M(i,j)=A(i,j)/A(j,j);
for k=j:n
A(i,k)=A(i,k)-M(i,j)*A(j,k);
end b(i)=b(i)-M(i,j)*b(j);
else
error('无法用列主元消去法求解')
end
end
end
x(n)=b(n)/A(n,n);
i=n-1;
while i>0
s=0;
for j=i+1:n
s=A(i,j)*x(j)+s;
end
x(i)=(b(i)-s)/A(i,i);
i=i-1;
end
format long
误差验证:
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];
x=[-0.181917777335808;-1.663030812834654;2.217228318359845;-0.446704218797852];%列主消元结果
b=[0.4043;0.1550;0.4240;-0.2557]
e1=A*x-b%列主消元误差
x2=[-0.181917777335807;-1.663030812834652;2.217228318359843;-0.446704218797852];%高斯消元结果
e2=A*x2-b%高斯消元误差
4 结果
5 总结与展望
把向量计算得到的解向量代入原方程,可以发现符合的还是比较好,这说明了列主元消去法计算这一类方程的有效性。 事实上,对于普通 Gauss 消去法的修正,还可以有行主元消去法,全主元消去法,但是 全主元消去法相当于行、列主元消去法的工作量要大的很多,所以列主元消去法是解线性方 程组实用的方法之一。如果使用按比例列主元消去法,效果会比列主元消去法更优越,尤其是方程组系数相差非常大的时候,而且按比列列主元消去法算法上相对而言也比较容易实现。