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.

fcn2optimexpr

Convierta la función a la expresión de optimización

Descripción

ejemplo

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

ejemplo

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK,Name,Value) modifica el proceso de creación de la expresión según los parámetros de nombre-valor.

Ejemplos

contraer todo

Para utilizar una función MATLAB™ en el enfoque basado en problemas, primero conviértalo en una expresión de optimización.

Por ejemplo, para utilizar la función objetiva

<math display="block">
<mrow>
<mo>-</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<msup>
<mrow>
<mi>x</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>/</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
, cree una variable de optimización y utilíla en una función anónima convertida:x

x = optimvar('x'); obj = fcn2optimexpr(@(t)-exp(-t^2/2),x); prob = optimproblem('Objective',obj); showproblem(prob)
  OptimizationProblem :    minimize :        anonymousFunction1(x)         where:           anonymousFunction1 = @(t)-exp(-t^2/2);       

Para funciones más complejas, convierta un archivo de función. Por ejemplo, supongamos que tiene un archivo de función denominado que calcula un objetivo en dos variables de optimización.expfn2.m

type expfn2
function f = expfn2(t,u) f = -exp(-t^2/2)*u/(1 + u^2); 

Incluya este objetivo en un problema.

x = optimvar('x'); y = optimvar('y','LowerBound',0); obj = fcn2optimexpr(@expfn2,x,y); prob = optimproblem('Objective',obj); showproblem(prob)
  OptimizationProblem :    minimize :        expfn2(x, y)   variable bounds:        0 <= y 

Si la función tiene varias salidas, puede utilizarlas como elementos de la función objetiva. Por ejemplo, supongamos que es una variable 2 por 2 y es una variable 2 por 1 y tiene tres salidas:uvexpfn3

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 de tamaño adecuado y cree una función objetiva a partir de las dos primeras salidas.

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); showproblem(prob)
  OptimizationProblem :    minimize :        ((arg2 .* arg3) ./ (1 + arg1.^2))         where:           [arg1,~,~] = expfn3(u, v);          [arg2,~,~] = expfn3(u, v);          [~,arg3,~] = expfn3(u, v);       

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

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 para crear una o ambas expresiones de optimización.fcn2optimexpr

Cree la restricción que sea menor o igual que – 1/2.expfn2 Esta función de dos variables está en el archivo.expfn2.m

