UNIVERSIDAD NACIONAL DE TRUJILLO
ESCUELA DE POSTGRADO

 

a

           CURSO:      Métodos y Modelos de Optimización

 

        TEMA:        Optimización de una función no restringida
                                       de una variable

 

        PROFESOR: Dr. Joaquín Lombira Echevarría

 

        ALUMNO:

                              Ing. Walter Moreno Eustaquio

 

 

         FECHA:        10 de Marzo de 2007

 

TRUJILLO - PERU
                       

 

 

 

OPTIMIZACIÓN DE UNA FUNCIÓN DE UNA SOLA VARIBLE

 

  1. Problema.

La razón de crecimiento de una levadura que produce un antibiótico es una función de la concentración del alimento c,

g = __________2c__________
         4  +  0.8 c  + c2 + 0.2 c3

Como se ilustra en la siguiente figura 1, el crecimiento parte de cero a muy baja concentraciones debido a la alimentación de la comida. También parte de cero en altas concentraciones debido a los efectos de toxicidad. Encuentre el valor de c para cual el crecimiento es un máximo.

b
 Figura 1.

2.- Solución:
            Para la solución de este problema se emplearon los diferentes métodos desarrollados en clase, tanto de tipo indirecto (Newton Raphson), como de tipo directo (Eliminación de regiones) usando Matlab como lenguaje de programación.

            Se presenta su ejecución de cada uno de ellos con sus respectivos resultados y conclusiones. Según el problema la optimización consiste en una maximización.

function y=f(x)
y = 2*x / (4+0.8*x+x^2+0.2*x^3);

function y=df(x)
y = (8-2*x^2-0.8*x^3) / (4+0.8*x+x^2+0.2*x^3);

function y=d2f(x)
y = (-12.8-36*x-8.8*x^2+9.28*x^3+5.6*x^4+0.96*x^5)/(4+0.8*x+x^2+0.2*x^3);

clear
error =0.0001;
exito =0;
x0 =input('valor inicial : ');
iter =0;
fprintf('-----------------------------------------------------\n');
fprintf('Iteraccion      x0       df(x0)    d2f(x0)     x     \n');
fprintf('-----------------------------------------------------\n');
while exito==0
    iter = iter+1;
    x= x0 - df(x0)/d2f(x0);
    fprintf('%6.0f%15.6f %10.6f%10.6f%10.6f\n',iter,x0,df(x0),d2f(x0),x);  
    if abs(df(x0))<=error
        fprintf('-----------------------------------------------------\n');
        fprintf('El c optimo es : %10.6f\n',x);
        fprintf('El valor optimo de g es : %10.6f\n',f(x));
        exito=1;
    else
        x0=x;
    end
end

>> opt_raphson
Valor inicial: 0
--------------------------------------------------------------
Iteración      x0           df (x0)      d2f(x0)         x    
--------------------------------------------------------------
     1       0.000000   2.000000 -3.200000  0.625000
     2       0.625000   1.421906 -7.192260  0.822699
     3       0.822699   1.138534 -7.395533  0.976648
     4       0.976648   0.902995 -7.052333  1.104690
     5       1.104690   0.703019 -6.413603  1.214304
     6       1.214304   0.531814 -5.609028  1.309118
     7       1.309118   0.385251 -4.722829  1.390690
     8       1.390690   0.261094 -3.821537  1.459012
     9       1.459012   0.158886 -2.969798  1.512512
    10      1.512512   0.080159 -2.242420  1.548259
    11      1.548259   0.028255 -1.727355  1.564616
    12      1.564616   0.004699 -1.484000  1.567782
    13      1.567782   0.000153 -1.436339  1.567889
    14      1.567889   0.000000 -1.434727  1.567889
--------------------------------------------------------------
El c óptimo es:         1.567889
El valor óptimo de g es:   0.369635  

 

2.2.- Método de los dos puntos igualmente espaciados

