当前位置: 首页 > news >正文

有限元方法中的数值技术:Cholesky矩阵分解

计算原理

对于对称正定矩阵AAA,存在于一个实的下三角矩阵LLL,使得A=LLTA=LL^TA=LLT,若限定LLL的对角元素为正时,这种分解是唯一的。

(a11a12⋯a1na21a22⋯a2n⋮⋱an1an2⋯ann)=(l11l21l22⋯⋱ln1ln2⋯lnn)(l11l21⋯ln1l22⋯ln2⋱lnn) { \left( \begin{array} { l l l l } { a _ { 1 1 } } & { a _ { 1 2 } } & { \cdots } & { a _ { 1 n } } \\ { a _ { 2 1 } } & { a _ { 2 2 } } & { \cdots } & { a _ { 2 n } } \\ { \vdots } & & { \ddots } & \\ { a _ { n 1 } } & { a _ { n 2 } } & { \cdots } & { a _ { n n } } \end{array} \right) } = { \left( \begin{array} { l l l l } { l _ { 1 1 } } & & & \\ { l _ { 2 1 } } & { l _ { 2 2 } } & & \\ { \cdots } & & { \ddots } & \\ { l _ { n 1 } } & { l _ { n 2 } } & { \cdots } & { l _ { n n } } \end{array} \right) } { \left( \begin{array} { l l l l } { l _ { 1 1 } } & { l _ { 2 1 } } & { \cdots } & { l _ { n 1 } } \\ & { l _ { 2 2 } } & { \cdots } & { l _ { n 2 } } \\ & & { \ddots } & \\ & & & { l _ { n n } } \end{array} \right) } a11a21an1a12a22an2a1na2nann=l11l21ln1l22ln2lnnl11l21l22ln1ln2lnn

  1. l11=a11l_{11} = \sqrt{a_{11}}l11=a11
  2. li1=ai1l11,i=2,Nl_{i1} = \frac{a_{i1}}{l_{11}}, \quad i=2,Nli1=l11ai1,i=2,N
  3. j=2,Nj=2,Nj=2,N,做A~B处理:

A:
ljj=ajj−∑k=1j−1ljk2l_{jj} = \sqrt{a_{jj} - \sum_{k=1}^{j-1} l_{jk}^2 }ljj=ajjk=1j1ljk2

B:
lij=(aij−∑k=1j−1likljk)ljj,i=j+1,Nl_{ij} = \frac{ \left( a_{ij} - \sum_{k=1}^{j-1} l_{ik} l_{jk} \right) }{ l_{jj} }, \quad i=j+1,Nlij=ljj(aijk=1j1likljk),i=j+1,N

Fortran数值实现

subroutine cholesky(a,l,n)
! cholesky矩阵分解(只适用于对称正定矩阵)! A = L*L^Tinteger, intent(in) :: nreal*8, intent(in) :: a(n,n)real*8, intent(out) :: l(n,n)integer :: i,j,kl = 0l(1,1) = sqrt(a(1,1))l(2:,1) = a(2:,1)/l(1,1)do j = 2,ns = 0do k = 1,j-1s = s + l(j,k)**2end dol(j,j) = sqrt(a(j,j)-s)do i = j+1,ns = 0do k = 1,j-1s = s + l(i,k) * l(j,k)end dol(i,j) = (a(i,j)-s)/l(j,j)end doend do
end subroutine cholesky

数值案例

A=(233.4615113.8423256.0623145.0697113.842378.6033127.429895.3089256.0623127.4298281.4721164.8676145.069795.3089164.8676181.2339) \mathbf{A} = \left( \begin{array}{cccc} 233.4615 & 113.8423 & 256.0623 & 145.0697 \\ 113.8423 & 78.6033 & 127.4298 & 95.3089 \\ 256.0623 & 127.4298 & 281.4721 & 164.8676 \\ 145.0697 & 95.3089 & 164.8676 & 181.2339 \end{array} \right) A=233.4615113.8423256.0623145.0697113.842378.6033127.429895.3089256.0623127.4298281.4721164.8676145.069795.3089164.8676181.2339

主程序:

