Está en la página 1de 40

Optimización

Optimización
Búsqueda del mínimo o del máximo de una función

Una estrategia para buscar el mínimo o el máximo


de una función es buscar la raíz de su derivada
Problemas de optimización en
ingeniería
Problemas de optimización: definición
Determinar x que minimiza o maximiza f(x).
Orientación
Optimización 1D

Métodos:
● De la sección dorada (sección áurea)
● Interpolación cuadrática
● de Newton
Sección áurea
Se cumple que:
l1 l2
l 0 =l 1 +l 2 =
l0 l 1
Reemplazando,
tomando el recíproco
y definiendo: l2
R=
l1
2
se llega a R + R−1=0

cuya raíz positiva es R=


 5−1
=0.61803...
Razón
2 áurea
Algoritmo de la sección aúrea
Paso 1: elegir intervalo [xl  , xu] donde haya un extremo local de f(x)

Paso 2: calcular los puntos interiores x1 y x2

d =R( x u − x l )
x 1 =x l + d

x 2= x u −d

Paso 3: ciclo iterativo hasta cumplir εa <εs


Algoritmo de la sección aúrea
Paso 3:        Si f(x1) > f(x2)                            Si f(x2) > f(x1)  

xl          x2 xu          x1
x2          x1 x1          x2
Sección áurea
Cota del error
Al finalizar una iteración, el óptimo se ecuentra
en alguno de los intervalos:
 x l , x 2, x 1   x 2, x 1, x u 
En el intervalo superior, los errores máximos
son:
 x a = x 1−x 2 =...=2 R−1 x u−x l ≈0.236  x u −x l 
 x b =x u −x 1=...=1−R x u −x l ≈0.382  x u−x l 
con lo cual
εa =(1−R)
| |
x u− x l
x opt
100 %
Ejemplo 13.1 pag. 368
Encontrar el máximo de
2
x
f  x=2 sin x− , x ∈[0 ; 4]
10
En la primera iteración,
x l =0 ; x u =4 d=
 5−1
 4−0=2.472
2
x 1= x l d=2.472 ; x 2 =x u −d =1.528

f  x 1 = f 2.472=0.63 ; f  x 2 = f 1.528=1.765
Ejemplo 13.1 pag. 368

● Planilla de cálculo: aurea.ods


● Código en Octave: aurea.m
● Código en Python: aurea.py
Sección áurea: Pseudocódigo
iniciar xl; xu            // Paso 1
    
iniciar iter=0; imax; es
definir R
definir funcion f 
d = R*(xu­xl)             // Paso 2
x1 = xl + d; x2 = xu ­ d
f1 = f(x1);  f2 = f(x2)
repetir:
si f1 > f2:            // Paso 3
xopt = x1; ea = (1­R)*abs((xu­xl)/xopt)*100
xl = x2; x2 = x1; x1 = xl + d*R
f2 = f1; f1 = f(x1)
en caso contrario:
xopt = x2; ea = (1­R)*abs((xu­xl)/xopt)*100
xu = x1; x1 = x2; x2 = xu ­ d*R
f1 = f2; f2 = f(x2)
iter = iter + 1 
d = d*R     // valor d para iteracion siguiente    
hasta que (ea<es  or  iter>=imax)  
mostrar xopt
Interpolación cuadrática
● Evalúa la expresión
2
f  x=a x b xc
en los puntos
[ x 0 ; f  x 0 ]
[ x 1 ; f  x 1 ]
[ x 2 ; f  x 2 ]
obteniendo 2
a x b x 0 c= f  x 0 
0
2
a x b x 1c= f  x 1 
1
2
a x b x 2 c= f  x 2 
2
Interpolación cuadrática
● Resolviendo para a, b, c
Interpolación cuadrática
Recordando que el vértice de una parábola se
encuentra en
b
x 3=−
2a
y reemplazando,
2 2 2 2 2 2
f  x 0  x − x  f  x 1  x −x  f  x 2  x −x 
1 2 2 0 0 1
x 3=
2 f  x 0  x 1−x 2 2 f  x 1  x 2 −x 0 2 f  x 2  x 0− x 1 
Interpolación cuadrática
En la próxima iteración se elimina:
x 0 si x1 ≤ x 3 x 2 si x 3 < x1

próxima
x0 x1 x2 x0 x1 x 2
iteración
Interpolación cuadrática: Pseudocódigo
iniciar x0; x1; x2            
    iniciar iter=0; imax; es
definir funcion f 
x3Ant = x2
f0 = f(x0); f1 = f(x1); f2 = f(x2)
repetir:    
    x3 = (f0*(x1^2­x2^2) + f1*(x2^2­x0^2) + f2*(x0^2­x1^2))  /  ...
        (2*(f0*(x1­x2) + f1*(x2­x0) + f2*(x0­x1)) )
si x3 < x1:
    x2 = x1
f2 = f1 
    en caso contrario:
      x0 = x1
f0 = f1
    x1 = x3
f1 = f3         
    si x3 != 0: 
      ea = abs((x3­x3Ant)/x3)*100         
    iter = iter + 1
    x3Ant = x3     
hasta que (ea<es  or  iter>=imax)  
mostrar x3
Ejemplo 13.2, pag. 372
2
x
Obtener el máximo de f  x=2 sin x− , x ∈[0 ; 4]
10
Con los valores iniciales x 0=0 , x 1=1 , x 2 =4

Se evalúa la función
f  x 0 =0 , f  x 1 =1.5829 , f  x 2 =−3.1136

