主要内容

lsqr

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

描述

例子

x= lsqr (一个,b)试图解决线性方程组A * x =x使用最小二乘法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 *平方米

例子

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

例子

(x,国旗)= lsqr (___)返回一个标记,用于指定是否该算法成功地融合。当国旗= 0,收敛是成功的。您可以使用这个输出语法与任何以前的输入参数组合。当你指定国旗输出,lsqr不显示任何诊断消息。

例子

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

例子

(x,国旗,relres,iter)= lsqr (___)返回迭代的数量iter在这x是计算。

例子

(x,国旗,relres,iter,resvec)= lsqr (___)还返回一个向量的残留标准在每个迭代中,包括第一个残留规范(b * x0)

例子

(x,国旗,relres,iter,resvec,lsvec)= lsqr (___)同样的回报lsvec,这是一个估计的正常比例在每个迭代方程误差。

例子

全部折叠

解决一个矩形线性系统使用lsqr默认设置,然后调整解决方案中使用的宽容和迭代次数的过程。

创建一个随机稀疏矩阵一个密度为50%。还创建一个随机向量b的右边 斧头 = b

rng默认的5 = sprand (400300);b =兰德(400 1);

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

x = lsqr (A, b);
lsqr停在迭代20不收敛所需的公差1 e-06因为迭代的最大数量。返回的迭代(20)数量相对剩余0.26。

默认情况下lsqr使用20个迭代和宽容的1 e-6,但该算法无法在这20个迭代收敛这个矩阵。由于残余还大,这是一个很好的指标,需要更多的迭代(或预调节器矩阵)。您还可以使用更大的宽容使算法更容易收敛。

解决系统再次使用的宽容1的军医和70的迭代。指定返回相对剩余6个输出relres的计算解决方案,以及剩余的历史resvec和最小二乘残差的历史lsvec

[x,国旗,relres, iter resvec, lsvec] = lsqr (A, b, 1的军医,70);国旗
国旗= 0

国旗是0,该算法能够满足所需的错误容忍在指定数量的迭代。你通常可以调整公差和迭代次数之间做出权衡速度和精度。

检查计算的相对剩余和最小二乘残差的解决方案。

relres
relres = 0.2625
lsr = lsvec(结束)
lsr = 2.7640 e-04

这些残留的规范说明x是一个最小二乘解,因为relres不小于指定的公差1的军医。因为没有一致的解决线性系统存在,最好的解决者能做的就是使最小二乘残差满足公差。

画出剩余的历史。相对剩余resvec很快达到一个最小值和不能取得进一步进展,而最小二乘残差lsvec在后续迭代中仍然是最小的。

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

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。这些对象代表最小二乘残差,相对剩余。

检查使用预处理矩阵的影响lsqr解决一个线性系统。

负载west0479,一个真正的479 - 479年-非对称稀疏矩阵。

负载west0479一个= west0479;

定义b所以,真正的解决方案 斧头 = b 是一个向量的。

b =和(2);

宽容和最大迭代数。

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

使用lsqr找到一个解决方案在请求的宽容和迭代次数。指定6输出返回的信息解决方案过程:

  • x计算解决方案吗A * x =

  • fl是一个标志指示是否算法融合。

  • rr的相对剩余计算答案x

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

  • 房车是一个向量的残余历史 b - - - - - - 斧头

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

[x, fl, rr,房车,lsrv] = lsqr (A, b,托尔,麦克斯特);fl
fl = 1
rr
rr = 0.0017
它= 20

fl = 1,该算法不收敛于指定的公差内的最大迭代数。

援助与收敛速度慢,您可以指定一个预处理矩阵。自一个非对称,使用ilu生成预调节器 = l U 以映像的形式。指定公差忽略nondiagonal条目下降值小于1 e-6。解决了预处理系统 - - - - - - 1 ( x ) = b y = Mx 通过指定lU随着M1平方米输入lsqr

设置=结构(“类型”,“ilutp”,“droptol”1 e-6);[L U] = ilu(一个,设置);(x1, fl1 rr1、it1 rv1, lsrv1] = lsqr (A, b,托尔,麦克斯特,L, U);fl1
fl1 = 0
rr1
rr1 = 7.0954 e-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 (的相对剩余的)

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象,constantline。这些对象代表没有预调节器,ILU预调节器,宽容。

检查供应的影响lsqr解决方案的初始猜测。

创建一个随机矩形稀疏矩阵。使用每一行的总和作为向量的右边 斧头 = b 因此,预期的解决方案 x 是一个向量的。

= sprand (700900, 0.1);b =和(2);

使用lsqr来解决 斧头 = b 两次:一次使用默认初始猜测,和一个解决方案的时间和一个很好的初始估计。使用75次迭代和默认的对这两个解决方案。金宝搏官方网站指定初始猜测第二个解决方案作为一个向量的所有元素等于0.99。

麦克斯特= 75;x1 = lsqr (A, b,[],麦克斯特);
lsqr聚集在迭代64与相对剩余8.7 e-07解决方案。
x0 = 0.99 *(大小(A, 2), 1);x2 = lsqr(麦克斯特,A, b, [] [], [], x0);
lsqr聚集在迭代26与相对剩余9.6 e-07解决方案。

最初想接近预期的解决方案,lsqr能够在更少的迭代收敛。

返回中间结果

你也可以使用初始猜得到中间结果通过调用lsqr在一个循环。每次调用解算器执行几个迭代计算并存储解决方案。然后使用这个解决方案的初始矢量迭代的下一批。

例如,这段代码执行四次100次迭代和存储解决方案向量每次通过For循环:

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

