主要内容

symmlq.

求解线性方程系统 - 对称LQ方法

描述

例子

x= symmlq (一个b试图解线性方程组A * x =x使用对称LQ方法.当尝试成功时,symmlq.显示确认收敛的消息。如果symmlq.由于任何原因,未能在最大迭代次数或停止之后收敛,它显示包含相对残差的诊断消息常态(B-A * X)/ NOM(B)以及方法停止的迭代次数。

例子

x= symmlq (一个b指定该方法的公差。默认容差是1 e-6

例子

x= symmlq (一个b麦克斯特指定要使用的最大迭代次数。symmlq.如果无法在内部收敛,则显示诊断消息麦克斯特迭代。

例子

x= symmlq (一个b麦克斯特指定一个预处理矩阵和计算x通过有效地求解该系统 H - 1 一个 H - T y H - 1 b y,在那里 y H T x H 1 / 2 1 2 1 / 2 .算法没有形成H明确。使用预处理器矩阵可以提高问题的数度和计算效率。

例子

x= symmlq (一个b麦克斯特M1M2指定预处理矩阵的因子这样M = M1 *平方米

例子

x= symmlq (一个b麦克斯特M1M2x0指定解向量的初始猜测x.默认值是一个0的向量。

例子

x国旗) = symmlq (___返回指定算法是否成功收敛的标志。当国旗= 0,趋同是成功的。您可以将此输出语法与前面的任何输入参数组合一起使用。当你指定国旗输出,symmlq.不显示任何诊断消息。

例子

x国旗) = symmlq (___也返回计算解中的残差。如果国旗0,然后Relres <= tol

例子

x国旗iter) = symmlq (___也返回迭代数iter此时x是计算。

例子

x国旗iterresvec) = symmlq (___还在每次迭代时返回残差范数的向量,包括第一个残差规范(b * x0)

例子

x国旗iterresvecresveccg) = symmlq (___在每次迭代时也返回共轭梯度剩余规范的向量。

例子

全部收缩

解决方形线性系统使用symmlq.使用默认设置,然后调整解决方案流程中使用的容忍度和迭代次数。

创建一个稀疏的三对角矩阵一个作为系数矩阵。用密集的行和 一个 作为右侧的矢量 斧头 b 所以解决方案 x 预计将成为一个矢量。

n = 400;= 1 (n, 1);A = spdiags([-2*on 4*on -2*on],-1:1,n,n);b =全(sum (A, 2));

解决 斧头 b 使用symmlq..输出显示包括相对剩余误差的值 b - 斧头 b

x = symmlq (A, b);
Symmlq在迭代20时停止,没有收敛到期望的容忍值1e-06,因为已经达到了最大的迭代次数。返回的iterate(编号20)的相对残差为0.045。

默认情况下symmlq.使用20次迭代和一个公差1 e-6,并且该算法无法在此矩阵的那些迭代中收敛。由于剩余是按顺序的1)依照,这是需要更多迭代的良好指示。您还可以使用更大的容忍度,以使算法更容易收敛。

用容差再次解系统1的军医和250的迭代。

x = symmlq (A, b, 1 e - 4250);
Symmlq在第199次迭代时收敛到一个相对残差为1.5e-14的解。

用下列方法检查使用预处理矩阵的效果symmlq.解决线性系统。

建立对称正定带状系数矩阵。

一个= delsq (numgrid (“年代”, 102));

定义b所以真正的解 斧头 b 是所有的矢量。

b = sum(a,2);

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

托尔= 1 e-12;麦克斯特= 100;

采用symmlq.在请求的容忍和迭代次数找到解决方案。指定六个输出以返回有关解决方案过程的信息:

  • x算出的解是A * x =

  • fl0表示算法是否收敛。

  • RR0.是计算答案的相对残余x

  • it0迭代次数是什么时候x是计算。

  • rv0是一个残存的历史向量吗 b - 斧头

  • RVCG0.是共轭梯度剩余历史的向量吗 一个 T 一个 x - 一个 T b

[x,fl0,rr0,it0,rv0,rvcg0] = symmlq(a,b,tol,maxit);fl0
fl0 = 1
RR0.
rr0 = 0.0031
it0
it0 = 100

fl0是1,因为symmlq.不收敛到所请求的公差1 e-12在要求的100次迭代中。

为了帮助收敛,可以指定一个预处理矩阵。自一个是对称的,使用ichol.生成预处理程序 l l T .指定“信息与通信技术”选项使用阈值下降的不完全Cholesky分解,并指定对角移位值为1 e-6避免非正枢轴。通过指定来求解前置系统lL'作为输入symmlq.

设置=结构('类型'“信息与通信技术”“diagcomp”,1e-6,'droptol',1E-14);l = iChol(a,设置);[X1,FL1,RR1,IT1,RV1,RVCG1] = SymMLQ(A,B,TOL,MAXIT,L,L');FL1.
fl1 = 0.
RR1.
rr1 = 2.7798 e15汽油
it1
IT1 = 3.

使用ichol.预处理函数极大地改善了问题的数值性质symmlq.能够快速收敛。输出rv1 (1)规范(b),输出rv1(结束)规范(b * x1)

你可以跟着进度symmlq.通过在每次迭代时绘制相对残差。用线路为指定公差的线绘制每个溶液的共轭梯度残留历史。

semilogy(0:长度(rvcg0) 1, rvcg0 /规范(b),“o”) 抓住半机(0:长度(RVCG1)-1,RVCG1 / NORM(B),“o”) yline(托尔,“r——”);传奇(“没有预调节器”“ICHOL预处理”“宽容”'地点''东南')Xlabel(的迭代次数)ylabel(的相对剩余的

图中包含一个坐标轴。轴包含三个对象的类型线,恒线。这些对象代表No preconditioning, ICHOL preconditioning, Tolerance。

检查供应的效果symmlq.初步猜测解决方案。

创建一个三对角稀疏矩阵。用每一行的和作为右边的向量 斧头 b 所以预期的解决方案 x 是一个1的向量。

n = 900;e =那些(n,1);a = spdiags([e 2 * e e], -  1:1,n,n);b = sum(a,2);

采用symmlq.来解决 斧头 b 两次:一次是默认的初始猜测,另一次是正确的初始猜测。对这两种解决方案使用200次迭代和默认容忍。万博 尤文图斯指定第二个解中的初始猜想为一个所有元素都等于的向量0.99

maxit = 200;x1 = symmlq(a,b,[],maxit);
Symmlq在第34次迭代时收敛到一个相对残差为9.5e-07的解。
x0 = 0.99 * e;x2 = symmlq(麦克斯特,A, b, [] [], [], x0);
SymmlQ将迭代6融合到具有相对残差8.7E-07的解决方案。

在这种情况下,提供初始猜测symmlq.更快地聚合。

返回中间结果

您还可以通过调用初始猜测来获得中间结果symmlq.在一个循环。对求解器的每次调用都执行几次迭代,并存储计算出的解决方案。然后使用该解决方案作为下一批迭代的初始向量。

例如,这段代码执行四次100次迭代,并在For循环中每次传递后存储解决方案向量:

x0 = 0(大小(2),1);托尔= 1 e-8;麦克斯特= 100;k = 1:4 [x,国旗,relres] = symmlq (A, b,托尔,麦克斯特[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结束

X (:, k)迭代时是否计算了解向量kfor循环的r(k)是这个解的相对剩余。

通过提供解一个线性方程组symmlq.使用计算的函数句柄斧头代替系数矩阵一个

由威尔金森测试矩数之一产生画廊是一个21×21的三角形矩阵。预览矩阵。

一个=画廊(“wilk”,21)
一个=21日×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0121000000 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 ⋮

威尔金森矩阵有一个特殊的结构,所以你可以表示这个操作斧头使用函数句柄。当一个乘一个向量,得到的向量中的大多数元素都是零。结果中的非零元素对应于的非零三对角元素一个.此外,只有主对角线具有不等于1的非安利斯。

表达方式 斧头 就变成:

斧头 10 1 0 0 0 1 9 1 0 0 0 1 8 1 0 0 1 7 1 0 0 1 6 1 0 0 1 5 1 0 0 1 4 1 0 0 1 3. 0 0 0 1 0 0 0 1 10 x 1 x 2 x 3. x 4 x 5 x 21 10 x 1 + x 2 x 1 + 9 x 2 + x 3. x 2 + 8 x 3. + x 4 x 19 + 9 x 20. + x 21 x 20. + 10 x 21

得到的向量可以写成三个向量的和:

斧头 0 + 10 x 1 + x 2 x 1 + 9 x 2 + x 3. x 2 + 8 x 3. + x 4 x 19 + 9 x 20. + x 21 x 20. + 10 x 21 + 0 0 x 1 x 20. + 10 x 1 9 x 2 10 x 21 + x 2 x 21 0

在MATLAB®中,编写一个函数来创建这些向量并将它们相加,从而得到值斧头

功能Y = [0;x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束

(此函数在示例结束时保存为本地功能。)

现在,解线性方程组 斧头 b 通过提供symmlq.使用计算的函数句柄斧头.使用公差1 e-12和50迭代。

b = ins(21,1);托尔= 1 e-12;maxit = 50;x1 = symmlq(@ afun,b,tol,maxit)
Symmlq在迭代10时收敛到一个相对残差为4.5e-16的解。
x1 =21日×10.0910 0.0899 0.0999 0.1109 0.1241 0.1443 0.1544 0.2383 0.1309 0.5000⋮

检查一下afun (x1)生成一个矢量。

afun (x1)
ans =21日×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

本地函数

功能Y = [0;x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束

输入参数

全部收缩

系数矩阵,指定为对称矩阵或函数句柄。这个矩阵是线性方程组的系数矩阵A * x =.一般来说,一个是一个大的稀疏矩阵或函数句柄,返回大稀疏矩阵和列向量的乘积。您可以使用不对确认一个是对称的。

指定一个作为函数句柄

您可以可选地将系数矩阵指定为函数句柄而不是矩阵。功能处理返回矩阵矢量产品,而不是形成整个系数矩阵,使得计算更有效。s manbetx 845

要使用函数句柄,请使用函数签名函数y = fun(x)参数化功能解释如何向函数提供附加参数一个乐趣,如果必要的。函数调用Afun(x)必须返回值斧头

数据类型:|function_handle
复数的支持:万博1manbetx是的

线性方程的右边,指定为列向量。的长度b必须等于大小(1)

数据类型:
复数的支持:万博1manbetx是的

方法公差,指定为正标量。使用此输入来权衡计算的准确性和运行时间。symmlq.必须在允许的迭代次数内达到容忍度。较小的价值意味着答案必须更精确,计算才能成功。

数据类型:

最大迭代次数,指定为正标量整数。增加价值麦克斯特允许更多的迭代symmlq.满足宽容.一般来说,较小的值意味着需要更多的迭代才能成功完成计算。

预处理器矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预请词矩阵或者它的矩阵因子M = M1 *平方米改进线性系统的数值方面,使之更容易symmlq.快速收敛。您可以使用不完整的矩阵分解功能iluichol.生成预处理矩阵。你也可以用平衡在因数分解之前改进了条件数的系数矩阵。有关前置条件的更多信息,请参见线性系统的迭代方法

symmlq.将未指定的前置数视为单位矩阵。

指定作为函数句柄

您可以任意指定M1,或M2作为函数句柄而不是矩阵。函数句柄执行矩阵向量运算,而不是形成整个预处理矩阵,使计算更加高效。

要使用函数句柄,请使用函数签名函数y = mfun(x)参数化功能解释如何向函数提供附加参数MFUN.,如果必要的。函数调用mfun (x)必须返回值M \ x要么M1、M2 \ (x)

数据类型:|function_handle
复数的支持:万博1manbetx是的

初始猜测,指定为长度等于的列向量大小(2).如果你能提供symmlq.有一个更合理的初步猜测x0与默认的零向量相比,它可以节省计算时间,帮助算法更快地收敛。

数据类型:
复数的支持:万博1manbetx是的

输出参数

全部收缩

线性系统解,返回为列向量。这个输出给出了线性系统的近似解A * x =.如果计算成功(国旗= 0),然后是小于还是等于

每当计算不成功时(国旗~ = 0),解决方案x返回的symmlq.是在所有迭代中计算出的残差范数最小的。

收敛标志,作为此表中的标量值之一返回。收敛标志指示计算是否成功并在几种不同形式的故障之间区分。

标志值

收敛

0

成功——symmlq.收敛到期望的公差之内麦克斯特迭代。

1

失败- - - - - -symmlq.迭代麦克斯特迭代却没有收敛。

2

失败 - 预处理器矩阵要么M = M1 *平方米是病态的。

3.

失败- - - - - -symmlq.连续两次迭代后都是相同的。

4

失败 - 由此计算的标量数之一symmlq.算法变得太小或太大,无法继续计算。

5

失败-预处理矩阵不是对称正定的。

相对剩余误差,作为标量返回。相对残差表示返回的答案有多准确x是多少。symmlq.在求解过程中跟踪每一次迭代的相对残差和共轭梯度残差,当时算法收敛要么残余符合规定的公差.的输出包含收敛残差的值,可以是相对残差,也可以是共轭梯度残差:

  • 相对残差误差等于常态(B-A * X)/ NOM(B)并且通常是符合公差的残余symmlq.是收敛的。的resvec输出跟踪所有迭代中此残留的历史。

  • 共轭梯度残差等于规范(“* * x -”* b).这剩余的原因symmlq.收敛比相对残差收敛得更少的resveccg输出跟踪所有迭代中此残留的历史。

数据类型:

迭代数,作为标量返回。该输出指示计算的答案所在的迭代数x计算了。

数据类型:

残余错误,作为向量返回。剩余错误规范(b * x)揭示了给定值时算法离收敛有多近x.元素的数量resvec等于迭代次数。您可以检查的内容resvec来帮助决定是否要改变要么麦克斯特

数据类型:

共轭梯度残余规范,作为载体返回。元素的数量resveccg等于迭代次数。

数据类型:

更多关于

全部收缩

对称LQ方法

MINRES和SYMMLQ方法是Lanczos方法的变体,Lanczos方法支持共轭梯度方法PCG。和PCG一样,系数矩阵仍然需要是对称的,但是MINRES和SYMMLQ允许它是不确定的(不是所有的特征值都需要是正的)。这是通过避免Lanczos方法中通常存在的隐含LU分解来实现的,Lanczos方法在遇到零轴时很容易出现故障。

MINRES最小化了2-范数中的残差,而SYMMLQ使用LQ分解来解决投影系统,并保持残差与所有之前的残差正交[1]

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A).您可以使用平衡改进的条件数一个,它本身就使得大多数迭代求解器更容易收敛。然而,使用平衡当你随后分解均衡矩阵时,也会得到质量更好的预处理矩阵B = R * P * * C

  • 您可以使用矩阵重排序函数,例如解剖symrcm为了释放系数矩阵的行和列,并使系数矩阵被考虑为生成预处理器时最小化非安利斯数的数量。这可以减少随后解决预处理线性系统所需的存储器和时间。

参考文献

[1] Barrett, R., M. Berry, t.f. Chan, et al.,线性系统解的模板:迭代方法的构建块,暹罗,费城,1994年。

[2] Paige, C. C.和M. A. Saunders,“线性方程组的稀疏不定系统的解”。暹罗J.数。肛门。, Vol.12, 1975, pp. 617-629。

扩展功能

在R2006A之前介绍