Вы находитесь на странице: 1из 25

Optimizacion con MATLAB

Ing. Martín Rivera Toledo

Introducción
1. Convexidad y concavidad
2. Sistemas multivariables

min f ( x1 , x2 ,..., xn )
sujeta a
h j ( x1 , x 2 ,..., x n ) = 0 j = 1,2,..., m
g k ( x1 , x2 ,..., xn ) = 0 k = 1,2,..., p

condiciones necesarias y suficientes para un mínimo local

caso a. Sin restricciones


* * *
∇f ( x1 , x 2 ,..., x n ) = 0 &
* * *
H ( x1 , x 2 ,..., x n ) sea semi - definida positiva
donde
∂f ∂2 f
[∇f ]i = [ H ]ij =
∂xi & ∂xi ∂x j
caso b. Con restricciones
si se define la función de Lagrange como

m p
L( xi , u j , v k ) = f ( xi ) + ∑ h j ( xi )u j + ∑ g k ( xi )v k
j =1 k =1

Las condiciones necesarias y suficientes están dadas por

* * * *
∇L( xi , u j , v k ) = ∇f ( xi ) + ∇h( xi )u + ∇g ( xi )v = 0

ui ≥ 0 deben de aplicar en una sola dirección

* * *
g k ( x1 , x 2 ,..., x n ) ≤ 0 k = 1,2,..., p
* * *
h j ( x1 , x2 ,..., xn ) = 0 j = 1,2,..., m de factibilidad
* * *
u k g k ( x1 , x 2 ,..., x n ) = 0 k = 1,2,..., p
complementarias
* * *
Z T H ( x1 , x 2 ,..., x n ) Z > 0 para todos los vectores

Z que cumplen con


* * *
J ( x1 , x 2 ,..., x n ) Z = 0 & los renglones son las

derivadas parciales de las restricciones que están activas en x*, es

decir, Z son las direcciones de las restricciones


I. Minimización de funciones de una variable
min f ( x)
sujeta a
x1 ≤ x ≤ x 2

Estructura en Matlab

[x,fval,exitflag,output]= fminbnd ( fun,x1,x2,options )

Ejemplo [ fminvar.m ]

3 9 2
Calcular min f(x) = x - x +6 x+20 con 0 ≤ x ≤ 2
2

¿Tiene máximos esta función?, ¿cuáles son los puntos


críticos?
II. Minimización de funciones de varias variables

1. Minimización de funciones sin restricciones

min f ( x1 , x 2 ,..., x n )

Estructura en Matlab

[x,fval,exitflag,output,grad,hessian] =

fminunc( fun,x0,options )

Ejemplo [ prosenbrock.m & rosenbrock.m ]

Min f (x1,x2) = 100 ( x2 - x12 )2 + ( 1 - x1 )2

Con un estimado inicial de x1 = -1.2 & x2 = 1.0


2. Minimización de una función con restricciones

min f ( x1 , x 2 ,..., x n )
sujeta a
Ax ≤ b
Aeq x = beq restricciones lineales

Cx ≤ 0
C eq x = 0 restricciones no lineales

y con xlb ≤ x ≤ xub

Estructura en Matlab
[x,fval,exitflag,output,lambda,grad] =

fmincon( f,x0,A,b,Aeq,beq,xlb,xub,nonlcon,options )
Ejemplo 1 [ehlp8_26.m & p8_26.m]

min f(x) = x12 + x22 + x32

sujeta a las restricciones siguientes

g1(x) = 2 x1 + x2 ≤ 5

g2(x) = x1 + x3 ≤ 2

g3(x) = x1 + 2 x2 + x3 ≤ 10

h1(x) = 2 x1 - 2 x2 + x3 = -2

h2(x) = 10 x1 + 8 x2 - 14x3 = 26

h3(x) = -4 x1 + 5 x2 - 6 x3 = 6

x1 ≥ 1 x2 ≥ 2 x3 ≥ 0

con x0=[-1 -1 -1]


