MATLAB中ichol函数用法

news2024/9/21 12:23:03

目录

语法

说明

示例

不完全 Cholesky 分解

使用 ichol 作为预条件子

使用 diagcomp 选项


        ichol函数的功能是对矩阵进行不完全 Cholesky 分解。

语法

L = ichol(A)
L = ichol(A,options)

说明

        L = ichol(A) 通过零填充执行 A 的不完全 Cholesky 分解。A 必须为稀疏方阵。

        L = ichol(A,options) 使用结构图 options 指定的选项对 A 执行不完全 Cholesky 分解。

        默认情况下,ichol 引用 A 的下三角并生成下三角因子。

示例

不完全 Cholesky 分解

        此示例生成不完全 Cholesky 分解。从一个对称正定矩阵A开始:

N = 100;
A = delsq(numgrid('S',N));

        A 是带有 Dirichlet 边界条件的 100×100 方形网格上的二维、五点离散负 Laplacian 矩阵。A 的大小为 98*98 = 9604(并非 10000,因为网格边框用于施加 Dirichlet 条件)。

        无填充的不完全 Cholesky 分解是指在 A 包含非零值的相同位置仅包含非零值的分解。此分解的计算非常容易。尽管 L*L' 乘积通常与 A 完全不同,但 L*L' 乘积将与 A 在其向上舍入模式上匹配。

