Линейное программирование - MATLAB - PullRequest
0 голосов
/ 04 февраля 2011

У меня есть матрица [8x4], 'A', и матрица [8x1], 'B'. Как проверить, существует ли матрица [4x1] 'x', такая, что A * X = B?

Это можно сделать с помощью linprog в MATLAB, но я не уверен, как задать ограничения. Я пытался x = linprog([],[],[],A,B);, но, похоже, это не сработало.

Как указать условие x>=0 и оптимизировать его для A*X-B, чтобы, если оно возвращает 0, мы знали, что X.

Обновление:

pinv в MATLAB работает не во всех случаях. Рассмотрим следующий пример:

A= [1     0     0     0
     0     1    -1    -1
    -1    -1     1    -1
    -1    -1    -1     1
     0     0     0     0
     0     0     0     0
     0     0     0     0
     1     1     1     1]
B = [0
     0
     0
    -1
     0
     0
     0
     1]

с использованием pinv дает значение X как:

X = [-2.7756e-017
    0.5000
    0.5000
         0]

но когда используется линейное программирование, я получаю x как:

X = [    0
    0.5000
    0.5000
         0]

Именно поэтому я предпочел инструмент linprog в MATLAB. Я просто использовал его так, как упомянул ранее, но он выдает много предупреждений. Я все еще думаю, что есть лучший способ использовать эту функцию правильно. Это не для этой матрицы, но в целом, когда я перебираю много матриц, мое командное окно переполняется предупреждениями.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Но зачем использовать код, который сделает БОЛЬШЕ работы, чем необходимо для решения проблемы?Просто используйте псевдообратный.Если A имеет полный ранг, то обратной косой черты будет вполне достаточно.

Вычислите решение.Если норма ваших остатков меньше некоторого допуска, то у вас есть решение.Обратите внимание, что, по сути, ни одно решение не может дать вам действительно нулевые остатки, поэтому вы должны применить допуск.Таким образом,

x = A\B;
if norm(B - A*x) < tol
  disp('Eureeka!')
end

Или используйте x=pinv(A)*B, если вы беспокоитесь о ранге A.

Попытка бросить linprog в задачу, безусловно, не будет более эффективной, чем само прямое решение.

Редактировать: Поскольку неотрицательность результата теперь добавлена ​​как требование, используйте вместо этого lsqnonneg.Просто сравните норму остаточного вектора с допуском.Если норма слишком велика, решения не существует.

2 голосов
/ 04 февраля 2011

Зачем использовать линейное программирование? Вы можете просто решить систему A*x=B напрямую:

A =[ 1    -1    -1    -1     1     0     0     1
    -1     1    -1     0     0     1     0     0
    -1    -1     1     0     1     0     0     0
    -1    -1    -1     1     1     1     0     0]'; %'# 

B = [-1    -1     0     0     0     0     1     1]'; %'#

x = A\B
x =
      0.16327
     0.097959
      0.46531
      0.11837

Проблема, с которой вы можете столкнуться, заключается в том, что A может иметь недостаток ранга, но в этом случае вы получите бесконечно много решений для x.

0 голосов
/ 04 февраля 2011

К сожалению, вы не можете использовать разделение массива. Это не то же самое матричное деление. Тем не менее, вы могли бы использовать обратную матрицу A, чтобы умножить ее на матрицу B, чтобы получить x x = (A-1) B, но я не уверен, возможно ли обратное для неквадратной матрицы A (8x4). Следовательно, вы не могли бы работать с linprog

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...