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.

Escribir funciones de objetivo escalar

Archivos de función

Un archivo de función de objetivo escalar acepta una entrada, digamos, y devuelve una salida escalar real, digamos.xf La entrada puede ser un escalar, un vector o.xMatriz Un archivo de función puede devolver más salidas (ver).Incluyendo gradientes y hessianos

Por ejemplo, supongamos que el objetivo es una función de tres variables, y:xyz

() = 3 * (–)fxxy4 + 4 * (+)xz2 /(1 +x2 +y2 +z2) + cosh (– 1) + tanh (+).xyz

  1. Escriba esta función como un archivo que acepte el vector = [;;] y devuelva:xinxyzf

    function f = myObjective(xin) f = 3*(xin(1)-xin(2))^4 + 4*(xin(1)+xin(3))^2/(1+norm(xin)^2) ...     + cosh(xin(1)-1) + tanh(xin(2)+xin(3));
  2. Guárdelo como un archivo llamado a una carpeta en su ruta de acceso.myObjective.mMATLAB®

  3. Compruebe que la función se evalúa correctamente:

    myObjective([1;2;3])
    ans =     9.2666

Para obtener información sobre cómo incluir parámetros adicionales, consulte.Pasar parámetros adicionales Para obtener ejemplos más complejos de archivos de función, vea o.Minimización con gradiente y patrón de Sparsity de hessianMinimización con restricciones enlazadas y preacondicionador con bandas

Funciones locales y funciones anidadas

Las funciones pueden existir dentro de otros archivos como o.funciones locales (MATLAB)funciones anidadas (MATLAB) El uso de funciones locales o funciones anidadas puede reducir el número de archivos distintos que se guardan. El uso de funciones anidadas también permite acceder a parámetros adicionales, como se muestra en.Funciones anidadas

Por ejemplo, supongamos que desea minimizar la función objetiva, descrita en, sujeto a la restricción, descrita en.myObjective.mArchivos de funciónellipseparabola.mRestricciones no lineales En lugar de escribir dos archivos y, escriba un archivo que contenga ambas funciones como funciones locales:myObjective.mellipseparabola.m

function [x fval] = callObjConstr(x0,options) % Using a local function for just one file  if nargin < 2     options = optimoptions('fmincon','Algorithm','interior-point'); end  [x fval] = fmincon(@myObjective,x0,[],[],[],[],[],[], ...     @ellipseparabola,options);  function f = myObjective(xin) f = 3*(xin(1)-xin(2))^4 + 4*(xin(1)+xin(3))^2/(1+sum(xin.^2)) ...     + cosh(xin(1)-1) + tanh(xin(2)+xin(3));  function [c,ceq] = ellipseparabola(x) c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = [];

Resuelva la minimización restringida a partir del punto:[1;1;1]

[x fval] = callObjConstr(ones(3,1))

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is 
non-decreasing in feasible directions, to within the default 
value of the function tolerance, and constraints are satisfied 
to within the default value of the constraint tolerance.

x =
    1.1835
    0.8345
   -1.6439

fval =
    0.5383

Objetivos de función anónima

Utilice funciones anónimas para escribir funciones objetivas simples. Para obtener más información acerca de las funciones anónimas, consulte.¿Qué son las funciones anónimas? (MATLAB) La función de Rosenbrock es lo suficientemente simple como para escribir como una función anónima:

anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
Compruebe que se evalúa correctamente en:anonrosen[-1 2]
anonrosen([-1 2])
ans =    104
Minimizando con rendimientos los siguientes resultados:anonrosenfminunc
options = optimoptions(@fminunc,'Algorithm','quasi-newton'); [x fval] = fminunc(anonrosen,[-1;2],options)

Local minimum found.

Optimization completed because the size of the gradient
is less than the default value of the function tolerance.

x =
    1.0000
    1.0000

fval =
  1.2266e-10

Incluyendo gradientes y hessianos

Proporcionar derivados para Solvers

Para y, puede incluir degradados en la función objetiva.fminconfminunc En general, los solucionadores son más robustos y pueden ser ligeramente más rápidos cuando se incluyen degradados. Ver.Beneficios de incluir derivados Para incluir también los segundos derivados (hessianos), ver.Incluidos los hessianos

