Eigen 矩阵的LDLT分解求解线性方程组
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
矩阵的LDLT分解求解线性方程组
1.LDLT分解原理
利用矩阵
A
A
A的
L
D
L
T
LDL^T
LDLT分解来求解方程组
A
x
=
b
Ax=b
Ax=b的方法称为
L
D
L
T
LDL^T
LDLT分解法。若对称矩阵
A
A
A的各阶顺序主子式不为零则
A
A
A可以唯一分解为
A
=
L
D
L
T
A=LDL^T
A=LDLT。其中
L
L
L和
D
D
D的形式如下
L
=
∣
1
l
21
1
l
31
l
32
1
⋯
⋯
⋯
⋱
l
n
1
l
n
2
⋯
l
n
n
−
1
1
∣
L= \begin{vmatrix} 1 \\ l_{21} & 1 \\ l_{31} &l_{32}& 1 \\ \cdots& \cdots &\cdots& \ddots\\ l_{n1} & l_{n2}& \cdots& l_{nn-1}& 1 \end{vmatrix} \quad
L=∣∣∣∣∣∣∣∣∣∣1l21l31⋯ln11l32⋯ln21⋯⋯⋱lnn−11∣∣∣∣∣∣∣∣∣∣
D
=
∣
d
1
d
2
⋱
d
n
∣
D= \begin{vmatrix} d_1 \\ & d_2 \\ & & \ddots\\ & & & d_n \end{vmatrix} \quad
D=∣∣∣∣∣∣∣∣d1d2⋱dn∣∣∣∣∣∣∣∣
当进行对称线性方程组
A
x
=
b
Ax=b
Ax=b的求解时由
A
=
L
D
L
T
A=LDL^T
A=LDLT可得
(
L
D
L
T
)
x
=
b
(LDL^T)x=b
(LDLT)x=b即
L
D
L
T
x
=
b
LDL^Tx=b
LDLTx=b。我们分别令
z
=
L
T
x
y
=
D
z
z= L^Tx\\ y=Dz\\
z=LTxy=Dz
则有
L
y
=
b
Ly=b
Ly=b
因此可分步解得
x
i
x_i
xi。
y
i
=
b
i
−
∑
k
=
1
i
−
1
l
i
k
y
k
,
i
=
1
,
2
,
⋯
,
n
z
i
=
y
i
/
d
i
,
i
=
n
,
n
−
1
,
⋯
,
1
x
i
=
z
i
−
∑
k
=
i
+
1
n
l
k
i
x
k
,
i
=
n
,
n
−
1
,
⋯
,
1
y_i=b_i-\sum_{k=1}^{i-1}l_{ik}y_k , i=1,2,\cdots,n\\ z_i=y_i/d_i,i=n,n-1,\cdots,1\\ x_i=z_i-\sum_{k=i+1}^{n}l_{ki}x_k ,i=n,n-1,\cdots,1
yi=bi−k=1∑i−1likyk,i=1,2,⋯,nzi=yi/di,i=n,n−1,⋯,1xi=zi−k=i+1∑nlkixk,i=n,n−1,⋯,1
2.Eigen库实现
2.1问题定义
用
L
D
L
T
LDL^T
LDLT法求解线性方程组
A
x
=
b
Ax=b
Ax=b其中
A
A
A和
b
b
b如下
A
=
∣
1
1
/
2
1
/
2
1
/
2
1
1
/
2
1
/
2
1
/
2
1
∣
A= \begin{vmatrix} 1 &1/2 &1/2\\ 1/2 &1 &1/2 \\ 1/2 & 1/2 &1 \end{vmatrix} \quad
A=∣∣∣∣∣∣11/21/21/211/21/21/21∣∣∣∣∣∣
b = ∣ 1 − 2 3 ∣ b= \begin{vmatrix} 1 \\ -2 \\ 3 \end{vmatrix} \quad b=∣∣∣∣∣∣1−23∣∣∣∣∣∣
2.2代码实现
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
Matrix3d A;//3x3的矩阵
Vector3d b;//3x1的列向量
A << 1, 0.5, 0.5, 0.5, 1, 0.5, 0.5, 0.5, 1;//给A赋值
b << 1, -2, 3;//给b赋值
Vector3d x = A.ldlt().solve(b);//求解Ax=b
cout <<"x^T=[" <<x.transpose()<<"]" << endl;
return 0;
}
2.3输出结果
x^T=[ 1 -5 5]
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |