matlab 三角分解法 解线性方程组的直接方法

%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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值