type expfn2
function f = expfn2(t,u) f = -exp(-t^2/2)*u/(1 + u^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'); y = optimvar('y','LowerBound',0); expr1 = fcn2optimexpr(@expfn2,x,y); confn = expr1 <= -1/2; showconstr(confn)
  expfn2(x, y) <= (-0.5) 

Haga clic en el enlace azul extraParams anteriores para ver la siguiente salida:

extraParams{1}:

-0.5000

Cree otra restricción que sea mayor que.expfn2x + 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; showproblem(prob)
  OptimizationProblem :    minimize :  subject to confn:        expfn2(x, y) <= (-0.5)   subject to confn2:        expfn2(x, y) >= (x + y)   variable bounds:        0 <= y 

Si la restricción objetiva y no lineal procede de una función común que consume mucho tiempo, Ahorre tiempo utilizando el par nombre-valor.'ReuseEvaluation' Por ejemplo, calcula la función objetivo de Rosenbrock y la norma del argumento para su uso en la restricciónrosenbrocknorm

<math display="block">
<mrow>
<mo stretchy="false"></mo>
<mi>x</mi>
<msup>
<mrow>
<mo stretchy="false"></mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo></mo>
<mn>4</mn>
</mrow>
</math>
.

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 2-D.x A continuación, convierta en una expresión de optimización utilizando, especificando.rosenbrocknormfcn2optimexpr'ReuseEvaluation'

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

Cree expresiones de objetivo y restricción a partir de las expresiones devueltas. Incluya estas expresiones en un problema de optimización. Revise el problema usando.showproblem

prob = optimproblem('Objective',f); prob.Constraints.cineq = c <= 4; showproblem(prob)
  OptimizationProblem :    minimize :   [argout,~] = generatedFunction_rosenbrocknorm_withReuse(x)   subject to cineq:   arg_LHS <= 4    where:      [~,arg_LHS] = generatedFunction_rosenbrocknorm_withReuse(x); 

Resuelva el problema comenzando desde el punto inicial, cronometrar el resultado.x0.x = [-1;1]

x0.x = [-1;1]; tic [sol,fval,exitflag,output] = solve(prob,x0)
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 = 3.6222e-11 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 43
          funcCount: 161
    constrviolation: 0
           stepsize: 9.1067e-08
          algorithm: 'interior-point'
      firstorderopt: 6.3912e-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, 6.391223e-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.↵↵'
             solver: 'fmincon'

toc
Elapsed time is 161.910171 seconds. 

El tiempo de solución en segundos es casi el mismo que el número de evaluaciones de función. Este resultado indica que el solucionador reutiliza los valores de función y no pierde tiempo reevaluando el mismo punto dos veces.

Para obtener un ejemplo más extenso, consulte.Objetivo y restricciones tener una función común en serie o paralela, basada en problemas

Argumentos de entrada

contraer todo

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

Ejemplo: Especifica la función sinusoidal@sin

Tipos de datos: function_handle

Argumento de entrada, especificado como una variable.MATLAB La entrada puede tener cualquier tipo de datos y cualquier tamaño.

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 separados por comas opcionales. es el nombre del argumento y es el valor correspondiente. deben aparecer dentro de las cotizaciones.Name,ValueNameValueName Puede especificar varios argumentos de par de nombre y valor en cualquier orden como.Name1,Value1,...,NameN,ValueN

Ejemplo: Especifica que y son escalares y que estas variables se reutilizarán entre las funciones objetivas y de restricción sin volver a calcular.[out1,out2] = fcn2optimexpr(@fun,x,y,'OutputSize',[1,1],'Reuse',true)out1out2

Tamaños de las expresiones de salida, especificadas como:

  • Un vector entero: si hay una salida 1, especifica el tamaño de 1.outOutputSizeout Si hay varias salidas 1,..., N, especifica que todas las salidas tienen el mismo tamaño.outoutOutputSize

    Nota

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

  • Una matriz de celdas de vectores enteros: el tamaño de la salida j es el elemento JTH de.outOutputSize

Si no pasa un par nombre-valor, a continuación, pasa los datos a fin de determinar los tamaños de las salidas (consulte).OutputSizefcn2optimexprfcnAlgoritmos Al pasar, se habilita para omitir este paso.OutputSizefcn2optimexpr Omitir esta evaluación ahorra tiempo. Además, si no se pasa un par nombre-valor, y si la evaluación de errores por cualquier motivo, a continuación, se produce un error también.OutputSizefcnfcn2optimexpr

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

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

Tipos de datos: double | cell

Habilite los valores reutilizables, especificados como (no habilitar) o (habilitar).falsetrue

puede hacer que el problema se ejecute más rápido cuando, por ejemplo, el objetivo y algunas restricciones no lineales se basan en un cálculo común.ReuseEvaluation En este caso, el solucionador almacena el valor para su reutilización siempre que sea necesario, por lo que evita recalar el valor.

Hay una pequeña sobrecarga en la habilitación de valores reutilizables, por lo que es mejor habilitar los valores reutilizables solo para las expresiones que comparten un valor.

Ejemplo: permite, y se utiliza en varios cálculos, con las salidas que se calculan una sola vez por cada punto de evaluación[out1,out2,out3] = fcn2optimexpr(@fun,x,'ReuseEvaluation',true)out1out2out3

Tipos de datos: logical

Argumentos de salida

contraer todo

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

Algoritmos

Para buscar el tamaño de salida de cada expresión devuelta cuando no se proporciona una, se evalúa la función en el siguiente punto para cada elemento de las variables de problema.OutputSizefcn2optimexpr

  • Si hay un límite superior finito y un límite inferior finito, el punto de evaluación es.ublb(lb + ub)/2 + ((ub - lb)/2)*eps

  • Si hay un límite inferior finito y ningún límite superior, el punto de evaluación es.lb + max(1,abs(lb))*eps

  • Si hay un límite superior finito y ningún límite inferior, el punto de evaluación es.ub - max(1,abs(ub))*eps

  • Si no hay límites, el punto de evaluación es.1 + eps

  • Además, si la variable se especifica como un entero, el punto de evaluación es del punto indicado anteriormente.floor

Es posible que este punto de evaluación conduzca a un error en la evaluación de funciones. Para evitar este error, especifique.OutputSize

Introducido en R2019a