En la siguiente tabla se muestran los algoritmos que pueden utilizar degradados y hessianos.

SolverAlgoritmoGradienteHessian
fminconactive-setOpcionalNo
interior-pointOpcionalOpcional (ver)Hessian para el algoritmo de punto interior de fmincon
sqpOpcionalNo
trust-region-reflectiveObligatorioOpcional (ver)Hessian para fminunc confianza-región o fmincon confianza-región-reflexivo algoritmos
fminuncquasi-newtonOpcionalNo
trust-regionObligatorioOpcional (ver)Hessian para fminunc confianza-región o fmincon confianza-región-reflexivo algoritmos

Cómo incluir degradados

  1. Escribir código que devuelva:

    • La función objetiva (escalar) como la primera salida

    • El degradado (vector) como la segunda salida

  2. Establezca la opción de usar.SpecifyObjectiveGradienttrueoptimoptions Si es necesario, también establezca la opción en.SpecifyConstraintGradienttrue

  3. Opcionalmente, compruebe si la función de degradado coincide con una aproximación de diferencia finita. Ver.Comprobación de la validez de gradientes o Jacobianos

Sugerencia

Para la mayoría de la flexibilidad, escriba código.condicionado Conditionalized significa que el número de salidas de función puede variar, como se muestra en el ejemplo siguiente. El código condicionado no se error según el valor de la opción.SpecifyObjectiveGradient El código no condicionado requiere que establezca las opciones de forma adecuada.

Por ejemplo, considere La función de Rosenbrock

f(x)=100(x2x12)2+(1x1)2,

que se describe y se traza en.Resuelva un problema no lineal restringido, basado en Solver El gradiente de f(x) Es

f(x)=[400(x2x12)x12(1x1)200(x2x12)],

es una función condicionado que devuelve lo que requiera el solucionador:rosentwo

function [f,g] = rosentwo(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;  if nargout > 1 % gradient required     g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));         200*(x(2)-x(1)^2)];      end

comprueba el número de argumentos que especifica una función de llamada.nargout Ver.Encontrar número de argumentos de función (MATLAB)

El solucionador, diseñado para la optimización sin restricciones, le permite minimizar la función de Rosenbrock.fminunc Dile que uses el degradado y hessian estableciendo:fminuncoptions

options = optimoptions(@fminunc,'Algorithm','trust-region',...     'SpecifyObjectiveGradient',true);

Ejecutar a partir de:fminunc[-1;2]

[x fval] = fminunc(@rosentwo,[-1;2],options)
Local minimum found.

Optimization completed because the size of the gradient
is less than the default value of the function tolerance.

x =
    1.0000
    1.0000

fval =
  1.9886e-17

Si tiene una licencia, puede calcular gradientes y hessianos automáticamente, como se describe en.Symbolic Math Toolbox™Calcula gradientes y hessianosSymbolic Math Toolbox

Incluidos los hessianos

Puede incluir segundas derivadas con los algoritmos y con el algoritmo.fmincon'trust-region-reflective''interior-point'fminunc'trust-region' Hay varias maneras de incluir información de hessian, dependiendo del tipo de información y del algoritmo.

También debe incluir gradientes (fijados a y, si corresponde, a) con el fin de incluir los hessianos.SpecifyObjectiveGradienttrueSpecifyConstraintGradienttrue

Hessian para fminunc confianza-región o fmincon confianza-región-reflexivo algoritmos.  Estos algoritmos no tienen restricciones o solo tienen restricciones de igualdad enlazadas o lineales. Por lo tanto, el Hessiano es la matriz de los segundos derivados de la función objetiva.

Incluir la matriz Hessiana como la tercera salida de la función objetiva. Por ejemplo, el hessian H(x) de la función de Rosenbrock es (ver)Cómo incluir degradados

H(x)=[1200x12400x2+2400x1400x1200].

Incluir este hessian en el objetivo:

function [f, g, H] = rosenboth(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;  if nargout > 1 % gradient required     g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));         200*(x(2)-x(1)^2)];          if nargout > 2 % Hessian required         H = [1200*x(1)^2-400*x(2)+2, -400*x(1);             -400*x(1), 200];       end  end

Establecido en.HessianFcn'objective' Por ejemplo,

options = optimoptions('fminunc','Algorithm','trust-region',...     'SpecifyObjectiveGradient',true,'HessianFcn','objective');

Hessian para el algoritmo de punto interior de fmincon.  El hessian es el Hessiano del Lagrangio, donde el Lagrangio (,) esLxλ

L(x,λ)=f(x)+λg,igi(x)+λh,ihi(x).

y son funciones vectoriales que representan todas las restricciones de desigualdad e igualdad respectivamente (lo que significa restricciones enlazadas, lineales y no lineales), por lo que el problema de minimización esgh

minxf(x) subject to g(x)0, h(x)=0.

Para obtener más información, consulte.Teoría de optimalidad restringida El Hessiano del Lagrangio es

xx2L(x,λ)=2f(x)+λg,i2gi(x)+λh,i2hi(x).(1)

Para incluir un hessian, escriba una función con la sintaxis

hessian = hessianfcn(x,lambda)

es un-por-matriz, disperso o denso, donde está el número de variables.hessiannnn Si es grande y tiene relativamente pocas entradas que no sean de cero, Ahorre tiempo de ejecución y memoria representando como una matriz dispersa. es una estructura con los vectores multiplicador de Lagrange asociados a las restricciones no lineales:hessianhessianlambda

lambda.ineqnonlin lambda.eqnonlin

computa la estructura y la pasa a su función hessiana. debe calcular las sumas en.fminconlambdahessianfcnEcuación 1 Indique que está suministrando un hessian estableciendo estas opciones:

