预处理共轭梯度(PCG)解线性联立方程(python,数值积分)

本文介绍了线性联立方程组在遇到病态矩阵时,如何利用预处理共轭梯度法(PCG)进行求解。PCG通过对系数矩阵进行预处理以改善迭代过程的收敛性。文章详细阐述了预处理的概念,并提供了左处理和右处理的说明。此外,还展示了简单的预处理方法——使用对角矩阵的倒数近似。最后,给出了一个基于主对角线的预处理共轭梯度算法的步骤,以及一个计算实例验证了算法的正确性。
摘要由CSDN通过智能技术生成

第十四课 线性联立方程的预处理共轭梯度(PCG)

系数矩阵病态

百度解释:求解方程组时如果对数据进行较小的扰动,则得出的结果具有很大波动,这样的矩阵称为病态矩阵
在直接求解的诸多方法中,线性方程可能无法准确地求解,尤其是在使用“手动”计算时。在这种情况下,方程组就被说成是“病态的”。现代电子计算器已经能够精确到小数点后许多位,因此方程组的处理并不像“手动”计算,只需要选择精确到小数点后几位。在下表中,四舍五入到小数点后4、5、6、7和8位的数值解与真实解进行比较。可以看出,对于一个适当的工程项目而言,精确到小数点后8位是必要的。当使用32位字的计算机时,建议同学们使用“双精度”,即64位字,达到大约15位小数的精度,以满足大多数实际用途。
在这里插入图片描述

本文描述的程序执行的计算精度通常为“双精度”,虽然可以去用数字去度量这个‘病态’,称为“条件数”,但这个过程是很辛苦的,而且并不适用在工程实践。到目前为止,最准确性的解决方案是对结果的物理一致性进行独立检查。
在迭代过程中,这种‘病态’会是的方程变得收敛速度慢或者是根本就不收敛。。因此,要看下面的方程
在这里插入图片描述
是否可以转化成一个等效的方程
在这里插入图片描述
之后迭代过程的收敛特性会变得更好。这种使用“预处理”矩阵[P]转化的过程称为“预处理”,得到
在这里插入图片描述
上面的叫做左处理
在这里插入图片描述
这种叫做右处理
如果[P]是[A]的逆,则不需要迭代,但计算工作却很难实现。而得到的另外一种有效方式是,寻找可以方便获得的[A]-1的近似值。其中最简单的是通过取[A]的主对角项的倒数形成的对角矩阵(存储作为一个向量)。这个想法可以通过在逆近似(称为“不完全因子分解”)中包含更多的[A]的主对角线项来扩展,但是在下面的程序中,我们只针对纯主对角线形式。对共轭梯度法的计算过程进行预处理,形成“预处理共轭梯度”或“PCG”算法。算法的步骤如下面所示。
初始阶段:
在这里插入图片描述
在这里插入图片描述
迭代阶段:
在这里插入图片描述
算例采用第一篇中的基础算例
在这里插入图片描述

具体求解过程可以看高斯赛德尔迭代
程序如下:
其中有一个主程序和一个检查是否收敛的子程序checkit
主程序:

#线性联立方程的预条件共轭梯度法
import numpy as np
import math
import B
n=3
converged=np.array([False])
d=np.zeros((n,1))
p=np.zeros((n,1))
u=np.zeros((n,1))
precon=np.zeros((n
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
当使用共轭梯度线性方程组时,通常需要进行一些预处理步骤以提高求解效率和数值稳定性。以下是一个使用MATLAB进行预处理共轭梯度求解线性方程组的示例: ```matlab % 创建示例线性方程组 Ax = b n = 100; % 方程组的维度 A = gallery('poisson', n); % 创建一个具有对角占优性质的矩阵 b = ones(n, 1); % 预处理步骤 M = diag(diag(A)); % 对角预处理,构造对角矩阵作为预处理矩阵 % 共轭梯度求解线性方程组 x0 = zeros(n, 1); % 初始 tol = 1e-6; % 迭代收敛精度 max_iter = n; % 最大迭代次数 [x, flag, relres, iter] = pcg(A, b, tol, max_iter, M, M', x0); % 输出结果 disp(['共轭梯度法迭代次数:', num2str(iter)]); disp(['相对残差:', num2str(relres)]); disp(['是否收敛:', num2str(flag == 0)]); % 可选:计算精确并计算误差 x_exact = A\b; error = norm(x - x_exact); disp(['求解误差:', num2str(error)]); ``` 这个示例中,我们首先创建了一个具有对角占优性质的线性方程组Ax=b(使用`gallery`函数创建了一个Poisson方程组的系数矩阵),然后定义了预处理矩阵M为A的对角矩阵。接下来,我们使用MATLAB中的`pcg`函数进行共轭梯度求解,并指定预处理矩阵M和其转置M'。最后,我们输出了迭代次数、相对残差和是否收敛,并可选地计算了求解误差。 请注意,这只是一个简单的示例,实际应用中可能需要根据具体问题进行适当的预处理选择和参数调整。预处理方法有很多种,如不完全Cholesky分、不完全LU分等,具体选择取决于问题的特点和求解效果的需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深渊潜航

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

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

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

打赏作者

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

抵扣说明:

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

余额充值