Ejemplo 2 [ehlp_812.m & f_p812.m]

min f = (x1-1)2 + x22

sujeto a las restricciones

h = x12 + x22 + x1 + x2 = 0

g = -x1 + x22 ≥ 0

con x0=[-1 -1 ]
3. Minimización de una función cuadrática

1 T
min ( x1 , x 2 ,..., x n ) T [ M ]( x1 , x 2 ,..., x n ) + d ( x1 , x 2 ,..., x n )
2

sujeta a
Ax ≤ b
Aeq x = b eq
xlb ≤ x ≤ xub

Estructura en Matlab

[x,fval,exitflag,output,lambda] =

quadprog( M,d,A,b,Aeq,beq,xlb,xub,x0,options )
Ejemplo 1 [qpehlp8_26.m]

min f(x) = x12 + x22 + x32

sujeta a las restricciones siguientes

g1(x) = 2 x1 + x2 ≤ 5

g2(x) = x1 + x3 ≤ 2

g3(x) = x1 + 2 x2 + x3 ≤ 10

h1(x) = 2 x1 - 2 x2 + x3 = -2

h2(x) = 10 x1 + 8 x2 - 14x3 = 26

h3(x) = -4 x1 + 5 x2 - 6 x3 = 6

x1 ≥ 1 x2 ≥ 2 x3 ≥ 0

con x0=[-1 -1 -1]


el cual se puede expresar con la forma matricial

2 0 0 0   2 1 0 5
M = 0 2 0 d = 0 A = 1 0 1 b =  2 
0 0 2 0 1 2 1 10

 2 −2 1   − 2 1 
Aeq =  10 8 − 14 beq =  26  x lb = 2
− 4 5 − 6   6  0
4. Minimización del problema de programación lineal

T
min c ( x1 , x 2 ,..., x n )
sujeta a
Ax ≤ b
Aeq x = beq

Estructura en Matlab

[x,fval,exitflag,output,lambda] =

linprog( f,a,b,aeq,beq,lb,ub,x0,options )
Ejemplo 1 [ liprogv102_2.m ]

min f(x) = x1 + x2 + x3

sujeta a las restricciones siguientes

g1(x) = 2 x1 + x2 ≤ 5

g2(x) = x1 + x3 ≤ 2

g3(x) = x1 + 2 x2 + x3 ≤ 10

h1(x) = 2 x1 - 2 x2 + x3 = -2

h2(x) = 10 x1 + 8 x2 - 14x3 = 26

h3(x) = -4 x1 + 5 x2 - 6 x3 = 6

x1 ≥ 1 x2 ≥ 2 x3 ≥ 0
5. Mínimos cuadrados no lineales

p 2

min ∑ [ f k ( x1 , x 2 ,..., x n )]
k =1
sujeta a

xlb ≤ x ≤ xub

Estructura en Matlab

[x,resnorm,residual,exitflag,output,lambda,jacobian] =

lsqnonlin( fun,x0,lb,ub,options )
Ejemplo 1 [fminquad.m & xyquad.m]

Calcule los parámetros a1, a2 & a3 para representar el


conjunto de datos siguiente

Xi 10 20 30 40 50
Yi 1.0 1.26 1.86 3.31 7.08

Para el modelo

Y = ea1 + a2 x + a3 x 2

aplicando el método de mínimos cuadrados y trace la


predicción del modelo

Códigos en MATLAB
1. fminvar.m [regresar]
% inicio del archivo fminvar.m
%
% problema 3.1 Ray & szekely (1973)
% process optimization with applications in
% metallurgy and chemical engineering, john wiley
% min x^3-9/2*x^2+6*x+20 en el intervalo
% 0 <= x <= 2
%
clc; clear all; format compact;
x1 = 0; % limite inferior
x2 = 2; % limite superior
f = inline('x^3-9/2*x^2+6*x+20'); %expresion de la funcion objetivo
%[x,fval,exitflag,output]= fminbnd (f,x1,x2,options)

