Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

lsqminnorm

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

说明

示例

X = lsqminnorm(A,B) 返回可以求解线性方程 AX = B 并使 norm(A*X-B) 的值最小化的数组 X。如果此问题有多个解,则 lsqminnorm 返回能使 norm(X) 最小化的解。

示例

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

下图说明了这种情况,并显示每个方法返回的解。蓝线表示方程 x2=-23x1+83 的无限多个解。橙色圆圈表示从原点到解线的最小距离,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-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.1215e+08

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

绘制 Anoise 的 QR 分解中 R 矩阵的对角线元素。有大量对角线元素位于阶次 1e-10 处。

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

Figure contains an axes. The axes contains an object of type line.

此问题的解决方案是增大 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

输入参数

全部折叠

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

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

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

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

秩容差,指定为非负标量。指定容差有助于减少系数矩阵中随机噪声对解的干扰。默认情况下,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')

提示

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

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

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

在 R2017b 中推出