我是靠谱客的博主 自觉玉米,最近开发中收集的这篇文章主要介绍matlab ichol,求解线性方程组 - 预条件共轭梯度法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过为 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×20

20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 19 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 1 14 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 1 13 1 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1 12 1 0 0 0 0 0 0 0 0 0 0

0 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 变为:

[2010⋯⋯⋯00119100011810⋮⋮011710011610⋮⋮011510011410⋮⋮0113⋱000⋱⋱100⋯⋯⋯011][x1x2x3x4x5⋮⋮x20]=[20x1+x2x1+19x2+x3x2+18x3+x4⋮x18+2x19+x20x19+x20]。

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

[20x1+x2x1+19x2+x3x2+18x3+x4⋮x18+2x19+x20x19+x20]=[0x1⋮x19]+[20x119x2⋮x20]+[x2⋮x200]。

在 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×1

0.0476

0.0475

0.0500

0.0526

0.0555

0.0588

0.0625

0.0666

0.0714

0.0769

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

afun(x1)

ans = 20×1

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

1.0000

局部函数

function y = afun(x)

y = [0; x(1:19)] + ...

[(20:-1:1)'].*x + ...

[x(2:20); 0];

end

最后

以上就是自觉玉米为你收集整理的matlab ichol,求解线性方程组 - 预条件共轭梯度法的全部内容,希望文章能够帮你解决matlab ichol,求解线性方程组 - 预条件共轭梯度法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部