options=optimset('Display','iter');

[x,fmin,flag,output]= fminbnd (f,x1,x2,options)

%
% fin del archivo fminvar.m

2. prosenbrock.m [regresar]
% inico del archivo prosenbrock.m
% Problema de Rosenbrock
% f(x1,x2)= 100*(x2-x1^2)^2+(1-x1)^2;
% con la solucion siguiente
%
% X = 0.99999562761312 0.99999125498266 es el punto critico
% fmin = 1.911777389766082e-011 es la funcion evaluada en el punto critico
% FLAG = 1 **** el metodo convergio correctamente ****

% GRAD = 1.0e-003 [ -0.50022792312956 -0.18877516066886 ]


% HESSIAN = 1.0e+002 [8.20403078550788 -4.09549747125395
% -4.09549747125395 2.04772027690417 ]

% valores_propios = 1.0e+003 * [1.02491693258887 0.00025817365234]

clc;clear all; format compact; format long;


% estimado inicial
x0=[-1.2 1.0];
% aplicando el metodo del paso descendente
%options=optimset('LargeScale','off','Display','iter','HessUpdate','steepdesc');

% aplicando el metodo DFP - Davidon, Fletcher & Powell -


%options=optimset('LargeScale','off','Display','iter','HessUpdate','dfp');

% aplicando el metodo BFGS - Broyden, Fletcher, Goldfarb & Shanno -


%options=optimset('LargeScale','off','Display','iter','HessUpdate','dfp');

% aplicando el metodo gillmurray


%options=optimset('LargeScale','off','Display','iter','HessUpdate','gillmurray');

% -------------------------------------------------------------------
fprintf('-------------------------------------------------------------------\n')
fprintf(' METODOS PARA APROXIMAR LA MATRIZ HESSIANA\n')
fprintf('-------------------------------------------------------------------\n\n')
fprintf(' 1. Metodo del paso descendente \n')
fprintf(' 2. Metodo BFGS - Broyden, Fletcher, Goldfarb & Shanno - \n')
fprintf(' 3. Metodo DFP - Davidon, Fletcher & Powell - \n')
fprintf(' 4. Metodo Gill-Murray \n\n')

metodo=input('Teclee el numero del metodo deseado para el calculo: ');

switch metodo
case 1
options=optimset('LargeScale','off','Display','iter','HessUpdate','steepdesc');
case 2
options=optimset('LargeScale','off','Display','iter','HessUpdate','dfp');
case 3
options=optimset('LargeScale','off','Display','iter','HessUpdate','dfp');
case 4
options=optimset('LargeScale','off','Display','iter','HessUpdate','gillmurray');
otherwise,
fprintf(' ----- NO selecciono algun metodo !!!! ----- \n')
options=optimset('LargeScale','off','Display','iter');
end

% calculo del optimo


fprintf('\n\n')
fprintf(' ************** resumen de resultados ************************* \n')

[x,fmin,flag,output,grad,hessiana]=FMINUNC('rosenbrock',x0,options)

% matriz hessiana
valores_propios=eig(hessiana)
if(flag~=1)
fprintf(' --- no convergio ---\n')
else
fprintf(' --- si convergio ---\n')
end

% fin del archivo prosenbrock.m

3. rosenbrock.m [regresar]
% inicio del archivo rosenbrock.m
% rutina de declaracion de la funcion objetivo
% para el problema de rosenbrock
function f=rosenbrock(x)
x1=x(1); x2=x(2);
f = 100*(x2-x1^2)^2+(1-x1)^2;
% fin del archivo rosenbrock.m

