На просторах интернета полно пример работы с командой 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 и повторить расчет.