工程数学(3)——矩阵的直接三角分解法

本文探讨了三对角方程组追赶法,适用于严格对角占优阵的快速求解,以及对称正定矩阵的Cholesky分解,通过LDU或LDT分解简化计算。这两种方法在数值线性代数中极具效率。

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


一、三对角方程组追赶法

A x = f Ax=f Ax=f的系数矩阵呈对三角形
A = ( b 1 c 1 a 2 b 2 c 2 ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ) A= \begin{pmatrix} b_{1} & c_{1} \\ a_{2} & b_{2} & c_2\\ & \ddots & \ddots & \ddots\\ &&a_{n-1} & b_{n-1} &c_{n-1}\\ &&&a_{n}&b_{n}\\ \end{pmatrix} A=b1a2c1b2c2an1bn1ancn1bn
A = L U A=LU A=LU具有以下形式
L = ( 1 l 2 1 l 3 ⋱ ⋱ 1 l n 1 ) L= \begin{pmatrix} 1 \\ l_{2} & 1 \\ &l_3& \ddots\\ && \ddots& 1\\ &&& l_n & 1\\ \end{pmatrix} L=1l21l31ln1

U = ( u 1 d 1 u 2 d 2 ⋱ ⋱ u n − 1 d n − 1 u n ) U= \begin{pmatrix} u_1&d_1 \\ & u_{2} & d_2 \\ &&\ddots& \ddots\\ &&&u_{n-1}& d_{n-1}\\ &&&& u_n\\ \end{pmatrix} U=u1d1u2d2un1dn1un

计算公式如下:
d i = c i d_i=c_i di=ci
u 1 = b 1 u_1=b_1 u1=b1
l i = a i / u i − 1 l_i=a_i/u_{i-1} li=ai/ui1
u i = b i − l i c i − 1 u_i=b_i-l_ic_{i-1} ui=bilici1
计算次序是 u 1 , l 2 , u 2 , l 3 , u 3 , ⋯   , l n , u n u_1,l_2,u_2,l_3,u_3,\cdots,l_n,u_n u1,l2,u2,l3,u3,,ln,un
原方程组转化为
L y = f Ly=f Ly=f
U x = y Ux=y Ux=y
即可得解
求解三对角方程组前提条件是A是严格对角占优阵或对称正定

二、对称正定的Cholesky分解法

若A对称正定,则存在一个实的下三角阵L,使 A = L L T A=LL^T A=LLT
这种分解是唯一的
L = ( l 11 l 21 l 22 ⋯ ⋱ l n 1 l n 2 ⋯ l n n ) L= \begin{pmatrix} l_{11} \\ l_{21} & l_{22} \\ \cdots & & \ddots\\ l_{n1}&l_{n2}& \cdots&l_{nn}\\ \end{pmatrix} L=l11l21ln1l22ln2lnn
逐列计算L的元素,即 l 11 , l 21 , ⋯   , l n 1 , l 22 , ⋯   , l n 2 , ⋯   , l n n l_{11},l_{21},\cdots,l_{n1},l_{22},\cdots,l_{n2},\cdots,l_{nn} l11,l21,,ln1,l22,,ln2,,lnn
原方程组转化为 L y = b Ly=b Ly=b
L T x L^Tx LTx=y
PS:Matlab有专用的函数来计算 L L L

L=chol(A)

为了避免相对耗时的平方根运算,将A分解为 A = L D L T A=LDL^T A=LDLT
其中 L = ( 1 l 21 1 ⋯ ⋱ l n 1 l n 2 ⋯ 1 ) L= \begin{pmatrix} 1 \\ l_{21} &1\\ \cdots & & \ddots\\ l_{n1}&l_{n2}& \cdots&1\\ \end{pmatrix} L=1l21ln11ln21
D = ( d 1   d 2 ⋱ d n ) D= \begin{pmatrix} d_1 \\ \ &d_2\\ & & \ddots\\ && &d_n\\ \end{pmatrix} D=d1 d2dn
称为改进的平方根法

### 解决编译时找不到 `Eigen/Eigen` 头文件的问题 当遇到类似于 `fatal error: Eigen/Eigen: No such file or directory` 的错误时,通常意味着编译器无法定位所需的库文件。对于这个问题,有几种常见的解决方法。 #### 安装 Eigen 库 如果尚未安装 Eigen 库,则需要先进行安装。可以通过包管理工具来简化这一过程: ```bash sudo apt-get update sudo apt-get install libeigen3-dev ``` 这会下载并安装最新版本的 Eigen 到系统的标准路径下[^1]。 #### 修改 CMakeLists.txt 配置 确保项目能够正确识别 Eigen 路径,在项目的 `CMakeLists.txt` 中加入如下配置语句: ```cmake find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) ``` 这段代码告诉 CMake 去寻找 Eigen 并将其包含目录添加到编译选项里。这样可以使得后续源码中的 `#include <Eigen/Dense>` 或其他形式的引入变得有效[^2]。 #### 设置环境变量 另一种方式是在终端环境中设置相应的环境变量,比如 `CPATH` 来指定额外的头文件搜索位置。假设已经手动解压了 Eigen 至 `/opt/eigen3` 下面的话,可以在命令行执行下面的操作: ```bash export CPATH=/opt/eigen3:$CPATH ``` 或者更持久化的方式是将上述指令加到 `.bashrc` 文件里面去[^3]。 #### 校验依赖关系 有时即使完成了以上操作仍然会出现同样的问题,这时应该仔细检查整个工程的所有子模块及其各自的 `package.xml` 和 `CMakeLists.txt` 是否遗漏了对 Eigen 的声明或引用不当的情况。 ```xml <build_depend> eigen </build_depend> <!-- package.xml --> ``` 以及确认所有涉及的地方都已经按照官方文档说明进行了正确的集成处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叫我阿亮就好了-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值