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.

Convertir función no lineal a expresión de optimización

Para utilizar una función no lineal como función de restricción objetiva o no lineal en el enfoque basado en problemas, convierta la función en una expresión de optimización mediante.fcn2optimexpr En este ejemplo se muestra cómo convertir la función mediante un archivo de función y una función anónima.

Function File

Para utilizar un archivo de función en el enfoque basado en problemas, debe convertir el archivo a una expresión mediante.fcn2optimexpr

Por ejemplo, el archivo contiene el código siguiente:expfn3.m

type expfn3.m
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; 

Para utilizar este archivo de función como una expresión de optimización, cree primero las variables de optimización de los tamaños apropiados.

u = optimvar('u',3,3,'LowerBound',-1,'UpperBound',1); % 3-by-3 variable v = optimvar('v',3,'LowerBound',-2,'UpperBound',2); % 3-by-1 variable

Convierta el archivo de función en una expresión de optimización utilizando.fcn2optimexpr

[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);

Dado que todas las expresiones devueltas son escalares, puede ahorrar tiempo de computación especificando los tamaños de expresión mediante el argumento de par nombre-valor.'OutputSize' Además, dado que calcula todas las salidas, puede ahorrar más tiempo de computación utilizando el par nombre-valor.expfn3ReuseEvaluation

[f,g,mineval] = fcn2optimexpr(@expfn3,u,v,'OutputSize',[1,1],'ReuseEvaluation',true)
f =    Nonlinear OptimizationExpression      [argout,~,~] = expfn3(u, v)  
g =    Nonlinear OptimizationExpression      [~,argout,~] = expfn3(u, v)  
mineval =    Nonlinear OptimizationExpression      [~,~,argout] = expfn3(u, v)  

Función anónima

Para usar un identificador de función no lineal general en el enfoque basado en problemas, convierta el identificador en una expresión de optimización mediante.fcn2optimexpr Por ejemplo, escriba un identificador de función equivalente a y convertirlo.f

fun = @(x,y)-exp(-y'*x*y); funexpr = fcn2optimexpr(fun,u,v,'OutputSize',[1,1])
funexpr =    Nonlinear OptimizationExpression      anonymousFunction1(u, v)    where:      anonymousFunction1 = @(x,y)-exp(-y'*x*y);  

Crear objetivo

Para utilizar cualquiera de las expresiones como una función objetiva, cree un problema de optimización.

prob = optimproblem; prob.Objective = f; % Or, equivalently, prob.Objective = funexpr;

Definir restricciones

Defina la restricción en el problema de optimización.g <= 0

prob.Constraints.nlcons1 = g <= 0;

Defina también las restricciones que son simétricas y queu

<math display="block">
<mrow>
<mstyle mathvariant="normal">
<mrow>
<mrow>
<mi>m</mi>
<mi>i</mi>
<mi>n</mi>
<mi>e</mi>
<mi>v</mi>
<mi>a</mi>
<mi>l</mi>
</mrow>
<mo></mo>
<mo>-</mo>
<mn>1</mn>
<mo>/</mo>
<mn>2</mn>
</mrow>
</mstyle>
</mrow>
</math>
.

prob.Constraints.sym = u == u.'; prob.Constraints.mineval = mineval >= -1/2;

Vea el problema.

showproblem(prob)
  OptimizationProblem :    minimize :        [argout,~,~] = expfn3(u, v)   subject to nlcons1:        arg_LHS <= 0         where:           [~,arg_LHS,~] = expfn3(u, v);   subject to sym:        u(2, 1) - u(1, 2) == 0        u(3, 1) - u(1, 3) == 0        -u(2, 1) + u(1, 2) == 0        u(3, 2) - u(2, 3) == 0        -u(3, 1) + u(1, 3) == 0        -u(3, 2) + u(2, 3) == 0   subject to mineval:        arg_LHS >= (-0.5)         where:           [~,~,arg_LHS] = expfn3(u, v);   variable bounds:        -1 <= u(1, 1) <= 1        -1 <= u(2, 1) <= 1        -1 <= u(3, 1) <= 1        -1 <= u(1, 2) <= 1        -1 <= u(2, 2) <= 1        -1 <= u(3, 2) <= 1        -1 <= u(1, 3) <= 1        -1 <= u(2, 3) <= 1        -1 <= u(3, 3) <= 1         -2 <= v(1) <= 2        -2 <= v(2) <= 2        -2 <= v(3) <= 2 

Resuelve el problema

Para resolver el problema, llame.solve Establezca un punto inicial.x0

rng default % For reproducibility x0.u = randn(3); x0.u = x0.u + x0.u.'; x0.v = 2*randn(3,1); [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. 
sol = struct with fields:
    u: [3x3 double]
    v: [3x1 double]

fval = -403.4288 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 153
          funcCount: 2627
    constrviolation: 2.3657e-11
           stepsize: 8.7725e-06
          algorithm: 'interior-point'
      firstorderopt: 0.0016
       cgiterations: 279
            message: '...'
             solver: 'fmincon'

Vea la solución.

disp(sol.u)
    0.5613    0.5406   -0.5206     0.5406    0.8747    0.8340    -0.5206    0.8340    0.8547 
disp(sol.v)
    2.0000    -2.0000     2.0000 

La matriz de la solución es simétrica.u El vector de solución tiene todas las entradas en restricciones enlazadas.v

Consulte también

Temas relacionados