L = ichol(A);
norm(A-L*L','fro')./norm(A,'fro')

ans = 0.0916


norm(A-(L*L').*spones(A),'fro')./norm(A,'fro')
ans = 4.9606e-17

        ichol 也可用于通过阈值调降生成不完全 Cholesky 分解。当调降容差减小时,因子往往会变得更密集,而 L*L' 乘积往往更好地接近 A。以下绘图显示了不完全分解的相对误差对调降容差的图,以及不完全因子密度与完全 Cholesky 因子密度之比。

n = size(A,1);
ntols = 20;
droptol = logspace(-8,0,ntols);
nrm = zeros(1,ntols);
nz = zeros(1,ntols);
nzComplete = nnz(chol(A,'lower'));
for k = 1:ntols
    L = ichol(A,struct('type','ict','droptol',droptol(k)));
    nz(k) = nnz(L);
    nrm(k) = norm(A-L*L','fro')./norm(A,'fro');
end
figure
loglog(droptol,nrm,'LineWidth',2)
title('Drop tolerance vs norm(A-L*L'',''fro'')./norm(A,''fro'')')

如图所示:

figure
semilogx(droptol,nz./nzComplete,'LineWidth',2)
title('Drop tolerance vs fill ratio ichol/chol')

如图所示:

        该相对误差通常与调降容差的量级相当,但不能保证一定如此。

使用 ichol 作为预条件子

        此示例说明如何使用不完全 Cholesky 分解作为预条件子来提高收敛。创建一个对称正定矩阵 A

N = 100;
A = delsq(numgrid('S',N));

        创建一个不完全 Cholesky 分解,作为 pcg 的预条件子。在右侧使用一个常向量。先在没有预条件子的情况下执行 pcg,以作为基准。

b = ones(size(A,1),1);
tol = 1e-6;
maxit = 100;
[x0,fl0,rr0,it0,rv0] = pcg(A,b,tol,maxit);

        请注意,fl0 = 1 指示 pcg 未在允许的最大迭代次数中使相对残差趋向于请求的公差。请尝试使用无填充的不完全 Cholesky 分解作为预条件子。

L1 = ichol(A);
[x1,fl1,rr1,it1,rv1] = pcg(A,b,tol,maxit,L1,L1');

        fl1 = 0,指示 pcg 收敛至请求的公差,经过 59 次迭代(it1 值)后实现收敛。但是,由于此矩阵是一个离散的 Laplacian 矩阵,因此使用修正不完全 Cholesky 分解可创建一个更好的预条件子。修正不完全 Cholesky 分解会构造一个近似的分解,该分解会保留算子对常向量的作用。也就是说,对于 e = ones(size(A,2),1),norm(A*e-L*(L'*e)) 将约为零,即使 norm(A-L*L','fro')/norm(A,'fro') 不接近零。不必为此语法指定类型,因为 nofill 是默认值,但这是一种好的做法。

options.type = 'nofill';
options.michol = 'on';
L2 = ichol(A,options);
e = ones(size(A,2),1);
norm(A*e-L2*(L2'*e))
ans = 3.7983e-14
[x2,fl2,rr2,it2,rv2] = pcg(A,b,tol,maxit,L2,L2');

        pcg 收敛 (fl2 = 0),但仅用了 38 次迭代。绘制所有三种收敛历史记录将显示以下收敛情况。

semilogy(0:maxit,rv0./norm(b),'b.');
hold on
semilogy(0:it1,rv1./norm(b),'r.');
semilogy(0:it2,rv2./norm(b),'k.');
legend('No Preconditioner','IC(0)','MIC(0)');

如图所示:

        以上绘图显示,修正不完全 Cholesky 预条件子创建的收敛更快。

        也可以尝试通过阈值调降使用不完全 Cholesky 分解。以下绘图显示了通过各种调降容差构造预条件子时 pcg 的收敛。

L3 = ichol(A, struct('type','ict','droptol',1e-1));
[x3,fl3,rr3,it3,rv3] = pcg(A,b,tol,maxit,L3,L3');
L4 = ichol(A, struct('type','ict','droptol',1e-2));
[x4,fl4,rr4,it4,rv4] = pcg(A,b,tol,maxit,L4,L4');
L5 = ichol(A, struct('type','ict','droptol',1e-3));
[x5,fl5,rr5,it5,rv5] = pcg(A,b,tol,maxit,L5,L5'); 

figure
semilogy(0:maxit,rv0./norm(b),'b-','linewidth',2);
hold on
semilogy(0:it3,rv3./norm(b),'b-.','linewidth',2);
semilogy(0:it4,rv4./norm(b),'b--','linewidth',2);
semilogy(0:it5,rv5./norm(b),'b:','linewidth',2);
legend('No Preconditioner','ICT(1e-1)','ICT(1e-2)', ...
   'ICT(1e-3)','Location','SouthEast');

如图所示:

        请注意,通过调降容差 1e-2 构造的不完全 Cholesky 预条件子表示为 ICT(1e-2)。

        与零填充的不完全 Cholesky 分解一样,阈值调降分解也会受益于修正(即 options.michol = 'on'),因为矩阵由一个椭圆偏微分方程生成。与 MIC(0) 一样,修正后的阈值调降不完全 Cholesky 分解也将保留预条件子对常向量的作用,也即 norm(A*e-L*(L'*e)) 将约为零。

使用 diagcomp 选项

        此示例介绍了 ichol 的 diagcomp 选项的用法。

        正定矩阵的不完全 Cholesky 分解并不总是存在。以下代码构造一个随机的对称正定矩阵,并尝试使用 pcg 对线性系统求解。

S = rng('default');
A = sprandsym(1000,1e-2,1e-4,1);
rng(S);
b = full(sum(A,2));
[x0,fl0,rr0,it0,rv0] = pcg(A,b,1e-6,100);

        由于未实现收敛,因此请尝试构造一个不完全 Cholesky 预条件子。

L = ichol(A,struct('type','ict','droptol',1e-3));
Error using ichol
Encountered nonpositive pivot.

        如果 ichol 按以上所示进行分解,您可以使用 diagcomp 选项构造一个偏移的不完全 Cholesky 分解。也就是说,带有对角线补偿的 ichol 会构造 L 以使 L*L' 在未显式构造 M 的情况下约为 M = A + alpha*diag(diag(A)),而不是构造 L 以使 L*L' 约为 A。由于对于对角线占优的矩阵始终可以进行不完全分解,因此可以求得使 M 在对角线上占优的 alpha。

alpha = max(sum(abs(A),2)./diag(A))-2
alpha = 62.9341
L1 = ichol(A, struct('type','ict','droptol',1e-3,'diagcomp',alpha));
[x1,fl1,rr1,it1,rv1] = pcg(A,b,1e-6,100,L1,L1');

        此处的 pcg 仍然无法在所需的迭代次数内收敛至所需公差,但正如以下绘图所示,与没有预条件子相比,收敛更适用于带有此预条件子的 pcg。选择更小的 alpha 可能会有帮助。通过试验,我们可以为 alpha 设置合适的值。

alpha = .1;
L2 = ichol(A, struct('type','ict','droptol',1e-3,'diagcomp',alpha));
[x2,fl2,rr2,it2,rv2] = pcg(A,b,1e-6,100,L2,L2');

        现在,pcg 将会收敛,并且绘图可以显示每个预条件子的收敛历史记录。

semilogy(0:100,rv0./norm(b),'b.');
hold on;
semilogy(0:100,rv1./norm(b),'r.');
semilogy(0:it2,rv2./norm(b),'k.');
legend('No Preconditioner','\alpha \approx 63','\alpha = .1');
xlabel('Iteration Number');
ylabel('Relative Residual');

如图所示:

提示

  • ​此例程提供的因子可能很有用,可用作通过 pcg 或 minres 等迭代方法求解的线性系统的预条件子。

  • ichol 仅适用于稀疏方阵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西瓜书学习笔记三 归纳偏好

1.4 归纳偏好 通过学习得到的模型对应了假设空间中的一个假设。于是,图1. 2的西瓜版本空间给我们带来一个麻烦:现在有三个与训练集一致的假设,但与它们对应的模型在面临新样本的时候,却会产生不同的输出。现在有一个新瓜,一个模型…

希腊字母大写、小写、音标

▪Αα ▪Ββ ▪Γγ ▪Δδ ▪Εε或ϵ ▪Ϝϝ ▪Ζζ ▪Ηη ▪Θθ ▪Ιι ▪Κκ ▪Λλ ▪Μμ ▪Νν ▪Ξξ ▪Οο ▪Ππ ▪Ρρ ▪Σσ或ς ▪Ττ ▪Υυ ▪Φφ或ϕ ▪Χχ ▪Ψψ ▪Ωω

C语言学习——指针(定义、变量的指针和指向变量的指针变量)

目录 十、指针 10.1地址和指针的概念 10.2变量的指针和指向变量的指针变量 定义一个指针变量 指针变量的引用 指针变量作为函数参数 十、指针 10.1地址和指针的概念 我们要想了解什么是指针,就必须弄清楚数据在内存中是如何存储的,又是如何读取的…

利用EditPlus进行Json数据格式化

利用EditPlus进行Json数据格式化 git下载地址:https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令:Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…

代码随想录算法训练营第三十天| 01背包问题 二维, 01背包问题 一维 , 416. 分割等和子集

今天是动态规划学习的第三天,主要的学习内容包括:01背包问题二维数组解法和一维数组解法,以及01背包问题的应用。 01背包问题 二维 题目链接:46. 携带研究材料(第六期模拟笔试) (kamacoder.com) 首先我们…

胡姓名人伟人有哪些?胡姓最厉害三个名人是谁

胡姓名人伟人有哪些?胡姓最厉害三个名人是谁? 在中国悠久的历史长河中,胡姓不仅承载着丰富的文化遗产,更是孕育出无数杰出的历史人物。这些人物以其独特的贡献和影响力,成为中华文明的重要组成部分。以下是根据历史影响力和文化贡献精心挑选的十大胡姓名人,他们的故事和成就展…

GNU/Linux - systemd介绍

systemd官网: System and Service Manager systemd systemd Github地址: https://github.com/systemd/systemd 首次发布 2010年3月30日 System and Service Manager systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为…

USB 2.0 协议专栏之 USB 配置描述符(四)

前言:本篇博客为手把手教学的 USB 2.0 协议栈类精品博客,该专栏博客侧重针对 USB 2.0 协议进行讲解。第 4 篇重点为 USB 2.0 协议中的配置描述符 Configuration Descriptors 进行讲解,并结合 CH32V307 与 STM32 代码进行 Configuration Descr…

【工业机器人】工业异常检测大模型AnomalyGPT

AnomalyGPT 工业异常检测视觉大模型AnomalyGPT AnomalyGPT: Detecting Industrial Anomalies using Large Vision-Language Models AnomalyGPT是一种基于大视觉语言模型(LVLM)的新型工业异常检测(IAD)方法。它利用LVLM的能力来理…

Oracle VM VirtualBox虚拟机内存不够用的解决方案

一、 前言 在使用Oracle VM VirtualBox虚拟机的过程中,随着时间的推移,我们会感觉我们的内存越来越不够用,今天就来给大家分享一下我们如何解决虚拟机内存不够用的问题。 二、解决方法 1.虚拟机碎片化整理 我们第一步要做的是碎片整理&…

【protobuf】ProtoBuf——proto3语法详解、enum类型、enum类型的使用和注意事项、Any类型、通讯录录入号码类型和地址的功能实现

文章目录 ProtoBuf5. proto3语法详解5.3 enum类型5.4 Any类型 ProtoBuf 5. proto3语法详解 5.3 enum类型 定义规则: proto3支持我们定义枚举类型并使用: 枚举类型的名称采用驼峰命名法且首字母大写,如 MyEnum ,这样的命名方式符合…

重启人生计划-且随风行

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…

Element UI详解

目录 Element UIElement UI 简介开发使用开发指南概述总结 设计原则组件使用特性使用场景优势不足 Element UI Element UI 简介 Element UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。它提供了一系列丰富的 UI 组件,用于快速搭建企业级的 Web 应用…

RCE编码绕过--php://filter妙用

目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;&#xff0c;代码没有办法执行下去&#xff0c;所以…

day32+学习记录

一.算法练习 509.斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xf…

(待会删)分享9款一键生成原创论文在线使用软件

在当前的学术研究和写作环境中&#xff0c;AI技术的应用已经变得越来越普遍。其中&#xff0c;一键生成原创论文的在线软件更是为学者们提供了极大的便利。本文将重点介绍一款备受推荐的AI原创论文写作平台——千笔-AIPassPaPer&#xff0c;并分享其他几款优秀的同类软件。 千…

政务大数据解决方案(五)

政务大数据解决方案旨在通过建立统一的数据平台&#xff0c;将各政府部门的数据资源进行有效整合与智能分析&#xff0c;利用先进的数据处理和人工智能技术实现对社会动态的实时监测和精准预测&#xff0c;从而优化政府决策、提升公共服务效率和透明度。该方案涵盖数据的采集、…

每日OJ_牛客HJ75 公共子串计算

目录 牛客HJ75 公共子串计算 解析代码 牛客HJ75 公共子串计算 公共子串计算_牛客题霸_牛客网 解析代码 求最大公共子串&#xff0c;使用递推实现 假设 x(i)&#xff1a;字符串第i个字符 y(j)&#xff1a;字符串第j个字符 dp[i][j]&#xff1a;以x(i)&#xff0c;y(j)结尾的最…

XSS-games

XSS 1.XSS 漏洞简介2.XSS的原理3.XSS的攻击方式4.XSS-GAMESMa SpaghetJefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafiaOk, BoomerWW3svg 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Sc…

XSS反射实战

目录 1.XSS向量编码 2.xss靶场训练&#xff08;easy&#xff09; 2.1第一关 2.2第二关 方法一 方法二 2.3第三关 2.4第四关 2.5第五关 2.6第六关 2.7第七关 第一种方法&#xff1a; 第二种方法&#xff1a; 第三个方法&#xff1a; 2.8第八关 1.XSS向量编码 &…