【问题标题】:Find matrix satisfying conditions找到满足条件的矩阵
【发布时间】:2020-02-04 13:44:44
【问题描述】:

我希望在 MATLAB 中解决以下问题,但不知道使用哪个命令。

找到一个矩阵 B,s.t. A * B = I 和 0

其中 A 和 B 是矩阵,a 和 b 是向量。 I 是单位矩阵。

知道要使用什么吗? fsolve 没有用,我不知道如何在 linprog 中表述这一点。

例子:

A = [1 0 -1; 0 1 1];
a = [8; 6];
b = [15; 10; 10];

使用 cvx 的解决方案:

cvx_begin
variable B(3,2)
min (B)
subject to
    A*B == diag(ones(2,1));
    0 <= B*a;
    b >= B*a;
cvx_end

【问题讨论】:

  • 您能否为您的Aab 提供一些可重现的最小示例?
  • 谢谢,我加了一个例子。实际问题很大。
  • 至少有一个解决方案:B = [1 0; 0 1; 0 0],不用matlab也能找到

标签: matlab matrix linear-programming


【解决方案1】:

为了解决linprog 的这些问题,您必须列出:

  • 等式
  • 不等式

所以我们有六个未知数:

B = [x1 x2
     x3 x4
     x5 x6]

不等式是:

linprog (A*x &lt;= b) 支持的格式中给我们:

A = [8  6  0  0  0  0
     0  0  8  6  0  0
     8  6  0  0  8  6
    -8 -6  0  0  0  0
     0  0 -8 -6  0  0
     0  0  0  0 -8 -6];

b = [15 10 10 0 0 0]

注意到为了转换&lt;=0 中的&gt;=0,两边都乘以-1

等式是:

linprog(Aeq*x == beq) 支持的格式给我们:

Aeq = [1  0  0  0 -1  0
       0  1  0  0  0 -1
       0  0  1  0  1  0
       0  0  0  1  0  1]

beq = [1 0 0 1]

我们可以认为所有变量都具有相同的“权重”,我们的目标函数可以定义为f = [1 1 1 1 1 1]。但如果您更改这些权重,它也将起作用(并将提供另一种解决方案)。您可以将其视为 6D 空间的形状,其中某些维度可以被压缩或拉伸(但不能弯曲)。例如f = [1 0.25 1 1 -1 1/2] 也是一个选项...

f = [1 1 1 1 1 1] %which correspond to [x1 x2 x3 x4 x5 x6]

s = linprog(f, A,b,Aeq,beq,-10,10) %solve the problem with arbitrary lower and upper boundary.

一种可能的结果:

s = [ 10
     -12 
      9
      13 
      9 
     -12]

其中给出:

B = [10 -12
     9   13
     9   -12]

更大问题的自动化:

% B Matrix size
s1 = 3;
s2 = 2;

% Variable
A  = [1 0 -1; 0 1 1];
B  = sym('X', [s1 s2])
ax = [8; 6];
bx = [15; 10; 10];

% Convert linear equations to matrix form
[Aeq,beq] = equationsToMatrix(A*B == eye(s2))
[A1,b1]   = equationsToMatrix(B*ax == bx)
[A2,b2]   = equationsToMatrix(-B*ax == 0)

% Solve the problem
%      (      f      ,          A            ,            b           ,       Aeq  ,      beq  ,  lb,ub)
linprog(ones(s1*s2,1),[double(A1);double(A2)], [double(b1);double(b2)], double(Aeq),double(beq), -10,10)

【讨论】:

  • 谢谢,这非常适合这个例子。可悲的是不是一个非常大的问题。
  • 这可以自动解决更大的问题。
  • 自动化你只需让matlab提供a的行,就像在这个例子中手动完成的那样?
  • 检查我的编辑,我使用了equationsToMatrix函数。
【解决方案2】:

您可能会遇到两种不同的情况:

  • 有你的等式约束

    A*B=I

我认为您已经能够使用矩阵的Moore-Penrose inverse 求解B,即pinv(在MATLAB 中)或ginv(在R 中):

B = pinv(A);

B <- ginv(A)

由于摩尔-彭罗斯逆的唯一性,需要验证解出的B的条件

0

  • 如果使用上述方法违反了不等式约束,则可以尝试以下方法(在 MATLAB 中加载 CVX 或在 R 中加载 CVXR):

不幸的是,我的计算机中没有 MATLAB,但我尝试使用 CVXRR 语言,效果很好。也许您需要对 MATLAB 版本进行细微的语法调整或翻译。

这里有一个例子来告诉你如何表述这个问题:

# given matrices
A <- matrix(c(1,0,-1,0,1,1),nrow = 2,byrow = TRUE)
a <- matrix(c(8,6))
b <- matrix(c(15,10,10))

# formulate optimization problem and solve it
library(CVXR)
B <- Variable(3,2)
obj <- Minimize(norm(A%*%B - diag(c(1,1)),"2"))
cons <- list(B%*%a >= 0, b>=B%*%a )
problem <- Problem(obj,cons)
res <- solve(problem)

这样

> res$getValue(B)
            [,1]      [,2]
[1,]  0.90183254 0.6467117
[2,]  0.09816746 0.3532883
[3,] -0.09816746 0.6467117

【讨论】:

  • 感谢您的回复。这是我一开始尝试的,但在这种情况下,条件不成立。根据我的教授的说法,B 的其他解决方案应该是可用的,我应该编写发现 B 满足这两个条件的代码。
  • @Sniep 我认为您可以使用cvx 来制定具有两个约束条件的问题,然后解决B
  • 谢谢,我试试看
  • @Sniep 查看我的更新,其中使用CVX 解决B 的示例,效果很好
猜你喜欢
  • 2011-07-20
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2018-10-06
  • 2017-02-20
  • 2022-07-30
相关资源
最近更新 更多