Main Content

fcn2optimexpr

Convertir una función en una expresión de optimización

Desde R2019a

Descripción

ejemplo

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK) convierte la función fcn(in1,in2,...,inK) en una expresión de optimización con N salidas.

ejemplo

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK,Name,Value) especifica opciones adicionales utilizando uno o más argumentos de par nombre-valor. Por ejemplo, puede guardar la evaluación de una función pasando OutputSize.

Ejemplos

contraer todo

Para usar una función de MATLAB® en el enfoque basado en problemas cuando no se compone de funciones compatibles, conviértala primero en una expresión de optimización. Consulte Operaciones compatibles con variables y expresiones de optimización y Convertir una función no lineal en una expresión de optimización.

Para utilizar la función objetivo gamma (la función matemática Γ(x), una extensión de la función factorial), cree una variable de optimización x y utilícela en una función anónima convertida.

x = optimvar('x');
obj = fcn2optimexpr(@gamma,x);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       gamma(x)

Para resolver el problema resultante, proporcione una estructura de punto inicial y llame a solve.

x0.x = 1/2;
sol =  solve(prob,x0)
Solving problem using fminunc.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
sol = struct with fields:
    x: 1.4616

Para funciones más complejas, convierta un archivo de función. El archivo de función gammabrock.m calcula un objetivo de dos variables de optimización.

type gammabrock
function f = gammabrock(x,y)
f = (10*(y - gamma(x)))^2 + (1 - x)^2;

Incluya este objetivo en un problema.

x = optimvar('x','LowerBound',0);
y = optimvar('y');
obj = fcn2optimexpr(@gammabrock,x,y);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       gammabrock(x, y)


	variable bounds:
       0 <= x

La función gammabrock es una suma de cuadrados. Se obtiene una formulación más eficiente del problema expresando la función como una suma explícita de cuadrados de expresiones de optimización.

f = fcn2optimexpr(@(x,y)y - gamma(x),x,y);
obj2 = (10*f)^2 + (1-x)^2;
prob2 = optimproblem('Objective',obj2);

Para ver la diferencia de eficiencia, resuelva prob y prob2 y examine la diferencia en el número de iteraciones.

x0.x = 1/2;
x0.y = 1/2;
[sol,fval,~,output] = solve(prob,x0);
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
[sol2,fval2,~,output2] = solve(prob2,x0);
Solving problem using lsqnonlin.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
fprintf('prob took %d iterations, but prob2 took %d iterations\n',output.iterations,output2.iterations)
prob took 21 iterations, but prob2 took 2 iterations

Si su función tiene varias salidas, puede utilizarlas como elementos de la función objetivo. En este caso, u es una variable de 2 por 2, v es una variable de 2 por 1 y expfn3 tiene tres salidas.

type expfn3
function [f,g,mineval] = expfn3(u,v)
mineval = min(eig(u));
f = v'*u*v;
f = -exp(-f);
t = u*v;
g = t'*t + sum(t) - 3;

Cree variables de optimización del tamaño adecuado y una función objetivo a partir de los dos primeros resultados.

u = optimvar('u',2,2);
v = optimvar('v',2);
[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);
prob = optimproblem;
prob.Objective = f*g/(1 + f^2);
show(prob)
  OptimizationProblem : 

	Solve for:
       u, v

	minimize :
       ((arg2 .* arg3) ./ (1 + arg1.^2))

       where:

           [arg1,~,~] = expfn3(u, v);
           [arg2,~,~] = expfn3(u, v);
           [~,arg3,~] = expfn3(u, v);

Puede utilizar la salida mineval en una expresión de restricción posterior.

En la optimización basada en problemas, las restricciones son dos expresiones de optimización con un operador de comparación (==, <= o >=) entre ellas. Puede usar fcn2optimexpr para crear una o ambas expresiones de optimización. Consulte Convertir una función no lineal en una expresión de optimización.

