矩阵分解与高斯消元

我们之前就是消元法解方程嘛,先联立几个方程,然后把变量分离出来代入,最后得到一行只有一个变量的方程,把那个变量解出来,再重复上面的过程就可以了
但是计算机是不会干这件事的,这件事对于计算机来说,还是比较难的
我们要把这个问题变得简单一点,交给计算机去解决


三角形矩阵回代求解

三角形矩阵

什么样的方程组好解呢?

直观地看, 三角形的方程组应该是好解的
$$\begin{cases}a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=b_1\a_{22}x_2+\cdots+a_{2n}x_n=b_2\\cdots\cdots\a_{nn}x_n=b_n\end{cases}$$
像这个方程组, 我们只要从最下面一行开始解, 解出 $x_n$ 再往上代入就行了
重复上面的操作, 我们就可以解出所有的解
$$\begin{cases}&x_n=b_n/a_{nn}\&x_k=\frac{b_k-\sum_{j=k+1}^na_{kj}x_j}{a_{kk}}&(k=n-1,n-2,\cdots,1)\end{cases}$$

  • 这个过程称为回代过程
  • 计算量为 $1+2+\cdots+n=n(n+1)/2$, 为平方级

同理对下三角矩阵:
$$\begin{pmatrix}l_{11}\l_{21}&l_{22}\\vdots&\vdots&\ddots\l_{n1}&l_{n2}&\cdots&l_{nn}\end{pmatrix}\begin{pmatrix}x_1\x_2\\vdots\x_n\end{pmatrix}=\begin{pmatrix}b_1\b_2\\vdots\b_n\end{pmatrix}$$
容易求得解:
$$\begin{aligned}&x_1=\frac{b_1}{l_{11}}\&x_i=\frac{b_i-\sum_{j=1}^{i-1}l_{ij}x_j}{l_{ii}} i=2,3,\cdots,n\end{aligned}$$

我们在[[高等代数]]中学习过, 通过相似变换, 线性方程组的解是不会变的
于是我们想到, 能不能通过相似变换, 把一个线性方程组 (矩阵) 变换成三角形的呢?
#符号

  • 从此开始, 我们把解线性方程组同解矩阵等同起来

如何将矩阵化为三角形

把矩阵变成上/下三角形, 我们主要有两种办法

  1. 高斯消元法
  2. 非奇异矩阵三角分解

高斯消元法与矩阵分解

我们一直在用的解线性方程组的办法, 叫做高斯消元法
[[高斯消元法例子]]
由上面的例子可以看出, 高斯消元法包括两个过程: 消元回代
于是我们有如下方法


顺序高斯消元法

[!note] 顺序高斯消元
考虑一个 $n$ 阶线性方程组
$$\begin{cases}a_{11}x_1+a_{12}x_2+…+a_{1n}x_n=b_1\a_{21}x_1+a_{22}x_2+…+a_{2n}x_n=b_2\\vdots\a_{n1}x_1+a_{n2}x_2+…+a_{nn}x_n=b_n&\end{cases}$$
把它化为矩阵形式:
$$Ax=b$$
于是我们对矩阵进行操作
顺序高斯消元法的主要思路是, 把系数矩阵 $A$ 变成上三角矩阵, 然后回代求解
![[Pasted image 20240413233208.png|300]]
其实就是:
$$\begin{aligned}&x_n=b_n^{(n)}/a_{nn}^{(n)}\&x_i=\left(b_i^{(i)}-\sum_{j=i+1}^na_{ij}^{(i)}x_j\right)/a_{ii}^{(i)}\end{aligned}$$

  • 顺序高斯消元法硬性要求: 主元全都不为 $0$
  • 主元即矩阵对角线上的元素: $a_{ii}^{(i)}\left(i=1,2,…,n\right)$

顺序高斯消元法的条件

上面我们说过, 顺序高斯消元法要求主元 (对角元) 全都不为 $0$
这是因为我们的公式里有 $b_n^{(n)}/a_{nn}^{(n)}$, 分母是不能为 $0$ 的

那么什么时候主元全都不为 $0$ 呢?
下面给出一个定理

[!note] 主元不为 0 的充要条件
$a_{ii}^{(i)}\neq0(i=1,\quad2,\cdots n)$, 的充要条件是 $A$ 的顺序主子式不为零,即
$$
D_1=a_{11}\neq0,\quad D_i=\begin{vmatrix}a_{11}&\cdots&a_{1i}\\vdots&\ddots&\vdots\a_{i1}&\cdots&a_{ii}\end{vmatrix}\neq0,\quad i=1,2,…,n
$$


