Решение задач линейного программирования в Matlab

На просторах интернета полно пример работы с командой linprog, которая позволяет решать задачи линейного программирования в Matlab. Да вот беда. Нигде не показано как ей пользоваться в полном объеме. Куча примеров простейшего уравнения, да и только.

Давайте рассмотрим такой пример:
5×1 — 2×2 + x3 >= 3
-2×1 + 3×2 — 2×3 <= 8
x1 + x2 + x3 = 9
1 <= x1 <= 2
2 <= x2 <= 4
x3 >= 1
f = x1 + x2 — 2×3

Как видите в данном примере есть и равенство и ограничения нижнего/верхнего значений переменных. И все это нужно куда то задавать.
Сперва зададим матрицу целевой функции:

f = [1; 1; -2];

Теперь зададим матрицу коэффициентов неравенств. При этом все неравенства должны быть приведены к виду «меньше или равно». Если это не так, то меняем знаки.

A = [-5 2 -1; -2 3 -2; 0 0 -1];

Дальше задаем знаки правой части неравенств:

 
b = [-3; 8; -1];

Задаем нижние ограничения переменных из двойных неравенств:

lb = [1; 2; 1];

Задаем верхние ограничения из двойных неравенств:

ub = [2; 4];

Задаем уравнение:

Aeq = [1 1 1];
Beq = 9;

Считаем:

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,Beq,lb,ub)

Получаем ответ:

Optimization terminated.

x =

    1.0000
    2.0000
    6.0000


fval =

   -9.0000


exitflag =

     1


output = 

         iterations: 6
          algorithm: 'interior-point'
       cgiterations: 0
            message: 'Optimization terminated.'
    constrviolation: 3.6149e-12
      firstorderopt: 7.2028e-11


lambda = 

    ineqlin: [3x1 double]
      eqlin: 2.0000
      upper: [3x1 double]
      lower: [3x1 double]

Так мы нашли минимум. Для нахождения максимума целевой функции необходимо сменить знаки в массиве f и повторить расчет.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий