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=1l21l31ln11l32ln21lnn11

D = ∣ d 1 d 2 ⋱ d n ∣ D= \begin{vmatrix} d_1 \\ & d_2 \\ & & \ddots\\ & & & d_n \end{vmatrix} \quad D=d1d2dn
  当进行对称线性方程组 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=bik=1i1likyk,i=1,2,,nzi=yi/di,i=n,n1,,1xi=zik=i+1nlkixk,i=n,n1,,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=123

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