Решение задач линейного и квадратичного программирования
Решение задачи линейного программирования
Функция 1 inp год обеспечивает решение типовой задачи линейного программирования:
х = linprog(f,A,b,Aeq,beq,lb,ub,xO,options)
[x, fval, exitflag, output, lambda ] = linprog(...)
В этой функции введен дополнительный аргумент f — вектор коэффициентов линейной целевой функции. Функция может использовать алгоритм большой размерности LTPSOL или алгоритм средней размерности (метод проекций).
Пусть требуется найти решение задачи линейного программирования, описывающейся соотношениями
/(х) = -5х, - 4х2 - 6х3,
х( - х2 + х3 < 20
Зх, + 2х, + 4х3 < 42,
Зх{ + 2х2 < 30
0 < х,, 0 < х2, 0 < х3.
Решение задачи приведено ниже.
» f=[-5; -4; -6]; А=[1 -1 1;3 2 4;3 2 0];
» Ь=[20; 42; 30]; lb = zeros (3,1);
>> [х,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
x =
- 0.0000
- 15.0000
- 3.0000
fval = -78.0000
Решение задачи квадратичного программирования
Функция quadprog возвращает решение задачи квадратичного программирования:
х = quadprog(Н,f,A,b,Aeq,beq,lb,ub,x0,options)
[x, fval, exitflag, output, lambda] = quadprog (...)
Аргументы (за исключением матрицы н) и возвращаемые величины аналогичны рассмотренным для функции fmincon.
Найдем решение задачи квадратичного программирования, имеющей описание
/(х) = — х2 + х2 - х(х2 - 2Х] - 6х2,
X' + х2 < 2,
- -х, + 2х2 < 2,
- 2х, + х2 < 3,
- 0 < X], 0 < х2.
В данном случае
I -1
Х|
х2
и решение задачи представляется в следующем виде:
» Н=[1 -1; -1 2]; f=[-2; -6] ;
» А= [ 1 1; -1 2; 2 1]; Ь= [ 2; 2; 3]; lb = zeros (2,1);
>> [х,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb) Приведем основную часть вывода:
- 0.6667
- 1.3333 fval =
- -8.2222
Из опущенной выходной информации следует, что количество выполненных итераций равно 3 и использован алгоритм средней размерности.
Дополнительные примеры решения типовых оптимизационных задач
Минимизация без ограничений
Рассмотрим задачу нахождения значений переменных х, и х2, обеспечивающих решение задачи минимизации
min /(х) = ех' (4х2 + 2х2 + 4х,х2 + I).
Нахождение решения производится в соответствии со следующими этапами.
Составим m-файл с именем objfun, реализующий вычисление значения целевой функции: function f = objfun(x) f = exp(x(1))*(4*x(1)л2+2*х(2)л2 + 4*х(1)*x(2)+2*x(2)+1) ;
Решим задачу с использованием подходящей функции пакета fminunc:
>> х0=[-1,1]; options = optimset('LargeScale', 'off ' ); » [x,fval,exitflag,output] = fminunc('objfun',xO,options) Optimization terminated successfully:
Current search direction is a descent direction, and magnitude of directional derivative in search direction less than 2*options.To1Fun x = 0.5000 -1.0000 fval = 1.3028e-010 exitflag = 1 output = iterations: 7 funcCount: 40 stepsize: 1
firstorderopt: 8.1997е-004 algorithm: 'medium-scale: Quasi-Newton line search'
Значениях = [0.5000 -1.0000] и fval = 1.3028e-010 — искомое решение задачи. Значение exitflag=l дает информацию, что найдена точка минимума (возможно, локального). Остальные характеристики выхода вполне очевидны.