MATLAB 求解线性方程组(一)

2022.4.13学习笔记

简单的理论介绍

高斯消去法利用了代数方程求解中的消元思想,通过将增广矩阵化为倒三角形式进行迭代求解,是非常简单的求解算法。
三角分解法(LU分解)其原理是将高斯消去法的初等变换变成了左乘矩阵的形式表达,进而由Doolittle分解法来确定对应的左乘矩阵。三角分解具有存在且唯一的特点,其唯一性可以使用反证法证明。
平方根法是实对称矩阵的三角分解法的特例。
追赶法在一定程度上也可以看成是三角分解法在对三角矩阵的特例。
下面对前两者的程序进行编写和使用。

1. 列主元高斯消去法

这个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

2. LU分解法

下面是交作业用的哈。

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的伴随矩阵、行列式来应对计算矩阵的逆,这种分解比较节约计算空间。当然这种方法用于一些特殊矩阵(如实对称矩阵)会收到一定的效果。

MATLAB使用经验总结

% 矩阵运算总结
% 转置
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)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值