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

MATLAB中pcg函数用法

目录

语法

说明

示例

线性系统的迭代解

使用指定了预条件子的 pcg

提供初始估计值

使用函数句柄代替数值矩阵


        pcg函数的功能是求解线性系统 - 预条件共轭梯度法。

语法

x = pcg(A,b)
x = pcg(A,b,tol)
x = pcg(A,b,tol,maxit)
x = pcg(A,b,tol,maxit,M)
x = pcg(A,b,tol,maxit,M1,M2)
x = pcg(A,b,tol,maxit,M1,M2,x0)
[x,flag] = pcg(___)
[x,flag,relres] = pcg(___)
[x,flag,relres,iter] = pcg(___)
[x,flag,relres,iter,resvec] = pcg(___)

说明

        x = pcg(A,b) 尝试使用预条件共轭梯度法求解关于 x 的线性系统 A*x = b。如果尝试成功,pcg 会显示一条消息来确认收敛。如果 pcg 无法在达到最大迭代次数后收敛或出于任何原因暂停,则会显示一条包含相对残差 norm(b-A*x)/norm(b) 以及该方法停止时的迭代次数的诊断消息。

        x = pcg(A,b,tol) 指定该方法的容差。默认容差是 1e-6。

        x = pcg(A,b,tol,maxit) 指定要使用的最大迭代次数。如果 pcg 无法在 maxit 次迭代内收敛,将显示诊断消息。

        x = pcg(A,b,tol,maxit,M) 指定预条件子矩阵 M 并通过有效求解关于 y 的方程组 来计算 x,其中 且 。该算法不显式形成 H。使用预条件子矩阵可以改善问题的数值属性和计算的效率。

        x = pcg(A,b,tol,maxit,M1,M2) 指定预条件子矩阵 M 的因子,使得 M = M1*M2。

        x = pcg(A,b,tol,maxit,M1,M2,x0) 指定解向量 x 的初始估计值。默认值为由零组成的向量。

        [x,flag] = pcg(___) 返回一个标志,指示算法是否成功收敛。当 flag = 0 时,收敛成功。您可以将此输出语法用于之前的任何输入参数组合。如果指定了 flag 输出,pcg 将不会显示任何诊断消息。

        [x,flag,relres] = pcg(___) 还会返回相对残差 norm(b-A*x)/norm(b)。如果 flag 为 0,则 relres <= tol。

        [x,flag,relres,iter] = pcg(___) 还会返回计算出 x 时的迭代次数 iter。

        [x,flag,relres,iter,resvec] = pcg(___) 还会在每次迭代中返回残差范数向量(包括第一个残差 norm(b-A*x0))。

示例

线性系统的迭代解

        使用采用默认设置的 pcg 求解系数矩阵为方阵的线性系统,然后在求解过程中调整使用的容差和迭代次数。

        创建一个随机对称稀疏矩阵 A。还要为 Ax=b 的右侧创建一个由 A 的行总和组成的向量 b,使得实际解 x 是由 1 组成的向量。

rng default
A = sprand(400,400,.5);
A = A'*A;
b = sum(A,2);

        使用 pcg 求解 Ax=b。输出显示包括相对残差 ‖b−Ax‖/‖b‖ 的值。

x = pcg(A,b);
pcg stopped at iteration 20 without converging to the desired tolerance 1e-06
because the maximum number of iterations was reached.
The iterate returned (number 20) has relative residual 3.6e-06.

        默认情况下,pcg 使用 20 次迭代和容差 1e-6,对于此矩阵,算法无法在 20 次迭代后收敛。然而,残差接近容差,因此算法可能只需更多迭代即可收敛。

        使用容差 1e-7 和 150 次迭代再次求解方程组。

x = pcg(A,b,1e-7,150);
pcg converged at iteration 129 to a solution with relative residual 1e-07.