Cree la restricción no lineal de forma que gammafn2 sea menor o igual que -1/2. Esta función de dos variables se encuentra en el archivo gammafn2.m.

type gammafn2
function f = gammafn2(x,y)
f = -gamma(x)*(y/(1+y^2));

Cree variables de optimización, convierta el archivo de función en una expresión de optimización y, a continuación, exprese la restricción como confn.

x = optimvar('x','LowerBound',0);
y = optimvar('y','LowerBound',0);
expr1 = fcn2optimexpr(@gammafn2,x,y);
confn = expr1 <= -1/2;
show(confn)
  gammafn2(x, y) <= -0.5

Cree otra restricción por la que gammafn2 sea mayor o igual que x + y.

confn2 = expr1 >= x + y;

Cree un problema de optimización y coloque las restricciones en el problema.

prob = optimproblem;
prob.Constraints.confn = confn;
prob.Constraints.confn2 = confn2;
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :

	subject to confn:
       gammafn2(x, y) <= -0.5

	subject to confn2:
       gammafn2(x, y) >= (x + y)

	variable bounds:
       0 <= x

       0 <= y

Si su problema implica una función común que necesita mucho tiempo para calcular el objetivo y la restricción no lineal, puede ahorrar tiempo utilizando el argumento nombre-valor ReuseEvaluation. La función rosenbrocknorm calcula tanto la función objetivo de Rosenbrock como la norma del argumento para utilizarla en la restricción x24.

type rosenbrocknorm
function [f,c] = rosenbrocknorm(x)
pause(1) % Simulates time-consuming function
c = dot(x,x);
f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

Cree una variable de optimización x en 2D. A continuación, convierta rosenbrocknorm en una expresión de optimización utilizando fcn2optimexpr y establezca el argumento nombre-valor ReuseEvaluation en true. Para asegurarse de que fcn2optimexpr mantiene la instrucción pause, establezca el argumento nombre-valor Analysis en off'.

x = optimvar('x',2);
[f,c] = fcn2optimexpr(@rosenbrocknorm,x,...
    'ReuseEvaluation',true,'Analysis','off');

Cree objetivos y expresiones de restricción a partir de las expresiones devueltas. Incluya los objetivos y las expresiones de restricción en un problema de optimización. Revise el problema con show.

prob = optimproblem('Objective',f);
prob.Constraints.cineq = c <= 4;
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       [argout,~] = rosenbrocknorm(x)


	subject to cineq:
       arg_LHS <= 4

       where:

         [~,arg_LHS] = rosenbrocknorm(x);
     

Resuelva el problema comenzando por el punto inicial x0.x = [-1;1] y cronometre el resultado.

x0.x = [-1;1];
tic
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

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

<stopping criteria details>
sol = struct with fields:
    x: [2×1 double]

fval = 4.5793e-11
exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 44
               funcCount: 164
         constrviolation: 0
                stepsize: 4.3124e-08
               algorithm: 'interior-point'
           firstorderopt: 5.1691e-07
            cgiterations: 10
                 message: 'Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 5.169074e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.'
            bestfeasible: [1×1 struct]
     objectivederivative: "finite-differences"
    constraintderivative: "finite-differences"
                  solver: 'fmincon'

toc
Elapsed time is 165.623157 seconds.

El tiempo de solución en segundos es casi igual al número de evaluaciones de la función. Este resultado indica que el solver reutilizó los valores de la función y no perdió tiempo reevaluando dos veces el mismo punto.

Para ver ejemplos más exhaustivos, consulte Objective and Constraints Having a Common Function in Serial or Parallel, Problem-Based. Para obtener más información sobre cómo usar fcn2optimexpr, consulte Convertir una función no lineal en una expresión de optimización.

Argumentos de entrada

contraer todo

Función que desea convertir, especificada como un identificador de función.

Ejemplo: @sin especifica la función seno.