4. ehlp8_26.m [regresar]
% inicio del archivo ehlp8_26.m
% codigo para calcular el minimo de una funcion
% con restricciones correspondiente al problema
% 8.26 del libro de Edgar, Himmelblau & Lasdon (2001)
% optimization of chemical processes
%
% min f(x) = x1^2 + x2^2 + x3^2
% sujeta a las restricciones siguientes
% g1(x) = 2 x1 + x2 <= 5
% g2(x) = x1 + x3 <= 2
% g3(X) = x1 + 2x2 + x3 <= 10
% h1(x) = 2 x1 - 2x2 + x3 = -2
% h2(x) = 10 x1 + 8x2 - 14x3 = 26
% h3(x) = -4x1 + 5x2 - 6x3 = 6
% x1 >= 1 x2 >= 2 x3 >= 0
% con un estimado inicial de
% x0=[1 1 1]

clc; clear all; format compact;

x0=[1 1 1]; % estimado inicial para las variables x1, x2 & x3

A=[2 1 0; 1 0 1; 1 2 1]; % coeficientes de las ecuaciones de


% restricciones de desigualdad
B=[5;2;10]; % termino independiente de las
% restricciones de desigualdad

Aeq=[2 -2 1; 10 8 -14; -4 5 -6]; % coeficientes de las ecuaciones de


%restricciones de igualdad

Beq=[-2; 26; 6]; % termino independiente


%restricciones de igualdad

Lb=[1 2 0]; % limite inferior para las varibles x1, x2 & x3

x0=[-1 -1 -1 ]; % estimado inicial

options=optimset('LargeScale','off','Display','iter');
%[x,fval,exitflag,output,lambda,grad] =fmincon(fun,x0,a,b,aeq,beq,lb,ub,nonlcon,options)

% -------------------------------------------------------------------------
[x,fmin,flag,output,lambda,dfdxi,d2fdxi2]=fmincon('p8_26',x0,A,B,Aeq,Beq,Lb,[],[],options)
% -------------------------------------------------------------------------

x1=x(1); x2=x(2); x3=x(3); % reasignacion de valores

lambda_mu=eig(d2fdxi2); % calculo de valores propios de la matriz hessiana

% despliegue de resultados
fprintf(' -------------------------------------------------------------------------\n')
fprintf(' ------------------ despliegue de resultados -------------------------\n')
fprintf(' -------------------------------------------------------------------------\n')
fprintf('x1 = %10.4f\n',x1)
fprintf('x2 = %10.4f\n',x2)
fprintf('x3 = %10.4f\n',x3)
fprintf('fmin = %10.4f\n',fmin)
fprintf('Valores propios de la Hessiana = %f\n',lambda_mu)

% fin del archivo ehlp8_26.m

5. p8_26[regresar]
% inicio del archivo p8_26.m
% evalucion de la funcion objetivo para
% el problema 8.26 del libro de himmelblau

% -------------------------------------------------------------------------
function f = p8_26 (x)
% -------------------------------------------------------------------------
x1 = x(1); x2 = x(2); x3 = x(3);

f = x1^2 + x2^2 + x3^2;


% fin del archivo p8_26.m

6. ehlp_812.m [regresar]
% inicio del archivo ehlp_812.m
%
% problema 8.12 del libro de Edgar, Himmelblau & Lasdon
% min f=(x1-1)^2+x2^2
% sujeto a las restricciones
% h=x1^2+x2^2+x1+x2=0
% g=-x1+x2^2>=0

clc; clear all; format compact;

options=optimset('LargeScale','off','Display','iter');

%[x,fval,exitflag,output,lambda,grad] =fmincon(fun,x0,a,b,aeq,beq,lb,ub,nonlcon,options)

x0=[1 1]; a=[]; b=[]; aeq=[]; beq=[]; lb=[]; ub=[];

[x,fmin,flag,output,lambda,grad] =fmincon('f_p812',x0,a,b,aeq,beq,lb,ub,'resp_812',options)

%
% fin del archivo ehlp_812.m

7. f_p812.m[regresar]
% inicio del archivo f_p812.m
% funcion para la evaluacion de la funcion objetivo
% del problema 8.12 del libro de Edgar, Himmelblau & Lasdon

