Optimización de funciones con el método Newton

  • 0 Respuestas
  • 285 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Andr0z

  • *
  • Colaborador
  • *
  • Mensajes: 14
  • Actividad:
    36.67%
  • Country: mx
  • Reputación 2
    • Yahoo Instant Messenger - Andr0z
    • Ver Perfil
    • Email

Optimización de funciones con el método Newton

  • en: Marzo 30, 2020, 02:13:39 pm
El método de Newton-Raphson es un método abierto que permite encontrar la raiz x de una función de tal manera que f(x)=0. En su forma simbólica se resume como:

xi+1 =xi-f(xi)/f'(xi)    Ec. 1

Se utiliza un método similar para encontrar un valor óptimo de f(x) al definir una nueva función r(x) dada por r(x)=f'(x), así para decir que se ha encontrado un óptimo de nuestra función se tiene que tener r(x)=0, por lo tanto se puede emplear lo siguiente para encontrar una x que satisfaga r(x)=0, de manera simbólica nuestro modelo a iterar quedaría como:

xi+1 =xi-r(xi)/r'(xi)   Ec. 2


Ahora veamos como aplicariamos ésto a un ejercicio práctico:

Queremos encontrar el óptimo de nuestra función con un x inicial de 2.5:

f(x)=2senx-x2/10

La gráfica de dicha ecuación quedaría como:


Escribiendo el código en Phyton 3.6.8 para aplicar la ecuación 2:

Código: You are not allowed to view links. Register or Login
import math

#Funcion a optimizar f(x)=2*math.sin(x)-pow(x,2)/10 ----> (2sinX-X^2/10)

#funcion primer derivada
def f_p(x):
    yp=2*math.cos(x)-x/5
    return (yp)

# funcion segunda derivada
def f_pp(x):
    ypp=-2*math.sin(x)-1/5
    return (ypp)

#introduciomos el valor x de partida (Xo asi como el numero de iteraciones)
xi=float(input("Introduce X_o: "))
iteraciones=int(input("Introduce el numero de iteraciones:  "))

raiz=[]
raiz.insert(0,0)

# inicializamos el contador de iteraciones
i=0

# Definimos un error inicial
error=1

# Aplicamos la formula Newton  para optimos
while iteraciones>i:
  xi_1=xi-(f_p(xi)/f_pp(xi))
  raiz.append(xi_1)
  i=i+1
  xi=xi_1
  error=(raiz[i]-raiz[i-1])/raiz[i]
  print(xi)
print("Error final:  " +str(error))
print("El optimo global aproximado es: " +str(2*math.sin(xi)-pow(xi,2)/10))


Finalmente, si ejecutamos el código para 5 iteraciones y con una x inicial de 2.5  obtendremos:


Si comparamos éste resultado con la gráfica anterior se puede notar que efectivamente el algoritmo converge a un óptimo global para un x inicial de 2.5

Nota: Estos métodos son de suma importancia para comenzar a entender el método de descenso por  gradiente aplicado a las redes neuronales, el cual es similar pero en los gradientes se aplican constantes de aprendizaje que hacen que la convergencia (si es que existe) sea mas rápida o mas lenta según lo permita la función




« Última modificación: Marzo 30, 2020, 02:40:21 pm por Andr0z »

 

[Código-Python] Metodo Burbuja - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 1681
Último mensaje Junio 03, 2011, 02:17:08 am
por JaAViEr
Cifrado Cesar ... 3 Funciones

Iniciado por darkucla

Respuestas: 3
Vistas: 429
Último mensaje Enero 16, 2020, 12:42:18 am
por darkucla
Funciones de php a python & mucho mas

Iniciado por Oggy

Respuestas: 2
Vistas: 2556
Último mensaje Diciembre 11, 2012, 11:24:03 am
por fortil
Funciones en Python

Iniciado por Sajuuk

Respuestas: 2
Vistas: 2852
Último mensaje Mayo 19, 2015, 04:38:36 pm
por Achraf
[UnderTips] Funciones como parámetro de entrada en otras funciones

Iniciado por DeBobiPro

Respuestas: 0
Vistas: 2258
Último mensaje Septiembre 09, 2016, 12:27:16 pm
por DeBobiPro