Este documento describe varios métodos para optimizar funciones unidimensionales sin restricciones, incluyendo el método de Newton, aproximaciones de diferencias finitas, el método de la secante y aproximaciones polinomiales. También explica cómo aplicar la búsqueda unidimensional a problemas multidimensionales variando un parámetro a lo largo de la dirección del gradiente.
2. 1. Método de Newton
f’(x)
f ' (x k )
k +1
= x − '' k
k
x
f (x )
x*
xk+1 xk x
Ventajas:
1. El procedimiento presenta convergencia cuadrática
2. Para una función cuadrática, el mínimo se obtiene en un solo paso.
Desventajas:
1. Es necesario calcular f’(x) y f’’(x)
2. Si f’’(x)→0 el método converge lentamente.
3. Si el punto inicial no se encuentra cerca al mínimo, el método podría no converger
3. 2. Aproximación de diferencias finitas para la derivada
[f (x k + h ) − f (x k − h )] / 2h
f(x)
x k +1 = x k −
[f (x k + h ) − 2f (x k ) + f (x k − h )]/ h 2
f(xk+h)
f(xk-h)
xk x
h
4. 3. Método de Quasi - Newton (Método de la secante)
f’(x)
Pendiente=m
f ' (x k )
=m
x −x
k
f ' (x q ) − f ' (x p )
m=
xq − xp
~*
xp x
x* xq x
f ' (x q )
~ = xq −
[ ]
x
f ' ( x q ) − f ' ( x p ) /( x q − x p )
5. 4. Métodos de aproximación polinomial
Interpolación cuadrática
f(x)
f ( x ) = a + bx + cx 2
~=− b
x
2c
Etapa 1
~
x1 x2 x3 x
x
Etapa 2
~
x2 x3 x
x
f ( x 1 ) = a + bx 1 + cx 1
2
f ( x 2 ) = a + bx 2 + cx 2
2
f ( x 3 ) = a + bx 3 + cx 3
2
6. f(x) f(x)
~ ~
x1 x2 x3 x x1 x2 x3 x
x x
Iteración k+1: x2,x,x3 Iteración k+1: x1,x2,x
f(x) f(x)
~ x2 ~ x2
x1 x3 x x1 x3 x
x x
Iteración k+1: x1,x,x2 Iteración k+1: x2,x,x3
7. Ejercicio
Encontrar los puntos estacionarios de la función
f(x) = x 3 − 4·x 2 + x
Calcular los óptimos mediante el método de Newton
Solución
8. Optim1DMetodoNewton.m
%Capítulo 5. Optimización de funciones sin restricciones: Búsqueda
% unidimensional
%Aplicación del método de Newton para encontrar puntos óptimos de funciones
%unidimensionales
%Minimizar: f(x)=x^3-4*x^2+x
%Fórmula recursiva: xk1=xk-(f'(x)/f''(x))
%Evaluando la primera derivada: f'(x)=3·x^2-8·x
%Evaluando la segunda derivada: f''(x)=6·x-8
%Nombre de archivo: Optim1DMetodoNewton.m
function f=Optim1DMetodoNewton(x0,epsilon)
% x0 = Punto de partida, cercano al óptimo. Por ejemplo 8 o -4
%epsilon = test de convergencia. Por ejemplo 0.00001
xk=x0;
Test=epsilon+1;
while Test>=epsilon
xk1=xk-((3*xk^2-8*xk+1)/(6*xk-8));
Test=abs((xk1-xk)/xk);
xk=xk1;
end
fprintf('X óptimo = %5.5fn',xk);
9. Optim1DMetodoNewtonDifFinit.m
%Capítulo 5. Optimización de funciones sin restricciones: Búsqueda
% unidimensional
%Aplicación del método de Newton con diferencias finitas para encontrar
%puntos estacionarios de funciones unidimensionales
%Minimizar: f(x)=x^3-4*x^2+x
%Fórmula recursiva: xk1=xk-(f'(x)/f''(x))
%Evaluando la primera derivada: f'(x)=(f(x+h)-f(x-h))/2h
%Evaluando la segunda derivada: f''(x)=(f(x+h)-2·f(x)+f(x-h))/(h^2)
%Nombre de archivo: Optim1DMetodoNewtonDifFinit.m
function f=Optim1DMetodoNewtonDifFinit(x0,h,epsilon)
% x0 = Punto de partida, cercano al óptimo. Por ejemplo 8 o -4
%epsilon = test de convergencia. Por ejemplo 0.00001
xk=x0;
Test=epsilon+1;
while Test>=epsilon
%Evaluación de derivadas mediante diferencias finitas
dF=(Funcion(xk+h)-Funcion(xk-h))/(2*h); %Primera derivada
d2F=(Funcion(xk+h)-2*Funcion(xk)+Funcion(xk-h))/(h^2); %Segunda derivada
%Cálculo de x(k+1)
xk1=xk-(dF/d2F);
Test=abs((xk1-xk)/xk);
xk=xk1;
end
fprintf('X óptimo = %5.5fn',xk);
Funcion.m
%Evaluación de la función f(x)=x^3-4*x^2+x
function f=Funcion(x)
f=x^3-4*x^2+x;
10. 4. Cómo se aplica la búsqueda unidimensional a un problema
multidimensional.
x nuevo = x viejo + αs
α ≡ Tamaño de paso
s ≡ dirección de búsqueda
x0
x1
x2
s
11. Ejemplo 5.5 Ejecución de una búsqueda unidimensional
%Ejercicio5_5.m
%Cómo aplicar la búsqueda unidimensional a problemas multidimensionales
%Minimizar la función
%f(x)=x1^4 - 2·x2·x1^2 + x2^2 + x1^2 -2·x1 + 5
%Punto de partida: x0=[1;2]
%Dirección: s=-gradiente(f(x0))=-[-4;2]
%Algoritmo de búsqueda: Xnuevo=Xviejo+alfa*S
clear;clf; %Borrado de variables y ventanas gráficas
X0=[1;2]; %Vector de partida
S=-[-4;2]; %Dirección de búsqueda
Xviejo=X0;
alfa=[0:0.005:0.12];
limite=length(alfa);
%Iteraciones
for i=1:limite
X1(i)=Xviejo(1,1)+alfa(i)*S(1,1);
X2(i)=Xviejo(2,1)+alfa(i)*S(2,1);
f(i)=X1(i)^4-2*X2(i)*X1(i)^2+X2(i)^2+X1(i)^2-2*X1(i)+5;
end
plot(alfa,f);
xlabel('alfa');ylabel('f(x1,x2)');
12. [fmax,i]=min(f);
AlfaOptimo = alfa(i);
fprintf('Alfa óptimo = %5.5fn',AlfaOptimo);
%Curvas de nivel
figure(2)
x1=0:0.05:2;x2=0:0.05:3;
[X1g,X2g] = meshgrid(x1,x2);
F=X1g.^4-2*X2g.*X1g.^2+X2g.^2+X1g.^2-2*X1g+5;
contour(X1g,X2g,F,40);xlabel('x1');ylabel('x2')
hold on
line([X1(1),X1(1)+AlfaOptimo*S(1,1)],[X2(1),X2(1)+AlfaOptimo*S(2,1)])