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

有限元方法中的数值技术:预处理共轭梯度法 PCG (2)

Cholesky预处理: 预处理矩阵 M=LLT\mathbf{M} = LL^TM=LLT,其中 LLLAAA 的下三角Cholesky分解

每步的PCG主要分量公式如下:

  1. 预处理向量 zzz 的计算
    (两步三角系统求解,逐分量写为):

    • 先解 Ly=rL y = rLy=r
      y1=r1L11 y_1 = \frac{r_1}{L_{11}} y1=L11r1
      yi=1Lii(ri−∑j=1i−1Lijyj),i=2,…,n y_i = \frac{1}{L_{ii}}\left(r_i - \sum_{j=1}^{i-1} L_{ij} y_j\right),\quad i=2,\ldots,n yi=Lii1(rij=1i1Lijyj),i=2,,n

    • 再解 LTz=yL^T z = yLTz=y
      zn=ynLnn z_n = \frac{y_n}{L_{nn}} zn=Lnnyn
      zi=1Lii(yi−∑j=i+1nLjizj),i=n−1,…,1 z_i = \frac{1}{L_{ii}}\left(y_i - \sum_{j=i+1}^{n} L_{ji} z_j\right),\quad i=n-1,\ldots,1 zi=Lii1(yij=i+1nLjizj),i=n1,,1

  2. 其余 αk\alpha_kαkx(k+1)x^{(k+1)}x(k+1)r(k+1)r^{(k+1)}r(k+1)βk\beta_kβkp(k+1)p^{(k+1)}p(k+1) 的表达方式完全和Jacobi预处理一致,只是预处理向量zzz的获得方式不同

subroutine pcg_c(a, b, x, x0, n)! Cholesky预处理共轭梯度法(适用于对称正定A)integer, intent(in) :: nreal*8, intent(in) :: a(n,n), b(n), x0(n)real*8, intent(out) :: x(n)real*8 :: x1(n), x2(n), r0(n), r1(n)real*8 :: z0(n), z1(n), y(n)real*8 :: p0(n), p1(n)real*8 :: L(n, n)integer :: i, k, iter_maxreal*8 :: eps, tmp1, tmp2, tmp3, afa, beta, dr_siter_max = 1000eps = 1.0d-7write(*,501)! --- 1. Cholesky分解 A = LL^T ---call cholesky(a, L, n)! --- 2. 初始化 ---x1 = x0r0 = b - matmul(a, x1)call lowtri(L, r0, y, n)call uptri(transpose(L), y, z0, n)p0 = z0do k = 1, iter_maxtmp1 = dot_product(r0, z0)tmp2 = dot_product(p0, matmul(a, p0))afa = tmp1 / tmp2x2 = x1 + afa * p0dr_s = sqrt(dot_product(r0, r0))if (dr_s < eps) exitr1 = r0 - afa * matmul(a, p0)call lowtri(L, r1, y, n)call uptri(transpose(L), y, z1, n)tmp3 = dot_product(r1, z1)beta = tmp3 / tmp1p1 = z1 + beta * p0write(*,503) k, (x2(i), i=1, n)! 全部更新r0 = r1z0 = z1p0 = p1x1 = x2end dox = x2501 format(//,18x,"Cholesky-PCG Iterative",//)
503 format(i5, 4(3x, f12.8))
end subroutine pcg_c
http://www.xdnf.cn/news/19732.html

相关文章:

  • 【Cursor-Gpt-5-high】StackCube-v1 任务训练结果不稳定性的分析
  • 关于linux网络编程——4
  • 醋酸铕:点亮现代生活的“隐形之光“
  • HTML元素周期表
  • 【C++】C++入门—(中)
  • ASP.NET Web Forms 实战:用 RadioButton 打造“性别/称谓选择”表单的最佳实践
  • 【数据结构】1绪论
  • 【Qt中信号槽连接connect有接收者和无接收者的区别】
  • 执行一条select语句期间发生了什么?
  • 常用符号 Emoji 对照表——Unicode UTF-8
  • CSS Sass Less 样式.xxx讲解
  • SpringMVC的请求接收与结果响应
  • 华为HCIE数通含金量所剩无几?考试难度加大?
  • 数据库选择有讲究?SQLite、PostgreSQL还是MySQL?
  • 电脑接入企业中的网线,为啥网卡上面显示AD域名
  • MongoDB 聚合查询超时:索引优化与分片策略的踩坑记录
  • 国产CAD皇冠CAD(CrownCAD)建模教程:汽车驱动桥
  • 二、Scala流程控制:分支与循环
  • 波浪模型SWAN学习(2)——波浪浅化模拟(Shoaling on sloping beach)
  • RoPE频率缩放机制:解密大语言模型上下文扩展的核心算法
  • linux之IO存储子系统全流程分析
  • 差分隐私在运营指标:ABP 的 DP 计数器与噪声预算
  • 使用PyTorch构建全连接神经网络实现MNIST手写数字分类
  • 【面试题】 如何处理中文分词?
  • LeetCode 2486.追加字符以获得子序列
  • ubuntu的2T新硬盘分区、格式化并挂载
  • Python进阶第三方库之Numpy
  • GO : cannot find module
  • 【音视频】 RGB 格式详解
  • 1.Linux:命令提示符,history和常用快捷键