MATLAB中lsqminnorm函数用法

目录

语法

说明

示例

求解具有无限个解的线性系统

指定容差以减少含噪数据的影响

切换显示低秩矩阵警告


        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 使用与稠密矩阵不同的算法,因此会产生不同的结果。

上一篇:向量数据库!AI 时代的变革者还是泡沫?


下一篇:二、Python(项目创建、常见的设置、print函数)