fcn2optimexpr
Convertir una función en una expresión de optimización
Sintaxis
Descripción
Ejemplos
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 , 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 gammabrockfunction 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 expfn3function [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 gammafn2function 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 .
type rosenbrocknormfunction [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
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: Sí
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
fcn2optimexpranalicefcny, si es posible, que utilice las operaciones admitidas para implementarfcn, especifique"on". Esta especificación permite quefcnutilice la diferenciación automática y elija un solver apropiado, como se describe enSolver.Si no quiere que
fcn2optimexpranalicefcny, por lo tanto, que tratefcncomo una caja negra sin diferenciación automática, especifique"off". En este caso,solvesolo utilizafmincon,fminuncolsqnonlincomo 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,OutputSizeespecifica el tamaño deout1. Si la función tiene varias salidasout1,...,outN,OutputSizeespecifica 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 deOutputSize.
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
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
Analysispuede no incluir funciones no computacionales. Este aspecto del algoritmo puede dar lugar a lo siguiente:Las instrucciones de
pausese 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
randorng, 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
plotpodría no actualizar una figura en todas las iteraciones.Es posible que el almacenamiento de datos en un archivo
mato 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
Analysisde par nombre-valor en"off".
Para obtener más información, consulte Limitations of Static Analysis.
Algoritmos
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
fcn2optimexpren una función no modificada. Si al menos una operación de una función no es compatible, debe llamar afcn2optimexpr. Por ejemplo, la funciónbesselhno es compatible, por lo que para incluirla en una función objetivo, debe utilizarfcn2optimexpr.prob.Objective = fcn2optimexpr(@(z)besselh(3,z),x);
Modificar una función para que sus bucles
forinternos 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
Analysisen"off"enfcn2optimexpr. Al hacerlo,fcn2optimexprenvuelve 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.
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 variables | Punto 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 superior | lb + max(1,abs(lb))*eps |
| Límite superior finito y sin límite inferior | ub - max(1,abs(ub))*eps |
| Sin límites | 1 + eps |
| La variable se especifica como un entero | floor 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
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Seleccione un país/idioma
Seleccione un país/idioma para obtener contenido traducido, si está disponible, y ver eventos y ofertas de productos y servicios locales. Según su ubicación geográfica, recomendamos que seleccione: .
También puede seleccionar uno de estos países/idiomas:
Cómo obtener el mejor rendimiento
Seleccione China (en idioma chino o inglés) para obtener el mejor rendimiento. Los sitios web de otros países no están optimizados para ser accedidos desde su ubicación geográfica.
América
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)