主要内容

lsqr

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

描述

例子

x= lsqr (一个b)试图解线性方程组A*x=bx使用最小二乘法lsqr找到一个最小平方的解决方案x那就最小化了规范(b * x).当一个是一致的,最小二乘解也是线性方程组的解。当尝试成功时,lsqr显示确认收敛的消息。如果lsqr由于任何原因,未能在最大迭代次数或停止之后收敛,它显示包含相对残差的诊断消息常态(B-A * X)/ NOM(B)以及方法停止的迭代次数。

例子

x= lsqr (一个b)指定方法的公差。默认容忍度为1e-6

例子

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

例子

x= lsqr (一个b马克西特)指定预处理器矩阵和计算x通过有效地求解该系统 一个 1 y b y哪里 y x .利用预处理矩阵可以改善问题的数值性质,提高计算效率。

例子

x= lsqr (一个b马克西特M1M2)指定预条件器矩阵的因子以致M = M1 *平方米

例子

x= lsqr (一个b马克西特M1M2x0)指定解向量的初始猜测x. 默认值为零向量。

例子

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

例子

x旗帜) = lsqr (___)也返回计算解的残差x.如果旗帜0,然后x是最小二乘解吗规范(b * x).如果那么它是小的x也是一致的解决方案,因为代表常态(B-A * X)/ NOM(B)

例子

x旗帜iter) = lsqr (___)也返回迭代数iter在这x是计算。

例子

x旗帜iterresvec) = lsqr (___)还返回每个迭代的剩余范数向量,包括第一个剩余范数规范(b * x0)

例子

x旗帜iterresveclsvec) = lsqr (___)还返回lsvec,它是每次迭代时比例正态方程误差的估计。

例子

全部收缩

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

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

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

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

x = lsqr (A, b);
lsqr在迭代20停止,但未收敛到所需公差1e-06,因为已达到最大迭代次数。返回的迭代(数字20)的相对残差为0.26。

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

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

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

自从旗帜如果为0,则该算法能够在指定的迭代次数内满足所需的误差容限。通常,您可以同时调整公差和迭代次数,以便以这种方式在速度和精度之间进行权衡。

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

relres = 0.2625
lsres=lsvec(结束)
LSRES = 2.7640E-04

这些残差规范表明x是一个最小二乘解,因为不小于指定的公差1e-4. 由于不存在线性系统的一致解,解算器所能做的最好是使最小二乘残差满足公差。

绘制剩余历史。相对剩余resvec迅速达到最小,无法进一步进步,而最小二乘剩余lsvec在随后的迭代中继续最小化。

N=长度(resvec);符号学(0:N-1,lsvec,“- o”,0:n-1,Resvec,“o”)传奇(“最小二乘剩余”“相对剩余”)

图中包含一个坐标轴。轴线包含2个线型对象。这些对象表示最小二乘残差,相对残差。

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

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

负载West0479.A=0.479;

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

b = sum(a,2);

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

tol=1e-12;maxit=20;

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

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

  • fl表示算法是否收敛。

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

  • 是迭代号码何时x是计算。

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

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

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

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

为了帮助缓慢的收敛,您可以指定一个预处理器矩阵。自从一个非对称,使用伊鲁生成预处理器 l U 以分解形式。指定删除公差,以忽略小于的值的非透明条目1e-6.解预处理系统 - 1 x ) b y Mx 通过指定lU随着M1M2输入lsqr

