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 no lineales con degradados

Normalmente, las rutinas de minimización utilizan gradientes numéricos calculados por aproximación de diferencias finitas. Este procedimiento perturba sistemáticamente cada una de las variables con el fin de calcular la función y la restricción de derivados parciales. Alternativamente, puede proporcionar una función para calcular los derivados parciales analíticamente. Normalmente, el problema se resuelve con mayor precisión y eficacia si se proporciona una función de este tipo.

Considere cómo resolver

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

sujeta a las restricciones

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

Para resolver el problema utilizando degradados determinados analíticamente, haga lo siguiente.

Paso 1: escribe un archivo para la función objetiva y el degradado.

function [f,gradf] = objfungrad(x) f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); % Gradient of the objective function: if nargout  > 1     gradf = [ f + exp(x(1)) * (8*x(1) + 4*x(2)),      exp(x(1))*(4*x(1)+4*x(2)+2)]; end

Paso 2: escribir un archivo para las restricciones no lineales y los degradados de las restricciones no lineales.

function [c,ceq,DC,DCeq] = confungrad(x) c(1) = 1.5 + x(1) * x(2) - x(1) - x(2); % Inequality constraints c(2) = -x(1) * x(2)-10;  % No nonlinear equality constraints ceq=[]; % Gradient of the constraints: if nargout > 2     DC= [x(2)-1, -x(2);         x(1)-1, -x(1)];     DCeq = []; end

contiene los derivados parciales de la función objetiva, devueltos por, con respecto a cada uno de los elementos de:gradffobjfungrad(x)x

f=[ex1(4x12+2x22+4x1x2+2x2+1)+ex1(8x1+4x2)ex1(4x1+4x2+2)].(1)

Las columnas de contienen los derivados parciales para cada restricción respectiva (es decir, la columna TH de es la derivada parcial de la restricción TH con respecto a).DCiDCix Así que en el ejemplo anterior, esDC

[c1x1c2x1c1x2c2x2]=[x21x2x11x1].(2)

Puesto que usted está proporcionando el gradiente del objetivo y el gradiente de las restricciones en, usted dice que estos archivos contienen esta información adicional.objfungrad.mconfungrad.mmustfmincon Se utiliza para activar las opciones y en el ejemplo existente:optimoptionsSpecifyObjectiveGradientSpecifyConstraintGradienttrueoptions

options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);

Si no establece estas opciones, no utiliza los degradados analíticos.'on'fmincon

Los argumentos y colocan los límites inferior y superior en las variables independientes en.lbubx En este ejemplo, no hay restricciones enlazadas, por lo tanto, establezca ambos en.[]

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

x0 = [-1,1];            % Starting guess  options = optimoptions(@fmincon,'Algorithm','sqp'); options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true); lb = [ ]; ub = [ ];   % No upper or lower bounds [x,fval] = fmincon(@objfungrad,x0,[],[],[],[],lb,ub,...     @confungrad,options);

Los resultados:

x,fval
x =     -9.5474    1.0474 fval =      0.0236
[c,ceq] = confungrad(x) % Check the constraint values at x
c =    1.0e-13 *    -0.1066     0.1066  ceq =      []

Temas relacionados