Main Content

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.

Restricciones de desigualdad no lineales

En este ejemplo se muestra cómo resolver un problema de minimización escalar con restricciones de desigualdad no lineales. El problema es encontrar que resuelvex

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1).(1)

sujeta a las restricciones

x1x2x1x2 ≤ – 1,5,
x1x2 ≥ – 10.

Dado que ninguna de las restricciones es lineal, no puede pasar las restricciones a la línea de comandos.fmincon En su lugar, puede crear un segundo archivo, que devuelve el valor en ambas restricciones en la actual en un vector.confun.mxc A continuación, se invoca el optimizador restringido.fmincon Porque espera que las restricciones se escriban en el formulariofmincon c(x) ≤ 0, debe volver a escribir las restricciones en el formulario

x1x2x1x2 + 1,5 ≤ 0, –
x1x2 – 10 ≤ 0.
(2)

Paso 1: escribe un archivo objfun. m para la función objetiva.

function f = objfun(x) f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);

Paso 2: escriba un archivo confun. m para las restricciones.

function [c, ceq] = confun(x) % Nonlinear inequality constraints c = [1.5 + x(1)*x(2) - x(1) - x(2);           -x(1)*x(2) - 10]; % Nonlinear equality constraints ceq = [];

Paso 3: invocar la rutina de optimización restringida.

x0 = [-1,1];     % Make a starting guess at the solution options = optimoptions(@fmincon,'Algorithm','sqp'); [x,fval] = ...  fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);

produce la solución con el valor de función:fminconxfval

x,fval
x =     -9.5474  1.0474  fval =     0.0236

Puede evaluar las restricciones en la solución introduciendo

[c,ceq] = confun(x)

Esto devuelve números cercanos a cero, como

c =     1.0e-14 *      0.5107    -0.5329   ceq =       []

Tenga en cuenta que ambos valores de restricción son, dentro de una tolerancia pequeña, menor o igual que 0; es decir, satisfacex c(x) ≤ 0.

Temas relacionados