《矩阵分析》代码Ⅲ——Doolittle分解、Crout分解、Cholesky分解求解线性方程组matlab实现

《矩阵分析》代码Ⅲ——Doolittle分解、Crout分解、Cholesky分解求解线性方程组matlab实现

注意:
三种分解方法求解过程都会用到三角矩阵的回代法。小编之前已经写过三角矩阵回代法程序!!关于代码可参考:https://blog.csdn.net/m0_46498899/article/details/109223781

(一)Doolittle分解

1.1 算法思想

n阶线性方程组系数矩阵A可以分解成单位下三角矩阵L和上三角矩阵R,即
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 matlab实现

function [L,R,X]=Doolittle(A,B)
%%%输入n*n的方阵A,
%%%通过Doolittle分解;
%%%输出单位下三角矩阵L和上三角矩阵R。
[n,~]=size(A);
L=eye(n);
R=zeros(n);
for k=1:n
    for j=k:n
        R(k,j)=A(k,j)-L(k,1:k-1)*R(1:k-1,j);
    end
    for i=k+1:n
        L(i,k)=(A(i,k)-L(i,1:k-1)*R(1:k-1,k))/R(k,k);
    end
end
y=b_Back_subtitution(L,B);   %下三角回代法函数;
X=a_Back_subtitution(R,y);   %上三角回代法函数;

1.3 实例验证

命令行输入:

在这里插入图片描述

运行结果:

在这里插入图片描述

(二) Crout分解

2.1 算法思想

Doolittle分解是将矩阵A分解为单位下三角矩阵L和上三角矩阵R的乘积;而Crout分解则是将矩阵A分解为下三角矩阵L和单位上三角矩阵的乘积。具体方法与Doolittle分解类似,这里不加赘述,不明白的可以自行百度。下面直接给出matlab代码。

2.2 matlab实现

function [L,R,X]=Crout(A,B)
%%%输入n*n的方阵A,
%%%通过Crout分解;
%%%输出下三角矩阵L和单位上三角矩阵R。
Y=A\B;
[n,~]=size(A);
L=zeros(n);
R=eye(n);
for k=1:n
    for i=k:n
        L(i,k)=A(i,k)-L(i,1:k-1)*R(1:k-1,k);
    end
    for j=k+1:n
        R(k,j)=(A(k,j)-L(k,1:k-1)*R(1:k-1,j))/L(k,k);
    end

end
y=b_Back_subtitution(L,B);   %%调用下三角回代法;
X=a_Back_subtitution(R,y);   %%调用上三角回代法;

2.3 实例验证

命令行输入:

在这里插入图片描述

运行结果:

在这里插入图片描述

(三)正定矩阵的平方根(Cholesky)分解

3.1算法思想

在这里插入图片描述
在这里插入图片描述

3.2 matlab实现

function [L,X]=Cholesky(A,B)
%%%输入n*n的正定矩阵A和常数项列向量B,
%%%通过Cholesky分解;
%%%输出下三角矩阵L,和方程的解X。
[n,~]=size(A);
L=zeros(n);
for j=1:n
    for i=j:n
        if i==j
        L(j,j)=(A(j,j)-L(j,1:j-1)*(L(j,1:j-1))')^(1/2);
        elseif i>j
        L(i,j)=(A(i,j)-L(i,1:j-1)*(L(j,1:j-1))')/L(j,j);
        end
    end
    
end
y=b_Back_subtitution(L,B);  %%调用下三角回代法函数;
X=a_Back_subtitution(L',y);  %%调用上三角回代法函数。

3.3 实例验证

命令行输入:

在这里插入图片描述

运行结果:

在这里插入图片描述

(四)正定矩阵的改进平方根分解

4.1算法思想

在这里插入图片描述

4.2 matlab实现

function [L,D0,X]=Cholesky_ed(A,B)
%%%输入n*n的正定矩阵A和常数项列向量B,
%%%通过Cholesky分解;
%%%输出下三角矩阵L,和方程的解X。
%%%{diag(A,k)函数:如果A是列向量,就将列向量放在矩阵的第K条对角线上;
                  ...如果A是矩阵,则将矩阵的第K条对角线是的元素提取并按列输出,
                  ...K=0表示主对角线}
[n,~]=size(A);
L=eye(n);
S=zeros(n);
for j=1:n
    S(j,j)=A(j,j)-S(j,1:j-1)*L(j,1:j-1)';
    for i=j+1:n
        S(i,j)=A(i,j)-S(i,1:j-1)*L(j,1:j-1)';
        L(i,j)=S(i,j)/S(j,j);
    end
end
D0=diag(S);             
y=b_Back_subtitution(L,B);
y=y./D0;
X=a_Back_subtitution(L',y);

4.3实例验证

命令行输入:

在这里插入图片描述

运行结果:

在这里插入图片描述

  • 19
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篱落~~成殇~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值