主要内容

lsqminnorm

线性方程的最小范数最小二乘解

说明

X = lsqminnorm(A,B) 返回可以求解线性方程 AX = B 并使 norm(A*X-B) 的值最小化的数组 X。如果存在几个解,则 lsqminnorm 返回最小化 norm(X) 的解。如果 B 有多列,则前面的语句分别适用于 XB 的每列。

示例

X = lsqminnorm(A,B,tol) 还指定 lsqminnorm 用来确定 A 的秩的容差。

示例

X = lsqminnorm(___,rankWarn) 指定如果 A 的秩较低是否显示警告。除了上述语法中的任何输入参量组合之外,您还可以指定此选项。rankWarn 可以是 "nowarn"(默认值)或 "warn"

示例

X = lsqminnorm(___,RegularizationFactor=alpha) 指定要应用于解 X 的吉洪诺夫正则化因子。 (自 R2024b 起)

示例

示例

全部折叠

使用反斜杠 (\) 和 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      8.8818e-16       2.2188

下图说明了这种情况,并显示每个方法返回的解。蓝线表示方程 x2=-23x1+83 的无限多个解。橙色圆圈表示从原点到解线的最小距离,lsqminnorm 返回的解刚好在这条线与圆圈之间的切点上,指示它是离原点最近的解。

您可以指定容差用于计算秩,也可以指定吉洪诺夫正则化因子以使用 lsqminnorm 求解问题。这些设定有助于确定问题的规模,以便随机噪声不会破坏解。

创建秩为 5 的低秩矩阵 A 和右侧向量 b

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-bx 的范数,以检查解的质量。

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.1214e+08

解之间的巨大差异是因为噪声影响 A 的低秩逼近。换句话说,lsqminnorm 认为在 R 的 QR 分解中,位于 A 矩阵对角线上的小值很重要,而实际上这些值并没有那么重要。理想情况下,R 对角线上的这些小值被视为零。

绘制 Anoise 的 QR 分解中 R 矩阵的对角线元素。大量对角线元素的数量级为 1e-10

[Q,R,p] = qr(Anoise,0);
semilogy(abs(diag(R)),"o")

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

增大 lsqminnorm 使用的容差,以便在计算中使用误差小于 1e-8Anoise 低秩逼近。增大的容差将使噪声对结果的影响大大减小。使用容差的解非常接近原来的解 x

xtol = lsqminnorm(Anoise,b,1e-8);
norm(Anoise*xtol - b)
ans = 
0.0014
norm(xtol)
ans = 
0.1741
norm(x - xtol)
ans = 
1.0778e-14

或者,指定吉洪诺夫正则化因子为 1。对于病态问题,例如涉及噪声的病态问题,您可以指定正则化因子,这样就不会出现过拟合。

xreg = lsqminnorm(Anoise,b,RegularizationFactor=1);
norm(Anoise*xreg - b)
ans = 
0.0018
norm(xreg)
ans = 
0.1741
norm(x - xreg)
ans = 
7.9359e-06

在打开警告的情况下求解涉及低秩系数矩阵的线性系统。

创建一个秩为 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

输入参数

全部折叠

系数矩阵。系数矩阵显示在线性系统的左侧,如 Ax = B。系数矩阵可以是满矩阵或稀疏矩阵。

数据类型: double | single
复数支持:

输入数组,指定为向量或矩阵。B 显示在线性系统的右侧,如 Ax = B。如果 B 是矩阵,则矩阵中的每一列代表右侧一个不同的向量。

数据类型: double | single
复数支持:

秩容差,指定为非负标量。指定容差有助于减少系数矩阵中随机噪声对解的干扰。默认情况下,lsqminnorm 基于 A 的 QR 分解来计算 tol

lsqminnormA 的秩计算为 QR 分解 [Q,R,p] = qr(A,0)R 矩阵中的对角线元素数,绝对值大于 tol。如果 A 的秩是 k,则函数通过将 Q 的前 k 列乘以 R 的前 k 行来形成 A 的低秩逼近。更改容差会影响 A 的低秩逼近。

示例: X = lsqminnorm(A,B,1e-2)

数据类型: double

切换显示低秩矩阵警告,指定为 "nowarn""warn"。指定 "warn" 将指示 lsqminnorm 在系数矩阵 A 秩亏时生成警告。

示例: X = lsqminnorm(A,B,"warn")

自 R2024b 起

最小二乘解的吉洪诺夫正则化因子,指定为实数。将正则化因子指定为 alpha 会针对 X 的每一列返回使 norm(A*X-B)^2 + alpha^2*norm(X)^2 最小化的解 X。对于病态问题,指定正则化因子会优先考虑具有较小范数的解。

数据类型: double | single

提示

  • 当有多个解时,lsqminnorm 计算的最小范数解具有特别的意义。只要 A 欠定(行数少于列数)或低秩,方程 Ax = b 就有多个解。

  • 在计算线性系统的最小范数最小二乘解时,lsqminnorm(A,B,tol) 的效率通常高于 pinv(A,tol)*Blsqminnorm 使用完全正交分解 (COD) 来计算 A 的低秩逼近,而 pinv 使用的是奇异值分解 (SVD)。因此,pinvlsqminnorm 的结果不完全一致。

  • 对于稀疏矩阵,lsqminnorm 使用与稠密矩阵不同的算法,因此会产生不同的结果。

扩展功能

全部展开

版本历史记录

在 R2017b 中推出

全部展开