fmincon
алгоритм внутренней точки может принять функцию Гессиана как вход. Когда вы предоставляете Гессиан, можно получить более быстрое, более точное решение ограниченной проблемы минимизации.
Ограничительное множество для этого примера является пересечением внутренностей двух конусов — один, обращенный вверх и один, обращенный вниз. Ограничительная функция c
двухкомпонентный вектор, один компонент для каждого конуса. Поскольку это - 3D пример, градиент ограничения c
3-на-2 матрица.
function [c ceq gradc gradceq] = twocone(x) % This constraint is two cones, z > -10 + r % and z < 3 - r ceq = []; r = sqrt(x(1)^2 + x(2)^2); c = [-10+r-x(3); x(3)-3+r]; if nargout > 2 gradceq = []; gradc = [x(1)/r,x(1)/r; x(2)/r,x(2)/r; -1,1]; end
x(1)
координата становится отрицательной. Его градиент является трехэлементным вектором.function [f gradf] = bigtoleft(x) % This is a simple function that grows rapidly negative % as x(1) gets negative % f=10*x(1)^3+x(1)*x(2)^2+x(3)*(x(1)^2+x(2)^2); if nargout > 1 gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1); 2*x(1)*x(2)+2*x(3)*x(2); (x(1)^2+x(2)^2)]; end
x = [-6.5,0,-3.5]
:
Гессиан функции Лагранжа дан уравнением:
Следующая функция вычисляет Гессиан в точке x
со структурой множителя Лагранжа lambda
:
function h = hessinterior(x,lambda) h = [60*x(1)+2*x(3),2*x(2),2*x(1); 2*x(2),2*(x(1)+x(3)),2*x(2); 2*x(1),2*x(2),0];% Hessian of f r = sqrt(x(1)^2+x(2)^2);% radius rinv3 = 1/r^3; hessc = [(x(2))^2*rinv3,-x(1)*x(2)*rinv3,0; -x(1)*x(2)*rinv3,x(1)^2*rinv3,0; 0,0,0];% Hessian of both c(1) and c(2) h = h + lambda.ineqnonlin(1)*hessc + lambda.ineqnonlin(2)*hessc;
Запустите эту проблему с помощью алгоритма внутренней точки в fmincon
. Сделать это использование приложения Оптимизации:
Установите проблему как в следующем рисунке.
Для итеративного выхода прокрутка к нижней части Options разделяет на области и выбирает Level of display, iterative
.
В панели Options дайте аналитический указатель на функцию Гессиана.
Под Run solver and view results нажмите Start.
Выполнять минимизацию в командной строке:
Установка опций
можно следующим образом:
options = optimoptions(@fmincon,'Algorithm','interior-point',... 'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,... 'HessianFcn',@hessinterior);
Запустите fmincon
с начальной точкой [–1, –1, –1], с помощью options
структура:
[x,fval,mflag,output] = fmincon(@bigtoleft,[-1,-1,-1],... [],[],[],[],[],[],@twocone,options);
Исследуйте решение, значение целевой функции, выходной флаг и количество вычислений функции и итераций:
x,fval,mflag,output.funcCount,output.iterations x = -6.5000 -0.0000 -3.5000 fval = -2.8941e+03 mflag = 1 ans = 7 ans = 6
Если вы не используете функцию Гессиана, fmincon
берет 9 итераций, чтобы сходиться, вместо 6:
options = optimoptions(@fmincon,'Algorithm','interior-point',... 'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true); [x fval mflag output]=fmincon(@bigtoleft,[-1,-1,-1],... [],[],[],[],[],[],@twocone,options); x,output.funcCount,output.iterations x = -6.5000 -0.0000 -3.5000 ans = 13 ans = 9