Tipos de datos: function_handle

Argumento de entrada, especificado como una variable de MATLAB. La entrada puede tener cualquier tipo de datos y cualquier tamaño. Puede incluir cualquier variable o dato del problema en el argumento de entrada in; consulte Pasar parámetros adicionales en el enfoque basado en problemas.

Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
Soporte de números complejos:

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value el valor correspondiente. Los argumentos nombre-valor deben aparecer tras otros argumentos, aunque no importa el orden de los pares.

En versiones anteriores a R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: [out1,out2] = fcn2optimexpr(@fun,x,y,'OutputSize',[1,1],'ReuseEvaluation',true) especifica que out1 y out2 son escalares que un solver reutilizará entre las funciones objetivo y de restricción sin volver a realizar el cálculo.

Indicación para analizar la función fcn a fin de determinar si está compuesta en su totalidad por operaciones admitidas (consulte Operaciones compatibles con variables y expresiones de optimización), especificada como "on" u "off".

  • Si desea que fcn2optimexpr analice fcn y, si es posible, que utilice las operaciones admitidas para implementar fcn, especifique "on". Esta especificación permite que fcn utilice la diferenciación automática y elija un solver apropiado, como se describe en Solver.

  • Si no quiere que fcn2optimexpr analice fcn y, por lo tanto, que trate fcn como una caja negra sin diferenciación automática, especifique "off". En este caso, solve solo utiliza fmincon, fminunc o lsqnonlin como solver.

Para obtener más información sobre los efectos de Analysis, consulte Limitaciones.

Ejemplo: [out1,out2] = fcn2optimexpr(@fun,x,"Analysis","off")

Tipos de datos: char | string

Informar sobre los detalles del análisis de la función, especificado como "off" (no informar) u "on" (informar). Si Analysis está en "off", no hay nada de lo que informar.

Ejemplo: [out1,out2] = fcn2optimexpr(@fun,x,"Display","on")

Tipos de datos: char | string

Tamaño de las expresiones de salida, especificado como:

  • Un vector de enteros: si la función tiene una salida out1, OutputSize especifica el tamaño de out1. Si la función tiene varias salidas out1,...,outN, OutputSize especifica que todas las salidas tienen el mismo tamaño.

  • Un arreglo de celdas de vectores de enteros: el tamaño de la salida outj es el j-ésimo elemento de OutputSize.

Nota

Un escalar tiene el tamaño [1,1].

Si no se especifica el argumento de par nombre-valor 'OutputSize', fcn2optimexpr pasa datos a fcn para determinar el tamaño de las salidas (consulte Algoritmos). Especificando 'OutputSize', permite que fcn2optimexpr omita este paso, lo que ahorra tiempo. Además, si no se especifica 'OutputSize' y la evaluación de fcn falla por cualquier motivo, fcn2optimexpr también falla.

Ejemplo: [out1,out2,out3] = fcn2optimexpr(@fun,x,'OutputSize',[1,1]) especifica que las tres salidas [out1,out2,out3] son escalares.

Ejemplo: [out1,out2] = fcn2optimexpr(@fun,x,'OutputSize',{[4,4],[3,5]}) especifica que out1 tiene un tamaño de 4 por 4 y out2 tiene un tamaño de 3 por 5.

Tipos de datos: double | cell

Indicador para reutilizar valores, especificado como false (no reutilizar) o true (reutilizar).

Nota

Es posible que ReuseEvaluation no tenga efecto cuando Analysis="on".

ReuseEvaluation no es compatible con un pool paralelo basado en procesos.

ReuseEvaluation puede hacer que su problema se ejecute más rápido cuando, por ejemplo, el objetivo y algunas restricciones no lineales dependen de un cálculo común. En este caso, el solver almacena el valor para reutilizarlo cuando sea necesario y evita recalcularlo.

Los valores reutilizables implican cierta sobrecarga, por lo que es mejor activar los valores reutilizables solo para las expresiones que comparten un valor.

