Foros del Web » Programando para Internet » Python »

taylor

Estas en el tema de taylor en el foro de Python en Foros del Web. Hola necesito ayuda con este ejercicio: me piden que utilizando taylor, debo crear una funcion "expon" que se acerque mucho al valor del exponente. el ...
  #1 (permalink)  
Antiguo 28/10/2010, 09:04
 
Fecha de Ingreso: octubre-2010
Mensajes: 19
Antigüedad: 14 años
Puntos: 0
taylor

Hola necesito ayuda con este ejercicio:

me piden que utilizando taylor, debo crear una funcion "expon" que se acerque mucho al valor del exponente.

el problema es que por ejemplo si ami funcion le pongo unos pocos valores y el exponente es muy grande el error es notable...

asi que os pido ayuda, ya que soy un poco principiante en esto...

gracias
  #2 (permalink)  
Antiguo 28/10/2010, 09:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: taylor

Deberías de poner el código de lo que estas haciendo. De otra forma no puedo decir en que estas fallando.
  #3 (permalink)  
Antiguo 28/10/2010, 10:39
 
Fecha de Ingreso: octubre-2010
Mensajes: 19
Antigüedad: 14 años
Puntos: 0
Respuesta: taylor

def expon(x):
y=1
y=y+x
y=y+(x**2)/2
y=y+(x**3)/6
y=y+(x**4)/24
y=y+(x**5)/120
y=y+(x**6)/720

return y

import math

x=1

print(math.exp(x)-expon(x))



eso es lo que tengo escrito, lo que ocurre es que esa funcion como esta echa en el 0 pues claro los puntos que estan alrededor si que valen,como el 1 y el 2.

pero fijate lo que ocurre si pones x=10, el error es muy grande, y se que lo podria hacer todavia mas pequeño si sigo haciendo mi polinomio de taylor que es el que esta arriba, pero necesitaria una formula muy larga...

entonces os pido una formula mas corta que cumpla lo mismo que lo de taylor.

gracias
  #4 (permalink)  
Antiguo 28/10/2010, 10:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: taylor

Código Python:
Ver original
  1. def expon(x):
  2.     y = 1.0
  3.     y = y + 1
  4.     y = y + 1.0 / 2
  5.     y = y + 1.0 / 6
  6.     y = y + 1.0 / 24
  7.     y = y + 1.0 / 120
  8.     y = y + 1.0 / 720
  9.     return y ** x
Otra cosa para obtener una buena precisión debes de hacerlo hasta x ** 14 / (14!)
Eso y estas haciendo división entre enteros, lo cual te arrojara un entero y no un flotante o real.

puedes hacer un:
print(1/2) y un
print(1.0 / 2)
y ver una clara diferencia.
  #5 (permalink)  
Antiguo 28/10/2010, 11:35
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: taylor

Código Python:
Ver original
  1. from __future__ import division
y queda solucionado el asunto de la división. Además, en Python 3 funciona por defecto devolviendo un flotante.

Tampoco es necesaria "una fórmula muy larga", más bien crear cada sumando en un for, ya que todos tienen la misma forma: el término de grado n es x^n/n!

Código Python:
Ver original
  1. from math import factorial
  2. from __future__ import division
  3. y = 0
  4. for i in range(0, n):
  5.     y += (x**i)/factorial(i)
  6.  
  7. return y

donde n es la cantidad de términos que te interesa generar para la serie.
  #6 (permalink)  
Antiguo 28/10/2010, 11:52
 
Fecha de Ingreso: octubre-2010
Mensajes: 19
Antigüedad: 14 años
Puntos: 0
Respuesta: taylor

me dan numeros asi

6.60438672639e-08

¿¿como quito esa e??
  #7 (permalink)  
Antiguo 28/10/2010, 12:51
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: taylor

Significa que tu error es muy pequeño.

Para comprender eso del error tienes que ver un ejemplo:
Código Python:
Ver original
  1. # -*- coding: utf-8 -*-
  2. from math import sqrt
  3.  
  4. x = 2
  5. y = sqrt(x)
  6. print x == y*y #Al elevar la raiz de x al cuadrado pensaria que seria 2, pero no
  7. print x - y*y #Vemos que diferencia es muy pequeña
  8. #Ahora lo que tenemos que hacer para corregir ese error es poner un margen de error
  9. def comparar(a, b):
  10.     error =  1e-10 #Presicion de 10 decimales despues del punto
  11.     if a-error < b < a+error:
  12.         return True
  13.     else:
  14.         return False
  15. print comparar(x, y*y)
  #8 (permalink)  
Antiguo 28/10/2010, 12:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: taylor

Cita:
Iniciado por AlvaroG Ver Mensaje
Código Python:
Ver original
  1. from __future__ import division
y queda solucionado el asunto de la división. Además, en Python 3 funciona por defecto devolviendo un flotante.

Tampoco es necesaria "una fórmula muy larga", más bien crear cada sumando en un for, ya que todos tienen la misma forma: el término de grado n es x^n/n!

Código Python:
Ver original
  1. from math import factorial
  2. from __future__ import division
  3. y = 0
  4. for i in range(0, n):
  5.     y += (x**i)/factorial(i)
  6.  
  7. return y

donde n es la cantidad de términos que te interesa generar para la serie.
AlvaroG yo también fue lo primero que hice, pero me di cuenta que le quitaba precisión.

Veamos un ejemplo:
Código Python:
Ver original
  1. from __future__ import division
  2. from math import factorial, e
  3.  
  4. def expo_razpeitia(x):
  5.     y = 0
  6.     for i in range(15): #Rango predefinido
  7.         y += 1 / factorial(i)
  8.     return y ** x
  9.  
  10. def expo_AlvaroG(x):
  11.     y = 0
  12.     for i in range(15):
  13.         y += (x ** i) / factorial(i)
  14.     return y
  15.  
  16. print e ** 10
  17. print expo_razpeitia(10)
  18. print expo_AlvaroG(10) #El tuyo tiene una perdida mas grande
  #9 (permalink)  
Antiguo 28/10/2010, 13:16
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: taylor

El asunto es que lo que vos estás haciendo es aproximar e, y luego exponenciar, recordando que

e = sumatoria_de_0_a_infinito(1/factorial(i))

Estás potenciando una aproximación de e, no aproximando una potencia de e. El resultado es válido siempre que sea eso lo que se quiere hacer, pero no es Taylor

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:49.