% -------------------------------------------------------------------------
function f=f_p812(x)
% -------------------------------------------------------------------------
x1 = x(1); x2 = x(2); % reasignacion de variables

f = (x1-1)^2 + x2^2; % funcion objetivo


% fin del archivo f_p812.m

8. qpehlp8_26.m[regresar]
% inicio del archivo qpehlp8_26.m
% codigo para calcular el minimo de una funcion
% con restricciones correspondiente al problema
% 8.26 del libro de Edgar, Himmelblau & Lasdon (2001)
% optimization of chemical processes
%
% min f(x) = x1^2 + x2^2 + x3^2
% sujeta a las restricciones siguientes
% g1(x) = 2 x1 + x2 <= 5
% g2(x) = x1 + x3 <= 2
% g3(X) = x1 + 2x2 + x3 <= 10
% h1(x) = 2 x1 - 2x2 + x3 = -2
% h2(x) = 10 x1 + 8x2 - 14x3 = 26
% h3(x) = -4x1 + 5x2 - 6x3 = 6
% x1 >= 1 x2 >= 2 x3 >= 0
% con un estimado inicial de
% x0=[1 1 1]

clc; clear all; format compact;

x0=[1 1 1]; % estimado inicial para las variables x1, x2 & x3

M=[2 0 0; 0 2 0; 0 0 2]; % coeficientes del termino de segundo


% grado para la funcion objetivo

d=[0 0 0]; % coeficientes del termino de primer


% grado para la funcion objetivo

A=[2 1 0; 1 0 1; 1 2 1]; % coeficientes de las ecuaciones de


% restricciones de desigualdad
b=[5;2;10]; % termino independiente de las
% restricciones de desigualdad

Aeq=[2 -2 1; 10 8 -14; -4 5 -6]; % coeficientes de las ecuaciones de


%restricciones de igualdad

beq=[-2; 26; 6]; % termino independiente


%restricciones de igualdad

xlb=[1 2 0]; % limite inferior para las variables x1, x2 & x3


xub=[]; % limite superior para las variables x1, x2 & x3

x0=[-1 -1 -1 ]; % estimado inicial

options=optimset('LargeScale','off','Display','iter');

%[x,fval,exitflag,output,lambda]= quadprog(M,d,A,b,Aeq,beq,xlb,xub,x0,options)

% -------------------------------------------------------------------------
[x,fmin,flag,output,lambda]= quadprog(M,d,A,b,Aeq,beq,xlb,xub,x0,options)
% -------------------------------------------------------------------------

x1=x(1); x2=x(2); x3=x(3); % reasignacion de valores

% despliegue de resultados
fprintf(' -------------------------------------------------------------------------\n')
fprintf(' ------------------ despliegue de resultados -------------------------\n')
fprintf(' -------------------------------------------------------------------------\n')
fprintf('x1 = %10.4f\n',x1)
fprintf('x2 = %10.4f\n',x2)
fprintf('x3 = %10.4f\n',x3)
fprintf('fmin = %10.4f\n',fmin)
% fin del archivo qpehlp8_26.m

9. liprogv102_2.m[regresar]
% inicio del archivo liprogv102_2.m
% codigo para calcular el maximo de una funcion
% con restricciones correspondiente al problema
% 10.2.1 del libro de Venkataraman (2001)
% Applied Optimization with MATLAB Programming
% min f(x) = x1 + x2 + x3
%
% sujeta a las restricciones siguientes
%
% g1(x) = 2 x1 + x2 <= 5
% g2(x) = x1 + x3 <= 2
% g3(x) = x1 + 2 x2 + x3 <= 10
%
% h1(x) = 2 x1 - 2 x2 + x3 = -2
% h2(x) = 10 x1 + 8 x2 - 14x3 = 26
% h3(x) = -4 x1 + 5 x2 - 6 x3 = 6
%
% x1 >= 1 x2 >= 2 x3 >= 0

clc; clear all; format compact;

Z=[1 1 1]; % coeficientes de la funcion objetivo

