主要内容

lsqr

解线性方程组-最小二乘法

描述

例子

x= lsqr (一个b试图解线性方程组A*x = bx使用最小二乘法lsqr求的最小二乘解x,最大限度地减少规范(b * x).当一个是一致的,最小二乘解也是线性系统的解。当尝试成功时,lsqr显示确认收敛的消息。如果lsqr在最大迭代次数之后未能收敛或由于任何原因停止,它将显示包含相对残差的诊断消息规范(b * x) /规范(b)以及方法停止的迭代次数。

例子

x= lsqr (一个b托尔指定方法的容差。默认容差为1 e-6

例子

x= lsqr (一个b托尔麦克斯特指定要使用的最大迭代次数。lsqr如果收敛失败,则显示诊断消息麦克斯特迭代。

例子

x= lsqr (一个b托尔麦克斯特指定一个前置条件矩阵和计算x通过有效地求解方程组 一个 1 y b y,在那里 y x .采用预条件矩阵可以改善问题的数值性质,提高计算效率。

例子

x= lsqr (一个b托尔麦克斯特M1平方米指定前置条件矩阵的因子这样M = m1 * m2

例子

x= lsqr (一个b托尔麦克斯特M1平方米x0指定解向量的初始猜测x.默认值是0向量。

例子

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

例子

x国旗relres= lsqr(___还返回计算解的残余误差x.如果国旗0,然后x最小二乘解是最小的吗规范(b * x).如果relres很小,那么x也是一个一致的解决方案,因为relres代表规范(b * x) /规范(b)

例子

x国旗relresiter= lsqr(___还返回迭代数iter在这x是计算。

例子

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

例子

x国旗relresiterresveclsvec= lsqr(___同样的回报lsvec,这是每次迭代时缩放法向方程误差的估计值。

例子

全部折叠

求解一个矩形线性方程组lsqr使用默认设置,然后调整解决过程中使用的公差和迭代次数。

创建一个随机稀疏矩阵一个50%的密度。也可以创建一个随机向量b的右边 斧头 b

rng默认的A = sprand(400,300,.5);B = rand(400,1);

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

x = lsqr(A,b);
LSQR在迭代20处停止,没有收敛到期望的容差1e-06,因为达到了最大迭代次数。返回的迭代(编号20)的相对残差为0.26。

默认情况下lsqr使用20次迭代,公差为1 e-6,但算法无法在这个矩阵的这20次迭代中收敛。由于残差仍然很大,这是一个很好的指标,表明需要更多的迭代(或预处理矩阵)。您还可以使用更大的公差,使算法更容易收敛。

再用一个容差解系统1的军医70次迭代。指定六个输出以返回相对残差relres的计算解,以及残差历史resvec以及最小二乘残差历史lsvec

[x,flag,relres,iter,resvec,lsvec] = lsqr(A,b,1e-4,70);国旗
Flag = 0

国旗为0,表示该算法在指定迭代次数内能够满足所期望的容错。您通常可以一起调整公差和迭代次数,以这种方式在速度和精度之间进行权衡。

检验计算解的相对残差和最小二乘残差。

relres
Relres = 0.2625
Lsres = lsvec(end)
Lsres = 2.7640e-04

这些剩余规范表明x是最小二乘解,因为relres是否小于规定的公差1的军医.由于线性系统不存在一致解,求解器能做的最好的是使最小二乘残差满足公差。

绘制剩余历史。相对残差resvec迅速达到最小值,不能再前进,而最小二乘残差lsvec在后续迭代中继续最小化。

N = length(resvec);lsvec semilogy (0: n - 1,“- o”0: n - 1、resvec“o”)传说(“最小二乘残差”“相对剩余”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示最小二乘残差,相对残差。

检查使用预处理矩阵的效果lsqr解一个线性方程组。

加载west0479,一个真实的479 × 479非对称稀疏矩阵。

负载west0479A = west0479;

定义b这才是真正的解 斧头 b 都是1的向量。

b = sum(A,2);

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

Tol = 1e-12;Maxit = 20;

使用lsqr在要求的公差和迭代次数上找到解决方案。指定六个输出以返回关于解决方案过程的信息:

  • x计算的解是A*x = b

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

  • rr计算结果的相对残差是多少x

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

  • 房车向量的残差历史为 b - 斧头

  • lsrv是最小二乘残差历史的向量。

[x,fl,rr,it,rv,lsrv] = lsqr(A,b,tol,maxit);fl
Fl = 1
rr
Rr = 0.0017
It = 20

Fl = 1时,算法在最大迭代次数内没有收敛到指定的公差。

为了帮助处理缓慢的收敛,您可以指定一个预处理矩阵。自一个是非对称的,用ilu生成前置条件 l U 因式分解。指定一个落差公差以忽略值小于的非对角线项1 e-6.解预条件方程组 - 1 x b y Mx 通过指定l而且U随着M1而且平方米输入lsqr

设置= struct(“类型”“ilutp”“droptol”1 e-6);[L,U] = ilu(A,设置);[x1,fl1,rr1,it1,rv1,lsrv1] = lsqr(A,b,tol,maxit,L,U);fl1
Fl1 = 0
rr1
Rr1 = 7.0954e-14
it1
It1 = 13

使用ilu预处理剂产生的相对残留小于规定的容差1 e-12在第13次迭代中。输出rv1 (1)规范(b),输出rv1(结束)规范(b * x1)

你可以跟随的进度lsqr通过绘制每次迭代的相对残差。用指定公差的一条线绘制每个溶液的残留历史。

semilogy(0:长度(rv) 1、rv /规范(b),“o”)举行semilogy(0:长度(rv1) 1, rv1 /规范(b),“o”) yline(托尔,“r——”);传奇(“没有预调节器”ILU预处理的“宽容”“位置”“东”)包含(的迭代次数) ylabel (的相对剩余的

图中包含一个轴对象。axis对象包含3个类型为line、constantline的对象。这些对象表示无前置条件、ILU前置条件、容差。

检查供给的效果lsqr对解的初步猜测。

创建一个随机的矩形稀疏矩阵。用每一行的和作为右边的向量 斧头 b 这就是期望的解 x 是1的向量。

A = sprand(700,900,0.1);b = sum(A,2);

使用lsqr来解决 斧头 b 两次:一次是默认的初始猜测,另一次是正确的初始猜测。对两个解决方案都使用75次迭代和默认容差。金宝搏官方网站将第二个解决方案中的初始猜测指定为所有元素都等于0.99的向量。

Maxit = 75;x1 = lsqr(A,b,[],maxit);
LSQR在迭代64时收敛到相对残差为8.7e-07的解。
x0 = 0.99*ones(size(A,2),1);x2 = lsqr(A,b,[],maxit,[],[],x0);
LSQR在迭代26时收敛到相对残差为9.6e-07的解。

有了接近预期解的初始猜测,lsqr能够在更少的迭代中收敛。

返回中间结果

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

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

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

X (:, k)解向量是在迭代时计算的吗kfor循环的,和R (k)是解的相对残差。

求解一个线性方程组lsqr使用一个函数句柄进行计算* x而且‘* x代替系数矩阵一个

创建一个非对称三对角矩阵。预览矩阵。

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

因为这个三对角矩阵有一个特殊的结构,你可以表示这个操作* x使用函数句柄。当一个乘以一个向量,结果向量中的大部分元素都是零。结果中的非零元素对应于的非零三对角元素一个

表达式 一个 x 就变成:

一个 x 10 2 0 0 1 9 2 0 0 1 2 0 0 1 0 0 1 0 2 0 0 1 10 x 1 x 2 x 3. x 21 10 x 1 + 2 x 2 x 1 + 9 x 2 + 2 x 3. x 19 + 9 x 20. + 2 x 21 x 20. + 10 x 21

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

一个 x 10 x 1 + 2 x 2 x 1 + 9 x 2 + 2 x 3. x 19 + 9 x 20. + 2 x 21 x 20. + 10 x 21 0 x 1 x 2 x 20. + 10 x 1 9 x 2 9 x 20. 10 x 21 + 2 x 2 x 3. x 21 0

同样,for的表达式 一个 T x 就变成:

一个 T x 10 1 0 0 2 9 1 0 0 2 1 0 0 2 0 0 1 0 1 0 0 2 10 x 1 x 2 x 3. x 21 10 x 1 + x 2 2 x 1 + 9 x 2 + x 3. 2 x 19 + 9 x 20. + x 21 2 x 20. + 10 x 21

一个 T x 10 x 1 + x 2 2 x 1 + 9 x 2 + x 3. 2 x 19 + 9 x 20. + x 21 2 x 20. + 10 x 21 2 0 x 1 x 2 x 20. + 10 x 1 9 x 2 9 x 20. 10 x 21 + x 2 x 3. x 21 0

在MATLAB®中,编写一个函数来创建这些向量并将它们相加,从而给出的值* x‘* x,取决于标志输入:

函数Y = fun(x,flag)如果比较字符串(国旗,“notransp”%计算A*xY = [0;x (1:20))...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * (x(2:结束);0);elseif比较字符串(国旗,“透明”计算A'*xY = 2*[0;x (1:20))...+ ((10: 1:0) ';(1:10)”)。* x...+ (x(2:结束);0);结束结束

(该函数在示例末尾保存为本地函数。)

现在求解线性方程组 斧头 b 通过提供lsqr使用函数句柄进行计算* x而且‘* x.使用的公差1 e-625次迭代。指定 b 的行和 一个 这就是方程的解 x 是1的向量。

b = full(sum(A,2));Tol = 1e-6;Maxit = 25;X1 = lsqr(@afun,b,tol,maxit)
LSQR在迭代21收敛到相对残差为5.4e-13的解。
x1 =21日×11.0000 - 1.0000 - 1.0000 - 1.0000 - 1.0000 - 1.0000 - 1.0000 - 1.0000

本地函数

函数Y = fun(x,flag)如果比较字符串(国旗,“notransp”%计算A*xY = [0;x (1:20))...+ ((10: 1:0) ';(1:10)”)。* x...+ 2 * (x(2:结束);0);elseif比较字符串(国旗,“透明”计算A'*xY = 2*[0;x (1:20))...+ ((10: 1:0) ';(1:10)”)。* x...+ (x(2:结束);0);结束结束

输入参数

全部折叠

系数矩阵,指定为矩阵或函数句柄。这个矩阵是线性系统中的系数矩阵A*x = b.一般来说,一个大型稀疏矩阵或返回大型稀疏矩阵与列向量乘积的函数句柄。

指定一个作为函数句柄

您可以选择将系数矩阵指定为函数句柄而不是矩阵。函数句柄返回矩阵向量乘积,而不是形成整个系数矩阵,使计算更高效。下载188bet金宝搏

要使用函数句柄,请使用函数签名函数y = fun(x,opt)参数化功能解释如何向函数提供附加参数afun,如有需要。这个函数afun必须满足这些条件:

  • afun (x, notransp)返回产品* x

  • afun (x,“透明”)返回产品‘* x

可接受函数的一个例子是:

函数y = afun(x,opt,B,C,n)如果比较字符串(选择,“notransp”) y = [B*x(n+1:结束);C * x (1: n)];其他的y = [C'*x(n+1:end);B * x (1: n)];结束
这个函数afun中的值B而且C都要计算* x‘* x(取决于指定的标志)而不实际形成整个矩阵。

数据类型:|function_handle
复数支持:金宝app是的

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

数据类型:
复数支持:金宝app是的

方法公差,指定为正标量。使用此输入来权衡计算中的准确性和运行时间。lsqr必须在允许的迭代次数内满足公差才能成功。较小的值托尔意味着为了计算成功,答案必须更精确。

数据类型:

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

预条件矩阵,指定为矩阵或函数句柄的单独参数。您可以指定一个预处理矩阵或者矩阵因子M = m1 * m2为了改进线性系统的数值方面,使它更容易lsqr迅速汇合:迅速汇合对于平方系数矩阵,可以使用不完全矩阵分解函数ilu而且ichol生成预处理矩阵。你也可以用平衡先对系数矩阵进行因数分解,以改善其条件数。有关预处理条件的更多信息,请参见线性系统的迭代方法

lsqr将未指定的预处理条件作为单位矩阵处理。

指定作为函数句柄

您可以选择指定其中的任何一个M1,或平方米作为函数句柄而不是矩阵。函数句柄执行矩阵-向量运算,而不是形成整个预处理矩阵,使计算更高效。

要使用函数句柄,首先要创建带有签名的函数函数y = mfun(x,opt)参数化功能解释如何向函数提供附加参数mfun,如有需要。这个函数mfun必须满足这些条件:

  • mfun (x, notransp)返回的值M \ xM1、M2 \ (x)

  • mfun (x,“透明”)返回的值M ' \ xM1 ' \”(M2 \ x)

可接受函数的一个例子是:

函数Y = mfun(x,opt,a,b)如果比较字符串(选择,“notransp”) y = x.*a;其他的Y = x.*b;结束结束
在这个例子中,函数mfun使用一个而且b都要计算M\x = x*aM'\x = x*b(取决于指定的标志)而不实际形成整个矩阵

数据类型:|function_handle
复数支持:金宝app是的

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

数据类型:
复数支持:金宝app是的

输出参数

全部折叠

线性系统解,作为列向量返回。这个输出给出了线性系统的近似解A*x = b

  • 如果国旗0而且Relres <= tol,然后x是否有一致的解决方案A*x = b

  • 如果国旗0Relres > tol,然后x最小二乘解是最小的吗规范(b * x).在这种情况下,lsvec输出包含的缩放法向方程误差x

当计算不成功时(标志~= 0),解决方案x返回的lsqr是在所有迭代中计算的范数残差最小的一个。

收敛标志,作为此表中的一个标量值返回。收敛标志表示计算是否成功,并区分几种不同形式的失败。

标志值

收敛

0

成功——lsqr收敛到期望的公差托尔麦克斯特迭代。

1

失败- - - - - -lsqr迭代麦克斯特迭代但不收敛。

2

失败-预处理矩阵M = m1 * m2条件不好。

3.

失败- - - - - -lsqr连续两次迭代后停滞不前。

4

方法计算的标量之一lsqr算法变得太小或太大,无法继续计算。

相对残差,作为标量返回。相对残差表示返回的答案有多准确x是多少。lsqr跟踪求解过程中每次迭代的相对残差和最小二乘残差,算法收敛于要么残留量满足规定公差托尔.的relres输出包含收敛后的残差值,要么是相对残差,要么是最小二乘残差:

  • 相对残差等于规范(b * x) /规范(b)并且一般是满足公差的残差托尔lsqr是收敛的。的resvec输出在所有迭代中跟踪这个残差的历史。

  • 最小二乘残差等于规范((*发票(M))”* (b * X)) /规范(A *发票(M),“来回”).这个残余原因lsqr收敛:收敛的频率低于相对残差的lsvec输出在所有迭代中跟踪这个残差的历史。

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

数据类型:

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

数据类型:

缩放的正常方程误差,以矢量形式返回。对于每一次迭代,lsvec包含缩放的正态方程残差的估计规范((*发票(M))”* (b * X)) /规范(A *发票(M),“来回”).元素的数量lsvec等于迭代的次数。

更多关于

全部折叠

最小二乘法

最小二乘(LSQR)算法是对矩形矩阵的共轭梯度(CG)方法的一种改进。分析上,LSQR为A*x = b对正态方程产生与CG相同的残差A'*A*x = A'*b,但LSQR具有更有利的数值性质,因此通常更可靠[1]

最小二乘法是唯一可以处理矩形和不一致系数矩阵的迭代线性系统求解器。

提示

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

  • 您可以使用矩阵重新排序函数,例如解剖而且symrcm当对系数矩阵进行因式分解以生成预处理条件时,对系数矩阵的行和列进行排列并使非零的数量最小化。这可以减少随后求解预条件线性系统所需的内存和时间。

参考文献

[1]巴雷特,R., M. Berry, T. F. Chan等,线性系统解的模板:迭代方法的构建块, SIAM,费城,1994年。

[2] Paige, C. C.和M. A. Saunders,“LSQR:稀疏线性方程和稀疏最小二乘的算法”,ACM反式。数学。柔软。, Vol.8, 1982, pp. 43-71。

扩展功能

R2006a之前介绍