MATLAB函数及应用
上QQ阅读APP看书,第一时间看更新

50.lsqr函数

在MATLAB中,提供了lsqr函数实现LSQR方法。函数的语法格式为:

x=lsqr(A,b):针对x对线性方程组A∗x=b求解,否则将计算使得norm(b-A∗x)为x的最小二乘解。m×n系数矩阵A无须为方阵,但应为大型稀疏矩阵。列向量b必须具有长度m。可以将A指定为函数句柄afun,这样afun(x,'notransp')将返回A∗x,afun(x,'transp')将返回A'∗x。

如果lsqr收敛,则会显示一条有关该结果的消息。如果lsqr无法在达到最大迭代次数后收敛或出于任何原因暂停,则会输出一条显示相对残差norm(b-A∗x)/norm(b)以及该方法停止或失败时所达到的迭代数的警告消息。

lsqr(A,b,tol):指定该方法的容差。如果tol为[],lsqr使用默认值1e-6。

lsqr(A,b,tol,maxit):指定最大迭代次数。

lsqr(A,b,tol,maxit,M)和lsqr(A,b,tol,maxit,M1,M2):使用n×n预设子条件M或M=M1∗M2,并高效求解关于y的方程组A∗inv(M)∗y=b,其中y=M∗x。如果M为[],lsqr不会应用预设子条件。M可以是函数mfun,这样mfun(x,'notransp')返回M\x,mfun(x,'transp')返回M'\x。

lsqr(A,b,tol,maxit,M1,M2,x0):指定n×1初始估计解。如果x0为[],lsqr使用默认值(即全部为零的向量)。

[x,flag]=lsqr(A,b,tol,maxit,M1,M2,x0):也返回一个收敛标志,其取值及含义见表1-1。

如果flag不为0,返回的解x具有在所有迭代中最小的范数残差。如果指定flag输出,将不会显示任何消息。

[x,flag,relres]=lsqr(A,b,tol,maxit,M1,M2,x0):还返回相对残差norm(b-A∗x)/norm(b)的估计值。如果flag为0,relres≤tol。

[x,flag,relres,iter]=lsqr(A,b,tol,maxit,M1,M2,x0):还返回计算x时所达到的迭代数,其中0≤iter≤maxit。

[x,flag,relres,iter,resvec]=lsqr(A,b,tol,maxit,M1,M2,x0):还返回每次迭代中的残差范数估计值的向量(包括norm(b-A∗x0))。

[x,flag,relres,iter,resvec,lsvec]=lsqr(A,b,tol,maxit,M1,M2,x0):还返回每次迭代中的缩放标准方程残差的估计值向量:norm((A∗inv(M))'∗(B-A∗X))/norm(A∗inv(M),'fro')。请注意,norm(A∗inv(M),'fro')的估计值在每次迭代中都会改变,可以进行改进。

【例1-51】本示例演示如何使用带有矩阵输入的lsqr。

运行程序,输出如下:

     lsqr在解的迭代11处收敛,并且相对残差为3e-09。