A=[2 1 0; 1 0 1; 1 2 1]; % coeficientes de las ecuaciones de


% restricciones de desigualdad
b=[5; 2; 10]; % termino independiente de las
% restricciones de desigualdad

Aeq=[2 -2 1; 10 8 -14; -4 5 -6]; % coeficientes de las ecuaciones de


%restricciones de igualdad

beq=[-2; 26; 6]; % termino independiente


%restricciones de igualdad

xlb=[1 2 0]; % limite inferior para las variables x1, x2 & x3


xub=[]; % limite superior para las variables x1, x2 & x3

x0(1:3)=1;% estimado inicial

options=optimset('LargeScale','off','Display','iter');
%[x,fval,exitflag,output,lambda]= linprog(f,a,b,aeq,beq,lb,ub,x0,options)
% -------------------------------------------------------------------------
[x,Zmin,flag,output,lambda]= linprog(Z,A,b,Aeq,beq,xlb,xub,x0,options)
% -------------------------------------------------------------------------

x1=x(1); x2=x(2); x3=x(3); % reasignacion de valores

% despliegue de resultados
fprintf(' -------------------------------------------------------------------------\n')
fprintf(' ------------------ despliegue de resultados -------------------------\n')
fprintf(' -------------------------------------------------------------------------\n')
fprintf('x1 = %10.4f\n',x1)
fprintf('x2 = %10.4f\n',x2)
fprintf('x3 = %10.4f\n',x3)
fprintf('fmin = %10.4f\n',Zmin)

% fin del archivo liprogv102_2.m

10. fminquad.m[regresar]
% inicio del archivo fminquad.m
%
% codigo para calcular los coeficientes de una funcion
% por el metodo de minimos cuadrados
% 2.8 del libro de Edgar, Himmelblau & Lasdon (2001)
% optimization of chemical processes
%
function fminquad
clc; clear all; format compact;
global xi yi
xi=[10 20 30 40 50];
yi=[1.0 1.26 1.86 3.31 7.08];

x0=[0.1 0 0];
xlb=[];
xub=[];
options=optimset('LargeScale','off','Display','iter');

%[x,resnorm,residual,exitflag,output,lambda,jacobian]= lsqnonlin(fun,x0,lb,ub,options)

[x,funx2,fun,flag,output,lambda,jacobian]= lsqnonlin(@xyquad2,x0,xlb,xub,options)

c0=x(1); c1=x(2); c2=x(3); % reasignacion de parametros

yi_mod=exp(c0+c1*xi+c2*xi.^2);
figure(1), plot(xi,yi,'o',xi,yi_mod,'--')
xlabel('xi'),ylabel('yi,yimodelo')
legend('Yi_{exp}','Yi_{mod}'),title('yi_{exp} yi_ {mod} vs xi')
figure(2),plot(yi,yi_mod,'--')
xlabel('yi_{exp}'),ylabel('yi_{mod}')
%
% fin del archivo fminquad.m

% inicio del archivo xyquad.m


% codigo para calcular los coeficientes de una funcion
% por el metodo de minimos cuadrados
% 2.8 del libro de Edgar, Himmelblau & Lasdon (2001)
% optimization of chemical processes
%
function fi2=xyquad2(x)
global yi xi
c0=x(1); c1=x(2); c2=x(3);

yi_mod=exp(c0+c1*xi+c2*xi.^2);
fi2=yi-yi_mod;
% fin del archivo xyquad.m

11. xyquad.m[regresar]
% inicio del archivo xyquad.m
% codigo para calcular los coeficientes de una funcion
% por el metodo de minimos cuadrados
% 2.8 del libro de Edgar, Himmelblau & Lasdon (2001)
% optimization of chemical processes
%
function fi2=xyquad(x)
global yi xi
c0=x(1); c1=x(2); c2=x(3);

yi_mod=exp(c0+c1*xi+c2*xi.^2);
fi2=yi-yi_mod;
% fin del archivo xyquad.m

Вам также может понравиться