Этот пример показывает, как решить задачу оптимизации, которая имеет линейную или квадратичную цель и квадратичные ограничения неравенства. Пример генерирует и использует градиент и Гессиан целевой и ограничительной функций.
Предположим, что ваша задача имеет форму
при условии, что
где 1 ≤ i ≤ m. Предположим, что по крайней мере одна Hi ненулевая; в противном случае можно использовать quadprog
или linprog
чтобы решить эту проблему. При ненулевых Hi ограничения нелинейны, что означает fmincon
является соответствующим решателем в соответствии с таблицей принятия решений по оптимизации.
Пример принимает, что квадратичные матрицы симметричны без потери общности. Можно заменить несимметричную H (или Q) матрицу эквивалентной симметричной версией (H + HT)/2.
Если x есть N компоненты, то Q и Hi N N матрицами, f и ki векторы <reservedrangesplaceholder2>-by-1 и c, и di скаляры.
Сформулируйте задачу используя fmincon
синтаксис. Предположим, что x
и f
являются векторы-столбцы. (x
является вектор-столбец, когда начальный вектор x0
является вектор-столбец.)
function [y,grady] = quadobj(x,Q,f,c) y = 1/2*x'*Q*x + f'*x + c; if nargout > 1 grady = Q*x + f; end
Для согласованности и легкого индексирования поместите каждую квадратичную матрицу ограничений в один массив ячеек. Точно так же поместите линейный и постоянный условия в массивы ячеек.
function [y,yeq,grady,gradyeq] = quadconstr(x,H,k,d) jj = length(H); % jj is the number of inequality constraints y = zeros(1,jj); for i = 1:jj y(i) = 1/2*x'*H{i}*x + k{i}'*x + d{i}; end yeq = []; if nargout > 2 grady = zeros(length(x),jj); for i = 1:jj grady(:,i) = H{i}*x + k{i}; end end gradyeq = [];
Предположим, что у вас есть следующая проблема.
Q = [3,2,1; 2,4,0; 1,0,5]; f = [-24;-48;-130]; c = -2; rng default % For reproducibility % Two sets of random quadratic constraints: H{1} = gallery('randcorr',3); % Random positive definite matrix H{2} = gallery('randcorr',3); k{1} = randn(3,1); k{2} = randn(3,1); d{1} = randn; d{2} = randn;
Создайте функцию Гессиана. Гессиан Лагранжа задается уравнением
fmincon
вычисляет приблизительный набор множителей Лагранжа λi и упаковывает их в структуру. Чтобы включить Гессиана, используйте следующую функцию.
function hess = quadhess(x,lambda,Q,H) hess = Q; jj = length(H); % jj is the number of inequality constraints for i = 1:jj hess = hess + lambda.ineqnonlin(i)*H{i}; end
Используйте fmincon
interior-point
алгоритм для решения задачи наиболее эффективно. Этот алгоритм принимает функцию Гессиана, которую вы задаете. Установите эти опции.
options = optimoptions(@fmincon,'Algorithm','interior-point',... 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,... 'HessianFcn',@(x,lambda)quadhess(x,lambda,Q,H));
Звонить fmincon
чтобы решить проблему.
fun = @(x)quadobj(x,Q,f,c); nonlconstr = @(x)quadconstr(x,H,k,d); x0 = [0;0;0]; % Column vector [x,fval,eflag,output,lambda] = fmincon(fun,x0,... [],[],[],[],[],[],nonlconstr,options);
Исследуйте множители Лагранжа.
lambda.ineqnonlin
ans = 12.8412 39.2337
Оба нелинейных множителя неравенства являются ненулевыми, поэтому оба квадратичных ограничения активны в решении.
Алгоритм внутренней точки с градиентами и Гессианом эффективен. Просмотрите количество вычислений функции.
output
output = iterations: 9 funcCount: 10 constrviolation: 0 stepsize: 5.3547e-04 algorithm: 'interior-point' firstorderopt: 1.5851e-05 cgiterations: 0 message: 'Local minimum found that satisfies the constraints. Optimization compl...'
fmincon
Для решения задачи требуется только 10 вычислений функции.
Сравните этот результат с решением без Гессиана.
options.HessianFcn = [];
[x2,fval2,eflag2,output2,lambda2] = fmincon(fun,[0;0;0],...
[],[],[],[],[],[],nonlconstr,options);
output2
output2 = iterations: 17 funcCount: 22 constrviolation: 0 stepsize: 2.8475e-04 algorithm: 'interior-point' firstorderopt: 1.7680e-05 cgiterations: 0 message: 'Local minimum found that satisfies the constraints. Optimization compl...'
В этом случае, fmincon
принимает примерно в два раза больше итераций и вычислений функции. Решения те же самые, что и в пределах допусков.
Если у вас также есть квадратичные ограничения равенства, можно использовать по существу тот же метод. Задача та же самая, с дополнительными ограничениями
Переформулируйте свои ограничения, чтобы использовать Ji, pi и qi переменные. The lambda.eqnonlin(i)
структура имеет множители Лагранжа для ограничений равенства.