¿Cómo implementar la aproximación de Taylor en Python?
La aproximación de Taylor es una poderosa herramienta matemática que nos permite representar funciones no lineales mediante funciones afines en torno a un punto. Esto es especialmente útil en análisis numérico y matemáticas aplicadas, donde simplificar funciones puede facilitar cálculos complejos. Vamos a profundizar en el uso de la aproximación de Taylor a través de un ejemplo práctico y su implementación en Python.
¿Qué es NumPy y cómo nos ayuda en esto?
NumPy es una biblioteca fundamental para la computación científica en Python. Nos proporciona soporte para grandes arreglos multidimensionales y matrices, junto con una amplia colección de funciones matemáticas para operar con estos arreglos. En el contexto de aproximaciones de Taylor, usaremos NumPy para manejar los cálculos de vectores y funciones de manera eficiente.
¿Cómo calculamos el gradiente de la función?
Para calcular el gradiente de una función dada ( f: \mathbb{R}^2 \to \mathbb{R} ), primero necesitamos definir la función del gradiente, que nos devuelve un vector:
Asegurándonos de que la aproximación se valide mediante su evaluación en el punto de interés, debe coincidir con el valor de ( f(z) ).
¿Cómo visualizamos la aproximación para entender mejor?
La visualización es crucial. Utilizamos bibliotecas de visualización como matplotlib para graficar tanto la función original como su aproximación:
import matplotlib.pyplot as plt
# Definir un rango de valoresx_values = np.linspace(0,1,1000)original_function =[f([x, x])for x in x_values]approximated_function =[aproximacion_taylor([x, x])for x in x_values]plt.plot(x_values, original_function, label='Función original')plt.plot(x_values, approximated_function, label='Aproximación de Taylor')plt.scatter([1],[f_evaluado], color='red', zorder=5)# Punto de aproximaciónplt.legend()plt.show()
Mediante esta comparación gráfica, podemos observar cómo en la vecindad del punto de aproximación, las funciones se asemejan. Sin embargo, al alejarnos del punto, el error entre la función original y su aproximación aumenta.
¿Cómo calcular y entender el error de la aproximación?
El error entre ( f ) y su aproximación de Taylor en un punto ( x ) se mide mediante el valor absoluto de la diferencia entre ambas evaluaciones:
deferror(x):returnabs(f(x)- aproximacion_taylor(x))error_0_3 = error([0.3,0.3])error_0_4 = error([0.4,0.4])# Punto donde empieza la aproximaciónprint(error_0_3, error_0_4)
Podemos notar que cuando evaluamos la función en valores cercanos a ( z ), el error es mínimo. Esto se debe a que nuestras aproximaciones de Taylor son más precisas en estos puntos. A medida que te alejas del punto de aproximación, el error se incrementa, demostrando la limitación de nuestra aproximación en un dominio más amplio.
En conclusión, ánimo con esta aventura de aprender a aproximar funciones no lineales mediante el uso de herramientas matemáticas modernas. Si encuentras dificultades, profundiza en los cursos básicos de cálculo y programación en Python para reforzar las bases necesarias. ¡Vamos a seguir aprendiendo y explorando!
Con el ánimo de complementar un poco, me tomé el tiempo para graficar la comparación entre la primera función que se presenta en la clase y su aproximaxicón de Taylor. Este fue el resultado:
En este caso, por ser una función que contiene dos variables, se puede graficar como una superficie. Por lo tanto, su approximación de Taylor es un plano que toca a la superficie en z.
También grafiqué el error:
Este es el link por si quieres echar un vistazo al código para graficar.
Execelente trabajo, muchas gracias, de hecho me quede pensando que el error absoluto era una parabola, y ya la vi en tu segunda grafica, muchas gracias!
Gracias, no sabía como realizar la gráfica del primer ejercicio. Excelente aporte. 👍
Menos mal estudié ingeniería, porque creo que muchos se perderían con tantas cosas :O
Y se supone Platzi es para todos. Yo también he estudiado ingeniería, pero estoy entendiendo poco aunque la verdad Cálculo eran de los peores cursos que entendía en la universidad.
No se si entendi muy bien el ejercico que teniamos que hacer, pero esto es lo que consegui aproximando en f(x) = 3.7183 + [-1.72, 2.72] [x0 - 1, x1 - 2]
Está muy bien, lo único que te falta es obtener el error acumulado entre la aproximación y el valor real, lo cual ya tienes. En este caso tendrías que sumar las diferencias entre cada una de las dimensiones, la suma de cada uno de los errores forma el error total.
Amigo disculpa, como le pusiste el Dark Mode al Jupyter?
Entiendo que hay que saber programar y eso da un plus, pero la verdad a veces pienso yo que es mejor hacer un ejemplo de forma grafica y sencilla ( hacer un ejercicio tableriado), y luego si pasar a realizar el programa, ya que si yo entiendo primero que estoy haciendo de forma explicita esto me permite comprender que esta haciendo el código, los términos que se usan a veces son complejos, y no hay un ejemplo grafico, esto dificultara al estudiante y lo alejara debido a su nivel, los términos a veces son muy matemáticos, y a veces solo lo entendemos quienes ya vimos cursos avanzados, y en ello caería el nombre del curso que es una introducción.
import math
def taylor_approximation_sin(x): a =0 f_a = math.sin(a) # Valor de la función en el punto a
f_prime_a = math.cos(a) # Derivada de la función en el punto a
f_double_prime_a =-math.sin(a) # Segunda derivada de la función en el punto a
approximation = f_a + f_prime_a *(x - a)+(1/2)* f_double_prime_a *(x - a)**2 # Aproximación de Taylor de segundo orden
return approximation
# Ejemplo de uso
x = math.pi/6approximation =taylor_approximation_sin(x)exact_value = math.sin(x)print("Aproximación de Taylor:", approximation)print("Valor exacto:", exact_value)print("Error absoluto:",abs(exact_value - approximation))
En este ejemplo, se define la función taylor_approximation_sin que realiza la aproximación de Taylor de segundo orden para la función seno alrededor del punto a = 0. Luego, se prueba la aproximación para x = π/6 y se compara con el valor exacto de la función seno en ese punto. Se imprime la aproximación de Taylor, el valor exacto y el error absoluto.
Recuerda que a medida que se incluyen más términos en la serie de Taylor, la aproximación será más precisa. Sin embargo, en este ejemplo solo se utiliza la aproximación de segundo orden para simplificar el código.
Yo probé diferentes valores con el siguiente código:
valores =[(1,2),(2,2),(2,4),(3,4),(4,5),(5,5),(5,4),(6,5),(5,6)]for tupla invalores: x = np.array([tupla[0],tupla[1]])print(f' x = {x} f(x) ={F(x)} Taylor f(x) = {taylor_F(x,z)} |f(x) - Taylor f(x)| = {np.abs(F(x) - taylor_F(x,z))}')
y obtuve estos resultados:
x = [1 2] f(x) =3.718281828459045 Taylor f(x) = 3.718281828459045 |f(x) - Taylor f(x)| = 0.0
x = [2 2] f(x) =3.0 Taylor f(x) = 2.0 |f(x) - Taylor f(x)| = 1.0
x = [2 4] f(x) =9.38905609893065 Taylor f(x) = 7.43656365691809 |f(x) - Taylor f(x)| = 1.9524924420125602
x = [3 4] f(x) =5.718281828459045 Taylor f(x) = 5.718281828459045 |f(x) - Taylor f(x)| = 0.0
x = [4 5] f(x) =6.718281828459045 Taylor f(x) = 6.718281828459045 |f(x) - Taylor f(x)| = 0.0
x = [5 5] f(x) =6.0 Taylor f(x) = 5.0 |f(x) - Taylor f(x)| = 1.0
x = [5 4] f(x) =5.367879441171443 Taylor f(x) = 2.281718171540955 |f(x) - Taylor f(x)| = 3.086161269630488
x = [6 5] f(x) =6.367879441171443 Taylor f(x) = 3.2817181715409554 |f(x) - Taylor f(x)| = 3.0861612696304874
x = [5 6] f(x) =7.718281828459045 Taylor f(x) = 7.718281828459045 |f(x) - Taylor f(x)| = 0.0
Hola muchachos, acá dejo mi aporte:
Ejercicio propuesto en la clase:
Me he tardado bastante con este ejercicio y aun asi pienso que mi código es incorrecto. Me sería de mucha utilidad si me pueden apoyar con alguna sugerencia.
Mi código en Deepnote
Sinceramente no entendi la parte de derivar la funcion evaluada en z, por ejemplo, si tengo que derivarla a mano, tendria que sacar, en el primer ejemplo la derivada parcial de x + e^(2 - x) y en el segundo ejemplo la derivada pacial 1 + e^( x - 1) ?
Si exacto ese seria el caso, por eso la primera derivada respecto a x0 sale 1-exp(z1-z0),el exp negativo porque la derivada de -x0 sale negativo y la otra derivada con respecto a x1 sale exp(z1-z0) porque el x0 seria una constante solo quedaria el exp positivo por la derivada de x1 es positiva.
Con esta explicación entendí claramente el ejemplo. Muchas gracias Tomas & Victor.
para z = [1, 2]
f(x)-taylor_f(x)=0
##Error de aproximación
x = np.arange(-10,12,.5)y = np.arange(-9,13,.5)coords =[[i,j]for i,j inzip(x,y)]print(coords)def error(coords):for i incoords:print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(i,F(i),taylor_F(i,z),np.abs(F(i)-taylor_F(i,z))))print('---'*10)error(coords)
x = [-6.0, -5.0], f(x) = -3.281718171540955, Taylor f(x) = -3.281718171540955, |f(x) - Taylor f(x)| = 0.0
x = [-5.5, -4.5], f(x) = -2.781718171540955, Taylor f(x) = -2.781718171540954, |f(x) - Taylor f(x)| = 8.881784197001252e-16
x = [-5.0, -4.0], f(x) = -2.281718171540955, Taylor f(x) = -2.281718171540954, |f(x) - Taylor f(x)| = 8.881784197001252e-16
x = [-4.5, -3.5], f(x) = -1.781718171540955, Taylor f(x) = -1.7817181715409558, |f(x) - Taylor f(x)| = 8.881784197001252e-16
x = [-4.0, -3.0], f(x) = -1.281718171540955, Taylor f(x) = -1.281718171540955, |f(x) - Taylor f(x)| = 0.0
x = [-3.5, -2.5], f(x) = -0.7817181715409549, Taylor f(x) = -0.7817181715409549, |f(x) - Taylor f(x)| = 0.0
x = [-3.0, -2.0], f(x) = -0.2817181715409549, Taylor f(x) = -0.2817181715409549, |f(x) - Taylor f(x)| = 0.0
x = [-2.5, -1.5], f(x) = 0.2182818284590451, Taylor f(x) = 0.2182818284590451, |f(x) - Taylor f(x)| = 0.0
x = [-2.0, -1.0], f(x) = 0.7182818284590451, Taylor f(x) = 0.7182818284590455, |f(x) - Taylor f(x)| = 4.440892098500626e-16
x = [-1.5, -0.5], f(x) = 1.218281828459045, Taylor f(x) = 1.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [-1.0, 0.0], f(x) = 1.718281828459045, Taylor f(x) = 1.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [-0.5, 0.5], f(x) = 2.218281828459045, Taylor f(x) = 2.2182818284590455, |f(x) - Taylor f(x)| = 4.440892098500626e-16
x = [0.0, 1.0], f(x) = 2.718281828459045, Taylor f(x) = 2.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [0.5, 1.5], f(x) = 3.218281828459045, Taylor f(x) = 3.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [1.0, 2.0], f(x) = 3.718281828459045, Taylor f(x) = 3.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [1.5, 2.5], f(x) = 4.218281828459045, Taylor f(x) = 4.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [2.0, 3.0], f(x) = 4.718281828459045, Taylor f(x) = 4.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [2.5, 3.5], f(x) = 5.218281828459045, Taylor f(x) = 5.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [3.0, 4.0], f(x) = 5.718281828459045, Taylor f(x) = 5.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [3.5, 4.5], f(x) = 6.218281828459045, Taylor f(x) = 6.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [4.0, 5.0], f(x) = 6.718281828459045, Taylor f(x) = 6.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [4.5, 5.5], f(x) = 7.218281828459045, Taylor f(x) = 7.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [5.0, 6.0], f(x) = 7.718281828459045, Taylor f(x) = 7.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [5.5, 6.5], f(x) = 8.218281828459045, Taylor f(x) = 8.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [6.0, 7.0], f(x) = 8.718281828459045, Taylor f(x) = 8.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [6.5, 7.5], f(x) = 9.218281828459045, Taylor f(x) = 9.218281828459046, |f(x) - Taylor f(x)| = 1.7763568394002505e-15
x = [7.0, 8.0], f(x) = 9.718281828459045, Taylor f(x) = 9.718281828459045, |f(x) - Taylor f(x)| = 0.0
x = [7.5, 8.5], f(x) = 10.218281828459045, Taylor f(x) = 10.218281828459045, |f(x) - Taylor f(x)| = 0.0
x = [8.0, 9.0], f(x) = 10.718281828459045, Taylor f(x) = 10.718281828459045, |f(x) - Taylor f(x)| = 0.0
Hola! Si estás trabajando en Google Colabs, no es necesario a gregar la línea de %matplotlib inline, ya que, a diferencia de juyter, colab renderiza los gráficos sin necesidad de ese comando.
Hola de nuevo. Veo que estás corriendo un archivo local, en ese caso tampoco es necesario el comando %matplotlib inline :)
Modificando los valores del profe se calculo los errores de la funcion:
definos los puntos a evaluar:
se importo numpy primero.
f([1,2])=3.718281828459045f([1.5,3])=5.9816890703380645f([2,4])=9.38905609893065f([3,6])=23.085536923187668f([4,8])=58.598150033144236taylor_F([1,2],[1,2])=3.718281828459045taylor_F([1.5,3],[1,2])=5.577422742688568taylor_F([2,4],[1,2])=7.43656365691809taylor_F([3,6],[1,2])=11.154845485377136taylor_F([4,8],[1,2])=14.873127313836179El error definido por |f([1,2])-Taylorf([1,2],[1,2])| es =0.0El error definido por |f([1.5,3])-Taylorf([1.5,3],[1,2])| es =0.40426632764949666El error definido por |f([2,4])-Taylorf([2,4],[1,2])| es =1.9524924420125602El error definido por |f([3,6])-Taylorf([3,6],[1,2])| es =11.930691437810532El error definido por |f([4,8])-Taylorf([4,8],[1,2])| es =43.72502271930806