In [1]:
%matplotlib inline
In [2]:
from sympy import symbols, integrate, lambdify, diff
from matplotlib import pyplot as plt
import numpy
In [3]:
# Creamos los simbolos que vamos a emplear
x, y, z, t = symbols('x y z t')
In [4]:
# Definimos constantes
g = 9.8 # [m/s**2]
rx0 = rz0 = 0
ry0 = 100
vx0 = vy0 = vz0 = 0
ax0 = ay0 = az0 = 0
V = 5 # [m/s] Velocidad de traslación del sistema S'
In [5]:
# Obtenemos valores de integrales simbólicas
vy = -g * t
ry = integrate(vy)
ay = diff(vy, t)
# 'lambdificamos' para poder realizar evaluaciones de las integrales
# lambdify(t, vy)(9)
In [6]:
# Formamos vectores como tuplas python. Podemos evaluar sus componentes con lambdify
r = (rx0, ry + ry0, rz0)
v = (vx0, vy + vy0, vz0)
a = (ax0, ay + ay0, az0)
Tenemos el sistema de referencia S' el cual se mueve con velocidad de traslación V = cte
In [7]:
V_mod = 5 # [m/s]
# Vector desplazamiento de S'
V = (V_mod, 0, 0)
v_pr = [v[i] - V[i] for i in range(3)] # Pasamos a tuplas, mejor usarlas aunque no modifiquemos, por list_comprehension
# A continuación forma correcta de integrar un vector, cada uno de sus componentes por separado,
# pero usando una única función vectorial
r_pr = [integrate(v_pr[i], t) for i in range(3)]
r_pr[0] += 5 # Añadimos valor inicial de x0 en S'
r_pr[1] += ry0
Representación gráfica del movimiento de la gota de lluvia en los dos sistemas de referencia
In [8]:
p = numpy.linspace(0, 4.5, 100)
x_S = [5 for i in range(100)]
y_S = [lambdify(t, r[1])(i) for i in p]
x_S_pr = [lambdify(t, r_pr[0])(i) for i in p]
y_S_pr = [lambdify(t, r_pr[1])(i) for i in p]
plt.title('Gota de lluvia en caída libre')
plt.xlabel('distancia X [m]')
plt.ylabel('distancia Y [m]')
plt.plot(x_S, y_S)
plt.plot(x_S_pr, y_S_pr)
plt.xlim(-18, 6)
plt.ylim(0, 110)
plt.plot(5, 100, 'ro')
plt.text(0, 100.7, 'punto inicial')
plt.plot(0, 0, 'b-', label = 'S fijo')
plt.plot(0, 0, 'g-', label = 'Sprima con v cte')
plt.legend(loc=0)
plt.show()
In [13]:
##### Lambdify (sympy)
#
# Sirve para lambdificar, esto es, hacer función anónima, un expresión que tengamos dependiente de una o más variables.
# Tiene muchísimas más opciones. Se puede elegir el módulo del cuál se cogerá la expresión (en caso de usar sin, cos, etc),
# puede coger matrices (las sustituye por numpy.array), etc.
# Increíblemente útil. Muchos ejemplos en la ayuda.
#
# Ejemplos
# r = [0, -4.9*t**2 + 100, 0]
# lambdify(t, r[1])(1)
# Out: 95.1
# s = 2 * x**2 + 3*y + z
# lambdify((x, y, z), s)(0.2, -4, 1)
# Out: -10.92