Así como trabajamos en el final de la parte II del proyecto con la resolución de límites utilizando el módulo sympy, podemos calcular derivadas de la misma manera, lo cual conseguiremos utilizando diff(y,x). Donde x es una variable simbólica y y una variable que depende de x. Por ejemplo, podemos calcular la derivada de la función $f(x)=x^{2}$ la cual es
Lo cual puede calcularse también utilizando el siguiente código
import numpy as np
from sympy import *
# definimos a x como un símbolo
x = symbols("x")
# definimos la función de interés
y = x ** 2
# calculamos la derivada de y respecto de x
diff(y,x)
Asimismo podemos evaluar la derivada en algún punto, lo cual sabemos que representa (geométricamente) la pendiente de la recta tangente en ese punto; por ejemplo podemos calcular $f'(2)=2(2)=4$ o en código:
# colocaremos .subs(x,2) para efectuar matemáicamente f(2)
diff(y,x).subs(x,2)
Sabemos que al derivar una función volvemos a obtener otra función, por ello es que a la derivada podemos volver a derivarla obteniéndose así la derivada de segundo orden. Esto es, dada $f(x)$ dos veces derivable, la derivada de orden dos o segunda derivada se define como
$$ \frac{d^{2}}{dx^{2}}f(x)=\frac{d}{dx}\left(\frac{d}{dx}f(x)\right) $$Por ejemplo, sabemos que $\frac{d}{dx}x^{2}=2x$ y por ende
$$ \frac{d^{2}}{dx^{2}}f(x)=\frac{d}{dx}\left(\frac{d}{dx}x^{2}\right)=\frac{d}{dx}2x=2 $$En Python agregaremos como tercer parámetro a diff() para indicar el orden de la derivada que deseamos calcular. Veamos
# derivada de segundo orden
diff(y,x,2)
Otro ejemplo interesante es calcular las derivadas de orden superior de la función $g(x)=\frac{1}{x}$:
# definimos la función g(x)
y = 1 / x
# calculamos la primer derivada
diff(y,x)
# calculamos la segunda derivada
diff(y,x,2)
# calculamos la tercera derivada
diff(y,x,3)
De tal manera tenemos que $$ \frac{d}{dx}f(x)=-\frac{1}{x^{2}},\ \ \frac{d^{2}}{dx^{2}}f(x)=\frac{2}{x^{3}}, \ \ \frac{d^{3}}{dx^{3}}f(x)=-\frac{6}{x^{4}} $$
Podemos también aplicar la regla de la cadena, por ejemplo podemos derivar la función $h(x)=(sen(x))^{2}$:
import numpy as np
x = symbols("x")
# definimos la función f
f = sin(x)
# definimos la función g que depende de la función f
g = f ** 2
diff(g,x)
Derivemos ahora la función $k(x)=ln(sen(x))$ cuya derivada es
$$ \frac{d}{dx}k(x)=\frac{\frac{d}{dx}sen(x)}{sen(x)}=\frac{cos(x)}{sen(x)} $$o en código
# definimos la función f
f = sin(x)
# definimos la función g que depende de f
g = log(f)
diff(g, x)
además podemos simplificar expresiones algebraicas, para ello utilizamos simplify(). Por ejemplo
simplify(diff(g,x))
Como bien sabemos, en general, la derivada de $f(x)$ representa la pendiente de la recta tangente a la gráfica de $f(x)$ en el punto $x$. Es decir, si consideramos por ejemplo $f(x)=x^{2}$, y queremos conocer la pendiente de la recta tangente en el punto $x=3$ hacemos la evaluación $f'(3)=2(3)=6$. Obtengamos la ecuación de dicha recta. Sabemos que la ecuación punto-pendiente es de la forma
$$ y-y_{1}=m(x-x_{1}) $$pero en este caso la pendiente es $f'(3)=6$ y el punto $x_{1}=3$. Para obtener el punto $y_{1}$ basta con considerar $f(x_{1})=f(3)=3^{2}=9$. De tal manera
$$ y-9=6(x-3)=6x-18 $$de tal manera la ecuación de la recta tangente a la curva $f(x)$ en el punto $x=3$ es $y=6x+9$. Veamos graficamente:
import matplotlib.pyplot as mplot
# definimos la función f(x)
x = np.arange(-5,5, 0.01)
y = x ** 2
# graficamos la funcion
mplot.plot(x,y, color = "k", label = "$f(x)=x^{2}$")
# definimos la ecuación de la recta tangente v=6u+9, cambiamos u,v por x,y para evitar confuciones
u = np.arange(-2,5, 0.01)
v = 6 * u - 9
# graficamos la recta z=6x-9
mplot.plot(u,v, color = "r", label = "$y=6x-9$")
# graficamos el punto de tangencia
mplot.plot(3,9, marker = "o", color = "k")
mplot.grid()
mplot.legend()
mplot.show()
Finalmente, graficaremos varias rectas tangentes por lo que emplearemos un método similiar a la graficación de varios puntos como lo hicimos en límites. Comencemos por dibujar los puntos de interés, esto lo conseguiremos evaluando los puntos de tangencia de nuestro interés en la función $f(x)$. Por ejemplo, si el punto $x=2$ es un punto de interés, obtendremos la coordenada cmpleta evaluando $f(2)=2^{2}$, lo cual se consigue en usando .subs(x,2). Veamos
# definimos la función
x = symbols("x")
y = x ** 2
# derivamos
derivada = diff(y,x)
# lista de puntos de tangencia, en este caso serán -3,-2,-1,1,2,3 y 4
puntos_tangencia = [i / 4 for i in range(-12,16,4) if i != 0]
# agregamos el punto de tangencia x=0
puntos_tangencia.append(0)
# graficamos los puntos de tangencia iterando con un bucle for sobre los elementos de la lista de puntos de tangencia
for k in puntos_tangencia:
mplot.plot(k, y.subs(x,k), marker = "o", color = "c")
Después graficaremos las rectas tangentes. Para ello necesitamos
puntos_tangencia y la ordenada $y_{1}$ se obtiene empleando y.subs(x,x1).derivada.subs(x,x1).Con base en todo lo anterior tenemos que
# definimos el dominio de graficación
u = np.arange(-4,4,0.01)
# inicializamos x1 con el primer valor de la lista puntos_tangencia
x1 = -3
# implementamos un bucle while
while x1 in puntos_tangencia:
y1 = y.subs(x,x1)
pendiente = derivada.subs(x,x1)
ecuacion_rec_tangente = pendiente * u - pendiente * x1 + y1
mplot.plot(u,ecuacion_rec_tangente)
del y1
x1 += 1
# es necesario eliminar la variable y1 para que ésta se vuelva a crear en otra iteración y tome el valor
# correspondiente de la x1 en cuestión
mplot.show()
Finalmente conjuntamos todo para obtener
# definimos la función
x = symbols("x")
y = x ** 2
# derivamos
derivada = diff(y,x)
# lista de puntos de tangencia, en este caso serán -3,-2,-1,1,2,3 y 4
puntos_tangencia = [i / 4 for i in range(-12,16,4) if i != 0]
# agregamos el punto de tangencia x=0
puntos_tangencia.append(0)
# graficamos los puntos de tangencia iterando con un bucle for sobre los elementos de la lista de puntos de tangencia
for k in puntos_tangencia:
mplot.plot(k, y.subs(x,k), marker = "o", color = "r")
# --------------------------------------------------------------------------------------------------------------------
# definimos el dominio de graficación
u = np.arange(-4,4,0.01)
# inicializamos x1 con el primer valor de la lista puntos_tangencia
x1 = -3
# implementamos un bucle while
while x1 in puntos_tangencia:
y1 = y.subs(x,x1)
pendiente = derivada.subs(x,x1)
ecuacion_rec_tangente = pendiente * u - pendiente * x1 + y1
mplot.plot(u,ecuacion_rec_tangente)
del y1
x1 += 1
# es necesario eliminar la variable y1 para que ésta se vuelva a crear en otra iteración y tome el valor
# correspondiente de la x1 en cuestión
# graficamos la función f(x)=x^2
v = np.arange(-4,4,0.01)
w = v ** 2
mplot.plot(v,w, color = "k")
mplot.show()