012 −42 1.58294 2−02 −3.11360 2−12 


x 3= =1.5055
2 01−421.58294−02−3.11360−1

f 1.5055=1.7691
Ejemplo 13.2, pag. 372

● Planilla de cálculo: cuadratica.ods


● Código en Python:
-módulo cuadratica.py
-programa principal ejemploCuadratica.py
Método de Newton
Se basa en el método de Newton-Raphson de
búsqueda de raíces:
f  xi 
x i1=x i −
f '  xi 

Para encontrar el máximo o el mínimo busca la


raíz de la primera derivada:
f ' ( xi )
x i +1=x i −
f ' ' ( x i)
Método de Newton: Pseudocódigo
iniciar xant, iter=0, imax, es 
    
definir funcion f
definir funcion df
definir funcion d2f
repetir:
   xopt = xant ­ df(xant)/d2f(xant)   
   si xopt != 0: 
      ea = abs((xopt ­ xant)/xopt)*100   
   iter = iter + 1        
   xant = xopt  
hasta que (ea<es  or  iter>=imax)
mostrar xopt
Ejemplo 13.3, pag.373
2
x
Obtener el máximo de f  x=2 sin x− , x ∈[0 ; 4]
10
Sus derivadas:
x 1
f '  x =2 cos x− , f ' '  x =−2 sin x−
5 5
Tomando como valor inicial x0 = 2.5,
2 cos 2.5−2.5/ 5
x 1=2.5− =0.99508
−2 sin 2.5−1/5
● Planilla de cálculo: newton.ods
● Código en Python: newton.py
Problemas 13.1 a 13.21
Optimización multidimensional

● Métodos
● Directos
● De gradiente
Métodos directos
● Búsqueda por malla* (algoritmo de fuerza
bruta) – problema 14.10
Búsqueda por malla: Pseudocódigo
iniciar xl; xu; yl; yu; dx; dy
    
iniciar opt = ­Inf
definir funcion f

repetir para x desde xl hasta xu cada dx:
repetir para y desde yl hasta yu cada dy:
f = f(x,y)
si f > opt:
opt = f; xopt = x; yopt = y
mostrar xopt, yopt, opt
     
   
Problema 14.10
Hallar el máximo de
2 2
f ( x , y)= y− x−2 x −2 x y− y , x ∈[−2 ; 2] , y∈[1 ;3]
Gráfica en Octave (GNUPlot)
x=[­2:0.1:2]; y = [1:0.1:3];
[X Y] = meshgrid(x,y);
f = Y­X­2*X.^2­2*X.*Y­Y.^2;
surfc(X,Y,f)

Gráfica en Python
(Matplotlib)
grafico14_10.py
Problema 14.10
● Código en Octave: fuerzabruta.m
● Código en Python: fuerzabruta.py
Métodos directos
● Búsqueda aleatoria (método de Monte Carlo)

Se evalúan puntos de coordenadas aleatorias:

x= x l  x u−x l r
y=yl  y u−y l r

donde r es un número aleatorio uniformemente


distribuido entre 0 y 1
Búsqueda aleatoria: Pseudocódigo
iniciar xl; xu; yl; yu; nPuntos
    
iniciar opt = ­Inf
definir funcion f
definir funcion r    # funcion para obtener numero aleatorio [0;1)

rangoX = xu – xl; rangoY = yu ­ yl
repetir para i dede 1 hasta nPuntos:
x = xl + rangoX * r
y = yl + rangoY * r
f = f(x,y)
si f > opt:
opt = f; xopt = x; yopt = y 
mostrar xopt, yopt, opt

     
   
Ejemplo 14.1
Hallar el máximo de
2 2
f  x , y=y−x−2 x −2 x y− y , x ∈[−2 ; 2] , y∈[1 ; 3]
Las coordenadas de
cada punto se
determinan por:
x=...=−24 r
y=...=12 r

● Código en Octave: montecarlo.m


● Código en Python: montecarlo.py
Problemas 14.1 a 14.12 pag. 396
Estudio de casos
1) Diseño de un tanque con el menor costo
Parámetros
V 0=0.8 m 3
t=3 cm
kg
=8000 3
m
L máx =2 m
D máx =1 m
c m=4.5 $ /kg
c w =20 $ / m Variables de diseño: V y D
Diseño de un tanque con el menor costo

Problema: minimizar FO (costo):


C=c m mc w l w
donde

[  ]
2 2

 
2
D D D
V cil =L  t −  V tapa = t t
2 2 2

m=  V cil 2 V tapa 


[  
D D
]
l w =2 2  t  2  =4   Dt
2 2

 D2 L 4V0 40.8
=V 0 ⇒ L= 2
⇒ L máx = 2
=1.0186
4 D  1 m
Diseño de un tanque con el menor costo

Problema de optimización 1D (D) restringida (..?)

● Código en Octave: p16_1.m


Máxima transferencia de potencia
en un circuito
Ra : potenciómetro
Parámetros
V =80 V R 1=8
R 2 =12  R 3=10 

Según las leyes de


Kirchhoff:
2

P  R a =
[ V R3 Ra
R 1  R a R2 R 3  R3 R a R 3 R2 ]
Ra
Máxima transferencia de potencia
en un circuito
Realizar un análisis de sensibilidad que muestre
cómo varía la máxima potencia conforme V varía
entre 45 a 105 V.
● Código en Octave: p16_3.m
Problemas 16.1 a 16.29, pag. 440

También podría gustarte