X (:, k)在迭代解向量计算吗kfor循环的R (k)是解决方案的相对剩余。

解一个线性系统通过提供lsqr计算一个函数处理* x‘* x的系数矩阵一个

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

一个=画廊(“wilk”21)+诊断接头(1(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一个函数处理。当一个乘以一个向量,大部分结果向量中的元素是0。结果中的非零元素对应的非零三对角元素一个

表达式 一个 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 ]

同样地,的表达式 一个 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 = afun (x,国旗)如果比较字符串(国旗,“notransp”)%计算* x(y = 0;x (1:20))+ ((10:1:0)';(1:10)”)。* x+ 2 * (x(2:结束);0);elseif比较字符串(国旗,“透明”)' * x %计算y = 2 * [0;x (1:20))+ ((10:1:0)';(1:10)”)。* x+ (x(2:结束);0);结束结束

(这个函数保存为本地函数结束时的例子。)

现在,解决线性系统 斧头 = b 通过提供lsqr计算的函数处理* x‘* x。使用一个公差1 e-6和25个迭代。指定 b 行总结 一个 所以,真正的解决方案 x 是一个向量的。

b =全(sum (A, 2));托尔= 1 e-6;麦克斯特= 25;x1 = lsqr (@afun, b,托尔,麦克斯特)
lsqr聚集在迭代21与相对剩余5.4 e-13解决方案。
x1 =21日×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

本地函数

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

输入参数

全部折叠

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

指定一个作为处理函数

您可以选择性地指定系数矩阵作为处理函数,而不是一个矩阵。函数处理返回矩阵向量的产品,而不是形成整个系数矩阵,计算效率更高。下载188bet金宝搏

要使用一个函数处理,使用函数签名函数y = afun (x,选择)参数化功能解释如何提供额外的参数函数afun,如果必要的。这个函数afun必须满足以下条件:

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

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

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

函数y = afun (x,选择,B, C, n)如果比较字符串(选择,“notransp”)y = [B * x (n + 1:结束);C * x (1: n)];其他的* x y = [C”(n + 1:结束);B * x (1: n)];结束
这个函数afun使用的值BC来计算* x‘* x(根据指定的标志)没有形成整个矩阵。

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

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

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

公差的方法,指定为一个积极的标量。使用该输入平衡精度和运行时的计算。lsqr必须符合公差在允许迭代的数量才能成功。一个较小的值托尔意味着答案必须更精确的计算才能成功。

数据类型:

最大迭代次数,指定为一个积极的标量整数。增加的价值麦克斯特允许更多的迭代lsqr为了满足公差托尔。一般来说,一个更小的值托尔意味着更多的迭代需要成功地完成计算。

预处理矩阵,矩阵或作为单独的参数指定的函数处理。您可以指定一个预处理矩阵或其矩阵因素M = M1 *平方米提高数值方面的线性系统和方便lsqr快速收敛。对于平方系数矩阵,您可以使用不完整的矩阵分解的功能iluichol生成预调节器矩阵。你也可以使用平衡分解前改善系数矩阵的条件数。有关预调节器的更多信息,请参阅线性系统的迭代方法

lsqr将未指明的预调节器视为单位矩阵。

指定作为处理函数

你可以指定任何,M1,或平方米作为函数处理代替矩阵。函数处理执行矩阵向量操作而形成整个预处理矩阵,使计算更加高效。

使用一个函数处理,首先创建一个函数的签名函数y = mfun (x,选择)参数化功能解释如何提供额外的参数函数mfun,如果必要的。这个函数mfun必须满足以下条件:

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

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

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

函数y = mfun (x,选择a, b)如果比较字符串(选择,“notransp”)y = x。*;其他的y = x。* b;结束结束
在本例中,函数mfun使用一个b来计算M \ x = x *M ' \ x = x * b(根据指定的标志)没有形成整个矩阵

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

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

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

输出参数

全部折叠

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

  • 如果国旗0relres < =托尔,然后x是一个一致的解决方案A * x =

  • 如果国旗0relres >托尔,然后x的最小二乘解最小化规范(b * x)。在这种情况下,lsvec输出包含了正常的误差方程x

当计算不成功(国旗~ = 0),解决方案x返回的lsqr是用最小的规范剩余所有迭代的计算。

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

标志值

收敛

0

成功——lsqr聚集到所需的公差托尔麦克斯特迭代。

1

失败- - - - - -lsqr迭代麦克斯特迭代,但没有收敛。

2

失败——预调节器矩阵M = M1 *平方米是病态的。

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)方法对矩形矩阵。分析,LSQRA * x =产生相同的残差作为CG法方程“* * x =“* b,但LSQR具有更有利的数值属性,因而更可靠[1]

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

提示

  • 大多数迭代方法的收敛性取决于系数矩阵的条件数,气孔导度(A)。您可以使用平衡改善的条件数一个自己,这使得大多数迭代解决者更容易收敛。然而,使用平衡时也会导致更好的质量矩阵预调节器随后因素平衡矩阵B = R * P * * C

  • 您可以使用矩阵重新排序等功能解剖symrcm来交换系数矩阵的行和列的数量,减少非零系数矩阵分解时生成一个预调节器。这可以减少所需的内存和时间随后预先处理解决线性系统。

引用

[1]巴雷特,R。,米。Berry, T. F. Chan, et al.,线性系统的解决方案模板:迭代方法的构建块、暹罗、费城1994人。

Paige [2], c . c和m·a·桑德斯”LSQR:一个稀疏线性方程和稀疏最小二乘算法,”ACM反式。数学。柔软。Vol.8, 1982年,页43 - 71。

扩展功能

之前介绍过的R2006a