Ejemplo: [out1,out2,out3] = fcn2optimexpr(@fun,x,"ReuseEvaluation",true,"Analysis","off") permite utilizar out1, out2 y out3 en varias operaciones y calcular las salidas una sola vez por punto de evaluación.

Tipos de datos: logical

Argumentos de salida

contraer todo

Argumento de salida, devuelto como OptimizationExpression. El tamaño de la expresión depende de la función de entrada.

Limitaciones

Analysis puede ignorar las funciones no computacionales

  • El algoritmo Analysis puede no incluir funciones no computacionales. Este aspecto del algoritmo puede dar lugar a lo siguiente:

    • Las instrucciones de pause se ignoran.

    • Una variable global que no afecte a los resultados puede ignorarse. Por ejemplo, si utiliza una variable global para contar las veces que se ejecuta la función, podría obtener un recuento engañoso.

    • Si la función contiene una llamada a rand o rng, la función podría ejecutar solo la primera llamada y las llamadas futuras no establecerían el flujo de números aleatorios.

    • Una llamada a plot podría no actualizar una figura en todas las iteraciones.

    • Es posible que el almacenamiento de datos en un archivo mat o en un archivo de texto no se produzca en cada iteración.

  • Para asegurarse de que las funciones no computacionales funcionan como espera, establezca el argumento Analysis de par nombre-valor en "off".

Para obtener más información, consulte Limitations of Static Analysis.

Algoritmos

contraer todo

Análisis

Cuando el argumento Analysis está en la configuración predeterminada de "on", fcn2optimexpr realiza varios pasos en un intento de crear la expresión de optimización más eficiente. Consulte la descripción del algoritmo en fcn2optimexpr Algorithm Description.

Existen varias opciones a la hora de incluir una función objetivo o una función de restricción no lineal en un objeto de problema.

  • Usar sobrecargas. Si todas las operaciones de una función son Operaciones compatibles con variables y expresiones de optimización, puede llamar a la función directamente en las variables de optimización. Por ejemplo:

    prob.Objective = sin(3*x)*exp(-x-y);
  • Usar fcn2optimexpr en una función no modificada. Si al menos una operación de una función no es compatible, debe llamar a fcn2optimexpr. Por ejemplo, la función besselh no es compatible, por lo que para incluirla en una función objetivo, debe utilizar fcn2optimexpr.

    prob.Objective = fcn2optimexpr(@(z)besselh(3,z),x);
  • Modificar una función para que sus bucles for internos aparezcan en funciones separadas. Hacerlo permite que el análisis estático acelere los bucles. Consulte Create for Loop for Static Analysis y Static Analysis of Optimization Expressions.

  • Establecer el argumento Analysis en "off" en fcn2optimexpr. Al hacerlo, fcn2optimexpr envuelve la función como una caja negra, lo cual es una operación rápida. La expresión obtenida no puede aprovechar la diferenciación automática (consulte Automatic Differentiation Background), por lo que puede hacer que un solver utilice más evaluaciones de función para estimar el gradiente por diferencias finitas.

Tamaño de salida

Para encontrar el tamaño de salida de cada expresión devuelta cuando no se especifica OutputSize, fcn2optimexpr evalúa la función en el siguiente punto para cada elemento de las variables del problema.

Características de las variablesPunto de evaluación
Límite superior finito ub y límite inferior finito lb(lb + ub)/2 + ((ub - lb)/2)*eps
Límite inferior finito y sin límite superiorlb + max(1,abs(lb))*eps
Límite superior finito y sin límite inferiorub - max(1,abs(ub))*eps
Sin límites1 + eps
La variable se especifica como un enterofloor del punto dado anteriormente

Un punto de evaluación puede provocar un error en la evaluación de la función. Para evitar este error, especifique OutputSize.

Historial de versiones

Introducido en R2019a