Чтобы решить эту проблему с linprog
, вам нужно перечислить:
Итак, у нас есть шесть неизвестные:
B = [x1 x2
x3 x4
x5 x6]
Неравенства составляют:
и
В формате, поддерживаемом linprog
(A*x <= 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]
заметил, что для преобразования >=0
в <=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)