clear
error=0.0001;
a=input('valor inicial a : ');
b=input('valor inicial b : ');
x1=a+(b-a)/3;
x2=b-(b-a)/3;
exito=0;
iter=0;
fprintf('---------------------------------------------------------------------------\n');
fprintf('Interaction        a         b        x1        x2       f(x1)     f(x2)   \n');
fprintf('---------------------------------------------------------------------------\n');
while exito==0
    iter=iter+1;
    fprintf('%6.0f%15.6f %10.6f%10.6f%10.6f%10.6f%10.6f\n',iter,a,b,x1,x2,f(x1),f(x2));  
    if(f(x1)<f(x2))      
        a=x1;
                x1=a+(b-a)/3;
                x2=b-(b-a)/3;
    else
        if(f(x1)>f(x2))
            b=x2;
            x1=a+(b-a)/3;
            x2=b-(b-a)/3;
        end
    end   
    if abs(a-b)<=error
        fprintf('---------------------------------------------------------------------------\n');
        fprintf('el c optimo es : %10.6f\n',x1);
        fprintf('El g optimo es : %10.6f\n',f(x1));
        exito=1;
    end
end

>> opt_eli
valor inicial a : 0
valor inicial b : 5
------------------------------------------------------------------------------------------
Iteration         a                b               x1             x2          f(x1)             f(x2)  
-----------------------------------------------------------------------------------------
     1        0.000000   5.000000  1.666667  3.333333  0.368852  0.264706
     2        0.000000   3.333333  1.111111  2.222222  0.347341  0.344241
     3        0.000000   2.222222  0.740741  1.481481  0.283669  0.368974
     4        0.740741   2.222222  1.234568  1.728395  0.358462  0.367637
     5        1.234568   2.222222  1.563786  1.893004  0.369633  0.362139
     6        1.234568   1.893004  1.454047  1.673525  0.368471  0.368743
     7        1.454047   1.893004  1.600366  1.746685  0.369547  0.367180
     8        1.454047   1.746685  1.551593  1.649139  0.369612  0.369100
     9        1.454047   1.649139  1.519077  1.584108  0.369428  0.369613
    10       1.519077   1.649139  1.562431  1.605785  0.369632  0.369516
    11       1.519077   1.605785  1.547980  1.576882  0.369601  0.369628
    12       1.547980   1.605785  1.567248  1.586517  0.369635  0.369606
    13       1.547980   1.586517  1.560826  1.573671  0.369631  0.369632
    14       1.560826   1.586517  1.569389  1.577953  0.369635  0.369626
    15       1.560826   1.577953  1.566535  1.572244  0.369635  0.369633
    16       1.560826   1.572244  1.564632  1.568438  0.369634  0.369635
    17       1.564632   1.572244  1.567169  1.569706  0.369635  0.369635
    18       1.564632   1.569706  1.566323  1.568015  0.369635  0.369635
    19       1.566323   1.569706  1.567451  1.568579  0.369635  0.369635
    20       1.566323   1.568579  1.567075  1.567827  0.369635  0.369635
    21       1.567075   1.568579  1.567576  1.568077  0.369635  0.369635
    22       1.567576   1.568579  1.567910  1.568245  0.369635  0.369635
    23       1.567576   1.568245  1.567799  1.568022  0.369635  0.369635
    24       1.567576   1.568022  1.567725  1.567873  0.369635  0.369635
    25       1.567725   1.568022  1.567824  1.567923  0.369635  0.369635
    26       1.567824   1.568022  1.567890  1.567956  0.369635  0.369635
    27       1.567824   1.567956  1.567868  1.567912  0.369635  0.369635
----------------------------------------------------------------------------------------
el x optimo es :   1.567853
El y optimo es :   0.369635

2.3.- Método de la bisección