options = optimoptions('fmincon','Algorithm','interior-point',...     'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...     'HessianFcn',@hessianfcn);

Por ejemplo, para incluir una función de hessian para Rosenbrock restringida al disco de la unidad x12+x221, observe que la función de restricción g(x)=x12+x2210 tiene una matriz de gradiente y segunda derivada

g(x)=[2x12x2]Hg(x)=[2002].

Escriba la función de hessian como

function Hout = hessianfcn(x,lambda) % Hessian of objective H = [1200*x(1)^2-400*x(2)+2, -400*x(1);             -400*x(1), 200]; % Hessian of nonlinear inequality constraint Hg = 2*eye(2); Hout = H + lambda.ineqnonlin*Hg;

Ahorre en su camino.hessianfcnMATLAB Para completar el ejemplo, la función de restricción que incluye degradados es

function [c,ceq,gc,gceq] = unitdisk2(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ];  if nargout > 2     gc = [2*x(1);2*x(2)];     gceq = []; end

Resuelve el problema incluyendo gradientes y hessian.

fun = @rosenboth; nonlcon = @unitdisk2; x0 = [-1;2]; options = optimoptions('fmincon','Algorithm','interior-point',...     'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...     'HessianFcn',@hessianfcn); [x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],[],[],@unitdisk2,options);

Para otros ejemplos usando un punto interior hessian, ver y.Algoritmo de punto interior de fmincon con hessian analíticoCalcula gradientes y hessianosSymbolic Math Toolbox

Función de multiplicar de hessian.  En lugar de una función completa de hessian, los algoritmos y permiten suministrar una función de multiplicar de hessian.fminconinterior-pointtrust-region-reflective Esta función da el resultado de un producto vectorial de hessian-Times, sin computar el hessian directamente. Esto puede ahorrar memoria. La opción debe ser para que una función de multiplicar de hessian funcione; Este es el valor predeterminado.SubproblemAlgorithm'cg'trust-region-reflective

Las sintaxis de los dos algoritmos difieren.

  • Para el algoritmo, la sintaxis esinterior-point

    W = HessMultFcn(x,lambda,v);

    El resultado debe ser el producto, donde está el hessian del Lagrangio en (ver), es el multiplicador de Lagrange (calculado por), y es un vector de tamaño por 1.WH*vHxEcuación 1lambdafminconvn Configure las opciones de la siguiente manera:

    options = optimoptions('fmincon','Algorithm','interior-point','SpecifyObjectiveGradient',true,...      'SpecifyConstraintGradient',true,'SubproblemAlgorithm','cg','HessianMultiplyFcn',@HessMultFcn);

    Proporcione la función, que devuelve un vector-by-1, donde es el número de dimensiones de.HessMultFcnnnx La opción le permite pasar el resultado de multiplicar el hessian por un vector sin calcular el hessian.HessianMultiplyFcn

  • El algoritmo no implica:trust-region-reflectivelambda

    W = HessMultFcn(H,v);

    El resultado. pasa como el valor devuelto en la tercera salida de la función objetiva (véase). también pasa, un vector o una matriz con filas.W = H*vfminconHHessian para fminunc confianza-región o fmincon confianza-región-reflexivo algoritmosfminconvn El número de columnas en puede variar, por lo que escribir para aceptar un número arbitrario de columnas. no tiene que ser el hessian; más bien, puede ser cualquier cosa que le permita calcular.vHessMultFcnHW = H*v

    Configure las opciones de la siguiente manera:

    options = optimoptions('fmincon','Algorithm','trust-region-reflective',...      'SpecifyObjectiveGradient',true,'HessianMultiplyFcn',@HessMultFcn);

    Para ver un ejemplo usando una función de multiplicar de hessian con el algoritmo, vea.trust-region-reflectiveMinimización con hessian estructurado denso, Equalidades lineales

Beneficios de incluir derivados

Si no se proporcionan gradientes, los solucionadores estiman los degradados mediante diferencias finitas. Si proporciona degradados, el solucionador no necesita realizar esta estimación de diferencias finitas, por lo que puede ahorrar tiempo y ser más preciso, aunque una estimación de diferencias finitas puede ser más rápida para los derivados complicados. Además, los solucionadores utilizan un hessian aproximado, que puede estar lejos del verdadero hessian. Proporcionar un hessian puede producir una solución en menos iteraciones. Por ejemplo, vea.Comparar con optimización sin gradientes y hessianos

Para problemas restringidos, proporcionar un degradado tiene otra ventaja. Un solucionador puede llegar a un punto tal que sea factible, pero, para ello, las diferencias finitas alrededor siempre conducen a un punto inviable.xxxx Supongamos además que la función objetiva en un punto inviable devuelve una salida compleja,, o error.InfNaN En este caso, un solucionador puede fallar o detenerse prematuramente. Proporcionar un degradado permite que un solucionador proceda. Para obtener esta ventaja, es posible que también deba incluir el degradado de una función de restricción no lineal y establecer la opción.SpecifyConstraintGradienttrue Ver.Restricciones no lineales

Elija INPUT hessian aproximación para fmincon de punto interior

El algoritmo tiene muchas opciones para seleccionar una aproximación hessian de entrada.fminconinterior-point Para obtener detalles de sintaxis, consulte.Hessian como entrada Aquí están las opciones, junto con las estimaciones de sus características relativas.

HessianUso de memoria relativaEficiencia relativa
predeterminado'bfgs'Alta (para grandes problemas)Alto
'lbfgs'De bajo a moderadoModerado
'fin-diff-grads'BajoModerado
'HessianMultiplyFcn'Bajo (puede depender de su código)Moderado
'HessianFcn'? (depende del código)Alto (depende del código)

Utilice el valor por defecto de hessian a menos que'bfgs'

La razón sólo tiene una eficiencia moderada es doble.'lbfgs' Tiene actualizaciones relativamente costosas de Sherman-Morrison. Y el paso de iteración resultante puede ser algo impreciso debido a la memoria limitada.'lbfgs'

La razón y sólo tienen una eficiencia moderada es que utilizan un enfoque de gradiente conjugada.'fin-diff-grads'HessianMultiplyFcn Estiman con precisión el hessian de la función objetiva, pero no generan el paso de iteración más preciso. Para obtener más información, consulte y su análisis del enfoque de LDL y el enfoque de gradiente conjugada para resolver.Algoritmo de punto interior de fminconEcuación 36

Temas relacionados