fcn2optimexpr
Sintaxis
Descripción
Ejemplos
Convertir una función objetivo en una expresión
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 Supported Operations for Optimization Variables and Expressions 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 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.
Crear restricciones no lineales a partir de una función
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
Calcular de forma eficiente objetivos y restricciones comunes
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 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
fcn
— Función que desea convertir
identificador de función
Función que desea convertir, especificada como un identificador de función.
Ejemplo: @sin
especifica la función seno.
Tipos de datos: function_handle
in
— Argumento de entrada
Variable de MATLAB®
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.
Analysis
— Indicación para analizar la función
"on"
(predeterminado) | "off"
Indicación para analizar la función fcn
a fin de determinar si está compuesta en su totalidad por operaciones admitidas (consulte Supported Operations for Optimization Variables and Expressions), especificada como "on"
u "off"
.
Si desea que
fcn2optimexpr
analicefcn
y, si es posible, que utilice las operaciones admitidas para implementarfcn
, especifique"on"
. Esta especificación permite quefcn
utilice la diferenciación automática y elija un solver apropiado, como se describe enSolver
.Si no quiere que
fcn2optimexpr
analicefcn
y, por lo tanto, que tratefcn
como una caja negra sin diferenciación automática, especifique"off"
. En este caso,solve
solo utilizafmincon
,fminunc
olsqnonlin
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
Display
— Informar sobre los detalles del análisis de la función
"off"
(predeterminado) | "on"
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
OutputSize
— Tamaño de las expresiones de salida
vector de enteros | arreglo de celdas de vectores de enteros
Tamaño de las expresiones de salida, especificado como:
Un vector de enteros: si la función tiene una salida
out
1,OutputSize
especifica el tamaño deout
1. Si la función tiene varias salidasout
1,...,out
N,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
out
j 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
ReuseEvaluation
— Indicador para reutilizar valores
false
(predeterminado) | true
Indicador para reutilizar valores, especificado como false
(no reutilizar) o true
(reutilizar).
Nota
Es posible que ReuseEvaluation
no tenga efecto cuando Analysis
="on"
.
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
out
— Argumento de salida
OptimizationExpression
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
orng
, 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
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 Supported Operations for Optimization Variables and Expressions, 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 afcn2optimexpr
. Por ejemplo, la funciónbesselh
no 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
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"
enfcn2optimexpr
. 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 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
Abrir ejemplo
Tiene una versión modificada de este ejemplo. ¿Desea abrir este ejemplo con sus modificaciones?
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)