解线性方程组——Cholesky分解 | 北太天元

一、问题描述

对于线性方程组
A x = b , A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) , b = ( b 1 b 2 ⋮ b n ) Ax=b,\quad A=\begin{pmatrix} a_{11} & a_{12} &\cdots &a_{1n}\\ a_{21} & a_{22} &\cdots &a_{2n}\\ \vdots & \vdots & &\vdots\\ a_{n1} & a_{n2} &\cdots &a_{nn}\\ \end{pmatrix},\quad b=\begin{pmatrix} b_1\\b_2\\ \vdots\\ b_n \end{pmatrix} Ax=b,A= a11a21an1a12a22an2a1na2nann ,b= b1b2bn

A为对称正定矩阵,求向量 x x x

二、对称正定矩阵的Cholesky分解

( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) = [ l 11 l 21 l 22 ⋮ ⋮ ⋱ l n 1 l n 2 ⋯ l n n ] [ l 11 l 21 ⋯ l n 1 l 22 ⋯ l n 2 ⋱ ⋮ l n n ] . \begin{pmatrix} a_{11} & a_{12} &\cdots &a_{1n}\\ a_{21} & a_{22} &\cdots &a_{2n}\\ \vdots & \vdots & &\vdots\\ a_{n1} & a_{n2} &\cdots &a_{nn}\\ \end{pmatrix}=\begin{bmatrix}l_{11}&&&\\l_{21}&l_{22}&&\\\vdots&\vdots&\ddots&\\l_{n1}&l_{n2}&\cdots&l_{nn}\end{bmatrix}\begin{bmatrix}l_{11}&l_{21}&\cdots&l_{n1}\\&l_{22}&\cdots&l_{n2}\\&&\ddots&\vdots\\&&&l_{nn}\end{bmatrix}. a11a21an1a12a22an2a1na2nann = l11l21ln1l22ln2lnn l11l21l22ln1ln2lnn .

上式可以看作,做第一步
[ a 11 A 21 T A 21 A 22 ] = [ l 11 L 21 L 22 ] [ l 11 L 21 T L 22 T ] = [ l 11 2 l 11 L 21 T l 11 L 21 L 21 L 21 T + L 22 L 22 T ] \left.\left[\begin{array}{c|c}a_{11}&A_{21}^\mathrm{T}\\\hline A_{21}&A_{22}\end{array}\right.\right]=\begin{bmatrix}l_{11}&\\L_{21}&L_{22}\end{bmatrix}\begin{bmatrix}l_{11}&L_{21}^\mathrm{T}\\&L_{22}^\mathrm{T}\end{bmatrix}=\begin{bmatrix}l_{11}^2&l_{11}L_{21}^\mathrm{T}\\l_{11}L_{21}&L_{21}L_{21}^\mathrm{T}+L_{22}L_{22}^\mathrm{T}\end{bmatrix} [a11A21A21TA22]=[l11L21L22][l11L21TL22T]=[l112l11L21l11L21TL21L21T+L22L22T]

按顺序,求出 l 11 , L 21 l_{11},L_{21} l11,L21后,再得 L 22 L 22 T L_{22}L_{22}^T L22L22T,而 L 22 L 22 T L_{22}L_{22}^T L22L22T依然是对称正定的,继续按照第一步的思路进行计算。

举一个例子
[ 4 12 − 16 12 37 − 43 − 16 − 43 98 ] \begin{bmatrix}4&12&-16\\12&37&-43\\-16&-43&98\end{bmatrix} 41216123743164398
对这个三维矩阵做Cholesky分解,自己试着算一下

三、算法

💖 Cholesky分解:[L]=Cholesky_fac(A)

输入:系数矩阵 A

输出:下三角矩阵L

实现过程:在原矩阵上做改变,

  • for i = 1 i=1 i=1 to n − 1 n-1 n1
  • a i i = A i i a_{ii}=\sqrt{A_{ii}} aii=Aii
  • A i + 1 : n , i = A i + 1 : n , i ∗ 1 a i i A_{i+1:n,i} = A_{i+1:n,i}*\frac{1}{a_{ii}} Ai+1:n,i=Ai+1:n,iaii1
  • A i + 1 : n , i + 1 : n = A i + 1 : n , i + 1 : n − A i + 1 : n , i ∗ A i + 1 : n , i T A_{i+1:n,i+1:n}= A_{i+1:n,i+1:n} -A_{i+1:n,i}*A_{i+1:n,i}^T Ai+1:n,i+1:n=Ai+1:n,i+1:nAi+1:n,iAi+1:n,iT

