LU分解求线性方程组

LU分解求线性方程组

解一维平板非稳态导热隐式格式时,需要求解线性方程组。LU分解适合线性方程组有唯一解的小规模求解。

function x=LUsolve(A,B,x0,eps,M)
%LU分解法求方程组的解(矩阵公式求解)
%A为方程组的系数矩阵;b为方程组的右端项
%x为线性方程组的解;x0为迭代初值
%eps为误差限;M为迭代的最大次数
if nargin==2
    x0=zeros(size(A,1),1);
    eps= 1.0e-3;%默认精度
    M = 10000;%参数不足时默认后两个条件
elseif nargin==3
    eps= 1.0e-3;%默认精度
    M = 10000;%参数不足时默认后两个条件
elseif nargin ==4
    M = 10000;%参数的默认值
elseif nargin<2
    errordlg('参数不足','错误');
    return
end
[n,m]=size(A);
nb=length(B);
%当方程组行与列的维数不相等时,停止计算,并输出出错信息
if n~=m
    errordlg('矩阵A行数和列数必须相等!','错误');
    return;
end
%当方程组与右端项的维数不匹配时,停止计算,并输出出错信息
if n~=nb
    errordlg('矩阵A的行数必须和b的长度相等!','错误');
    return;
end 
L =zeros(n,n);
U =zeros(n,n);
D =zeros(n,n);
L=-tril(A,-1);
U=-triu(A,1);
D=diag(diag(A));
DLU=(D-L)\U;        %DLU为迭代矩阵
DLB=(D-L)\B;        %DLB为右端项
pr=max(abs(eig(DLU))); %求迭代矩阵谱半径
if pr>=1
    errordlg('迭代矩阵谱半径大于1迭代法不收敛','错误');
    return;
end
k=0;
tol=1;
while tol>=eps 
    x = DLU*x0+DLB;
    k = k+1;         %迭代步数
    tol = norm(x-x0);%前后两步迭代结果的误差
    x0 = x;
    if(k>=M)
        disp('Warning: 迭代次数太多,可能不收敛!');
        return;
    end
end

也可以采用高斯赛德尔迭代求解。

posted on 2021-09-02 10:53  MultiSimOpt  阅读(875)  评论(0编辑  收藏  举报

导航