Proyecto final:Series de Taylor Diego Vidal 2008-11-24 Abstract
En este documento se relata el procedimiento que se sigui´o para poder usar series de Taylor en una computado computadora. ra. El lenguaje usado fue Python1
1
Intr Introd oduc ucci ci´ on o ´n
En verdad no vamos a usar una serie de Taylor como tal, dado que la serie de Taylor es la siguiente
f (x) · x n
T :=
i
i
i!
i=0
Lo que se va a usar es un caso espec´ espec´ıfico de la serie de Taylor, este caso espec´ıfico ıfico se le denomina serie de Maclaurin, la cual es n f i (0) · xi f (x) = i! i=0 Serie que es convenientemente ´util util dado que podemos conocer el valor de la funci´on en un punto s´olo olo con saber las derivadas de dicha funci´on on y cu´anto anto vale la funci´on on y sus derivadas en 0. Un ejemplo de esto, es el caso del coseno. cos(x) =
cos(0) · x0
0!
−
sen(0) · x1
1!
−
cos(0) · x2
2!
+
cos(x) = 1 −
sen(0) · x3
3! x2
2!
+
x4
4!
−
+
cos(0) · x4
x6
6!
4!
−
sen(0) · x5
5!
−
cos(0) · x6
6!
+ ···
Veamos unos ejemplos cos(0) = 1 π π3 cos( ) ≈ 1 − +
3
π4
−
π6
≈ 1 − .574190 + .050107 − .001831 ≈ .474086 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´ ermino ermino lleguemos en la serie 1
http://python.org
1
+···
1 .1
La formula o ´rmula de Euler
Una de las f´ormulas ormulas mas bellas de las matem´aticas, aticas, la f´ ormula ormula de Euler es una ecuaci´on on que relaciona a los n´ umeros transcendentales ( e), los imaginarios (i), los irracionales (π ), los reales, negativos y la unidad umeros (−1) y el cero, la f´ormula ormula es la siguiente eiπ + 1 = 0 Deducir dicha ecuaci´on on es algo muy sencillo con series de Taylor-Maclaurin Demostraci´ on on Se tiene que eix =
ei0 · x0
0!
+
iei0 · x1
1!
+
i2 ei0 · x2
2!
+
i3 ei0 · x3
3!
+
i4 ei0 · x4
4!
+
i5 ei0 · x5
5!
+ ···
Lo cual simplificando nos queda x2
eix = 1 + ix −
−
2!
ix3
3!
+
x4
4!
+
ix5
5!
+ ···
(1)
Si se es lo suficientemente suspicaz, ya se habr´a identificado que parte de la f´ormula ormula parece la serie de Taylor-Maclaurin del coseno. As´ As´ı que veamos el desarrollo de las series para seno y coseno. cos(x) = 1 −
x2
+
2!
sen(x) = x −
x4
x3
4! +
−
x6
x5
6! −
+
x8
x7
8!
−
+
x10
10!
+ ···
(2)
x9
+ ··· (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 eix = cos(x) + isen(x)
Por lo tanto eiπ = cos(π ) + isen(π ) = −1 QED
2
Prog ogr rama
2.1 2.1
Deri Deriv vada ada
El programa como se indica anteriormente fue hecho en Python, se le ense˜n´o a derivar a la computadora directamente de la definici´on on de derivada, la cual es df f (x + ∆x) − f (x) = l im ∆x 0 dx ∆x →
Sin embargo se tuvo que hacer un peque˜no ajuste el cual fue inspirado por Spivak2 el cual consiste en alterar un poco la definici´on on de derivada del modo que se muestra a continuaci´on df f (x + ∆x) − f (x − ∆x) = li m ∆x 0 dx 2∆x →
2
Michael Spivak,
Calculus,
Editoria Edi toriall Revert´ Rever t´ e,Reimpresi´ e,Reim presi´ on de octubre del 2007, ISBN:978-968-6708-18-9, p´ on agina agina 225
2
Este ajuste fue hecho para buscar m´as as exactitud en los c´alculos, alculos, lo que hice en la parte del c´odigo donde ∆x ense˜ no a derivar a python fue tomar ∆ x = 2 , por lo que, queda lo siguiente no f (x + df = li m ∆x 0 dx →
∆x 2
) − f (x − ∆x
∆x 2
)
Dado que la computadora no tiene noci´on on de l´ımites (y para este ejercicio no tiene caso ense˜narle narle un concepto tan general), le damos un ∆ x muy peque˜ no, no, con una millon´esima esima basta; a continuaci´ continuaci´on on se muestra la parte del programa donde se define la derivada 3 def derivada(f): def drf(x,dx=1e-6): drf(x,dx=1e-6): return (f(x+dx/2)-f(x-dx/2))/dx (f(x+dx/2)-f(x-dx/2))/dx return return drf
Entonces, si se usa def g(x): return return 3*x*x*x 3*x*x*x dg = derivada derivada(g) (g) print print dg(3)
el comando print dg(3) nos d´a como resultado 80 .9999999944 ≈ 81, siendo d 3x3 |x=3 = 81 dx
2.2
Factor actoria iall
Otra Otra parte parte fundam fundamen entea teall de las series series de Taylor aylor-Ma -Macla clauri urin, n, es el factor factorial, ial, al igualq igualq ue la deriv derivada ada,, la computadora no sabe lo que es, por lo cual hay que ense˜n´arselo. arselo. Aprovec Aprovechando hando la definici´ definici´ on on recursiva de factorial, la cual es n! = n · (n − 1)! No se necesita necesita modificar la definici´ definici´on on para ense˜ n´ narsela ´arsela a la computadora, computadora, el c´odigo odigo queda del siguiente modo def fac(n): fac(n): if n == 0: return return 1 else: return return n * fac(nfac(n-1) 1)
Como se puede apreciar en el codigo, fue una simple traducci´on on de la definici´on on matem´atica atica al lenguaje Python.
2.3 2.3.1 2.3.1
Probl Problem emas as con Pytho Python n Caract Caractere eress
Python es un lenguaje muy vers´atil, atil, pero por m´as as que lo sea, no se puede esperar ning´un un grado de reflexi´on on por parte del mismo. mismo. Un problema con el cual me encontr´ encontr´ e al hacer el programa programa es que, cuando el usuario usuario escribe su funci´on, on, Python la trata como texto, esto implica que no se vea como parte del c´odigo del programa, lo cual hace que nustra funci´on on no pueda pueda ser valuad valuada. a. La soluci´ soluci´ on on al problema fu´ f u´ e usar una funci´on on que eval(), por lo cual ahora si trata lo que escribi´o el usuario como trae Ptyhon por defecto, dicha funci´on on es eval(), funci´ on, ilustremos esto con un ejemplo. on, 3
Ver la secci´ on 2.3.3 para ver una aclaraci´ on on on en cuanto al tama˜ no n o de la ∆x
3
a=raw_in a=raw_input(" put("Escr Escribe ibe tu funcion: funcion: ") def f(x): f(x): a return return print print f(4)
Digamos Digamos que la funci´ on on que escribi´o el usuario fue f (x) = x2 , por lo cual f (4) = 16, y entonces esperariamos print f(4), f(4), imprimiera un 16 en pantalla, el problema es que no lo hace, mas bien imprime un x*x, que que print 2 eval(), ve´amos es x , la funci´ on on que escribi´o el usuario. Para resolver esto, se usa eval(), amos como a=raw_in a=raw_input(" put("Escr Escribe ibe tu funcion: funcion: ") def f(x): eval(a) eval(a) return print print f(4)
En este caso, ahora print f(4) si imprime en la pantalla un 16. 2.3.2 2.3.2
Exponen Exponentes tes
Otro problema que vale la pena mencionar dado que fue el que m´as tiempo tom´o detectar, es que seg´un un 0 Python 0 = 1, esto di´o 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 2.3.3
Tama˜ ama˜ no no de ∆x
Sabemos que ∆x tiene que ser peque˜na, na, pero el problema es determinar determinar que tanto. tanto. Su valor valor inicial el cual 1 6 era 1 × 10 = 1000000 , no result´o 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´ obten´ıan resultados resultados absurdos; absurdos; por p or esto se tuvo que hacer el ajuste y se encontr´ encontr´o 2.5 que el ajuste ´optimo optimo de ∆x = 1 × 10 , en general funciona bastante bien. Tambi´ en en hay un modo para que x el usuario modifique el valor de ∆ , el cual es −
def t(x): t(x): x**2 x**2 a=derivada(t) print print a(3) #esto #esto haria que se valuara valuara la derivada derivada en 3 print print a(3,1e a(3,1e-4) -4) #esto #esto haria haria que se valuar valuara a a en 3 con un dx=1x1 dx=1x10^( 0^(-4) -4)
3
Resu Result ltad ados os
Ahora veamos los resultados obtenidos por el programa, usar una funci´on polin´omica omica ser´ ser´ıa algo realmente trivial, por p or lo cual usemos dos funciones trigonom´etricas etricas que conocemos cono cemos muy bien, el seno y el coseno
3 .1
S en o
He aqu´ı una tabla de valores obtenidos de la funci´on on seno. Nota: A partir de 0, se hizo con los primeros 10 1 t´ erminos erminos de la serie; 90, se hizo con los primeros 9 t´erminos; erminos; a partir de 180, se tuvo que a justar ∆ x = 10 y hacer los primeros 15 t´ erminos; erminos; a partir de 300 se ajusto a 14 t´ erminos erminos
4
Funci´ on sen(0) sen(30) sen(60) sen(90) sen(120) sen(150) sen(180) sen(210) sen(240) sen(270) sen(300) sen(330) sen(360)
Valor 0 0.5 0.8660 866025 2540 40337844 784439 39 1 0.8660 866025 2540 40337844 784439 39 .5 0 −.5 −0.866025403784438 −1 −0.866025403784439 −.5 0
Valor obtenido 0 0.49999916159 0.866564711227 1.02084265991 0.863831617308 0.484351280621 −0.0776 077670 7037 3736 3614 1488 −0.498935268698 −0.8662 8662997902 790229 2966 −1.00363683506 −0.8742 8742773918 391803 0333 −0.5003 5003003242 324267 6766 0.0895497498962
Diferencia 0 8.3841 × 10 7 −5.3930 × 10 4 −2.0842 × 10 2 2.1937 × 10 3 1.5648 × 10 2 7.7670 × 10 2 −1.0647 × 10 3 2.7249 × 10 4 3.6368 × 10 3 8.2485 × 10 3 3.0324 × 10 4 −8.9549 × 10 2 −
−
−
−
−
−
−
−
−
−
−
−
Suponiendo Suponiendo que podamos arreglar el problema problema del ajuste de los t´ erminos erminos y ∆ x, veamos el promedio de la diferencia, definido como 12 | Di | i=0 P = 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´afica afica del comportamiento de las diferencias para el seno es la siguiente −
Variaciones de diferencias para el seno
0.1
0.08
0.06 a i c n e r 0.04 e f i D
0.02
0 0
50
10 0
150
200
25 0
300
350
40 0
‐0.02
Grados
Finalmente, vamos a ver que tan exacto fue nuestro programa, se define el error como E =
|V 0 − V | V 0
Donde V 0 es el valor esperado y V es el valor obtenido, haciendo el c´alculo, alculo, nos queda que el promedio de 2 E , es E ≈ 3.91 × 10 o en porcentaje E ≈ 3.91% −
3.2 3.2
Cosen oseno o
Finalme Fin almente nte aqu´ı est´a la tabla de los valores obtenidos de la funci´on on coseno Nota: A partir de 150 ∆ x = 1 × 10 1 ; a partir de 330 ∆ x = 1 −
5
Funci´ on cos(0) cos(30) cos(60) cos(90) cos(120) cos(150) cos(180) cos(210) cos(240) cos(270) cos(300) cos(330) cos(360)
Valor 1 0.866025403784439 .5 0 −.5 −0.866025403784439 −1 −0.866025403784439 −0.5 0 .5 0.866025403784438 1
Valor obtenido 1 0.866026351695 0.499968136978 −0.0008 000890 9032 3229 2958 5836 3666 −0.508754724135 −0.865607657172 −1.00167335603 −0.865513071157 −0.49396812212 0.0344747316528 0.64778274139 0.724440731698 0.965251687094
El promedio de la diferencia para el coseno es P ≈ 3.0658333 × 10 coseno es la siguiente
2
−
Diferencia 0 −9.4791 × 10 7 3.1863 × 10 5 8.9032 × 10 4 8.7547 × 10 3 −4.1774 × 10 4 1.6733 × 10 3 −5.1233 × 10 4 −6.0318 × 10 3 −3.4474 × 10 2 −1.4778 × 10 1 1.4158 × 10 1 3.4748 × 10 2 −
−
−
−
−
−
−
−
−
−
−
−
Y la grafica del comportamiento del
Variaciones de diferencias para el coseno 0.18 0.16 0.14 0.12 a 0.1 i c n e r 0.08 e f i D 0.06
0.04 0.02 0 ‐0.02
0
50
10 0
150
200
25 0
300
350
40 0
Grados
El promedio de error para coseno es de E ≈ .0511 o en porcentaje E ≈ 5.11%
4
Conc Conclu lusi sion ones es
Si se implementa un m´odulo odulo en el programa el cual sea capaz de lidiar con el error como se lidi´o manualemnte en esta ocasi´on, on, entonces ocurre algo bastante curioso, al parecer el error tiene un comportamiento peri´odico como pudimos observar en la gr´afica afica del seno. Esto Esto se debe a que la correcci correcci´´on on del error ocurre cuando ´este este es intolerable, por tanto tiene un peque˜ p eque˜no no margen para crecer; si quisi´eramos eramos que siempre estuviera en las mejores condiciones probablemente la computadora se sobrecargar´ sobrecargar´ıa y ser´ ser´ıa demasiado tedioso usar el programa. Sin embargo creo que hay que pulir los m´argenes de error, dado que aunque el mayor es de 5%, el cual es un margen margen bastante bastante aceptable, aceptable, se puede mejorar. mejorar.
5
C´ odigo odigo fuente
from from math math import import *
6
"""Est """Este e es el bloque bloque de funcio funciones nes del progrmam progrmama, a, en esta esta seccio seccion n se encuen encuentra tra la deriva derivada, da, el factor factorial ial y la funcio funcion n defini definida da por el usuari usuario"" o""" " #Defino #Defino la funcion funcion derivada, derivada, simplemente simplemente es la definici definicion on de derivacio derivacion n def derivada(f): def drf(x,dx=1e-2): drf(x,dx=1e-2): return (f(x+dx/2)-f(x-dx/2))/dx (f(x+dx/2)-f(x-dx/2))/dx return return drf #defin #defino o como como funcio funcion n la funcio funcion n que el usuari usuario o quiso quiso aproxi aproximar mar def f(x): f(x): return return eval(e) eval(e) #defino #defino la funcion funcion factorial factorial def fac(n): fac(n): if n == 0: return return 1 else: return return n * fac(nfac(n-1) 1) #est #estas as son son las las vari variab able les s que que se van van a usar usar en el prog progra rama ma p=input( p=input("De "De cuantos cuantos pasos pasos quieres quieres la serie serie de Taylor-M Taylor-Maclau aclaurin? rin?: : ") e=raw_ e=raw_inp input( ut("Cu "Cual al es la funcio funcion n que deseas deseas aproxi aproximar mar (Por (Por favor favor dala dala en termin terminos os de x)?: x)?: ") F=0 f0=0 f1=0 a=inpu a=input(" t("En En que punto punto la deseas deseas valuar valuar?: ?: ") t=derivada(f) #esta #esta es la serie serie de Taylor Taylor-Ma -Macla clauri urin n for y in range( range(p): p): MTd=0 MTm=(a**y)/fac(y) if y==0: y==0: MTm=0 else: MTd=t(0) t=derivada(t) F+=(MTd*MTm) RF=f(0)+F print print "El resultad resultado o es" print print RF
7