% Método de la Bisección o Búsqueda dicotomica para optimizar funciones
% de una sola Variable:
clear
error=0.0001;
delta=0.00001;
a=input('valor inicial a : ');
b=input('valor inicial b : ');
x1=(a+b-delta)/2;
x2=(a+b+delta)/2;
exito=0;
iter=0;
fprintf('    ERROR     DELTA\n');
fprintf('%10.6f%10.6f\n',error,delta);
fprintf('---------------------------------------------------------------------------\n');
fprintf('Iteraccion        a         b        x1        x2       f(x1)     f(x2)   \n');
fprintf('---------------------------------------------------------------------------\n');
while exito==0
    iter=iter+1;
    fprintf('%6.0f%15.6f %10.6f%10.6f%10.6f%10.6f%10.6f\n',iter,a,b,x1,x2,f(x1),f(x2));
    if(f(x1)<f(x2))      
        a=x1;
                x1=(a+b-delta)/2;
        x2=(a+b+delta)/2;
    else
                if(f(x1)>f(x2))
                    b=x2;
                    x1=(a+b-delta)/2;
            x2=(a+b+delta)/2;
        end
    end   
    if abs(b-a)<=error
        fprintf('---------------------------------------------------------------------------\n');
        fprintf('el c optimo es : %10.6f\n',x1);
        fprintf('El g optimo es : %10.6f\n',f(x1));
        exito=1;
    end
end

>> dico
valor inicial a : 0
valor inicial b : 5
    ERROR     DELTA
  0.000100  0.000010
----------------------------------------------------------------------------------------
Iteración          a                b             x1             x2          f(x1)         f(x2)  
----------------------------------------------------------------------------------------
     1        0.000000   5.000000  2.499995  2.500005  0.325204  0.325203
     2        0.000000   2.500005  1.249997  1.250007  0.359550  0.359551
     3        1.249997   2.500005  1.874996  1.875006  0.362881  0.362880
     4        1.249997   1.875006  1.562497  1.562507  0.369632  0.369632
     5        1.562497   1.875006  1.718747  1.718757  0.367861  0.367860
     6        1.562497   1.718757  1.640622  1.640632  0.369205  0.369205
     7        1.562497   1.640632  1.601559  1.601569  0.369541  0.369541
     8        1.562497   1.601569  1.582028  1.582038  0.369618  0.369618
     9        1.562497   1.582038  1.572262  1.572272  0.369633  0.369633
    10       1.562497   1.572272  1.567380  1.567390  0.369635  0.369635
    11       1.567380   1.572272  1.569821  1.569831  0.369635  0.369635
    12       1.567380   1.569831  1.568600  1.568610  0.369635  0.369635
    13       1.567380   1.568610  1.567990  1.568000  0.369635  0.369635
    14       1.567380   1.568000  1.567685  1.567695  0.369635  0.369635
    15       1.567685   1.568000  1.567837  1.567847  0.369635  0.369635
    16       1.567837   1.568000  1.567914  1.567924  0.369635  0.369635
----------------------------------------------------------------------------------------
El c óptimo es:   1.567876
El g óptimo es:   0.369635

2.4.- Método de la Sección Áurea o Método de la Regla de Oro

% Método de la Sección dorada para optimizar funciones de una
% sola Variable:

clear
error=0.0001;
a=input('valor inicial a : ');
b=input('valor inicial b : ');
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
exito=0;
iter=0;
fprintf('---------------------------------------------------------------------------\n');
fprintf('Iteraccion        a         b        x1        x2       f(x1)     f(x2)   \n');
fprintf('---------------------------------------------------------------------------\n');
while exito==0
     iter=iter+1;
    fprintf('%6.0f%15.6f%10.6f%10.6f%10.6f%10.6f%10.6f\n',iter,a,b,x1,x2,f(x1),f(x2));  
    if(f(x1)<f(x2))      
        a=x1;
                x1=a+0.382*(b-a);
        x2=a+0.618*(b-a);
    else
                if(f(x1)>f(x2))
                    b=x2;
                    x1=a+0.382*(b-a);
            x2=a+0.618*(b-a);
        end
    end   
    if abs(b-a)<=error
        fprintf('---------------------------------------------------------------------------\n');
        fprintf('el c optimo es : %10.6f\n',x1);
        fprintf('El g optimo es : %10.6f\n',f(x1));
        exito=1;
    end
end