使用指定了预条件子的 pcg

        检查使用指定了预条件子矩阵的 pcg 来求解线性系统的效果。

        创建一个对称正定带状系数矩阵。

A = delsq(numgrid('S',102));

        定义 b 作为线性方程 Ax=b 的右侧。

b = ones(size(A,1),1);

设置容差和最大迭代次数。

tol = 1e-8;
maxit = 100;

使用 pcg 根据请求的容差和迭代次数求解。指定五个输出以返回有关求解过程的信息:

  • x 是计算 A*x = b 所得的解。

  • fl0 是指示算法是否收敛的标志。

  • rr0 是计算的解 x 的相对残差。

  • it0 是计算 x 时所用的迭代次数。

  • rv0 是 ‖b−Ax‖ 的残差历史记录组成的向量。

[x,fl0,rr0,it0,rv0] = pcg(A,b,tol,maxit);
fl0
fl0 = 1
rr0
rr0 = 0.0131
it0
it0 = 100

        由于 pcg 未在请求的 100 次迭代内收敛至请求的容差 1e-8,因此 fl0 为 1。

        为了有助于缓慢收敛,可以指定预条件子矩阵。由于 A 是对称矩阵,请使用 ichol 生成预条件子 。通过指定 L 和 L' 作为 pcg 的输入,求解预条件方程组。

