Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Algoritmo de punto interior de fmincon con hessian analítico

El algoritmo de punto interior puede aceptar una función de hessian como entrada.fmincon Cuando usted suministra un hessian, puede obtener una solución más rápida y precisa para un problema de minimización restringida.

El conjunto de restricciones para este ejemplo es la intersección del interior de dos conos: uno apuntando hacia arriba y otro apuntando hacia abajo. La función de restricción es un vector de dos componentes, un componente para cada cono.c Dado que se trata de un ejemplo tridimensional, el degradado de la restricción es una matriz de 3 por 2.c

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
La función objetiva crece rápidamente negativa a medida que la coordenada se vuelve negativa.x(1) Su gradiente es un vector de tres elementos.
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
Aquí hay una trama del problema. El sombreado representa el valor de la función objetiva. Se puede ver que la función objetiva se minimiza cerca:x = [-6.5,0,-3.5]

 El código para generar la figura

El Hessiano del Lagrangio es dado por la ecuación:

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).

La siguiente función calcula el hessian en un punto conx Estructura multiplicadora de Lagrange: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;

Ejecute este problema utilizando el algoritmo de punto interior en.fmincon Para hacer esto usando la aplicación de optimización:

  1. Establezca el problema como en la siguiente figura.

  2. Para la salida iterativa, desplácese a la parte inferior del panel y seleccione,OptionsLevel of display iterative.

  3. En el panel, dé la manija analítica de la función hessian.Options

  4. En, haga clic en.Run solver and view resultsStart

Para realizar la minimización en la línea de comandos:

  1. Establezca lo siguiente:options

    options = optimoptions(@fmincon,'Algorithm','interior-point',...         'Display','off','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...         'HessianFcn',@hessinterior);
  2. Ejecutar con el punto de partida [– 1, – 1, – 1], utilizando la estructura:fminconoptions

    [x,fval,mflag,output] = fmincon(@bigtoleft,[-1,-1,-1],...            [],[],[],[],[],[],@twocone,options);

Examine la solución, el valor de la función objetiva, el indicador de salida y el número de evaluaciones y iteraciones de funciones:

x,fval,mflag,output.funcCount,output.iterations
x =     -6.5000   -0.0000   -3.5000   fval =    -2.8941e+03   mflag =       1   ans =       7   ans =       6

Si no utiliza una función de hessian, toma 9 iteraciones para converger, en lugar de 6:fmincon

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
Ambas corridas conducen a soluciones similares, pero el conteo F y el número de iteraciones son más bajos cuando se usa un hessian analítico.

Temas relacionados