>> dorada
valor inicial a : 0
valor inicial b : 5
---------------------------------------------------------------------------------------
Iteración          a                 b             x1             x2           f(x1)        f(x2)  
---------------------------------------------------------------------------------------
     1        0.000000   5.000000  1.910000  3.090000  0.361411  0.281924
     2        0.000000   3.090000  1.180380  1.909620  0.354122  0.361428
     3        1.180380   3.090000  1.909855  2.360525  0.361418  0.335038
     4        1.180380   2.360525  1.631195  1.909710  0.369307  0.361424
     5        1.180380   1.909710  1.458984  1.631106  0.368572  0.369308
     6        1.458984   1.909710  1.631161  1.737532  0.369308  0.367414
     7        1.458984   1.737532  1.565389  1.631127  0.369634  0.369308
     8        1.458984   1.631127  1.524743  1.565368  0.369474  0.369634
     9        1.524743   1.631127  1.565381  1.590488  0.369634  0.369592
    10       1.524743   1.590488  1.549857  1.565373  0.369607  0.369634
    11       1.549857   1.590488  1.565378  1.574967  0.369634  0.369631
    12       1.549857   1.574967  1.559449  1.565375  0.369629  0.369634
    13       1.559449   1.574967  1.565377  1.569039  0.369634  0.369635
    14       1.565377   1.574967  1.569041  1.571304  0.369635  0.369634
    15       1.565377   1.571304  1.567641  1.569040  0.369635  0.369635
    16       1.565377   1.569040  1.566776  1.567641  0.369635  0.369635
    17       1.566776   1.569040  1.567641  1.568175  0.369635  0.369635
    18       1.566776   1.568175  1.567311  1.567641  0.369635  0.369635
    19       1.567311   1.568175  1.567641  1.567845  0.369635  0.369635
    20       1.567641   1.568175  1.567845  1.567971  0.369635  0.369635
    21       1.567641   1.567971  1.567767  1.567845  0.369635  0.369635
    22       1.567767   1.567971  1.567845  1.567893  0.369635  0.369635
    23       1.567845   1.567971  1.567893  1.567923  0.369635  0.369635
----------------------------------------------------------------------------------------
El c óptimo es:   1.567875
El g óptimo es:   0.369635

2.5.- Método de Fibonacci

clear
a=input('valor inicial a : ');
b=input('valor inicial b : ');
while a>=b
    if a>=b
        frintf('a debe ser menor que b\n');
    end
    a=input('valor inicial a : ');
    b=input('valor inicial b : ');
end
error=input('Valor del error : ');
while error<=0
    error=input('Valor del error : ');
end
Fi(1)=1;
Fi(2)=1;
FIB =(b-a)/error;
I=3;
Fi(I)=Fi(I-2)+Fi(I-1);
while Fi(I)<FIB
    I= I+1;
    Fi(I)=Fi(I-2)+Fi(I-1);
end
n=I;
Fi(n+1)=Fi(n)+Fi(n-1);

x1=(Fi(n-1)/Fi(n+1))*(b-a) +a;
x2=(Fi(n)/Fi(n+1))*(b-a) +a;
iter=0;
fprintf('---------------------------------------------------------------------------\n');
fprintf('Iteraccion        a         b        x1        x2       f(x1)     f(x2)   \n');
fprintf('---------------------------------------------------------------------------\n');
for k=1:n-1
    iter=iter+1;
    fprintf('%6.0f%15.6f %10.6f%10.6f%10.6f%10.6f%10.6f\n',iter,a,b,x1,x2,f(x1),f(x2));  
    if(f(x1)<f(x2))      
       a=x1;
               x1=(Fi(n-(k+1))/Fi(n-(k-1)))*(b-a) +a;
       x2=(Fi(n-k)/Fi(n-(k-1)))*(b-a) +a;
    else
                if(f(x1)>f(x2))
                   b=x2;
               x1=(Fi(n-(k+1))/Fi(n-(k-1)))*(b-a) +a;
           x2=(Fi(n-k)/Fi(n-(k-1)))*(b-a) +a;
        end
    end
end
fprintf('---------------------------------------------------------------------------\n');
fprintf('el c optimo es : %10.6f\n',x1);
fprintf('El g optimo es : %10.6f\n',f(x1));

