Upload
fercienciasquimicas
View
19
Download
2
Embed Size (px)
Citation preview
UNIVERSIDAD AUTONOMA DE COAHUILA
Métodos de optimización
Simulación y optimización
FERNANDO ARANDA GUEVARA
29/10/2013
Métodos de búsqueda unidireccional y optimización multivariable sin restricciones
BÚSQUEDA UNIDIRECCIONAL: MÉTODOS DE APROXIMACIÓN POLINÓMICA. Otra clase de métodos de minimización unidimensional localizan un punto x cercano a x*, el valor de la variable independiente correspondiente al mínimo de f(x), por interpolación y extrapolación utilizando aproximaciones polinómicas a f(x). Se han propuesto tanto aproximaciones cuadráticas como cúbicas usando tanto los valores de la función solamente como los de sus derivadas primeras. Se ha comprobado que los métodos de interpolación polinómica son normalmente ligeramente mejores que el método de la sección áurea.
Interpolación cuadrática. Si comenzamos con tres puntos, por ejemplo x1, x2, x3 en orden creciente, y no necesariamente igualmente espaciados, pero contenidos dentro de la zona de
búsqueda (a,b), podemos aproximarlos a un polinomio de grado 2, f xa bx
cx2 de tal manera que dicho polinomio pasa exactamente por esos tres puntos y debe presentar un mínimo en:
Si suponemos que f(x) se evalúa en los tres puntos, podríamos calcular los valores de a, b, c resolviendo el sistema de tres ecuaciones lineales:
lo que nos lleva a :
Criterio de selección:
I. Si x* esta entre x2 y x3
a). f*<f2 y f*<f3 entonces x2, x*,x3
b). f*>f2 y f*<f3 entonces x1,x2 ,x
II Si x* está entre x1 y x2
a). f*<f2 y f*<f1 entonces x1, x*, x2
b). f*>f2 y f*<f1 entonces x* , x2 ,x3
Ejercicio:
Encontrar por el método de interpolación cuadrada el mínimo de la siguiente
función.
Si tomamos las siguientes aproximaciones:
x1=-5 x2=-4 x3=-3
Observamos que el método se desborda y nos arroja un resultado equivocado de
x*= -2.5954
Si tomamos las siguientes aproximaciones:
x1=+3 x2=+4 x3=+5
Observamos que el método se desborda y nos arroja un resultado equivocado de
x*= 2.6005
Si tomamos las siguientes aproximaciones:
x1=-5 x2=-4 x3=+3
Observamos que el mínimo es x*= 0.5000
Si tomamos las siguientes aproximaciones:
x1=-3 x2=+4 x3=+5
Observamos que el mínimo es x*= 0.5000
Si tomamos las siguientes aproximaciones:
x1=-0.005 x2=-0.004 x3=0.9
Observamos que el mínimo es x*= 0.5000
Si tomamos las siguientes aproximaciones:
x1=-0.0005 x2=0.0004 x3=0.8
Observamos que el mínimo es x*= 0.5000
Conclusiones sobre el método:
Es un método de fácil programación pero no acepta valores muy lejanos al punto
de búsqueda (mínimo) y no acepta que las tres aproximaciones estén ubicadas a
la derecha o izquierda del punto que buscamos. También es necesario dar las
aproximaciones en orden creciente.
-10 -8 -6 -4 -2 0 2 4 6 8
-1
0
1
2
3
4
5
x 104
valores X
valo
res Y
METODO PROGRAMADO EN MATLAB:
%interpolacion polinomial% clc x1=input('dame el primer valor '); x2=input('dame el segundo valor '); x3=input('dame el tercer valor '); f1=6*x1^4-3*x1+7 f2=6*x2^4-3*x2+7 f3=6*x3^4-3*x3+7 subs x x=0.5*(((x2^2-x3^2)*f1+(x3^2-x1^2)*f2+(x1^2-x2^2)*f3)/(((x2-
x3)*f1+(x3-x1)*f2+(x1-x2)*f3))) f=6*x^4-3*x+7 i=0 while 1000>i if x2<x if x<x3 sprintf('x esta entre x2 y x3') if f<f3 if f<f2 sprintf('se cumplen las condiciones a')
x1=x2 x2=x x3=x3 f1=6*x1^4-3*x1+7 f2=6*x2^4-3*x2+7 f3=6*x3^4-3*x3+7 x=0.5*(((x2^2-x3^2)*f1+(x3^2-x1^2)*f2+(x1^2-
x2^2)*f3)/(((x2-x3)*f1+(x3-x1)*f2+(x1-x2)*f3))) f=6*x^4-3*x+7 else if f>f2 sprintf('se cumplen las condiciones b') x1=x1 x2=x2 x3=x f1=6*x1^4-3*x1+7 f2=6*x2^4-3*x2+7 f3=6*x3^4-3*x3+7 x=0.5*(((x2^2-x3^2)*f1+(x3^2-x1^2)*f2+(x1^2-
x2^2)*f3)/(((x2-x3)*f1+(x3-x1)*f2+(x1-x2)*f3))) f=6*x^4-3*x+7 else end end else end else end
else if x1<x sprintf('x esta entre x1 y x2 ') if f<f1 if f<f2 sprintf('se cumplen las condiciones a') x1=x1 x3=x2 x2=x
f1=6*x1^4-3*x1+7 f2=6*x2^4-3*x2+7 f3=6*x3^4-3*x3+7 x=0.5*(((x2^2-x3^2)*f1+(x3^2-x1^2)*f2+(x1^2-
x2^2)*f3)/(((x2-x3)*f1+(x3-x1)*f2+(x1-x2)*f3))) f=6*x^4-3*x+7 else if f>f2 sprintf('se cumplen las condiciones b') x1=x x2=x2 x3=x3 f1=6*x1^4-3*x1+7 f2=6*x2^4-3*x2+7 f3=6*x3^4-3*x3+7 x=0.5*(((x2^2-x3^2)*f1+(x3^2-x1^2)*f2+(x1^2-
x2^2)*f3)/(((x2-x3)*f1+(x3-x1)*f2+(x1-x2)*f3))) f=6*x^4-3*x+7 else end
end else end else end end i=i+1 end sprintf('el minimo es ') x sprintf('¿quieres ver la grafica? si=1 no=2 ') s=input('dame tu eleccion '); if s==1 x=-10:0.1:10 y=6*x.^4-3*x+7 plot(x,y) end
Sección dorada.
El método solicita una aproximación adecuada a la función problema así como
también requiere un tamaño de paso coherente, a partir de estos dos valores el
método comienza a realizar iteraciones reduciendo el tamaño de paso en cada una
de ellas hasta encontrar el punto mínimo de la función, básicamente trabaja
eliminando regiones de búsqueda en cada iteración.
Los métodos más eficientes de búsqueda por eliminación de regiones son los métodos de Fibonacci y de la ‘sección áurea’, los cuales usan una relación constante para dividir el intervalo en segmentos. Pasaremos a discutir el método de la sección áurea que viene de los números de Fibonacci. La estrategia empleada en el método de la sección áurea es localizar dos puntos interiores del intervalo eliminado en cada iteración de tal manera que se cumpla la relación:
Además solamente una nueva evaluación se realiza en cada etapa de búsqueda.
Ejercicio:
Encontrar por el método de la sección dorada el mínimo de la siguiente función.
Si tomamos los siguientes valores x1=3 y tamaño de paso s=0.005 nos
arroja lo que sigue.
x4 =0.5059 la función evaluada es f4 =-5.8753
Si tomamos los siguientes valores x1=-30 y tamaño de paso s=0.0005 nos
arroja lo que sigue.
x4 = 0.4902 la función evaluada es f4 = -5.8759
Si tomamos los siguientes valores x1=0.002 y tamaño de paso s=0.00005
nos arroja lo que sigue.
x4 = 0.5016 la función evaluada es f4 = -5.8750
Conclusiones del método:
P ara calcular el mínimo de una función utilizando este método es necesario
multiplicar la función objetivo por (-1). Es fácil de utilizar ya que solo necesita dos
valores iniciales para comenzar las iteraciones.
-10
-5
0
5
-6-5-4-3-2-10x 10
4
-1
-0.5
0
0.5
1
valores yvalores x
METODO PROGRAMADO EN MATLAB:
%seccion dorad% clc x1=input('dame x1 '); s=input('dame el tamaño de paso '); x3=x1+s; f1=-6*x1^4+3*x1-7; f3=-6*x3^4+3*x3-7; t=0.618034; if f3>f1 else x3=x1; x1=x1+s; s=-1*s; end s=s/t; x2=x3+s; f2=-6*x2^4+3*x2-7; f3=-6*x3^4+3*x3-7;
while f2>f3 x1=x3; x3=x3+s; f1=-6*x1^4+3*x1-7; f3=-6*x3^4+3*x3-7; s=s/t; x2=x3+s; f2=-6*x2^4+3*x2-7; end x1; x2; x3; f2=-6*x2^4+3*x2-7; f1=-6*x1^4+3*x1-7; f3=-6*x3^4+3*x3-7; x4=(1-t)*x1+t*x2; f4=-6*x4^4+3*x4-7; l=abs(f3-f4);
while 0.001<l if f3>f4 x2=x1; x1=x4; x3=x3; x4=(1-t)*x1+t*x2; f2=-6*x2^4+3*x2-7; f1=-6*x1^4+3*x1-7; f4=-6*x4^4+3*x4-7; f3=-6*x3^4+3*x3-7; l=abs(f3-f4); else x1=x3; x2=x2; x3=x4; x4=(1-t)*x1+t*x2; f2=-6*x2^4+3*x2-7; f1=-6*x1^4+3*x1-7; f4=-6*x4^4+3*x4-7;
f3=-6*x3^4+3*x3-7; l=abs(f3-f4); end
end disp ('el minimo de la funcion es ') x4 disp ('la funcion evaluada es ') f4=-6*x4^4+3*x4-7
sprintf('¿quieres ver la grafica? si=1 no=2 ') s=input('dame tu eleccion '); if s==1 x=-10:0.1:10 y=-6*x.^4+3*x-7 plot(x,y) end
Método de Newton en diferencias finitas Los métodos en diferencias finitas tipo Newton, se utilizan si la derivada de la función objetivo es difícil de calcular, o ésta viene dada de forma numérica. Se basan en sustituir las derivadas por aproximaciones en diferencias finitas.
Ejercicio:
Encontrar por el método de diferencias finitas el mínimo de la siguiente función.
Si tomamos x0= -0.00003 entonces min = 0.5099
Si tomamos x0= 389 entonces min = 0.5098
METODO PROGRAMADO EN MATLAB:
%diferencias finitas % clc xo=input('dame la primera aproximacion '); n=1000; tol=0.001; [con,x]=cuasinewton('taller3',xo,n,tol); min=x
function [con,x]=cuasinewton(f,xo,n,tol) for i=1:n dx=xo/1000; fd=(feval(f,xo+dx)-feval(f,xo-dx))/dx; fdd=(feval(f,xo+dx)-2*feval(f,xo)+feval(f,xo-dx))/dx^2; x=xo-fd/fdd; if (abs((x-xo)/x))<tol con=true; return
else xo=x; con=false; end end end
Conclusión del método:
En este método de diferencias finitas no es necesario calcular la derivada de la
función de forma analítica ya que esto se hace por medio de las aproximaciones
en diferencias finitas que pueden ser diferencias centrales, hacia adelante o hacia
atrás.
Método de Newton
De acuerdo con la primera condición necesaria para que una función tuviera un
mínimo local se debe cumplir que f 'x0. Por lo tanto podemos aplicar el
método de Newton a la derivada, así: Realmente lo que hace el método de Newton es aproximar la función por una
función cuadrática en xk.
y dado que f 'x0, diferenciando la ecuación anterior:
0
Que se puede reordenar para dar la primera ecuación. El método de Newton es equivalente a usar un modelo cuadrático y aplicar las condiciones necesarias de optimalidad.
Ejercicio:
Encontrar por el método de newton el mínimo de la siguiente función.
Si tomamos x0= -0.00003 entonces min = 0.5000
Si tomamos x0= 389 entonces min = 0.5000
METODO PROGRAMADO EN MATLAB:
%metodo de newton% clc xo=3; n=1000; tol=0.001; [con,x]=newton('taller3d','taller3dd',xo,n,tol); resultado=x
function y=taller3d(xo) y=24*xo^3-3; end
function y=taller3dd(xo) y=72*xo^2; end
Conclusión del método:
El procedimiento es cuadráticamente convergente (p=2), siempre que f ''(x) 0 y Para una función cuadrática el mínimo se obtiene en una única iteración. Si existe más de un extremo, el método podría no converger al extremo deseado. Además el método podría oscilar.
Método de la secante
Los métodos de secante toman dos puntos, xp y xq y resuelve una ecuación similar
a la dada en el método de Newton:
El método de la secante aproxima la segunda derivada por una línea recta.
Cuando xqxp el valor de m se aproximará al valor de la segunda derivada. En este sentido el método de la secante se podría considerar también un método cuasi Newton. Admitiendo que la función es unimodal, el método comienza con dos puntos cualquiera del intervalo de tal manera que la primera derivada tenga signos diferentes. Calculando el cero de la ecuación de partida se obtiene.
Los dos puntos seleccionados para el paso siguiente son x* y xp ó xq dependiendo de los signos de f’(xp) y de f’(xq) con respecto al de f (x*)
El método de la secante parece bastante “crudo” pero funciona bastante bien en la práctica. El orden de convergencia para funciones de una sola variable es de
15/ 2 1.6. Su convergencia es ligeramente menor que la del método de
Newton de diferencias finitas, pero en muchas ocasiones funciona mejor que este en lo que a número de evaluaciones de la función objetivo se refiere. . Ejercicio:
Encontrar por el método de la secante el mínimo de la siguiente función.
Si tomamos xp= 90; xq=95 entonces x= 0.5001 con 95102 iteraciones.
Si tomamos xp= 3;xq=4 entonces x= 0.5001 con 122 Iteraciones.
Si tomamos xp= -17; xq=17 entonces x= 0.4999 con 3969 iteraciones.
Conclusión del método:
El método de la secante solo utiliza l derivada de la función y dos valores iniciales para realizar las iteraciones. El valor que se mantiene constante es el valor de xp y el método termina cuando encuentra un valor tal que df/dx=0
METODO PROGRAMADO EN MATLAB:
%metodo de la secante% clc xp=input('dame xp aproximacion '); xq=input('dame xq aproximacion '); fp=24*xp^3-3; fq=24*xq^3-3; x=xq-(fq*(xq-xp)/(fq-fp)); f=24*x^3-3; e=0.001; i=0; while (abs(f))>e xq=x; xp=xp; fp=24*xp^3-3; fq=24*xq^3-3; x=xq-(fq*(xq-xp)/(fq-fp)); f=24*x^3-3; i=i+1; end sprintf('el numero de iteraciones '); i
sprintf('el valor del minimo es '); x
-10
-5
0
5
10 -5
0
5
10
x 104
-1
0
1 funcion
derivada de la funcion
OPTIMIZACIÓN NUMÉRICA MULTIVARIABLE SIN RESTRICCIONES
La optimización numérica de funciones no lineales requiere la utilización de técnicas de optimización eficiente y robusta. La eficiencia es importante porque la solución de estos problemas se lleva a cabo por un procedimiento iterativo. La robustez (habilidad para encontrar la solución) es una propiedad deseable dado que el comportamiento de las funciones no lineales puede ser impredecible: pueden presentar máximos, mínimos y puntos de silla. En algunas regiones el avance hacia el óptimo puede ser muy lento, necesitando mucho tiempo de cálculo etc. Afortunadamente se posee mucha experiencia utilizando métodos de optimización numérica lo que permite contar con buenos algoritmos y conocer sus limitaciones y posibilidades.
Método de lagrange
Criterio de selección:
Δ>0 y fxx>0 existe un mínimo relativo
Δ>0 y fxx<0 existe un máximo relativo
Δ<0 no existe ni máximo ni mínimo
Δ=0 el criterio no da información
Ejercicio:
Encontrar el mínimo de la siguiente función.
La primera derivada respecto a x es
grafica de df/dx
-10-5
05
10
-10
0
10-4000
-2000
0
2000
4000
6000
valores xvalores y
valo
res z
La primera derivada respecto a y es
Grafica de df/dx
Resolviendo df/dx y df/dy de manera simultanea tenemos que
Despejando x de df/dx
Sustituyendo x en df/dy y despejando para ‘’y’’ tenemos
Y1= 1.5000
Y2= 1.6514
Y3= -0.1514
X1= -0.5000
x2= -0.6514
x3= 1.1514
-10-5
05
10
-10
-5
0
5
10
-50
0
50
valores x
valores y
valo
res z
Si para cada pareja de valores resolvemos los determinantes tendremos que.
Y1= 1.5000 y X1= -0.5000…… no existe ni máximo ni mínimo.
Y2= 1.6514 y X2= -0.6514……tienes un máximo.
Y3= -0.1514 y x3= 1.1514…….tienes un máximo.
La grafica de la función es:
-10-5
05
10
-10-5
05
10
-12000
-10000
-8000
-6000
-4000
-2000
valores xvalores y
valo
res z
METODO PROGRAMADO EN MATLAB:
%dos dimensiones% clc syms x y f=3.5*x+2*y+x^2-x^4-2*x*y-y^2;
%----------------calculando derivadas de la funcion-------------------
--% sprintf('la 1er derivada respectoa a x es ') f1=diff(f,x)
sprintf('la 2da derivada respectoa a x es ') f2dx=diff(f,x,2)
sprintf('la 1er derivada respectoa a y es ') f2=diff(f,y)
sprintf('la 2da derivada respectoa a y es ') f2dy=diff(f,y,2)
sprintf('la 2da derivada respectoa a y-x es ') f2yx=diff(f2,x)
sprintf('la 1er derivada respectoa a x-y es ') f2xy=diff(f1,y)
%-----------------resolviendo la df/dx y df/dy -----------------------
-% sprintf('si df/dx y df/dy se resuelven por simultaneas presiona 1 de
lo contrario 2') g=input('dame tu eleccion '); if g==1 subs x y sprintf('resolviendo la 1a derivada en x-y ') %--c=df/fy---% w1=input('dame la df/dy '); x=solve(w1*1.0,x) x=x*1.0; %---d=df/dx---% w=input('dame la df/dx '); d=solve(w*1.0,y) sprintf('los valores del polinomio son los siguientes ') y1=input('dame el primer valor del polinomio '); y2=input('dame el segundo valor del polinomio '); y3=input('dame el tercer valor del polinomio '); y1 y2 y3 x1=1-y1 x2=1-y2 x3=1-y3 else
if g==2
subs x y %--w1=df/fy---% w1=input('dame la df/dx '); x=solve(w1*1.0,x) %---d=df/dx---% w=input('dame la df/dy '); d=solve(w*1.0,y) sprintf('los valores del polinomio son los siguientes ') y1=input('dame el primer valor del polinomio y1 '); y2=input('dame el segundo valor del polinomio y2 '); y3=input('dame el tercer valor del polinomio y3 '); y1 y2 y3 x1=input('dame el primer valor del polinomio x1 '); x2=input('dame el segundo valor del polinomio x2 '); x1 x2 end end
%----------------calculando el determinante-------------------------% x1=input('dame el valor de x1 '); y1=input('dame el valor de y1 '); sprintf('introduce los valores en funcion de x1-y1') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x1=input('dame el valor de x2 '); y2=input('dame el valor de y2 ');
sprintf('introduce los valores en funcion de x2-y2') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x1=input('dame el valor de x3 '); y3=input('dame el valor de y3 '); sprintf('introduce los valores en funcion de x3-y3') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else
sprintf('EL CRITERIO NO DA INFORMACION') end
%--------------------------grafica---------------------------------% sprintf('si quieres ver la grafica presiona 2 si no presiona 1') s=input('dame s '); if s>1 sprintf('COMIENZA LA GRAFICA') [x,y]=meshgrid(-10:0.5:10); z=3.5*x+2*y+x.^2-x.^4-2*x*y-y.^2; mesh(x,y,z) else end
Ejercicio:
Encontrar el mínimo de la siguiente función.
La primera derivada respecto a x es
-10-5
05
10
-10
0
10-10
-5
0
5
10
15
20
25
30
valores xvalores y
valo
res z
La primera derivada respecto a y es
Resolviendo df/dx y df/dy de manera independiente tenemos
X1= 9
x2= -9
Y1= 0
Y2= 1
Y3= -1
Si para cada pareja de valores resolvemos los determinantes tendremos que.
-10
-5
0
5
10
-10-5
05
10-4000
-2000
0
2000
4000
valores xvalors y
valo
res z
X1= 9 y Y1=0 tienes un máximo
X1= 9 y Y2=1 no existe ni máximo ni mínimo.
X1= 9 y Y3=-1 no existe ni máximo ni mínimo.
X2=- 9 y Y1=0 no existe ni máximo ni mínimo
X2= -9 y Y2=1 no tienes un mínimo.
X2= -9 y Y3=-1 no tienes un mínimo.
La grafica de la función es:
-10
-5
0
5
10
-10
-50
5
10-2000
0
2000
4000
6000
8000
10000
valores xvalores y
valo
res z
METODO PROGRAMADO EN MATLAB:
%dos dimensiones% clc syms x y f=27*x-(1/9)*x^3-2*y^2+y^4;
%----------------calculando derivadas de la funcion-------------------
--% sprintf('la 1er derivada respectoa a x es ') f1=diff(f,x)
sprintf('la 2da derivada respectoa a x es ') f2dx=diff(f,x,2)
sprintf('la 1er derivada respectoa a y es ') f2=diff(f,y)
sprintf('la 2da derivada respectoa a y es ') f2dy=diff(f,y,2)
sprintf('la 2da derivada respectoa a y-x es ') f2yx=diff(f2,x)
sprintf('la 1er derivada respectoa a x-y es ') f2xy=diff(f1,y)
%-----------------resolviendo la df/dx y df/dy -----------------------
-% sprintf('si df/dx y df/dy se resuelven por simultaneas presiona 1 de
lo contrario 2') g=input('dame tu eleccion '); if g==1 subs x y sprintf('resolviendo la 1a derivada en x-y ') %--c=df/fy---% w1=input('dame la df/dy '); x=solve(w1*1.0,x) x=x*1.0; %---d=df/dx---% w=input('dame la df/dx '); d=solve(w*1.0,y) sprintf('los valores del polinomio son los siguientes ') y1=input('dame el primer valor del polinomio '); y2=input('dame el segundo valor del polinomio '); y3=input('dame el tercer valor del polinomio '); y1 y2 y3 x1=1-y1 x2=1-y2 x3=1-y3 else
if g==2
subs x y %--w1=df/fy---% w1=input('dame la df/dx '); x=solve(w1*1.0,x) %---d=df/dx---% w=input('dame la df/dy '); d=solve(w*1.0,y) sprintf('los valores del polinomio son los siguientes ') y1=input('dame el primer valor del polinomio y1 '); y2=input('dame el segundo valor del polinomio y2 '); y3=input('dame el tercer valor del polinomio y3 '); y1 y2 y3 x1=input('dame el primer valor del polinomio x1 '); x2=input('dame el segundo valor del polinomio x2 '); x1 x2 end end
%----------------calculando los valores-------------------------% x1=input('dame el valor de x1 '); y1=input('dame el valor de y1 '); sprintf('introduce los valores en funcion de x1-y1') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x1=input('dame el valor de x1 '); y2=input('dame el valor de y2 ');
sprintf('introduce los valores en funcion de x1-y2') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x1=input('dame el valor de x1 '); y3=input('dame el valor de y3 '); sprintf('introduce los valores en funcion de x1-y3') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else
sprintf('EL CRITERIO NO DA INFORMACION') end
x2=input('dame el valor de x2 '); y1=input('dame el valor de y1 '); sprintf('introduce los valores en funcion de x2-y1') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x2=input('dame el valor de x2 '); y2=input('dame el valor de y2 '); sprintf('introduce los valores en funcion de x2-y2') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0
sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
x2=input('dame el valor de x2 '); y3=input('dame el valor de y3 '); sprintf('introduce los valores en funcion de x2-y3') z1=input('dame f2dx '); z2=input('dame f2xy '); z3=input('dame f2yx '); z4=input('dame f2dy '); z1=z1; z2=z2; z3=z3; z4=z4; h(1,1)=z1; h(1,2)=z2; h(2,1)=z3; h(2,2)=z4; h h1=det(h) d1=z1 if h1~=0 if h1>0 if d1>0 sprintf('TIENES UN MINIMO') else sprintf('TIENES UN MAXIMO') end else sprintf('NO EXISTE NI MAXIMO NI MINIMO') end else sprintf('EL CRITERIO NO DA INFORMACION') end
%--------------------------grafica---------------------------------% sprintf('si quieres ver la grafica presiona 2 si no presiona 1') s=input('dame s '); if s>1 sprintf('COMIENZA LA GRAFICA') [x,y]=meshgrid(-10:0.5:10); z=27*x-(1/9)*x.^3-2*y.^2+y.^4; mesh(x,y,z) else end
Conclusiones sobre el método:
Este método presenta inconsistencias al momento de resolver df/dx y df/dy ya que
en este punto puede presentarse indeterminaciones o valores fuera de lo
esperado así como puntos de inflexión o de silla.
Método del máximo descenso del gradiente
Empezamos en un punto (po) y buscamos una mejora en la semirrecta que parte de (po) en la dirección señalada por el vector s0=-g/abs(g). este es un problema en una variable que podemos resolver con métodos de búsqueda unidireccional . de esta manera llegamos a (p1), en el cual hay un mínimo local de la función f(x) restringida a los puntos x de la semirrecta x=p1+t*s0. Esto es un proceso iterativo hasta encontrar la solución con la tolerancia deseada.
Encontrar por máximo descenso del gradiente el mínimo de la siguiente función.
i x1 x2 foriginal dF1 dF2 normal alfa
0 1,5 0,5 0,3125 0,5 -2 2,061552813 0,103
La minimización de alfa es mediante el método de la secante como se puede
ver en la grafica para la primera iteración.
-10 -8 -6 -4 -2 0 2 4 6 8 10-1000
-500
0
500
1000
1500
2000
2500
3000
La siguiente tabla desarrollada en Excel muestra algunas iteraciones hechas
para resolver el mínimo de la función.
i x1 x2 foriginal dF1 dF2 normal alfa h
0 1,5 0,5 0,3125 0,5 -2 2,061552813 0,10283145 0,09384025
1 1,44858427 0,7056629 0,09384025
-0,59613539
-0,14903387 0,6144823 0,36752205 0,03374833
2 1,66767718 0,76043614 0,03374833 0,14680492
-0,58721961 0,605292126 0,10404737 0,01468555
3 1,65240251 0,8215348 0,01468555
-0,14932666
-0,03733167 0,153922401 0,67718545 0,00727786
4 1,75352435 0,84681526 0,00727786 0,05989384
-0,23957533 0,246948598 0,10445618 0,00409268
5 1,74726807 0,87184038 0,00409268
-0,05739682
-0,01434921 0,059163284 0,95530035 0,00249505
6 1,80209927 0,88554819 0,00249505 0,0310029
-0,12401158 0,127828215 0,10462973 0,00164021
7 1,79885544 0,89852348 0,00164021
-0,02893559 -0,0072339 0,029826121 1,16963871 0,00113424
8 1,83269963 0,90698453 0,00113424 0,01873057
-0,07492225 0,077228088 0,1047186 0,00082196
9 1,83073819 0,91483029 0,00082196
-0,01724187
-0,00431047 0,017772515 1,32921272 0,00061583
10 1,8536563 0,92055982 0,00061583 0,01253668
-0,05014669 0,051690026 0,10477056 0,00047587
11 1,85234283 0,92581371 0,00047587
-0,01144646
-0,00286162 0,011798738 1,44883826 0,00037629
12 1,86892689 0,92995973 0,00037629 0,00900744
-0,03602973 0,037138595 0,10480393 0,00030401
Donde x1 y x2 son las
aproximaciones
Foriginal=la función
original evaluada en
x1 y x2
F1=derivada de la
función original en x1
F2=derivada de la
función original en x2
A=alfa
H=función a
minimizar
-10-5
05
10
-10
0
100
0.5
1
1.5
2
2.5
x 104
valores xvalores y
valo
res z
-10-5
05
10
-10-5
05
10-8000
-6000
-4000
-2000
0
2000
4000
valores xvalores y
valo
res z
-10
-5
0
5
10
-10
-5
0
5
10-150
-100
-50
0
50
100
150
valores xvalores y
valo
res z
Encontrar los puntos críticos y determinar si son máximos o mínimos en la función.
Resolviendo de manera independiente df/dx y df/dy para calcular los puntos críticos tenemos que de la 1ª derivada en x
X1=0 X2=1 X3=2
De la 1ª derivada en y
y1=0 y2= 2.1472 y3= -1.3972
Para la primer pareja de valores, es decir (x1, y1)
Hess= -96
Por lo tanto no hay máximo ni mínimo
Concluyendo que X1=0, y1=0 no existe ni máximo ni mínimo. X2=1, y2=2.1472 no existe ni máximo ni mínimo. X1=0, y1=0 tienes un mínimo.
Grafica de
-10-5
05
10
-10
0
10-5000
0
5000
10000
15000
valores xvalores y
valo
res z
Método de Newton.
El método de Newton hace uso de la aproximación de segundo orden de la función utilizando las derivadas segundas con respecto a cada una de las variables independientes. De esta forma es posible tener en cuenta la curvatura de la función en el punto e identificar las mejores direcciones de búsqueda. El mínimo de f(x) se obtiene diferenciando la aproximación cuadrática de f(x) con respecto a cada una de las variables e igualando a cero. Así:
f xf xk Hxk xk
Si f(x) es una función cuadrática el mínimo se alcanza en un único paso. Pero para una función general no lineal el óptimo no se alcanza en un único paso, por lo que se puede modificar la ecuación anterior para introducir el parámetro de longitud de paso, con lo que queda:
La longitud de paso se puede calcular vía cualquier método de optimización numérica de los ya comentados o bien analíticamente con lo que se obtendría:
En el método de Newton estrictamente hablando el valor de es la unidad. El problema también se puede resolver sin necesidad de invertir la matriz hessiana
resolviendo directamente el sistema de ecuaciones lineales en x, aplicando la factorización adecuada y evitando los errores de redondeo, en la medida de lo posible, que puedan aparecer como consecuencia del proceso de inversión de matrices. El método de Newton es el método de minimización más rápido, cuando funciona bien. Pero presenta las siguientes desventajas: 1.- El método no encuentra necesariamente un óptimo global (pero esto es una característica de todos los métodos que hemos comentado hasta el momento) 2.- Requiere la inversión de matrices o la resolución de un sistema de n ecuaciones lineales 3.- Necesita de las derivadas primera y segunda, las cuales en la práctica no son fáciles de obtener. 4.- El método puede llevar a un punto de silla si la matriz hessiana no es definida positiva.
La dificultad 3 se puede aliviar utilizando métodos apropiados de diferencias finitas para el cálculo de las derivadas primera y segunda. La convergencia global se
puede reforzar si, al realizar un paso de Newton propiamente dicho (=1) no se obtiene mejoría de la función objetivo, se vuelve al punto anterior y se realiza una
búsqueda con el valor de variable. Para evitar la dificultad 4 se debe ser muy cuidadoso con la técnica que se utiliza para garantizar que la matriz hessiana o su inversa sea definida positiva. (en algunos casos debido al número de condición de la matriz la inversión de ésta podría llevar a matrices no definidas positivas). Por otra parte sólo está garantizado que el valor de la función objetivo mejora si la matriz hessiana es definida positiva. H(x) es definida positiva sólo para funciones estrictamente convexas, pero las funciones no lineales en general la matriz H(x) puede cambiar de punto a punto y el método de Newton podría llevarnos a direcciones que no reducen el valor de la función objetivo (o al menos no a las direcciones óptimas). En otras palabras si los valores propios de la matriz hessiana son todos positivos sabemos que estamos aproximando nuestra función por una cuadrática de contornos circulares o elipsoidales que tienen un mínimo. Pero si al menos dos valores propios presentan signos opuestos podríamos movernos en dirección a un punto de silla en lugar de hacia el mínimo. El método de Newton tiene la ventaja de la convergencia cuadrática sólo en la vecindad del óptimo, donde la función objetivo puede ser aproximada bastante bien por una función cuadrática. Pero en zonas más alejadas otros métodos pueden presentar velocidades de convergencia mayores.
Ejercicio:
Minimizar la siguiente función:
Las derivadas correspondientes son:
Haciendo los cálculos en Excel el ejercicio quedaría de la siguiente forma:
-10
-5
0
5
10
-10
-5
0
5
100.95
1
1.05
1.1
1.15
1.2
x 105
valores xvalores y
valo
res z
Ref. bibliográfica:
Libro: Métodos numéricos con matlab 5ª edicicon,Johns H.Mathews,Kurtis D. Fink.
Cap. 8 Optimizacion numérica pag. 433