lsqr

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

描述

实例

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

实例

x= lsqr (A.,B,托尔)指定方法的公差。默认容忍度为1 e-6

实例

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

实例

x= lsqr (A.,B,托尔,麦克斯特,M)指定一个预处理矩阵M和计算x通过有效地解决该系统 A. M 1. Y = B 对于Y,在那里 Y = M x 使用预条件矩阵可以提高问题的数值性质和计算效率。

实例

x= lsqr (A.,B,托尔,麦克斯特,M1,平方米)指定预处理矩阵的因子M这样M = M1 *平方米

实例

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

实例

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

实例

[x,国旗,relres]=lsqr(___)也返回计算解的残差x.如果国旗0然后x是最小二乘解吗范数(b-A*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使用默认设置,然后调整解决方案过程中使用的公差和迭代次数。

创建一个随机稀疏矩阵A.密度为50%。同时创建一个随机向量B对于右侧的 斧头 = B

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

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

x=lsqr(A,b);
LSQR在迭代20时停止,没有收敛到期望的公差1e-06,因为已经达到了最大的迭代次数。返回的iterate(编号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”)传说(“最小二乘残差”,“相对剩余”)

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

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

负载west0479一个= west0479;

定义B这样才能真正解决问题 斧头 = B 是所有1的向量。

b =和(2);

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

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

使用lsqr在要求的容忍度和迭代次数下找到解决方案。指定6个输出以返回关于解决方案流程的信息:

  • x是计算出的解决方案A * x =

  • 佛罗里达州是指示算法是否收敛的标志。

  • rr是计算答案的相对残差吗x

  • 迭代次数是什么时候x进行了计算。

  • 房车是的剩余历史的向量 B - 斧头

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

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

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

为了帮助缓慢的收敛,你可以指定一个预处理矩阵。自A.是不对称的,使用ilu生成预处理程序 M = L U 以映像的形式。指定一个drop tolerance以忽略值小于的非对角线项1 e-6. 求解预条件系统 - 1. ( M 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 (的相对剩余的)

检查供应的效果lsqr对解有一个初步的猜测。

创建一个随机矩形稀疏矩阵。用每一行的和作为右边的向量 斧头 = B 所以预期的解决方案 x 是一个1的向量。

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

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

麦克斯特= 75;x1 = lsqr (A, b,[],麦克斯特);
LSQR在第64次迭代时收敛到一个相对残差为8.7e-07的解。
x0 = 0.99 *(大小(A, 2), 1);x2 = lsqr(麦克斯特,A, b, [] [], [], x0);
lsqr在迭代26时收敛到相对残差为9.6e-07的解。

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

返回中间结果

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

例如,这段代码执行四次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)迭代时是否计算了解向量K对于for循环,以及R (k)是这个解的相对剩余。

通过提供解一个线性方程组lsqr使用计算的函数句柄* xA'*x代替系数矩阵A.

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

A=画廊(“wilk”21) +诊断接头(1(20日1),1)
A=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 01.2.2.000000 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使用函数句柄。当A.乘一个向量,得到的向量中的大多数元素都是零。结果中的非零元素对应于的非零三对角元素A.

表达式 A. x 变成:

A. 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 ]

结果向量可以写成三个向量之和:

A. 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的表达式 A. T x 变成:

A. 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 ]

A. 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®中,编写一个函数来创建这些向量并将它们相加,从而得到值* xA'*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使用计算的函数句柄* xA'*x. 使用公差为1 e-6和25次迭代。指定 B 的行和 A. 因此,真正的解决方案 x 是一个1的向量。

b=满(和(A,2));tol=1e-6;最大值=25;x1=lsqr(@afun,b,tol,最大值)
LSQR在迭代21时收敛到一个相对残差为5.4e-13的解。
x1=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 = 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 =.一般来说,A.是一个大型稀疏矩阵或返回大型稀疏矩阵和列向量乘积的函数句柄。

指定A.作为函数句柄

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

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

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

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

可接受功能的一个例子是:

函数y=afun(x,opt,B,C,n)如果比较字符串(选择,“notransp”) y = [B*x(n+1:end)];C * x (1: n)];其他的y=[C'*x(n+1:end);B'*x(1:n)];终止
这个函数afun使用BC来计算* xA'*x(取决于指定的标志)而不是实际形成整个矩阵。

数据类型:|功能手柄
复数支持:金宝app是的

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

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

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

数据类型:

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

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

lsqr将未指定的前置条件视为单位矩阵。

指定M作为函数句柄

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

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

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

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

可接受功能的一个例子是:

函数y = mfun (x,选择a, b)如果比较字符串(选择,“notransp”) y = x.*a;其他的y = x。* b;终止终止
在本例中,函数mfun使用A.B来计算M\x=x*aM'\x=x*b(取决于指定的标志)而不是实际形成整个矩阵M

数据类型:|功能手柄
复数支持:金宝app是的

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

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

输出参数

全部折叠

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

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

  • 如果国旗0雷尔斯>托尔然后x是最小化的最小二乘解范数(b-A*x).在这种情况下lsvec输出包含的比例法向方程误差x

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

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

标志值

收敛

0

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

1.

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

2.

失败-预处理矩阵MM = M1 *平方米是病态的。

3.

失败- - - - - -lsqr在连续两次迭代后停滞是相同的。

4.

失败-一个标量计算lsqr算法变得太小或太大,无法继续计算。

相对剩余误差,作为标量返回。相对残差表示返回的答案有多准确xlsqr在求解过程中跟踪每一次迭代的相对残差和最小二乘残差,当要么残余应力符合规定公差托尔.的relres输出包含收敛的残差值,即相对残差或最小二乘残差:

  • 相对残差等于规范(b * x) /规范(b)通常是满足公差的残余托尔lsqr是收敛的。的resvec输出跟踪所有迭代中此剩余的历史记录。

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

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

数据类型:

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

数据类型:

缩放正态方程错误,作为向量返回。对于每次迭代,lsvec包含一个估计的比例正规方程残差规范((*发票(M))”* (b * X)) /规范(A *发票(M),“来回”). 中的元素数lsvec等于迭代次数。

更多关于

全部折叠

最小二乘法

最小二乘(LSQR)算法是对矩形矩阵共轭梯度(CG)方法的一种改进。从分析上讲,LSQR用于A * x =产生了和普通方程的CG一样的残差“* * x =“* b,但LSQR具有更有利的数值性质,因此通常更可靠[1]

最小二乘法是唯一一种能够处理矩形和不一致系数矩阵的迭代线性方程组求解方法。

提示

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

  • 可以使用矩阵重新排序函数,例如解剖symrcm将系数矩阵分解为预调节器时,对系数矩阵的行和列进行置换,使非零的数目最小化。这可以减少后续求解预处理线性系统所需的内存和时间。

参考文献

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

[2] Paige, C. C.和M. A. Saunders,“LSQR:稀疏线性方程和稀疏最小二乘法的算法”,ACM Trans.数学软件。,1982年第8卷,第43-71页。

扩展功能

之前介绍过的R2006a