通过提供解一个线性方程组lsqr
使用计算的函数句柄* x
和A'*x
代替系数矩阵A.
.
创建一个非对称的三对角矩阵。预览矩阵。
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.
.
表达式
变成:
.
结果向量可以写成三个向量之和:
=
.
同样,for的表达式
变成:
.
.
在MATLAB®中,编写一个函数来创建这些向量并将它们相加,从而得到值* x
或A'*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);终止终止
(这个函数在示例的最后保存为一个本地函数。)
现在,解线性方程组
提供lsqr
使用计算的函数句柄* x
和A'*x
. 使用公差为1 e-6
和25次迭代。指定
的行和
因此,真正的解决方案
是一个1的向量。
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⋮