高斯消去法利用了代数方程求解中的消元思想,通过将增广矩阵化为倒三角形式进行迭代求解,是非常简单的求解算法。
三角分解法(LU分解)其原理是将高斯消去法的初等变换变成了左乘矩阵的形式表达,进而由Doolittle分解法来确定对应的左乘矩阵。三角分解具有存在且唯一的特点,其唯一性可以使用反证法证明。
平方根法是实对称矩阵的三角分解法的特例。
追赶法在一定程度上也可以看成是三角分解法在对三角矩阵的特例。
下面对前两者的程序进行编写和使用。
这个MATLAB有自带程序了:
A = [2,-1,4,-3,1;-1,1,2,1,3;4,2,3,3,1;-3,1,3,2,4;1,3,-1,4,4];
b = [11;14;4;16;18];
A\b
下面是自己用来交作业的函数,输出是一个列向量:
function x=mgausslist(A,b,flag)
tic
%x为解向量,(A,b)为增广矩阵
if nargin<=1
c='this is default';
disp(c)
A = [2,-1,4,-3,1;-1,1,2,1,3;4,2,3,3,1;-3,1,3,2,4;1,3,-1,4,4];
b = [11;14;4;16;18];
flag=0;
end
%以上为默认测试输入%
if nargin==2, flag=0;end
%nargin 是输入参数个数判断(number of input arguments)函数
n=length(b);
%列主元消元过程
for k=1:(n-1)
%这一部分为列主元过程,目的是求出当前列的最大主元
k_list_max = abs(A(k,k));
%初始化最大值及其所在行
ki_max = k;
for t=k+1:n
if abs(A(t,k))>k_list_max
k_list_max = abs(A(t,k));
ki_max = t;
end
end
%此处使用行交换,将最大值所在行进行对调
A([ki_max,k],:)=A([k,ki_max],:);
b([ki_max,k],:)=b([k,ki_max],:);
%此处对增广矩阵进行初等行变换
m=A(k+1:n,k)/A(k,k);
A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-m*A(k,k+1:n);
b(k+1:n)=b(k+1:n)-m*b(k);
A(k+1:n,k)=zeros(n-k,1);
end
%回代过程
x=zeros(n,1);
x(n)=b(n)/A(n,n);
for k=n-1:-1:1
x(k)=(b(k)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end
toc
下面是交作业用的哈。
function x=LUdecomp(A,b,flag)
tic
%用途:LU分解法解线性方程组Ax=b
%格式: x=LUdecomp(A,b,flag), A为系数矩阵, b为右端项,
%若flag=0,则不显示中间过程,否则显示中间过程,默认为0,
%x为解向量
if nargin<=1
c='this is default';
disp(c)
A = [2,-1,4,-3,1;-1,1,2,1,3;4,2,3,3,1;-3,1,3,2,4;1,3,-1,4,4];
b = [11;14;4;16;18];
%A=[1,2,3,4;1,4,9,16;1,8,27,64;1,16,81,256];
%b=[2;10;44;190];
flag=0;
end
if nargin==2, flag=0;end
%nargin 是输入参数个数判断(number of input arguments)函数,此步非必要,实现功能为未输入flag默认为0
n=length(b);
%列主元消元过程
L = zeros(n);
u = zeros(n);
x = zeros(n,1);
for k=1:n
%分解
u(1,k) = A(1,k);
for i=2:n
L(i,1) = A(i,1)/u(1,1);
end
if flag~=0, Lout1=L, end
end
for i=1:n
for j=i:n
u(i,j) = A(i,j)-L(i,[1:i-1])*u([1:i-1],j);
end
%先算完u,再计算L
for k=i:n
L(k,i)=1/u(i,i)*(A(k,i)-L(k,[1:i-1])*u([1:i-1],i));
end
end
if (flag~=0)
disp(L);
disp(L*u);
end
disp(u);
%求y
y=zeros(n,1);
y(1)=b(1);
for k=2:n
y(k)=b(k)-L(k,[1:k-1])*y([1:k-1],1);
end
if (flag~=0)
disp();
end
%求x
x(n)=y(n)/u(n,n);
for k=n-1:-1:1
x(k)=(y(k)-u(k,k+1:n)*x(k+1:n))/u(k,k);
end
%if (flag~=0)
disp(x);
%end
toc
最后提一嘴这个三角分解和高斯消元的关系:
三角分解法计算中间函数L和U是对高斯消去法原理的一种展开,仅仅用来进行单次的三角分解是在降低计算效率,三角分解更大的意义应该在于这种分解可以应对可变b的情况,相比于计算A的伴随矩阵、行列式来应对计算矩阵的逆,这种分解比较节约计算空间。当然这种方法用于一些特殊矩阵(如实对称矩阵)会收到一定的效果。
% 矩阵运算总结
% 转置
A=A'
% 行列式
det(A)
% 求逆
inv(A)
% 矩阵乘法
A*B
% 元素乘法
A.*B
% 矩阵除法:A/B=A*(inv(B))
% 通常右除要快一点,但左除可避免矩阵的奇异性带来的麻烦:A\B=inv(A)*B
% INF(infinite)一般代表无穷
% INF与0相乘后会出现NAN(not a number)