Series de Taylor Con Python
Series de Taylor Con Python
Series de Taylor Con Python
Diego Vidal
2008-11-24
Abstract
En este documento se relata el procedimiento que se siguió para poder usar series de Taylor en una
computadora. El lenguaje usado fue Python1
1 Introducción
En verdad no vamos a usar una serie de Taylor como tal, dado que la serie de Taylor es la siguiente
n
X f i (x) · xi
T :=
i=0
i!
Lo que se va a usar es un caso especı́fico de la serie de Taylor, este caso especı́fico se le denomina serie de
Maclaurin, la cual es
n
X f i (0) · xi
f (x) =
i=0
i!
Serie que es convenientemente útil dado que podemos conocer el valor de la función en un punto sólo con
saber las derivadas de dicha función y cuánto vale la función y sus derivadas en 0. Un ejemplo de esto, es el
caso del coseno.
cos(0) · x0 sen(0) · x1 cos(0) · x2 sen(0) · x3 cos(0) · x4 sen(0) · x5 cos(0) · x6
cos(x) = − − + + − − + ···
0! 1! 2! 3! 4! 5! 6!
x2 x4 x6
cos(x) = 1 − + − + ···
2! 4! 6!
Veamos unos ejemplos
cos(0) = 1
3 4 6
π π π π
cos( ) ≈ 1 − + − ≈ 1 − .574190 + .050107 − .001831 ≈ .474086
3 54 81 · 24 729 · 720
cos(π) ≈ 1 − 4.934802 + 4.058712 − 1.335262 ≈ −1.211235
La exactitud de los resultados depende en gran parte de a que término lleguemos en la serie
1 http://python.org
1
1.1 La fórmula de Euler
Una de las fórmulas mas bellas de las matemáticas, la fórmula de Euler es una ecuación que relaciona a
los números transcendentales (e), los imaginarios (i), los irracionales (π), los reales, negativos y la unidad
(−1) y el cero, la fórmula es la siguiente
eiπ + 1 = 0
Deducir dicha ecuación es algo muy sencillo con series de Taylor-Maclaurin
Demostración
Se tiene que
x2 ix3 x4 ix5
eix = 1 + ix − − + + + ··· (1)
2! 3! 4! 5!
Si se es lo suficientemente suspicaz, ya se habrá identificado que parte de la fórmula parece la serie de
Taylor-Maclaurin del coseno. Ası́ que veamos el desarrollo de las series para seno y coseno.
x2 x4 x6 x8 x10
cos(x) = 1 − + − + − + ··· (2)
2! 4! 6! 8! 10!
x3 x5 x7 x9
sen(x) = x −
+ − + + ··· (3)
3! 5! 7! 9!
Como podemos ver, las partes reales de (1), son la serie del coseno (2), y las partes imaginarias son la serie
del seno (3) multiplicadas por i. Etonces podemos llegar al resultado
Por lo tanto
eiπ = cos(π) + isen(π) = −1
QED
2 Programa
2.1 Derivada
El programa como se indica anteriormente fue hecho en Python, se le enseñó a derivar a la computadora
directamente de la definición de derivada, la cual es
df f (x + ∆x) − f (x)
= lim
dx ∆x→0 ∆x
Sin embargo se tuvo que hacer un pequeño ajuste el cual fue inspirado por Spivak2 el cual consiste en alterar
un poco la definición de derivada del modo que se muestra a continuación
df f (x + ∆x) − f (x − ∆x)
= lim
dx ∆x→0 2∆x
2 Michael Spivak, Calculus, Editorial Reverté,Reimpresión de octubre del 2007, ISBN:978-968-6708-18-9, página 225
2
Este ajuste fue hecho para buscar más exactitud en los cálculos, lo que hice en la parte del código donde
enseño a derivar a python fue tomar ∆x = ∆x
2 , por lo que, queda lo siguiente
∆x ∆x
df f (x + − f (x −
2 ) 2 )
= lim
dx ∆x→0 ∆x
Dado que la computadora no tiene noción de lı́mites (y para este ejercicio no tiene caso enseñarle un concepto
tan general), le damos un ∆x muy pequeño, con una millonésima basta; a continuación se muestra la parte
del programa donde se define la derivada3
def derivada(f):
def drf(x,dx=1e-6):
return (f(x+dx/2)-f(x-dx/2))/dx
return drf
Entonces, si se usa
el comando print dg(3) nos dá como resultado 80.9999999944 ≈ 81, siendo
d 3
3x |x=3 = 81
dx
2.2 Factorial
Otra parte fundamenteal de las series de Taylor-Maclaurin, es el factorial, al igualq ue la derivada, la
computadora no sabe lo que es, por lo cual hay que enseñárselo. Aprovechando la definición recursiva de
factorial, la cual es
n! = n · (n − 1)!
No se necesita modificar la definición para enseñársela a la computadora, el código queda del siguiente modo
def fac(n):
if n == 0:
return 1
else:
return n * fac(n-1)
Como se puede apreciar en el codigo, fue una simple traducción de la definición matemática al lenguaje
Python.
3
a=raw_input("Escribe tu funcion: ")
def f(x): a return
print f(4)
Digamos que la función que escribió el usuario fue f (x) = x2 , por lo cual f (4) = 16, y entonces esperariamos
que print f(4), imprimiera un 16 en pantalla, el problema es que no lo hace, mas bien imprime un x*x, que
es x2 , la función que escribió el usuario. Para resolver esto, se usa eval(), veámos como
2.3.2 Exponentes
Otro problema que vale la pena mencionar dado que fue el que más tiempo tomó detectar, es que según
Python 00 = 1, esto dió bastantes problemas, por lo cual cuando se programa en python hay que tener esto
en cuenta y poner un ciclo if para solucionar esto.
2.3.3 Tamaño de ∆x
Sabemos que ∆x tiene que ser pequeña, pero el problema es determinar que tanto. Su valor inicial el cual
era 1 × 10−6 = 1000000
1
, no resultó muy bueno, dado que si se iteraba a mas de 5 pasos la serie de seno y mas
de 3 la serie de coseno se obtenı́an resultados absurdos; por esto se tuvo que hacer el ajuste y se encontró
que el ajuste óptimo de ∆x = 1 × 102.5 , en general funciona bastante bien. También hay un modo para que
el usuario modifique el valor de ∆x, el cual es
3 Resultados
Ahora veamos los resultados obtenidos por el programa, usar una función polinómica serı́a algo realmente
trivial, por lo cual usemos dos funciones trigonométricas que conocemos muy bien, el seno y el coseno
3.1 Seno
He aquı́ una tabla de valores obtenidos de la función seno. Nota: A partir de 0, se hizo con los primeros 10
1
términos de la serie; 90, se hizo con los primeros 9 términos; a partir de 180, se tuvo que ajustar ∆x = 10 y
hacer los primeros 15 términos; a partir de 300 se ajusto a 14 términos
4
Función Valor Valor obtenido Diferencia
sen(0) 0 0 0
sen(30) 0.5 0.49999916159 8.3841 × 10−7
sen(60) 0.866025403784439 0.866564711227 −5.3930 × 10−4
sen(90) 1 1.02084265991 −2.0842 × 10−2
sen(120) 0.866025403784439 0.863831617308 2.1937 × 10−3
sen(150) .5 0.484351280621 1.5648 × 10−2
sen(180) 0 −0.0776703736148 7.7670 × 10−2
sen(210) −.5 −0.498935268698 −1.0647 × 10−3
sen(240) −0.866025403784438 −0.866297902296 2.7249 × 10−4
sen(270) −1 −1.00363683506 3.6368 × 10−3
sen(300) −0.866025403784439 −0.874273918033 8.2485 × 10−3
sen(330) −.5 −0.500303242676 3.0324 × 10−4
sen(360) 0 0.0895497498962 −8.9549 × 10−2
Suponiendo que podamos arreglar el problema del ajuste de los términos y ∆x, veamos el promedio de la
diferencia, definido como P12
|Di |
P = i=0
12
Donde Di son las diferencias obtenidas, se obtiene que P ≈ 1.8333 × 10−2 , es un valor bastante bajo, lo cual
indica que las mediciones son buenas.
La gráfica del comportamiento de las diferencias para el seno es la siguiente
0.1
Variaciones de diferencias para el seno
0.08
0.06
Diferencia
0.04
0.02
0
0
50
100
150
200
250
300
350
400
‐0.02
Grados
Finalmente, vamos a ver que tan exacto fue nuestro programa, se define el error como
|V0 − V |
E=
V0
Donde V0 es el valor esperado y V es el valor obtenido, haciendo el cálculo, nos queda que el promedio de
E, es E ≈ 3.91 × 10−2 o en porcentaje E ≈ 3.91%
3.2 Coseno
Finalmente aquı́ está la tabla de los valores obtenidos de la función coseno Nota: A partir de 150 ∆x =
1 × 10−1 ; a partir de 330 ∆x = 1
5
Función Valor Valor obtenido Diferencia
cos(0) 1 1 0
cos(30) 0.866025403784439 0.866026351695 −9.4791 × 10−7
cos(60) .5 0.499968136978 3.1863 × 10−5
cos(90) 0 −0.000890322958366 8.9032 × 10−4
cos(120) −.5 −0.508754724135 8.7547 × 10−3
cos(150) −0.866025403784439 −0.865607657172 −4.1774 × 10−4
cos(180) −1 −1.00167335603 1.6733 × 10−3
cos(210) −0.866025403784439 −0.865513071157 −5.1233 × 10−4
cos(240) −0.5 −0.49396812212 −6.0318 × 10−3
cos(270) 0 0.0344747316528 −3.4474 × 10−2
cos(300) .5 0.64778274139 −1.4778 × 10−1
cos(330) 0.866025403784438 0.724440731698 1.4158 × 10−1
cos(360) 1 0.965251687094 3.4748 × 10−2
El promedio de la diferencia para el coseno es P ≈ 3.0658333 × 10−2 Y la grafica del comportamiento del
coseno es la siguiente
0.08
0.06
0.04
0.02
0
‐0.02
0
50
100
150
200
250
300
350
400
Grados
4 Conclusiones
Si se implementa un módulo en el programa el cual sea capaz de lidiar con el error como se lidió manualemnte
en esta ocasión, entonces ocurre algo bastante curioso, al parecer el error tiene un comportamiento periódico
como pudimos observar en la gráfica del seno. Esto se debe a que la corrección del error ocurre cuando
éste es intolerable, por tanto tiene un pequeño margen para crecer; si quisiéramos que siempre estuviera en
las mejores condiciones probablemente la computadora se sobrecargarı́a y serı́a demasiado tedioso usar el
programa.
Sin embargo creo que hay que pulir los márgenes de error, dado que aunque el mayor es de 5%, el cual
es un margen bastante aceptable, se puede mejorar.
5 Código fuente
from math import *
6
"""Este es el bloque de funciones del progrmama, en esta seccion se
encuentra la derivada, el factorial y la funcion definida por el usuario"""
#Defino la funcion derivada, simplemente es la definicion de derivacion
def derivada(f):
def drf(x,dx=1e-2):
return (f(x+dx/2)-f(x-dx/2))/dx
return drf
#defino como funcion la funcion que el usuario quiso aproximar
def f(x):
return eval(e)
#defino la funcion factorial
def fac(n):
if n == 0:
return 1
else:
return n * fac(n-1)
RF=f(0)+F
print "El resultado es"
print RF