Eigen 矩阵的LDLT分解求解线性方程组

该博客介绍了利用LDLT分解方法解决对称线性方程组的过程,并通过Eigen库在C++中实现了这一方法。具体包括LDLT分解的原理,以及一个3x3矩阵和对应右端项的示例。代码展示了如何使用Eigen库的ldlt().solve()函数求解线性方程组,并给出了输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]
  1. 应用

SLAM十四讲----非线性优化----手撕高斯牛顿法(用Eigen库实现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI Chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值