%MtriangleDecomposition
%带列主元法的三角分解
%直接三角分解法triangle decomposition
%function Tresult=eliminationM(input);%模块化功能
%input输入矩阵,包括系数和参数
%inputC 用于分解LU矩阵的合成矩阵
%oringinData保留的初始矩阵
%output 输出答案,对应X的各个值
%Toutput:修正顺序后的答案,对应输入数据的X顺序
%rememberdet:行列变化中介值
%remember:行列变化记录矩阵
%xnum,ynum 输入矩阵的尺寸
%Lneed 消元中,主式需要乘的变量
%keepnum 保留小数位数
%contrastFrom(各个多项式的误差)
%deltanum:矩阵中变化的最大值
%Ldet:分解出来的下矩阵
%Udet:分解出来的上矩阵
%Ydet:y解方程组矩阵
%%注意,元素中不能有为零的数
clear all%启用模块化后需要注释该句
input=[2,2,5,6;
-1,4,3,5;
1,-1,3,1];%输入矩阵
oringinData=input;
error1='the condition are not meet for using this algorithm' ;
%format short%设置精度 short为精确到小数点后3位 数值型 roundn(A,3)保留3位小数
keepnum=-10;%设置保留n位小数,记得加负号表示小数位
[ynum,xnum]=size(input);%获取输入矩阵大小
Ldet=zeros(ynum);
Udet=zeros(ynum);%创建LU的背景矩阵
inputC=input;
for i=1:ynum%构造合成矩阵(行j,列I)
for j=i:ynum %行逻辑为主,列逻辑为辅
for I=i:xnum%I这里做判断的算子
% if I>j%这里需要提前做一个判断,用于加减的转变
% overnum=j;
% else
% overnum=I;
% end
if j==i%跳过该行
else
if I==i
inputC(j,I)=roundn(inputC(j,I)/inputC(i,i),keepnum);
else
inputC(j,I)=roundn(inputC(j,I)-inputC(i,I)*inputC(j,i),keepnum);
end
end
end
end
end
for i=1:xnum%将合成矩阵拆分为L、U、Y矩阵
for j=1:ynum
if j==i
Ldet(j,i)=1;
Udet(j,i)=inputC(j,i);
end
if j>i
Ldet(j,i)=inputC(j,i);
end
if j<i&&i<xnum
Udet(j,i)=inputC(j,i);
end
if i==xnum
Ydet(j,1)=inputC(j,i)
end
end
end
YdetR=Ydet;
%开始解方程组
%回代
for i=1:ynum%这里计算出结果
output(ynum+1-i,1)=roundn(Ydet(ynum+1-i,1),keepnum)/roundn(inputC(ynum+1-i,xnum-i),keepnum);%output为输出结果
output(ynum+1-i,1)=roundn(output(ynum+1-i,1),keepnum)
for j=i+1:ynum
%回代结果到多项式中,将其他值消除
if i<ynum
Ydet(ynum+1-j,1)=roundn(Ydet(ynum+1-j,1),keepnum)-roundn(Udet(ynum+1-j,xnum-i),keepnum)*output(ynum+1-i,1);
Ydet(ynum+1-j,1)=roundn(Ydet(ynum+1-j,1),keepnum);
inputC(ynum+1-j,xnum-i)=0;
end
end
end
matlab 三角分解法 解线性方程组的直接方法
于 2022-06-03 21:47:31 首次发布