Ahora que ya he empezado a hacer pruebas con Jupyter Notebook, el siguiente paso que quiero probar es hacer gráficos interactivos. Pues ha resultado ser más fácil y rápido de lo que pensaba.
Partimos de un script python que simula los datos experimentales de una trayectoria parabólica, y calcula la parábola que mejor se ajusta (regresión cuadrática). A partir de la ecuación de la parábola se puede deducir la constante g (=9,81 m/s2). Simulamos los datos experimentales introduciendo un error de ruido en los datos teóricos. Pues bien, con mi gráfico interactivo puedo jugar con el nivel de ruido y con el número de puntos del muestreo, tal com se ve en el video. El código queda de la siguiente forma:
%matplotlib inline
from ipywidgets import interactive
import numpy as np
import pylab as plt
from IPython.display import display, Math, Latex
# tir parabòlic: y = vy*t - .5gt^2
vy = 10 # 10m/s
g = 9.81 # m/s^2
t_max = 2*vy/g
def f(nivell_soroll, num_punts):
t = np.linspace(0, t_max, num_punts)
y_or = vy*t - .5*g*t**2
noise = np.random.normal(0, nivell_soroll, num_punts) # simulem dades experimentals
y = y_or + noise
# ajustament a una paràbola
z = np.polyfit(t, y, 2)
g_exp = 2.0*z[0]
t_ = np.linspace(0, t_max, 100)
y_ = z[0]*t_**2 + z[1]*t_ + z[2]
fig, ax = plt.subplots()
plt.plot(t_, y_, t, y, 'bo')
plt.suptitle("Tir parabòlic. Regressió quadràtica")
plt.title("y = " + str(round(z[0],3)) + "t^2 + " + str(round(z[1],3)) + "t + " + str(round(z[2],3)) + " -> g exp = " + str(round(g_exp,3)) + " m/s^2")
ax.set(xlabel='temps (s)', ylabel='y (m)')
ax.grid()
plt.show()
interactive_plot = interactive(f, nivell_soroll=(0.0, 2.0), num_punts=(10, 50))
interactive_plot
Otra cosa que me interesa es la manera de exportar estos Jupyter Notebooks a una web, conservando las gráficas y las fórmulas en format Latex (aunque se pierda la interacció con las gráficas). Esto se consigue directamente exportando el Notebook a html:
$ jupyter nbconvert --execute tir_parabolic.ipynb --to html
e integrando este código en una web donde haya más texto y explicaciones, y con la librería Bootstrap.