Main Content

Cómo usar todos los tipos de restricciones

Este ejemplo es un problema de minimización no lineal con todos los tipos de restricciones posibles. El ejemplo no usa gradientes.

El problema tiene cinco variables, de x(1) a x(5). La función objetivo es un polinomio en las variables.

f(x)=6x2x5+7x1x3+3x22.

La función objetivo está en la función local myobj(x), que está anidada dentro de la función fullexample. El código para fullexample aparece al final de este ejemplo.

Las restricciones no lineales son también expresiones polinómicas.

x1-0.2x2x571

0.9x3-x4267

3x22x5+3x12x3=20.875.

Las restricciones no lineales están en la función local myconstr(x), que está anidada dentro de la función fullexample.

El problema tiene límites en x3 y x5.

0x320, x51.

El problema tiene una restricción de igualdad lineal x1=0.3x2, que puede escribir como x1-0.3x2=0.

El problema también tiene tres restricciones de desigualdad lineales:

0.1x5x4x40.5x50.9x5x3.

Represente los límites y las restricciones lineales como matrices y vectores. El código que crea estos arreglos está en la función fullexample. Como se describe en la sección fmincon Argumentos de entrada, los vectores lb y ub representan las restricciones

lb x ub.

La matriz A y el vector b representan las restricciones de desigualdad lineales

A*x b,

y la matriz Aeq y el vector beq representan las restricciones de igualdad lineales

Aeq*x = b.

Llame a fullexample para resolver el problema de minimización sujeto a todos los tipos de restricciones.

[x,fval,exitflag] = fullexample
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.
x = 5×1

    0.6114
    2.0380
    1.3948
    0.1572
    1.5498

fval = 37.3806
exitflag = 1

El valor del indicador de salida 1 indica que fmincon converge en un mínimo local que cumple todas las restricciones.

Este código crea la función fullexample, que contiene las funciones anidadas myobj y myconstr.

function [x,fval,exitflag] = fullexample
x0 = [1; 4; 5; 2; 5];
lb = [-Inf; -Inf;  0; -Inf;   1];
ub = [ Inf;  Inf; 20; Inf; Inf];
Aeq = [1 -0.3 0 0 0];
beq = 0;
A = [0 0  0 -1  0.1
     0 0  0  1 -0.5
     0 0 -1  0  0.9];
b = [0; 0; 0];
opts = optimoptions(@fmincon,'Algorithm','sqp');
     
[x,fval,exitflag] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub,...
                                  @myconstr,opts);

%---------------------------------------------------------
function f = myobj(x)

f = 6*x(2)*x(5) + 7*x(1)*x(3) + 3*x(2)^2;
end

%---------------------------------------------------------
function [c, ceq] = myconstr(x)

c = [x(1) - 0.2*x(2)*x(5) - 71
     0.9*x(3) - x(4)^2 - 67];
ceq = 3*x(2)^2*x(5) + 3*x(1)^2*x(3) - 20.875;
end
end

Temas relacionados