setup=struct('类型'“ilutp”'droptol',1E-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预处理器产生的相对残差小于1e-12在第13次迭代中。输出rv1(1)规范(b),输出rv1(完)规范(b * x1)

你可以跟着进度lsqr通过在每次迭代时绘制相对残差。绘制每个解决方案的剩余历史,具有指定公差的线。

semilogy(0:长度(rv) 1、rv /规范(b),“o”) 抓住semilogy(0:长度(rv1) 1, rv1 /规范(b),“o”)yline(tol,“r——”); 传奇(“没有预调节器”“ILU预处理程序”“宽容”“位置”'东')包含(“迭代次数”) ylabel (“相对残差”)

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

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

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

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

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

麦克斯特= 75;x1 = lsqr (A, b,[],麦克斯特);
LSQR在迭代64处收敛到具有相对残留的8.7E-07的溶液。
X0 = 0.99 * x0(尺寸(a,2),1);x2 = lsqr(a,b,[],maxit,[],[],x0);
LSQR在第26次迭代时收敛到一个相对残差为9.6e-07的解。

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

返回中间结果

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

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

x0=零(尺寸(A,2),1);tol=1e-8;最大值=100;k=1:4[x,flag,relres]=lsqr(A,b,tol,maxit,[],[]和x0);X(:,k)=X;R(k)=relres;x0=x;结束

X(:,k)迭代时是否计算了解向量kfor-loop,和r(k)是该溶液的相对残差。

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

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

一个=画廊(“威尔克”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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 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 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 20 0 0 0 0 0 0 0 0 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,取决于标志输入:

功能y=afun(x,标志)如果Strcmp(旗帜,“notransp”)%计算* xy = [0;x(1:20)]...+ [(10:-1:0)'; (1:10)“]x...+2*[x(2:结束);0];elseifStrcmp(旗帜,“运输”)%计算A'*xy = 2 * [0;x(1:20)]...+ [(10:-1:0)'; (1:10)“]x...+ (x(2:结束);0);结束结束

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

现在,解线性方程组 斧头 b 通过提供lsqr使用计算的函数句柄斧头‘* x.使用公差1e-6和25个迭代。指定 b 的行和 一个 所以真正的解 x 是一个1的向量。

b =全(sum (A, 2));托尔= 1 e-6;麦克斯特= 25;x1 = lsqr (@afun, b,托尔,麦克斯特)
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 ⋮

本地函数

功能y=afun(x,标志)如果Strcmp(旗帜,“notransp”)%计算* xy = [0;x(1:20)]...+ [(10:-1:0)'; (1:10)“]x...+2*[x(2:结束);0];elseifStrcmp(旗帜,“运输”)%计算A'*xy = 2 * [0;x(1:20)]...+ [(10:-1:0)'; (1:10)“]x...+ (x(2:结束);0);结束结束

输入参数

全部收缩

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

指定一个作为函数句柄

您可以选择将系数矩阵指定为函数句柄而不是矩阵。函数句柄返回矩阵向量乘积,而不是形成整个系数矩阵,使计算更有效率。s manbetx 845

要使用函数句柄,请使用函数签名函数y = afun(x,选择)参数化功能说明如何为函数提供其他参数好玩儿,如果必要的。这个函数好玩儿必须满足以下条件:

  • Afun(x,'notransp')返回产品斧头

  • afun(x,'transp')返回产品‘* x

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

功能y = afun (x,选择,B, C, n)如果Strcmp(选择,“notransp”)y=[B*x(n+1:end);C*x(1:n)];别的* x y = [C”(n + 1:结束);B * x (1: n)];结束
这个函数好玩儿使用BC要计算斧头‘* x(取决于指定的标志)而不是实际形成整个矩阵。

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

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

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

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

数据类型:双重的

最大迭代次数,指定为正标量整数。增值马克西特允许更多的迭代lsqr满足公差. 通常,较小的意味着需要更多的迭代才能成功完成计算。

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

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

指定作为函数句柄

您可以选择指定以下任意一项:M1,或M2作为函数句柄而不是矩阵。函数句柄执行矩阵向量运算,而不是形成整个预条件器矩阵,从而提高计算效率。

要使用函数句柄,首先要创建一个带有签名的函数函数y = mfun(x,opt)参数化功能说明如何为函数提供其他参数MFUN.,如果必要的。这个函数MFUN.必须满足以下条件:

  • mfun(x,'notransp')返回M \ xM2\(M1\x)

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

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

功能y=mfun(x,opt,a,b)如果Strcmp(选择,“notransp”)y=x*a;别的y = x。* b;结束结束
在这个例子中,函数MFUN.使用一个b要计算M \ x = x *M ' \ x = x * b(取决于指定的标志)而不实际形成整个矩阵

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

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

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

输出参数

全部收缩

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

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

  • 如果旗帜0relres >托尔,然后x是最小二乘解吗规范(b * x). 在这种情况下lsvec输出包含误差的标度正态方程x

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

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

标志值

汇聚

0

成功——lsqr收敛到所需的公差之内马克西特迭代。

1

失败-lsqr迭代马克西特迭代,但没有收敛。

2

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

3.

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

4

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

相对剩余错误,作为标量返回。相对残差表示返回答案的准确性x是多少。lsqr在解决方案过程中的每次迭代中跟踪相对残差和最小二乘剩余剩余,并且该算法会聚要么残余符合规定的公差. 这个输出包含收敛残差的值,可以是相对残差,也可以是最小二乘残差:

  • 相对残差等于常态(B-A * X)/ NOM(B)通常是满足公差的残余什么时候lsqr收敛。的resvec输出跟踪所有迭代的残差历史。

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

迭代编号,作为标量返回。此输出指示迭代次数,在该次数下,计算出的x计算了。

数据类型:双重的

残余错误,作为向量返回。剩余错误规范(b * x)揭示了对于给定的x. 这个number of elements inresvec等于迭代次数。您可以检查的内容resvec帮助决定是否更改的值马克西特

数据类型:双重的

比例法向方程错误,返回为矢量。对于每一个迭代,lsvec包含缩放正常方程残差的估计规范((*发票(M))”* (b * X)) /规范(A *发票(M),“来回”). 这个number of elements inlsvec等于迭代次数。

更多关于

全部收缩

最小二乘法

最小二乘(LSQR)算法是对矩形矩阵的共轭梯度(CG)算法的一种改进。分析,LSQRA*x=b产生与正态方程CG相同的残差“* * x =“* b,但LSQR具有更有利的数值特性,因此通常更可靠[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,“LSQR:稀疏线性方程和稀疏最小二乘算法,”ACM反式。数学。柔软。, 1982年第8卷,43-71页。

扩展能力

在R2006A之前介绍