【问题标题】:How does Matlab calculate the solution of underdetermined systems?Matlab如何计算欠定系统的解?
【发布时间】:2026-01-25 15:35:01
【问题描述】:

为了求解矩形线性系统Ax=b,其中Amxnn>m,Matlab 首先执行 QR 因式分解,然后通过替换求解三角线性系统。例如: 如果A 是一个 4x6 矩阵:

A =

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975
    0.2785    0.5469    0.9575    0.9649    0.1576    0.9706
    0.9572    0.4854    0.8003    0.1419    0.4218    0.9157
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340

b=

   -0.9661
    0.1590
   -0.0391
   -0.2491

要解决Ax=b,我们只需这样做:

x=A\b;

解决办法是:

x =

   -0.4284
   -0.6475
         0
   -0.1153
         0
    0.7662

这个计算的基本步骤是:

  1. A 的 QR 分解,然后 Ax=b 将等效于 Q*R*x=b
  2. 由于inv(Q)=Q'R是上三角形,求解系统将返回求解R*x=b1 where b1=Q'*b

由于R 是大小为 6x4 的上三角形,我们必须执行反向替换。 Matlab 在知道R 不是正方形的情况下如何执行反向替换?

我正在将此计算移植到 C 并成功完成,直到 R*x=b1,我因反向替换而迷失了方向,我想找到与 Matlab 相同的结果。

编辑: 对于上述矩阵A: 求解Ax=b相当于求解Rx=b1where:

R =

   -1.5117   -1.3991   -1.0952   -0.7786   -1.0819   -1.3007
         0   -0.5641   -0.2197   -0.6538   -0.2920   -0.2481
         0         0   -0.8692   -0.2077    0.1422   -0.9295
         0         0         0   -0.8426    0.2182    0.2125

b1 =

   -0.9661
    0.1590
   -0.0391
   -0.2491

这个系统是通过反向代换来解决的,因为R 是上三角矩阵,这在方三角矩阵(即m=n)的情况下很简单,但是R 不是方阵。 Matlab如何执行反向替换来找到x

【问题讨论】:

  • documentation 非常清晰和广泛。你的问题到底是什么?
  • 我编辑了我的问题以使其更清晰
  • OP,除非是学术练习,否则我可以建议使用库来执行此操作吗?有许多经过良好测试和优化的库可以解决这个问题。

标签: r matlab


【解决方案1】:

所以我不能 100% 确定 MATLAB 是做什么的,但我可以告诉你以下几点:

对于您的欠定矩阵 A (nxm),我们可以取 A' = QR。我们还看到 A = R'Q'。请注意,现在 R 有 n 个非零行。然后我们可以通过识别 R'Q'x=b 来求解系统,然后 Q'x=inv(R')*b。 RHS 可以通过反向替换来解决,我们称之为 y。所以 Q'x=y。但是 Q 是自厄米特,所以 x=Qy。在那里你有最小二乘解决方案。

在 MATLAB 中执行此操作,我们得到:

>> [Q,R] = qr(A')

Q =

   -0.4918    0.2143   -0.6131   -0.5675   -0.1086    0.0503
   -0.5468    0.0638    0.0596    0.5238   -0.5922   -0.2614
   -0.0767   -0.6389   -0.1919   -0.0733    0.2275   -0.7014
   -0.5514   -0.2397    0.6743   -0.3550    0.1568    0.1821
   -0.3818    0.2094   -0.1834    0.4750    0.7368    0.0904
   -0.0589   -0.6637   -0.3090    0.2158   -0.1351    0.6291


R =

   -1.6565   -1.1588   -1.0907   -1.3634
         0   -1.3597   -0.8286   -0.6385
         0         0   -0.9760   -0.9745
         0         0         0    0.5972
         0         0         0         0
         0         0         0         0

>> Q*(R'\b)

ans =

   -0.4256
   -0.3057
    0.3568
   -0.2745
   -0.2823
    0.4249

>> 

我在上面的 R'\b 中使用了反斜杠,但很明显,您可以在自己的例程中进行反斜杠替换。

我们可以通过使用 A 的伪逆计算解来验证这一点:

>> A'*inv(A*A')*b

ans =

   -0.4256
   -0.3057
    0.3568
   -0.2745
   -0.2823
    0.4249

您当然可以轻松地检查这是否是一个有效的解决方案。这应该很容易在 C 中实现。

希望这会有所帮助。

【讨论】:

  • 谢谢你回答我,那么诀窍就是用QR(A')而不是QR(A)..确实,一个未确定的系统有无限的解决方案..我会用你的解决方案给出了我的 C 代码,即使它与 matlab 返回的不同。在文档中,提到 Matlab 返回最稀疏的解决方案。但似乎如何计算它是 Mathworks 的秘密:)
【解决方案2】:

MATLAB 如何详细实现只有 Mathworks 知道的未确定情况!但是你可以这样做的方法如下。

A*x = b
A' = Q*R

现在,如果你看一下 R,你会得到某种形式的东西

R = [R1; zeros] 

其中 R1 是正方形。

您可以将解决方案表示为:

x = Q * [inv(R1')*b; zeros]

正如您所说,您已经解决了反转方阵的问题,这应该很容易:)

【讨论】: