目录
语法
说明
示例
求解具有无限个解的线性系统
指定容差以减少含噪数据的影响
切换显示低秩矩阵警告
lsqminnorm函数的功能是线性方程的最小范数最小二乘解。
语法
X = lsqminnorm(A,B)
X = lsqminnorm(A,B,tol)
X = lsqminnorm(___,rankWarn)
说明
X = lsqminnorm(A,B) 返回可以求解线性方程 AX = B 并使 norm(A*X-B) 的值最小化的数组 X。如果此问题有多个解,则 lsqminnorm 返回能使 norm(X) 最小化的解。如果 B 有多列,则前面的语句分别适用于 X 和 B 的每列。
X = lsqminnorm(A,B,tol) 还指定 lsqminnorm 用来确定 A 的秩的容差。
X = lsqminnorm(___,rankWarn) 指定一个可选标志,如果 A 的秩较低,则显示警告。可以使用上述语法中的任何输入参数组合。rankWarn 可以为 'nowarn'(默认值)或 'warn'。
示例
求解具有无限个解的线性系统
使用反斜杠 (\) 和 lsqminnorm 求解具有无限多个解的线性系统。使用解的 2-范数比较结果。
当 Ax=b 有无限多个解时,每个解都会使 ‖Ax−b‖ 最小化。反斜杠命令 (\) 也可以计算出一个这样的解,但此解通常不会使 ‖x‖ 最小化。lsqminnorm 计算出的解不仅会使 norm(A*x-b) 最小,还会使 norm(x) 最小。
假设有一个简单的线性系统 2x1+3x2=8,其中包含一个方程和两个未知数。该方程组是欠定方程组,因为方程的个数少于未知数的个数。使用反斜杠和 lsqminnorm 求解该方程。
A = [2 3];
b = 8;
x_a = A\b
x_a = 2×1
0
2.6667
x_b = lsqminnorm(A,b)
x_b = 2×1
1.2308
1.8462
两种方法得出不同的解,因为反斜杠只是要使 norm(A*x-b) 最小化,而 lsqminnorm 还要使 norm(x) 最小化。计算这些范数并将结果记录在表中,以便于比较。
s1 = {'Backslash'; 'lsqminnorm'};
s2 = {'norm_Ax_minus_b','norm_x'};
T = table([norm(A*x_a-b); norm(A*x_b-b)],[norm(x_a); norm(x_b)],'RowNames',s1,'VariableNames',s2)
T=2×2 table
norm_Ax_minus_b norm_x
_______________ ______
Backslash 0 2.6667
lsqminnorm 1.7764e-15 2.2188
下图说明了这种情况,并显示每个方法返回的解。蓝线表示方程的无限多个解。橙色圆圈表示从原点到解线的最小距离,lsqminnorm 返回的解刚好在这条线与圆圈之间的切点上,指示它是离原点最近的解。
如图所示:
指定容差以减少含噪数据的影响
说明如何在 lsqminnorm 中指定用于计算秩的容差,才能有助于定义问题的范围,以使随机噪声不会破坏解。
创建秩为 5 的低秩矩阵和右侧向量 b。
rng default % for reproducibility
U = randn(200,5);
V = randn(100,5);
A = U*V';
b = U*randn(5,1) + 1e-4*randn(200,1);
使用 lsqminnorm 求解线性系统 Ax=b。计算 A*x-b 和 x 的范数,以检查解的质量。
x = lsqminnorm(A,b);
norm(A*x-b)
ans = 0.0014
norm(x)
ans = 0.1741
现在,在矩阵 A 中添加少量噪声,然后再次求解线性系统。噪声对线性系统的解向量 x 的影响不成比例。
Anoise = A + 1e-12*randn(200,100);
xnoise = lsqminnorm(Anoise,b);
norm(Anoise*xnoise - b)
ans = 0.0010
norm(xnoise)
ans = 1.1215e+08
解之间的巨大差异是因为噪声影响 A 的低秩逼近。换句话说,lsqminnorm 认为在 A 的 QR 分解中,位于 R 矩阵对角线上的小值很重要,而实际上这些值并没有那么重要。理想情况下,R 对角线上的这些小值应视为零。
绘制 Anoise 的 QR 分解中 R 矩阵的对角线元素。有大量对角线元素位于阶次 1e-10 处。
[Q,R,p] = qr(Anoise,0);
semilogy(abs(diag(R)),'o')
如图所示:
此问题的解决方案是增大 lsqminnorm 使用的容差,以便在计算中使用误差小于 1e-8 的 Anoise 低秩逼近。这样将使噪声对结果的影响大大减小。使用容差的解非常接近原来的解 x。
xnoise = lsqminnorm(Anoise, b, 1e-8);
norm(Anoise*xnoise - b)
ans = 0.0014
norm(xnoise)
ans = 0.1741
norm(x - xnoise)
ans = 1.0811e-14
切换显示低秩矩阵警告
在打开警告的情况下求解涉及低秩系数矩阵的线性系统。
创建一个秩为 2 的 3×3 矩阵。在此矩阵中,可以通过将前两列相加得出第三列。
A = [1 2 3; 4 5 9; 6 7 13]
A = 3×3
1 2 3
4 5 9
6 7 13
求问题 Ax=b 的最小范数最小二乘解,其中 b 等于 A 中的第二列。为 lsqminnorm 指定 'warn' 标志,以便在检测到 A 为低秩时显示警告。
b = A(:,2);
x = lsqminnorm(A,b,'warn')
Warning: Rank deficient, rank = 2, tol = 1.072041e-14.
x = 3×1
-0.3333
0.6667
0.3333
提示
-
当有多个解时,lsqminnorm 计算的最小范数解具有特别的意义。只要 A 欠定(行数少于列数)或低秩,方程 Ax = b 就有多个解。
-
在计算线性系统的最小范数最小二乘解时,lsqminnorm(A,B,tol) 的效率通常高于 pinv(A,tol)*B。lsqminnorm 使用完全正交分解 (COD) 来计算 A 的低秩逼近,而 pinv 使用的是奇异值分解 (SVD)。因此,pinv 和 lsqminnorm 的结果不完全一致。
-
对于稀疏矩阵,lsqminnorm 使用与稠密矩阵不同的算法,因此会产生不同的结果。