具体操作

[[顺序高斯消元法具体操作]]
对增广矩阵  $(\mathbf A,\mathbf b)$ 进行初等行变换,直到化成 阶梯矩阵 ,然后回代计算出解

  • 假设在消去过程中主对角元素始终不为 0
    不断利用每行主对角元素消去下面同列的元素,逐渐使矩阵变成阶梯矩阵(上三角矩阵)
    完成后回代求解

计算量

![[Pasted image 20240413234759.png|325]]


优缺点

优点:

  • 计算量较小,结果准确
  • 简单易行

缺点:

  • 如果某个主元为 $0$, 就不能进行
  • 如果某个主元很小, 精度会大大降低 ([[数值,误差与算法#避免小分母|小分母]]或者[[数值,误差与算法#避免大数吃小数|大数吃小数]])(也称为淹没)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function [ X, U ] = GaussElim( A, b )
M = [A b];%增广矩阵
[n, ~] = size(A);
X = zeros(n,1);
%消去
for i = 1:n-1
%消去
for j = i+1:n
%计算得到乘子:m
m = M(j,i)/M(i,i);
M(j,:) = M(j,:)-m*M(i,:);
end
end
U = M(:,(1:n));
%回代过程
bn = M(:,n+1);
X(n) = bn(n)/M(n,n);
for k = 1:n-1
X(n-k) = (bn(n-k)-M(n-k,(n-k+1:n))*X(n-k+1:n))/(n-k);
end
end

LU 分解(Doolittle)

  • 也称为Doolittle分解
    接下来我们将说明一个事实 ,就是顺序高斯消元法的消元过程等价于矩阵的 LU 分解
    什么是 LU 分解?

    [!note] LU 分解
    如果我们有一个矩阵 $A$, 把它分解为一个单位下三角矩阵 $L$ 和一个上三角矩阵 $U$
    即$$A = LU$$
    这个过程称为矩阵 $A$ 的 $LU$ 分解

  • $L$ 是一个单位下三角矩阵, 它的对角线都是 $1$


推导

[[LU分解对应高斯消元法例子]]


LU 分解回代过程

既然我们把高斯消去法的消去步骤表示为 LU 分解, 那么如何转化回代步骤?
一旦知道 $L$ 和 $U$, 问题 $Ax = b$ 就可以写成 $LUx=b$, 我们定义辅助向量 $c=Ux$
那么回代过程就变成了两步:

  1. 对于方程 $Lc=b$, 求解 $c.$
  2. 对于方程 $Ux=c:$, 求解 $x.$
    由于 $L$ 和 $U$ 都是三角形的矩阵, 两步运算都很直接
    例如:
    $$\begin{bmatrix}1&1\3&-4\end{bmatrix}=LU=\begin{bmatrix}1&0\3&1\end{bmatrix}\begin{bmatrix}1&1\0&-7\end{bmatrix}$$
    先进行步骤 1
    $$\begin{bmatrix}1&&0\3&&1\end{bmatrix}\begin{bmatrix}c_1\c_2\end{bmatrix}=\begin{bmatrix}3\2\end{bmatrix}$$
    $$\begin{align}
    c_1+0c_2=3\3c_1+c_2=2
    \end{align}$$
    解得 $c_{1}=3,c_{2}=-7$
    再进行步骤 2
    $$\begin{bmatrix}1&&1\0&&-7\end{bmatrix}\begin{bmatrix}x_1\x_2\end{bmatrix}=\begin{bmatrix}&3\-7\end{bmatrix}$$
    $$\begin{aligned}x_1+x_2&=3\-7x_2&=-7\end{aligned}$$
    解得 $x_{2}=1,x_{1}=2$

LU 分解的条件

我们上面说到, 矩阵的 $LU$ 分解是等价于顺序高斯消元法的, 这意味着两者的条件是相同的
$$
\text{LU分解存在} \Leftrightarrow \text{高斯消元法不中断} \Leftrightarrow a_{kk}^{(k)} \ne 0 \Leftrightarrow \text{所有顺序主子式不为}0
$$
参考[[直接法#顺序高斯消元法的条件|顺序高斯消元法的条件]]


计算量

计算量和顺序高斯消元法一致


优缺点

  • 和高斯消元法基本一致, 但是, 如果等式的右边的项 $b$ 替换后,
    $LU$ 分解不用重新进行计算, 相比高斯消元法更好
  • 对于三对角或者对称正定线性方程组, $LU$ 分解更加高效

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function [ X,L, U ] = GaussElimLU( A, b )
M = [A b];%增广矩阵
[n, ~] = size(A);
X = zeros(n,1);
L = eye(n);
%消去
for i = 1:n-1
%消去
for j = i+1:n
%计算得到乘子:m
LS = eye(n);
m = M(j,i)/M(i,i);
M(j,:) = M(j,:)-m*M(i,:);
LS(j,:) = LS(j,:) - m*LS(i,:);
L = L*LS;
end
end
U = M(:,(1:n));
%回代过程
bn = M(:,n+1);
X(n) = bn(n)/M(n,n);
for k = 1:n-1
X(n-k) = (bn(n-k)-M(n-k,(n-k+1:n))*X(n-k+1:n))/(n-k);
end
end

列主元高斯消元法

之前的高斯消元法不是对主元要求很高吗, 既不能为 $0$ 也不能很小
我们就来挑一挑主元, 把大的数作为主元不就好了吗
我们知道, 把方程组的两行换一下, 方程组本质上是没有变的 (解也没有变)

[!note] 列主元选取
在顺序高斯消元法的基础上作出改进:
再第 $k$ 步消元的时候, 我们在要消去的第 $k$ 个主元所在的行以及下面的行中选择
选出第 $k$ 个位置最大的行, 和我们现在这一行交换
(1) 先选取列主元:$|a_{i_kk}^{(k)}|=\max_{k\leq i\leq n}\left{|a_{ik}^{(k)}|\right}\neq\mathbf{0}$
(2) 如果 $i_k\neq k$ 则交换第 $k$ 行和第 $i_k$ 行
(3) 消元

本质上, 我们可以这样看
我们先引入一个置换矩阵 $P$, 它的作用是对矩阵 $A$ 的行重新排一下序 (相当于提前换好行)
只要先用这个 $P$ 去乘矩阵 $A$, 接下来就做一般的顺序高斯消元法就好了
我们知道左乘相当于初等行变换
$$PA = LU$$


具体操作

例如
$$
\begin{pmatrix}10^{-8}&2&3\-1&3.712&4.623\-2&1.072&5.643\end{pmatrix}\begin{pmatrix}x_1\x_2\x_3\end{pmatrix}=\begin{pmatrix}1\2\3\end{pmatrix}
$$
此时我们处于 $k=1$ 这一步, 于是从这行开始往下找, 可以发现第三行是最大的, 那就交换一三行

由于在消元的时候, 我们有
$$
a_{ij}=a_{ij}-\frac{a_{ik}}{a_{kk}} \times a_{kj}
$$
但是我们这个 $a_{kk}$ 已经比下面的行($i>k$)里的都要大了(本列最大), 可以保证 $\frac{a_{ik}}{a_{kk}}<1$,
这意味着如果 $a_{kj}$ 有误差, 这个误差一定不会扩大, 是越来越小的 (乘以一个小于 1 的数)

  • 这样就保证了列主元高斯消元法的稳定性更好

![[Pasted image 20240414000731.png|238]]


优缺点

优点:

  • 主元有 $0$ 的时候也可以继续
  • 当主元比较小的时候也不会放大误差

缺点:

  • 要求 $\left| A \right| \ne 0$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function [ X, U ] = colGaussElim( A, b )
M = [A b];%增广矩阵
[n, ~] = size(A);
X = zeros(n,1);
%消去
for i = 1:n-1
%换主元
N = abs(M);
[~, e] = max(N((i:n),i));%找出该列中主元绝对值最大的元素所在行的索引
e=e+i-1;
temp = M(i,:);
M(i,:) = M(e,:);
M(e,:) = temp;%替换结束
if M(i,i) == 0
error('奇异阵');
end
%消去
for j = i+1:n
%计算得到乘子:m
m = M(j,i)/M(i,i);
M(j,:) = M(j,:)-m*M(i,:);
end
end
U = M(:,(1:n));
%回代过程
bn = M(:,n+1);
X(n) = bn(n)/M(n,n);
for k = 1:n-1
X(n-k) = (bn(n-k)-M(n-k,(n-k+1:n))*X(n-k+1:n))/(n-k);
end
end

PLU 分解

和列主元高斯消元法的想法一样, 为了避免主元很小或者主元为 $0$ 时消元无法进行
我们对矩阵 $A$ 的行进行交换, 把大的数作为主元
这就需要我们引入一个置换矩阵 $P$, 提前对 $A$ 进行排序, 保证消元的精度

推导过程和 $LU$ 分解是类似的, 但是增加了一个记录行变换的步骤:


推导

[[PLU分解推导]]


PLU 分解回代过程

一旦知道 $L$ 和 $U$ 还有 $P$, 问题 $Ax = b$ 就可以写成 $LUx=Pb$, 我们定义辅助向量 $c=Ux$
那么回代过程就变成了两步:

  1. 对于方程 $Lc=Pb$, 求解 $c.$
  2. 对于方程 $Ux=c:$, 求解 $x.$
    由于 $L$ 和 $U$ 都是三角形的矩阵, 两步运算都很直接
  • 注意这里左边的 $P$ 是隐含在 $LU$ 中的

完全主元法

顾名思义, 就是在整个矩阵右下角找主元 (因为左上角已经变成对角的了)
如果是第一步, 那就是在整个矩阵里找主元

  • 相比列主元法, 其实就是在做列变换的同时, 也做行变换
  • 在剩余矩阵中找最大的元素

    [!note] 完全主元
    在列 高斯消元法的基础上作出改进:
    再第 $k$ 步消元的时候, 我们在包括要消去的第 $k$ 个主元的右下角的矩阵中选择
    选出最大的元素, 通过行列变换
    (1) 先选取主元:$|a_{i_kj_k}^{(k)}|=\max_{k\leq i\leq n,k\le j \le n}\left{|a_{ij}^{(k)}|\right}\neq\mathbf{0}$
    (2) 如果 $i_k\neq k$ 或 $j_{k}\ne k$ 把 $a_{i_kj_k}$ 交换到 $a_{kk}$ 的位置
    (3) 消元

    本质上, 我们可以这样看
    我们先引入两个置换矩阵 $P$ 和 $Q$, $P$ 的作用是对矩阵 $A$ 的行重新排一下序 (相当于提前换好行), $Q$ 的作用是对矩阵 $A$ 的列重新排一下序 (相当于提前换好列)
    只要先用这个 $P$ 去左乘矩阵 $A$, 用这个 $Q$ 去右乘矩阵 $A$
    我们知道左乘相当于初等行变换, 右乘相当于初等列变换
    $$
    PAQ = LU
    $$

假如这个矩阵里的所有元素中, 最大的三个元素为 $\lambda_1>\lambda_2>\lambda_3$
![[Pasted image 20240414004402.png]]
完全主元法实际上就是做了这样的事


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function [P, Q, L, U] = TotalGaussElim(A)
[m, n] = size(A);
% 初始化PQ
P = eye(m);
Q = eye(n);
% 初始化LU
L = zeros(m, m);
U = zeros(m, n);
for k = 1:min(m-1, n)
% 找到主元位置
[~, pivot_row] = max(abs(A(k:m, k:n)));
[~, pivot_col_idx] = max(pivot_row);
pivot_row = pivot_row(pivot_col_idx) + k - 1;
pivot_col = pivot_col_idx + k - 1;
% 行列变换
if pivot_row ~= k
% 对A行变换
temp = A(k, :);
A(k, :) = A(pivot_row, :);
A(pivot_row, :) = temp;
% 对P行变换
temp = P(k, :);
P(k, :) = P(pivot_row, :);
P(pivot_row, :) = temp;
% 对L行变换
temp = L(k, 1:k-1);
L(k, 1:k-1) = L(pivot_row, 1:k-1);
L(pivot_row, 1:k-1) = temp;
end
if pivot_col ~= k
% 对A列变换
temp = A(:, k);
A(:, k) = A(:, pivot_col);
A(:, pivot_col) = temp;
% 对Q列变换
temp = Q(:, k);
Q(:, k) = Q(:, pivot_col);
Q(:, pivot_col) = temp;
% 对U列变换
temp = U(:, k);
U(:, k) = U(:, pivot_col);
U(:, pivot_col) = temp;
end
% 计算LU
L(k:m, k) = A(k:m, k) / A(k, k);
U(k, k:n) = A(k, k:n);
% 高斯消元
for i = k+1:m
A(i, k:n) = A(i, k:n) - L(i, k) * U(k, k:n);
end
end
% L的最后元素为1
L(end, end) = 1;
end

PQLU 分解

这个分解和完全主元法完全对应
$$
PAQ = LU
$$
为了目录结构的完整性, 所以专门列为一个标题, 但是内容是和完全主元法一致的
相信看完前面 [[#推导|PLU分解]] 的推导, 这个也是很容易推出来的


追赶法 (Crout)

  • 也称为Crout分解
    对于系数矩阵三对角矩阵的线性方程组, 它的结构比一般的线性方程组简单很多
    我们理应有更好的解法

    [!note] 三对角矩阵
    形如以下矩阵为三对角矩阵:
    $$\begin{bmatrix}\mathrm{a}1&\mathrm{c}1\\mathrm{d}2&\mathrm{a}2&\mathrm{c}2\&\ddots&\ddots&\ddots\&&\mathrm{d}{\mathrm{n}-1}&\mathrm{a}{\mathrm{n}-1}&\mathrm{c}{\mathrm{n}-1}\&&&\mathrm{d}{\mathrm{n}}&\mathrm{a}{\mathrm{n}}\end{bmatrix}\begin{bmatrix}\mathrm{x}1\\mathrm{x}2\\vdots\\mathrm{x}{\mathrm{n}-1}\\mathrm{x}{\mathrm{n}}\end{bmatrix}=\begin{bmatrix}\mathrm{b}1\\mathrm{b}2\\vdots\\mathrm{b}{\mathrm{n}-1}\\mathrm{b}{\mathrm{n}}\end{bmatrix}$$

对于三对角矩阵, 如果它满足[[#追赶法的条件]], 就一定有如下分解:
$$
A=LU
$$
其中
$$L=\begin{bmatrix}l_{11}&0&…&0\l_{21}&l_{22}&…&0\\vdots&\vdots&\ddots&\vdots\l_{n1}&l_{n2}&…&l_{nn}\end{bmatrix},U=\begin{bmatrix}1&u_{21}&…&u_{n1}\0&1&…&u_{n2}\\vdots&\vdots&\ddots&\vdots\0&0&…&1\end{bmatrix}$$


追赶法的条件

[!note] 追赶法条件
若 $A$ 为对角占优三对角阵,且满足
$|b_1|>|c_1|>0,|b_n|>|a_n|>0,\quad a_i\neq0,c_i\neq0$
$|b_{i}:|\ge|:a_{i}:|+|:c_{i}:|:,:a_{i}\cdot c_{i}\neq0\quad i=2,\cdots,n-1$
则方程组有唯一的 LU 分解
对应的矩阵形式: $$
A=LDM=TM$$
其中 $T$ 是单位下三角矩阵, $M$ 是上三角矩阵
更彻底的分法其实是 $LDM$, 其中 $L$ 是单位下三角矩阵, $D$ 是对角矩阵, $M$ 是单位上三角矩阵

  • 显然这个条件蕴含了三对角矩阵 A 的各阶顺序主子式都不为零

具体操作

操作起来是很简单的, 我找到一张很棒的图:
![[1ded1536454857.jpg]]
非常直观


平方根法(Cholesky 分解)

对于三对角矩阵我们有很方便的解法, 那么对于对称正定矩阵又如何呢?
我们对于对称正定矩阵, 可以做 Cholesky 分解
先了解一下对称正定矩阵的特点:

[!note] 对称正定矩阵性质
如果 $A$ 是一个对称正定矩阵, 那么:

  1. $A$ 的所有特征值 $>0$
  2. $A$ 是非奇异矩阵, 也就是各行各列线性无关, 行列式为 $\ne0$
  3. $A^{-1}$ 也是对称正定的
  4. $A$ 的对角线元素 (主元) $a_{ii}>0\quad(i=1,2,\cdots,n)$
  5. $A$ 的所有顺序主子式均 $>0$, 即 $\det(A_{k})>0$

我们先来看看对称矩阵能分解成什么样

[!note] 对称矩阵的三角分解
设 $A$ 是对称矩阵, 如果 $A$ 的所有顺序主子式都 $\ne0$, 那么 $A$ 有唯一的分解:
$$A=LDL^{T}$$
其中 $L$ 为单位下三角矩阵, $D$ 为对角矩阵

  • 直观地理解, 是很简单的, 其实就是消元:
    我们通过 $L^{-1}$ 进行初等行变换消掉下三角部分, 由于这个矩阵是对称的
    把 $L^{-1}$ 转置一下, 不就能消掉上三角部分了吗?
    其实是 $L^{-1}A{L^{-1}}^T=D$

现在我们更进一步, 看看对称正定矩阵可以分解成什么样
我们已经可以得到 $A=\tilde{L}D\tilde{L}^T$ (这里为了防止冲突, 我们把 $L$ 记为 $\tilde{L}$)
我们记 $D=diag(d_1,d_2\cdots d_n)$ ($diag$ 指的是对角的意思), 由于 $A$ 是正定的
由性质 1, 我们可以把 $D$ 拆成两半
$$D^{\frac12}=diag(\sqrt{d_1},\sqrt{d_2}\cdots\sqrt{d_n})$$
容易验证 $D^{\frac{1}{2}}\times D^\frac{1}{2}=D$
又由于 $D^{\frac{1}{2}}={D^{\frac{1}{2}}}^T$, 我们可以得到:
$$
A=\tilde{L}D^{\frac{1}{2}}{D^{\frac{1}{2}}}^T\tilde{L}^T=\tilde{L}D^{\frac{1}{2}}({D^{\frac{1}{2}}}\tilde{L})^T
$$

如果我们记 $\tilde{L}D^{\frac{1}{2}}=L$, 就得到:
$$
A=LL^T
$$
这就是 $Cholesky$ 分解

[!note] 对称正定矩阵的 Cholesky分解
若 $A$ 对称正定, 则 $A$ 可以唯一分解为
$$A=LL^T$$
其中 $L$ 为实下三角矩阵, 对角元素均 $>0$


具体操作

![[Pasted image 20240414235714.png]]
如图所示, 只要把右侧矩阵乘起来, 一一对应位置来求解

  • 计算顺序:先求 $L$ 的第一列,即可知道 $L^T$ 的第一行,然后再求解 $L$ 的第二列,….,以此类推

计算公式如下:
$$a_{ij}=\sum_{k=1}^nl_{ik}l_{jk}=\sum_{k=1}^{j-1}l_{ik}l_{jk}+l_{jj}l_{ij}$$
给出一个例子:
[[Cholesky分解例子]]


Cholesky 分解回代过程

和上面类似
解方程:$Ly=b$ 和 $L^Tx=y$


优缺点

优点:

  • 省内存:各值可以存放在原矩阵对应位置,不必开辟新的存储空间
  • 不用选主元
  • 具有数值稳定性
  • 由于 $A$ 的对称性, 运算量为 $LU$ 分解的一半
    缺点:
  • 需要进行 $n$ 次开方运算, 而开放运算一定是有误差的, 还需要额外计算量

改进的 Cholesky分解

运用平方根法计算量较大,为了避免开方运算,可以使用改进的 $Cholesky$分解

[!note] 改进 Cholesky 分解
$A$ 为对称正定矩阵, 则我们改进的 $Cholesky$ 分解为:
$$A=LDL^T$$
其中 $L$ 为单位下三角矩阵, $D$ 为对角矩阵

说是改进, 其实这个是我们推出 $Cholesky$ 的中间产物, 之前已经见过了


具体操作

$$A=LDL^T=\begin{bmatrix}1&&&&\l_{21}&1&&&\\vdots&&\ddots&\l_{n1}&\cdots&l_{n,n-1}&1\end{bmatrix}\begin{bmatrix}d_1&&&\&d_2&&\&&\ddots&\&&&d_n\end{bmatrix}\begin{bmatrix}1&l_{21}&\cdots&l_{n1}\&1&&l_{n2}\&&\ddots&\vdots\&&&1\end{bmatrix}$$
和上面的差不多, 我们把右边乘开, 对上位置列方程计算就行了
有计算公式:
$$a_{ij}=\sum_{k=1}^nl_{ik}d_kl_{jk}=\sum_{k=1}^{j-1}l_{ik}d_kl_{jk}+l_{ij}d_j$$


改进 Cholesky 分解的回代过程

和前面类似, 就是求解 $Ly=b$ 和 $DL^Tx=y$


优缺点

优点: 相比 Cholesky 分解不用进行开方运算


下面已经没有了哦

作者

anka

发布于

2024-04-18

更新于

2024-09-08

许可协议

评论

You forgot to set the owner, admin, repo,client_id, or client_secret for Gitalk. Please set it in _config.yml.