program mainimplicit noneinteger,  parameter :: n = 4real*8 :: a(n,n),l(n,n)integer :: i, ja = reshape([ &233.4615d0, 113.8423d0, 256.0623d0, 145.0697d0, &113.8423d0,  78.6033d0, 127.4298d0,  95.3089d0, &256.0623d0, 127.4298d0, 281.4721d0, 164.8676d0, &145.0697d0,  95.3089d0, 164.8676d0, 181.2339d0  &], shape(a), order=[2,1])call cholesky(a, l, n)print *, "Lower Triangular Matrix L from Cholesky decomposition:"do i = 1, nwrite(*, 100) (l(i,j), j = 1, n)end do100 format(4F12.6)
end program main

输出:

 Lower Triangular Matrix L from Cholesky decomposition:15.279447    0.000000    0.000000    0.0000007.450682    4.805272    0.000000    0.00000016.758610    0.534147    0.579450    0.0000009.494434    5.112904    5.217081    6.142468

求解矩阵方程

对于Ax=b\mathbf { A x } = \mathbf { b }Ax=b,进行cholesky分解:

LLTx=b,等价于{Ly=bLTx=y \mathbf { L } \mathbf { L } ^ { T } \mathbf { x } = \mathbf { b },等价于\left\{ \begin{array} { l l } { \mathbf { L } \mathbf { y } = \mathbf { b } } \\ { \mathbf { L } ^ { \mathrm { T } } \mathbf { x } = \mathbf { y } } \end{array} \right. LLTx=b,等价于{Ly=bLTx=y

对于:

A=(4−11−14.252.7512.753.5),b=(467.25) \mathbf { A } = { \left( \begin{array} { l l l } { 4 } & { - 1 } & { 1 } \\ { - 1 } & { 4 . 2 5 } & { 2 . 7 5 } \\ { 1 } & { 2 . 7 5 } & { 3 . 5 } \end{array} \right) } , \mathbf { b } = { \left( \begin{array} { l } { 4 } \\ { 6 } \\ { 7 . 2 5 } \end{array} \right) } A=41114.252.7512.753.5,b=467.25

program mainimplicit noneinteger,  parameter :: n = 3real*8 :: a(n,n), l(n,n), b(n), x(n), y(n)integer :: ia = reshape([ &4.0d0,   -1.0d0,   1.0d0,  &-1.0d0,  4.25d0,  2.75d0, &1.0d0,   2.75d0,  3.5d0   &], shape(a), order=[2,1])b = [4.0d0, 6.0d0, 7.25d0]call cholesky(a, l, n)! 解 Ly = bcall lowtri(l, b, y, n)! 解 L^T x = ycall uptri(transpose(l), y, x, n)print *, "Solution vector x:"write(*, 100) x100 format(3F12.6)
end program main

输出:

 Solution vector x:1.000000    1.000000    1.000000

注意:子程序中默认:implicit real*8(a-z)

参考文献

  1. 宋叶志,茅永兴,赵秀杰.Fortran 95/2003科学计算与工程[M].清华大学出版社,2011.
http://www.lryc.cn/news/614878.html

相关文章:

  • 从零学习three.js官方文档(一)——基本篇
  • 校招秋招春招实习快手在线测评快手测评题库|测评解析和攻略|题库分享
  • 【linux基础】Linux目录和Windows目录的区别
  • 免费开发数字人API
  • Milvus 向量数据库基础操作解析
  • Kubernetes 无法识别你定义的 `CronJob` 资源*逐步解决方案
  • 不足3个细胞怎么做差异分析?
  • 目标检测数据集 - 足球场广告横幅检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 【Datawhale AI夏令营】从Baseline到SOTA:深度剖析金融问答RAG管道优化之路
  • [CUDA] CUTLASS | `CuTe DSL` 创新
  • 《TypeScript搭建的认知桥梁:游戏化学习应用的深层架构》
  • day22|学习前端ts语言
  • Javaweb - 14.1 - 前端工程化
  • 政府数字化大屏系统 - Flask实现方案
  • 使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
  • HTML金色流星雨
  • 人工智能技术发展历史演变
  • Android中RecyclerView基本使用
  • 深入理解Qt事件处理机制
  • C++实现MATLAB矩阵计算程序
  • 【Redis7.x】docker配置主从+sentinel监控遇到的问题与解决
  • Debian 系统更新命令
  • PDF 转 HTML API 数据接口
  • 免费PDF编辑软件 pdf24-creator 及其安装包
  • 力扣-74.搜索二维矩阵
  • MyBatis联合查询 - 注解篇
  • 【洛谷题单】--分支结构(三)
  • JAVA基础-使用BIO / NIO实现聊天室功能
  • 一文详解 C++ 继承体系