>> fibonacci4
valor inicial a : 0
valor inicial b : 5
Valor del error : 0.0001
----------------------------------------------------------------------------------------
Iteración         a                 b             x1              x2          f(x1)          f(x2)  
----------------------------------------------------------------------------------------
     1        0.000000   5.000000  1.909830  3.090170  0.361419  0.281911
     2        0.000000   3.090170  1.180340  1.909830  0.354118  0.361419
     3        1.180340   3.090170  1.909830  2.360680  0.361419  0.335027
     4        1.180340   2.360680  1.631190  1.909830  0.369307  0.361419
     5        1.180340   1.909830  1.458980  1.631190  0.368572  0.369307
     6        1.458980   1.909830  1.631190  1.737621  0.369307  0.367412
     7        1.458980   1.737621  1.565412  1.631190  0.369634  0.369307
     8        1.458980   1.631190  1.524758  1.565412  0.369474  0.369634
     9        1.524758   1.631190  1.565412  1.590537  0.369634  0.369592
    10       1.524758   1.590537  1.549883  1.565412  0.369607  0.369634
    11       1.549883   1.590537  1.565412  1.575008  0.369634  0.369631
    12       1.549883   1.575008  1.559480  1.565412  0.369629  0.369634
    13       1.559480   1.575008  1.565412  1.569077  0.369634  0.369635
    14       1.565412   1.575008  1.569077  1.571343  0.369635  0.369634
    15       1.565412   1.571343  1.567677  1.569077  0.369635  0.369635
    16       1.565412   1.569077  1.566812  1.567677  0.369635  0.369635
    17       1.566812   1.569077  1.567677  1.568212  0.369635  0.369635
    18       1.566812   1.568212  1.567347  1.567677  0.369635  0.369635
    19       1.567347   1.568212  1.567677  1.567883  0.369635  0.369635
    20       1.567677   1.568212  1.567883  1.568006  0.369635  0.369635
    21       1.567677   1.568006  1.567800  1.567883  0.369635  0.369635
    22       1.567800   1.568006  1.567883  1.567924  0.369635  0.369635
    23       1.567800   1.567924  1.567842  1.567883  0.369635  0.369635
    24       1.567842   1.567924  1.567883  1.567883  0.369635  0.369635
-----------------------------------------------------------------------------------------
El c óptimo es:   1.567883
El g óptimo es:   0.369635

3.- Resultados y Conclusiones:

Método

c óptimo

g óptimo

Iteración 

1.- Newton-Raphson

1.567889

0.369635  

14

2.- Dos puntos igualmente espaciados

1.567853

0.369635

27

3.- Método de la bisección

1.567876

0.369635

16  

4.- Método de la Sección Áurea

1.567875

0.369635

23

5.- Método de Fibonacci

1.567883

0.369635

24

La aplicación de los diferentes métodos dan el mismo resultado de optimización para maximizar en este caso el valor de la función g. Los métodos 1 y 3 según nuestra tabla anterior  tienen menos iteraciones,  la diferencia entre estos dos métodos es que el método de Newton Raspón (Método indirecto), parte de un punto, para encontrar el valor óptimo,  por lo que es necesario derivar dos veces la función objetivo, este método es bondadoso cuando la primera y segunda derivada de la función que se desea optimizar son relativamente fácil solución, cuando derivar sea mas complejo muy bien se puede emplear los métodos de eliminaciones de región (métodos directos).
Según el resultado en lo métodos directos el numero de iteraciones esta en relación al criterio empleado en definir los dos puntos en el intervalo donde se encuentra el valor de x optimo, de la función objetivo de una variable, por ejemplo el método de bisección es el que presenta el menor número de iteraciones, por que en cada iteración se elimina casi la mitad del intervalo, mayor que el resto de métodos se puede verificar según la siguiente tabla:

Métodos Indirectos

Intervalo

% eliminado

Iteración 

 

 

 

 

2.- Dos puntos igualmente espaciados

LK=(2/3)Lº

33.33

27

3.- Método de la bisección

LK=(1/2)Lº

50.00

16  

4.- Método de la Sección Áurea

LK=(0.618)Lº

38.20

23

5.- Método de Fibonacci

dk=0.3820LK

38.00

24

            El método de la bisección es un método es mas eficiente que el resto de los métodos directos para la solución de maximización de nuestra función objetivo:

g = __________2c__________
                                 4  +  0.8 c  + c2 + 0.2 c3
cde