在《数值分析》第四章提到的求解线性方程组直接解法有Cramer法则,Gauss消元法,LU分解法,Gauss-Jordan消元法,Cholesky分解法、追赶法等等,在这里我主要通过编写Gauss列主元消元法,LU分解法,Cholesky分解法的程序来实现对线性方程组的求解。
1.Gauss列主元消元法
1.1.实验原理
在采用Guass消去法的时候,主元绝对值的大小将影响到计算结果,主元的绝对值越大,算法的稳定性越好,列主元消去法matlab程序设计思路为:
1)构造需要计算的矩阵,得到增广矩阵Ab;
2)将系数矩阵A的每一列的绝对值最大的元素换到列对角线上,矩阵b中的元素也随之改变,先判断主元是否为0,然后再利用此主元逐行消去此主元所在列中的元素,矩阵b中的元素也随之改变;
3)经过n-1步运算后,矩阵A就变换成一个上三角矩阵,从最后一行进行逐次回代,计算方程组的解。
1.2.实验程序
%高斯列主元消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在变量x中
clear;clc;
A=[2,1,2;
5,-1,1;
1,-3,-4]%系数矩阵
b=[5,8,-4]'%n维向量
[m,n]=size(A);
%先检查系数正确性
if m~=n
error('矩阵A的行数和列数必须相等');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或者A的列数相等');
return;
end
%检查方程是否存在唯一解
if rank(A)~=rank([A,b])
error('A的矩阵的秩和增广矩阵的秩不相等,方程不存在唯一解');
return;
end
c=n+1;
A(:,c)=b; %(增广)
for k=1:n-1
[r,m]=max(abs(A(k:n,k))); %选主元
m=m+k-1; %修正操作行的值
if(A(m,k)~=0)
if(m~=k)
A([k m],:)=A([m k],:); %换行
end
A(k+1:n,k:c)=A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c);%消去
end
end
x=zeros(length(b),1); %回带求解
x(n)=A(n,c)/A(n,n);
for k=n-1:-1:1
x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end
disp('高斯列主元消元法得线性方程组的解为:');
disp('X=');
disp(x);
1.3.实验结果
我们拿《数值分析》课本第117页的例题4.2.2来试试
例4.2.2 求解线性方程组(系数矩阵和n维列矩阵看图片,矩阵编辑不进博客)
2.LU分解法
2.1.实验原理
设A为n阶矩阵,如果A的各阶顺序主子式Di
≠0(i=1,2,···,n),则A可分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积,且这种分解是唯一的。
2.2.实验程序
%LU分解法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在变量x中
clear;clc;
A=[1 0 2 0;
0 1 0 1;
1 2 4 3;
0 1 0 3]
%系数矩阵
b=[5 3 17 7]' %n维向量
[m,n]=size(A);
L=zeros(m,m);
temp=0;
for ii=1:m
for
jj=ii+1:m
temp=A(jj,ii)/A(ii,ii);
L(jj,ii)=temp;
for kk=ii:m
A(jj,kk)=A(jj,kk)-A(ii,kk)*temp;
end
b(jj,1)=b(jj,1)-b(ii,1)*temp;
end
end
for ii=1:m
L(ii,ii)=1;
end
disp('LU分解法得单位下三角矩阵L为:');
disp('L=');
disp(L); %显示LU分解后的L,单位下三角矩阵
disp('LU分解法得上三角矩阵U为:');
disp('U=');
U=A;
disp(U); %显示LU分解后的U,上三角矩阵
%回代结果
x=zeros(m,1);
x(m,1)=b(m,1)/U(m,m);
sum=0;
for ii=m-1:-1:1
sum=0;
for
jj=ii+1:m
sum=sum+U(ii,jj)*x(jj,1);
end
x(ii,1)=(b(ii,1)-sum)/U(ii,ii);
end
%显示计算结果
disp('LU分解法算得线性方程组的解为:');
disp('X=');
disp(x);
2.3实验结果
我们拿《数值分析》2016年期末试题中的第六题的第(1)题来试试
(1).对下图方程组的系数矩阵做LU分解,其中L是单位下三角矩阵,U是上三角矩阵,并用此解求解线性方程组
3.Chlesky分解法
3.1.实验原理
若A为n阶对称正定矩阵,则存在唯一的主对角线元素都是正数的下三角矩阵L,使得 A=LLT
3.2.实验程序
%Cholesky消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在x变量中
clear;clc;
A=[0.01,0.02,-0.02;
0.02,0.13,0.11;
-0.02,0.11,0.65]
b=[-0.07 -0.02 1.06]'
n = length(b); L = zeros(n);
for k = 1 : n
delta =
A(k,k);
for j = 1 :
k-1
delta = delta - L(k,j)^2;
end
if delta <
1e-15
error('矩阵不正定,无法分解');
end
L(k,k) =
sqrt(delta);
for i = k+1 :
n
L(i,k) = A(i,k);
for j = 1 : k-1
L(i,k) = L(i,k) - L(i,j)*L(k,j);
end
L(i,k) = L(i,k)/L(k,k);
end
end
disp(' Cholesky消元法得下三角矩阵L为:');
disp('L=');
disp(L);
%解Ly = b
y = b;
y(1) = b(1)/L(1,1);
for i = 2:n
tempy = 0;
for k =
1:i-1
tempy = tempy + L(i,k)*y(k);
end
y(i) =
(b(i)-tempy)/L(i,i);
end
%解L'x = y;
x = y; x(n) = y(n)/L(n,n);
for i = n-1:-1:1
tempx = 0;
for k =
i+1:n
tempx = tempx + L(k,i)*x(k);
end
x(i) =
(y(i)-tempx)/L(i,i);
end
disp('Cholesky消元法得线性方程组的解为:');
disp('X=');
disp(x);
3.3.实验结果
我们拿《数值分析》2016年期末试题中的第六题的第(2)题来试试
(2).对下面方程组的系数矩阵做LLT分解,其中L是对角元素为正数的下三角矩阵,并用此分解求解线性方程组