【问题标题】:Find positive solutions to underdetermined linear system of equations找到欠定线性方程组的正解
【发布时间】:2013-05-03 18:51:31
【问题描述】:

我对 matlab 有点陌生,如果这太简单了,我很抱歉。

考虑以下问题:

找到x_1, x_2, x_3 > 0 这样

67.5 = 60*x_1 +  90*x_2 + 120*x_3 and
60   = 30*x_1 + 120*x_2 +  90*x_3

在这种情况下,我想要解决方案

0 < x_3 < 3/7,
x_2 = 7/20 - 4/10*x_3, and
x_1 = 2/5  -  7/5*x_3

有没有一种简单的方法可以让 Matlab 为我解决这样的问题?

【问题讨论】:

    标签: matlab mathematical-optimization equation-solving


    【解决方案1】:

    简单的答案是使用 lsqnonneg,因为您只需要对参数进行非负约束。这个问题根本不需要 lsqlin,因为 lsqnonneg 是 MATLAB 的一部分,所以不需要优化 TB。

    A = [60 90 120; 30 120 90];
    b = [67.5; 60];
    
    x = lsqnonneg(A,b)
    x =
                             0
             0.178571428571428
             0.428571428571429
    

    我们可以测试结果,看看它是否解决了原来的问题。

    A*x - b
    ans =
         0
         0
    

    你当然可以使用 lsqlin,但何必呢?

    事实上,我们必须考虑一个问题,因为一个欠定系统有无限多的解决方案。我们可以将数组 A 的任意数量的空空间添加到我们的解决方案中。在这种情况下,零空间的秩为 1。这里用向量 N 来表征:

    N = null(A)
    N =
            -0.792593923901216
             -0.22645540682892
             0.566138517072299
    

    理解它的一个简单方法是识别 A 的零空间的含义。 N 是一个向量(或一组跨越子空间的基向量,以防零空间的维数大于 1)使得

    A*N = 0
    

    本质上,N 是与 A 的所有行正交的向量。如果零空间的维数大于 1,则 N 可以是零空间的基向量的任意线性组合。因此,如果 X 是欠定系统的任意解

    A*x = b
    

    那么对于任意常数 c,x+c*N 也是一个解一定是真的。 (请记住,A*N 将为零。)

    例如,我将为 N 选择一个任意系数:

    x2 = x + N*(-.1)
    x2 =
            0.0792593923901216
              0.20121696925432
             0.371957576864199
    

    同样,x2 也是一个解决方案。它也有完全正的系数。 (您可以轻松地找到 N 上的系数值范围,使得解完全为正。)

    A*x2 - b
    ans =
          -1.4210854715202e-14
           -7.105427357601e-15
    

    (请注意,在浮点运算中发现的双精度垃圾中,这些实际上是零。)

    所以,如果我们想这样做,很容易从 lsqnonneg 或反斜杠或 pinv 解决方案开始,并为您的系统找到完整的解决方案集,以使系数完全为正。提示:您需要做的就是考虑向量 x 和 N,然后寻找问题的解决方案

    (x + c*N) > 0
    

    其中 c 是一些标量常数。显然,C 不能为正数,否则总和的第一个元素将为负数。

    C = -x./N
    C =
                0
          0.78855
         -0.75701
    
    x + C(1)*N
    ans =
                0
          0.17857
          0.42857
    
    x + C(3)*N
    ans =
              0.6
             0.35
                0
    

    正如我们所见,当 c 是闭区间 [-.75701,0] 中的任何值时,我们得到了问题的完全正解,形式为 (x+c*N)。但是,如果超出这些限制,则解决方案中的一个或多个元素将是负数。

    在某些问题上,根本没有解决方案可以产生具有解决方案向量的所有正元素的精确解决方案。这是完全可能的。例如,假设我们把原来的问题改成:

    A = [60 90 120; 30 120 90];
    b = [-67.5; -60];
    

    现在当我们应用 lsqnonneg 时会发生什么?

    lsqnonneg(A,b)
    ans =
         0
         0
         0
    

    一个全零解决方案的结果。既然那个解显然不能完全解决原来的问题,那么肯定不存在这样的正解。

    【讨论】:

    • 这似乎是一个非常棒的答案,但我得花点时间看看。谢谢你现在我会回来的:)
    【解决方案2】:
    A = [60 90 120; 30 120 90];
    b = [67.5; 60];
    

    你可以使用 Ax = b 得到一个解 x

    x = A\b;
    

    x = pinv(A)*b;
    

    但如果你想对 x 进行约束,你将不得不使用类似 lsqlin:

    lsqlin(A,b,[],[],[],[],[0; 0; 0],[])
    

    (在这种情况下,给出与 pinv 解决方案相同的结果)

    【讨论】:

    • 感谢您的回复。我有点需要不等式——我已经知道的解决方案部分。 lsqlin 能找到我要找的东西吗?
    • 假设你有优化工具箱,我不明白为什么没有
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多