L = ichol(A);
[x1,fl1,rr1,it1,rv1] = pcg(A,b,tol,maxit,L,L');
fl1
fl1 = 0
rr1
rr1 = 8.0992e-09
it1
it1 = 79

        在第 79 次迭代中,使用 ichol 预条件子产生的相对残差小于规定的容差 1e-8 。输出 rv1(1) 是 norm(b) 且 rv1(end) 是 norm(b-A*x1)。

        现在,使用 michol 选项创建修正的不完全 Cholesky 预条件子。

L = ichol(A,struct('michol','on'));
[x2,fl2,rr2,it2,rv2] = pcg(A,b,tol,maxit,L,L');
fl2
fl2 = 0
rr2
rr2 = 9.9618e-09
it2
it2 = 47

        该预条件子优于使用零填充不完全 Cholesky 分解为本例中的系数矩阵生成的预条件子,因此 pcg 能够更快地收敛。

        通过绘制从初始估计值(迭代编号 0)开始的每次残差历史记录,可以查看预条件子如何影响 pcg 的收敛速度。为指定的容差添加一个线条。

semilogy(0:length(rv0)-1,rv0/norm(b),'-o')
hold on
semilogy(0:length(rv1)-1,rv1/norm(b),'-o')
semilogy(0:length(rv2)-1,rv2/norm(b),'-o')
yline(tol,'r--');
legend('No Preconditioner','Default ICHOL','Modified ICHOL','Tolerance','Location','East')
xlabel('Iteration number')
ylabel('Relative residual')

如图所示:

提供初始估计值

        检查向 pcg 提供解的初始估计值的效果。

        创建一个三对角稀疏矩阵。使用每行的总和作为 Ax=b 右侧的向量,使 x 的预期解是由 1 组成的向量。

n = 900;
e = ones(n,1);
A = spdiags([e 2*e e],-1:1,n,n);
b = sum(A,2);

        使用 pcg 求解 Ax=b 两次:一次是使用默认的初始估计值,一次是使用解的良好初始估计值。对两次求解均使用 200 次迭代和默认容差。将第二种求解中的初始估计值指定为所有元素都等于 0.99 的向量。

maxit = 200;
x1 = pcg(A,b,[],maxit);
pcg converged at iteration 35 to a solution with relative residual 9.5e-07.
x0 = 0.99*e;
x2 = pcg(A,b,[],maxit,[],[],x0);
pcg converged at iteration 7 to a solution with relative residual 8.7e-07.

        在这种情况下,提供初始估计值可以使 pcg 更快地收敛。

返回中间结果

        还可以通过在 for 循环中调用 pcg 来使用初始估计值获得中间结果。每次调用求解器都会执行几次迭代,并存储计算出的解。然后,将该解用作下一批迭代的初始向量。

        例如,以下代码会循环执行四次,每次执行 100 次迭代,并在 for 循环中每通过一次后均存储解向量:

x0 = zeros(size(A,2),1);
tol = 1e-8;
maxit = 100;
for k = 1:4[x,flag,relres] = pcg(A,b,tol,maxit,[],[],x0);X(:,k) = x;R(k) = relres;x0 = x;
end

        X(:,k) 是在 for 循环的第 k 次迭代时计算的解向量,R(k) 是该解的相对残差。

使用函数句柄代替数值矩阵

        通过为 pcg 提供用来计算 A*x 的函数句柄(而非系数矩阵 A)来求解线性系统。

        使用 gallery 生成一个 20×20 正定三对角矩阵。上对角线和下对角线上的元素都是 1,而主对角线上的元素是从 20 递减到 1。预览该矩阵。

n = 20;
A = gallery('tridiag',ones(n-1,1),n:-1:1,ones(n-1,1));
full(A)
ans = 20×2020     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     01    19     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     00     1    18     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     00     0     1    17     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     00     0     0     1    16     1     0     0     0     0     0     0     0     0     0     0     0     0     0     00     0     0     0     1    15     1     0     0     0     0     0     0     0     0     0     0     0     0     00     0     0     0     0     1    14     1     0     0     0     0     0     0     0     0     0     0     0     00     0     0     0     0     0     1    13     1     0     0     0     0     0     0     0     0     0     0     00     0     0     0     0     0     0     1    12     1     0     0     0     0     0     0     0     0     0     00     0     0     0     0     0     0     0     1    11     1     0     0     0     0     0     0     0     0     0⋮

        由于此三对角矩阵有特殊的结构,您可以用函数句柄来表示 A*x 运算。当 A 乘以向量时,所得向量中的大多数元素为零。结果中的非零元素对应于 A 的非零三对角元素。此外,只有主对角线具有不等于 1 的非零值。

表达式 Ax 变为:

结果向量可以写为三个向量的和:

在 MATLAB® 中,编写一个函数来创建这些向量并将它们相加,从而给出 A*x 的值:

function y = afun(x)
y = [0; x(1:19)] + ...[(20:-1:1)'].*x + ...[x(2:20); 0];
end

        (该函数作为局部函数保存在示例的末尾。)

        现在,通过为 pcg 提供用于计算 A*x 的函数句柄,求解线性系统 Ax=b。使用容差 1e-12 和 50 次迭代。

b = ones(20,1);
tol = 1e-12;  
maxit = 50;
x1 = pcg(@afun,b,tol,maxit)
pcg converged at iteration 20 to a solution with relative residual 4.4e-16.
x1 = 20×10.04760.04750.05000.05260.05550.05880.06250.06660.07140.0769⋮

        检查 afun(x1) 是否产生由 1 组成的向量。

afun(x1)
ans = 20×11.00001.00001.00001.00001.00001.00001.00001.00001.00001.0000⋮

局部函数

function y = afun(x)
y = [0; x(1:19)] + ...[(20:-1:1)'].*x + ...[x(2:20); 0];
end

预条件共轭梯度法

        ​预条件共轭梯度法 (PCG) 旨在利用对称正定矩阵的结构。其他一些算法也可以对对称正定矩阵执行运算,但 PCG 在求解这些类型的方程组方面是最快和最可靠的 [1]。​

提示

  • ​大多数迭代方法的收敛取决于系数矩阵的条件数 cond(A)。当 A 是方阵时,可以使用 equilibrate 来改进其条件数,它本身就能使大多数迭代求解器更容易收敛。但如果您随后会对经平衡处理的矩阵 B = R*P*A*C 进行因式分解,使用 equilibrate 还可以获得质量更好的预条件子矩阵。

  • 可以使用矩阵重新排序函数(如 dissect 和 symrcm)来置换系数矩阵的行和列,并在系数矩阵被分解以生成预条件子时最小化非零值的数量。这可以减少后续求解预条件线性系统所需的内存和时间。

参考

        [1] Barrett, R., M. Berry, T. F. Chan, et al., Templates for the Solution of Linear Systems: Building Blocks for Iterative Methods, SIAM, Philadelphia, 1994.

相关文章:

MATLAB中pcg函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 pcg 提供初始估计值 使用函数句柄代替数值矩阵 pcg函数的功能是求解线性系统 - 预条件共轭梯度法。 语法 x pcg(A,b) x pcg(A,b,tol) x pcg(A,b,tol,maxit) x pcg(A,b,tol,maxit,M) x pcg(A,b,tol,ma…...

Veritus netbackup 管理控制台无法连接:未知错误

节假日停电&#xff0c;netbackup服务器意外停机后重新开机&#xff0c;使用netbackup管理控制台无法连接&#xff0c;提示未知错误。 ssh连接到服务器&#xff0c;操作系统正常&#xff0c;那应该是应用有问题&#xff0c;先试一下重启服务器看看。重新正常关机&#xff0c;重…...

安全中心 (SOC) 与 网络运营中心 (NOC)

NOC 和 SOC 之间的区别 网络运营中心 (NOC) 负责维护公司计算机系统的技术基础设施&#xff0c;而安全运营中心 (SOC) 则负责保护组织免受网络威胁。 NOC 专注于防止自然灾害、停电和互联网中断等自然原因造成的网络干扰&#xff0c;而 SOC 则从事监控、管理和保护。 NOC 提…...

WPS使用越来越卡顿

UOS统信wps频繁的使用后出现卡顿问题&#xff0c;通过删除或重命名kingsoft文件缓存目录。 文章目录 一、问题描述二、问题原因三、解决方案步骤一步骤二步骤三 一、问题描述 用户在频繁的使用wps处理工作&#xff0c;在使用一段时间后&#xff0c;用户反馈wps打开速度慢&…...

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.5-2.6

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.5 网络中的网络以及 11 卷积&#xff08;Network in Network and 11 convoluti…...

C# 解决Excel边框样式无法复制问题及实现格式刷功能

目录 问题现象 范例运行环境 解决方案 剪贴板加特殊粘贴 自定义样式 直接赋值 完美方案 小结 问题现象 在运行数据表数据导出到 EXCEL 数据输出时遇到了一个问题&#xff0c;开发者设计了单行细线下边框的输出模板&#xff0c;如下图设计&#xff1a; 其中 <%syst…...

前端组件化开发

假设这个页面是vue开发的&#xff0c;如果一整个页面都是编写在一个vue文件里面&#xff0c;后期不好维护&#xff0c;会特别的庞大&#xff0c;那么如何这个时候需要进行组件化开发。组件化开发后必然会带来一个问题需要进行组件之间的通信。组要是父子组件之间通信&#xff0…...

异步操作实现线程池

文章目录 futureasyncpromisepackage task C11线程池实现 future 在C11标准库中&#xff0c;提供了一个future的模板类&#xff0c;它表示的是一个异步操作的结果&#xff0c;当在多线程编程中使用异步任务的时候&#xff0c;使用这个类可以帮助在需要的时候获取到对应的数据处…...

长期提供APX515/B原装二手APX525/B音频分析仪

Audio Precision APx515 是一款针对生产测试而优化的高性能音频分析仪。它因其速度、性能、自动化和易用性而成为一流的仪器。它具有卓越的性能&#xff0c;具有 –106 dB 的典型 THDN、1M 点 FFT 和 192k 数字 I/O&#xff0c;以及所有 APx 系列音频分析仪的一键式自动化和易用…...

【数据库差异研究】update与delete使用表别名的研究

目录 ⚛️总结 ☪️1 Update ♋1.1 测试用例UPDATE users as a SET a.age 111 WHERE a.name Alice; ♏1.2 测试用例UPDATE users as a SET a.age 111 WHERE name Alice; ♐1.3 测试用例UPDATE users as a SET age 111 WHERE a.name Alice; ♑1.4 测试用例UPDATE us…...

idea远程连接docker

idea远程连接docker docker、ubuntu、linux、远程连接、IntelliJ idea注意&#xff01;本文中开启docker远程连接的方法只能在确定环境安全的内网中使用&#xff0c;不可在公网服务器设置&#xff0c;有极大安全风险&#xff01; 注意&#xff01;本文中开启docker远程连接的…...

Docker 安装 ClickHouse 教程

Docker 安装 ClickHouse 教程 创建目录 首先&#xff0c;创建必要的目录用于存放 ClickHouse 的配置、数据和日志文件。 mkdir -p /home/clickhouse/conf mkdir -p /home/clickhouse/data mkdir -p /home/clickhouse/log chmod -R 777 /home/clickhouse/conf chmod -R 777 /…...

过渡到内存安全语言:挑战和注意事项

开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C 等语言的局限性而出现的现象。 内存安全问题已存在五十多年&#xff0c;它要求程序员从内存管理任务中抽离出来。 Java、Rust、Python 和 JavaScript 等现代语言通…...

在Pycharm中安装Cv2

安装OpenCV&#xff1a; 在Terminal中&#xff0c;输入以下pip命令来安装OpenCV&#xff1a; pip install opencv-python pip install opencv-contrib-python 如果下载速度较慢&#xff0c;可以考虑使用国内的pip镜像源&#xff0c;如清华大学源&#xff1a; pip install openc…...

减少重复的请求之promise缓存池(构造器版) —— 缓存promise,多次promise等待并返回第一个promise的结果

减少重复的请求之promise缓存池 —— 缓存promise&#xff0c;多次promise等待并返回第一个promise的结果 背景简介 当一个业务组件初始化调用了接口&#xff0c;统一个页面多吃使用同一个组件&#xff0c;将会请求大量重复的接口 如果将promise当作一个普通的对象&#xff0…...

cdq+bitset处理高维偏序

高维偏序 CDQ分治 假设处理的区间为 [ l , r ] [l,r] [l,r] &#xff0c;CDQ分治的过程&#xff1a; 如果 l ≥ r l\geq r l≥r &#xff0c;返回。设区间中点为 m i d mid mid &#xff0c;递归处理 [ l , m i d ] [l,mid] [l,mid] 和 [ m i d 1 , r ] [mid1,r] [mid…...

敏捷开发和传统开发,你更适合哪种?

时间&#xff1a;2024年 10月 03日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术”&#xff0c;我是小蒋&#xff01;今天我们来聊聊两个开发模式的“对决”…...

python之with

with上下文管理是什么呢&#xff1f; 一般都是使用系统提供的一些with语句&#xff0c;列如我要去读取一些数据进行分析&#xff0c;就可以使用with open去读取某些数据&#xff0c;或者我要把一些图片给他保存到某些地方&#xff0c;可以用with给他写入。 上下午管理器with是…...

vue3 升级实战笔记

最近要将公司项目的移动端进行 vue3 的升级工作&#xff0c;就顺便记录下升级过程。 项目迁移的思路 我的想法是最小改动原则。 从 vue2.x 升级到 vue3&#xff0c;且使用 vue3 的 选项式 API。构建工具要从 vue-cli&#xff08;webpack&#xff09;升级到 vite。路由需要升级到…...

利用函数模块化代码实操 ← Python

【知识点】 ● 模块化可以使代码易于维护和调试&#xff0c;并且提高代码的重用性。 ● 函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块化代码并提高程序的质量。 ● 在 Python 中&#xff0c;可以将函数的定义放在一个被称为模块的文件中,这种文件的后缀…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...