解线性方程组的直接方法--低阶稠密矩阵三角分解法--改进的平方根法matlab实现(转)

转自改进的平方根法
做了一些注释和修改了函数
适用于A为对称正定矩阵:A=LDL^T(L为单位下三角矩阵,D为对角矩阵,D的对角元素di>0)

function [L,D,x,y]=improvedSqareRoot(A,b)
n=length(A(:,1)); %求A矩阵第一列的长度,即矩阵维数
%% 判断输入的矩阵是不是符合要求
for k=1:n
    if (det(A(1:k,1:k)))<=0 %由于对称正定矩阵A,必有det(A)>0
        disp('A矩阵不是对称正定矩阵,请重新运行程序')
    end
end
%分解A,使A=L*D*L'
%% 初始化L(i,i) 
for i=1:n
    L(i,i)=1;
end
%% 初始化d(i)L(i,k)
for k=1:n
    temp_sum1=0;
    for j=1:k-1
        temp_sum1=temp_sum1+L(k,j)^2*d(j);
    end    
    d(k)=A(k,k)-temp_sum1;

    for i=k+1:n
        temp_sum2=0;
        for j=1:k-1
            temp_sum2=temp_sum2+L(i,j)*d(j)*L(k,j);
        end
        L(i,k)=(A(i,k)-temp_sum2)/d(k);
    end
end
%% 初始化t(i,j)
for k=1:n
    for i=k+1:n
        t(i,k)=L(i,k)*d(k);
    end
end

%% 转换
for k=2:n
    temp_sum3=0;
    for j=1:k-1
        temp_sum3=temp_sum3+t(k,j)*L(k,j);
    end
    d(k)=A(k,k)-temp_sum3;
    
    for i=k:n
        temp_sum4=0;
        for j=1:k-1
            temp_sum4=temp_sum4+t(i,j)*L(k,j);
        end
        t(i,k)=A(i,k)-temp_sum4;
    end
    L(i,k)=t(i,k)/d(k);
end

%% 分解Ax=b 为 Ly=b  L'x=inv(D)*y
%% 求y
for k=1:n
    temp_sum5=0;
    for j=1:k-1
        temp_sum5=temp_sum5+L(k,j)*y(j);
    end
    y(k)=b(k)-temp_sum5;
end
%% 求x
for k=n:-1:1
    temp_sum6=0;
    for j=k+1:n
        temp_sum6=temp_sum6+L(j,k)*x(j);
    end
    x(k)=y(k)/d(k)-temp_sum6;
end
D=diag(d)
end

测试数据:
A =[ 1.0000 -1.0000 1.0000
-1.0000 3.0000 -2.0000
1.0000 -2.0000 4.5000];
b =[ 4 -8 12];
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值