i = n 时, A n , n = A n , n A_{n,n}= \sqrt{A_{n,n}} An,n=An,n

四、北太天元源程序

Cholesky分解

function [L] = Cholesky_fac(A)
    % 对称正定矩阵 的 Cholesky分解 
    % A = LL'
    % 输入:
    %    A,对称正定
    % 输出: 
    %    分解后的 下三角 L 
    % 创建时间: 1/18/2024
    % 版本: 1.0
    n = length(A);
    for i = 1:1:n-1
        A(i,i) = sqrt(A(i,i));
        A(i+1:n,i) = A(i+1:n,i)/A(i,i);
        A(i+1:n,i+1:n) = A(i+1:n,i+1:n)-A(i+1:n,i)*A(i+1:n,i)';
    end
    A(n,n)= sqrt(A(n,n));
    L = tril(A);
end

将上述代码保存为 Cholesky_fac.m 文件

五、数值算例

例子1:

[ 4 12 − 16 12 37 − 43 − 16 − 43 98 ] \begin{bmatrix}4&12&-16\\12&37&-43\\-16&-43&98\end{bmatrix} 41216123743164398
对其做Cholesky分解

%%
clc,clear all;
A1 = [4 12 -16;12 37 -43;-16 -43 98];
L1 = Cholesky_fac(A1)

L1 = 
   2   0   0
   6   1   0
  -8   5   3

例子2:

[ 10 1 2 3 4 1 9 − 1 2 − 3 2 − 1 7 3 − 5 3 2 3 12 − 1 4 − 3 − 5 − 1 15 ] [ x 1 x 2 x 3 x 4 x 5 ] = [ 12 − 27 14 − 17 12 ] \begin{bmatrix} 10&1&2&3&4\\1&9&-1&2&-3\\2&-1&7&3&-5\\3&2&3&12&-1\\4&-3&-5&-1&15\end{bmatrix} \begin{bmatrix}x_1\\x_2\\x_3\\x_4\\x_5\end{bmatrix} =\begin{bmatrix}12\\-27\\14\\-17\\12\end{bmatrix} 1012341912321735323121435115 x1x2x3x4x5 = 1227141712

用Cholesky分解求解向量 x

先用Cholesky分解求出 L2,再用两次回代得到 x x x

%%  对称正定矩阵下
A2 = [10 1 2 3 4; 1 9 -1 2 -3; 2 -1 7 3 -5; 3 2 3 12 -1; 4 -3 -5 -1 15];
b = [12; -27; 14; -17; 12];
L2 = Cholesky_fac(A2)
x = back_substitution_two(L2,L2',b)
x2 = gsem_column(A2,b)

L2 = 
    3.1623    0.0000    0.0000    0.0000    0.0000
    0.3162    2.9833    0.0000    0.0000    0.0000
    0.6325   -0.4022    2.5374    0.0000    0.0000
    0.9487    0.5698    1.0362    3.1147    0.0000
    1.2649   -1.1397   -2.4665    0.3227    2.4317

x = 
    1.0000
   -2.0000
    3.0000
   -2.0000
    1.0000

x2 = 
    1.0000
   -2.0000
    3.0000
   -2.0000
    1.0000

假如对非对称正定矩阵使用

%% 对称非正定矩阵下 结果不正确
A3 = [-10 1 2 3 4; 1 -5 -1 2 -3; 2 -1 7 3 -5; 3 2 3 12 -1; 4 -3 -5 -1 15];
b = [12; -27; 14; -17; 12];
L3 = Cholesky_fac(A3) %出现虚数
x31 = back_substitution_two(L3,L3',b)

x32 = gsem_column(A3,b)

运行后得

L3 = 
   0.0000 + 3.1623i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 - 0.3162i   0.0000 + 2.2583i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 - 0.6325i   0.0000 + 0.5314i   2.5135 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 - 0.9487i   0.0000 - 0.7528i   1.1140 + 0.0000i   3.0483 + 0.0000i   0.0000 + 0.0000i
   0.0000 - 1.2649i   0.0000 + 1.5055i  -2.6258 + 0.0000i   0.6097 + 0.0000i   1.9664 + 0.0000i


x31 = 
   8.1524 + 0.0000i
 -23.9180 + 0.0000i
  23.8006 + 0.0000i
  -6.7427 + 0.0000i
  16.5172 + 0.0000i


x32  是正确结果
x32 = 
    0.2250
    1.6622
    5.2829
   -2.8504
    2.6434

可以看到 L3 中出现虚数,显然不正确。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清水折木

谢谢前辈的鼓励,我会继续加油的

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

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

打赏作者

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

抵扣说明:

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

余额充值