Cinemática 3D con SageMath

Un problema clásico en Bachillerato es el siguiente: dadas las ecuaciones paramétricas de la trayectoria de una partícula, ¿cómo es su movimiento? Para contestar a esta pregunta recurres a tus conocimientos de cinemática, coges lápiz y papel (y calculadora) y, sin más que hacer unas cuantas operaciones, obtienes la posición, la velocidad y la aceleración de la partícula en cualquier instante.

En este artículo queremos mostrarte una manera alternativa de resolver el problema: escribiremos un programa que haga todos los cálculos necesarios para obtener la solución. Con este planteamiento solo te tendrás que preocupar de la lógica del problema y el ordenador hará las cuentas por ti. Este enfoque, aparte de evitarte el trabajo tedioso de realizar las operaciones, te va a permitir entrar en contacto con una herramienta fundamental en el trabajo científico: la programación científica.

El lenguaje de programación que utilizaremos es SageMath; si no lo conoces, en la entrada SageMath: una navaja suiza en clase de Física de este blog tienes una breve introducción. 

El problema

Las ecuaciones paramétricas del movimiento de una partícula, en unidades del SI, son:

$$\left.\begin{array}{l} x = 2t^2 - 2t\\ y = t^3 - 3\\ z = t^2 + 2t \end{array}\right\}$$

Halla, en el instante t=1 s, el vector de posición, la velocidad, la aceleración y las componentes intrínsecas de la aceleración de la partícula y el radio de curvatura de la trayectoria.

Seguro que has resuelto, con lápiz y papel, más de un problema de este estilo (si te hace falta refrescar los conceptos de cinemática tienes un resumen en Cinemática: glosario ilustrado). Veamos cómo lo podemos resolver utilizando SageMath.

La sintaxis

Los lenguajes de programación son muy estrictos en cuestiones de sintaxis, así que, antes de empezar es conveniente que leas el artículo Unas pocas reglas en el que se muestran ejemplos de las principales reglas que debes seguir cuando escribas un programa en Sage.

El programa

Para que te empieces a familiarizar con el lenguaje de programación que vamos a utilizar, en esta celda Sage tienes un programa que resuelve el problema planteado. Lee el código y ejecuta el programa (para ello pulsa el botón “Evaluar”) para intentar entender cómo funciona. Habrá muchos detalles que al principio no comprendas; pásalos por alto. Lo importante es que logres identificar las instrucciones en las que se realizan cálculos relevantes. Piensa también qué sucedería si cambias algún dato o instrucción; modifica el programa, ejecútalo y observa cómo cambia el resultado. ¿Funcionan las cosas como esperabas? Es muy interesante que pruebes con datos “especiales” o datos que creas que pueden dar resultados “raros”.

var('t')

# -------- DATOS ------

# Ecuaciones paramétricas del movimiento (m)
x = 2*t^2 - 2*t
y = t^3 - 3
z = t^2 + 2*t

# Instante ti para el cálculo de magnitudes instantáneas (s)
ti = 1

# Instantes tmin y tmax para la representación de la trayectoria (s)
tmin = 0
tmax = 2


# -------- MAGNITUDES CINEMÁTICAS ---------

# Vector de posición, velocidad y aceleración en función del tiempo
r = vector([x, y, z])
v = derivative(r, t)
a = derivative(r, t, 2)

# Módulo del vector velocidad
vmod = norm(v)

# Derivada del módulo de la velocidad
dv_dt = derivative(vmod, t)

# Vector unitario en la dirección de la velocidad
ut = v/vmod

# Aceleración tangencial
at = dv_dt*ut

# Aceleración normal
an = a - at

# Radio de curvatura
R = vmod^2/norm(an)


# -------- REPRESENTACIÓN GRÁFICA ---------

# Posición en el instante ti
Pi = point((x(t=ti),y(t=ti),z(t=ti)))

# Vector de posición en el instante ti
ri = plot(r(t=ti))

# Trayectoria entre los instantes tmin y tmax
trayectoria = parametric_plot((x,y,z), (t, tmin, tmax), color='darkred')


# -------- SALIDA POR PANTALLA ---------
show("Vector de posición, velocidad y aceleración en función del tiempo:")
show("r(t)=", r, " m")
show("v(t)=", v, " m/s")
show("a(t)=", a, " m/s2")
show("-------------------")

show("Vector de posición, velocidad y aceleración en t=", ti, " s:")
show("r=", r(t=ti), " m")
show("v=", v(t=ti), " m/s")
show("a=", a(t=ti), " m/s^2")
show("-------------------")

show("Componentes intrínsecas de la aceleración en t=", ti, " s:")
show("at=", at(t=ti), " m/s^2")
show("an=", an(t=ti), " m/s^2")
show("-------------------")

show("Radio de curvatura en t=", ti, " s:")
show("R=", n(R(t=ti)), " m")

show(trayectoria + Pi + ri, axes=True, decimals=0, projection='orthographic')

 

Las variables

Para que puedas entender mejor el programa, recogemos aquí los nombres de las variables que hemos utilizado y el significado que les hemos otorgado. Los nombres de las variables son arbitrarios, así que si lo deseas puedes cambiarlos.

VariableSignificado
tTiempo
x, y, zCoordenadas de la posición del móvil en función del tiempo
tiInstante en el que se calculan las magnitudes cinemáticas
tmin, tmaxIntervalo de tiempo para la representación de la trayectoria
rVector de posición de la partícula en función del tiempo
vVector velocidad en función del tiempo
aVector aceleración en función del tiempo
anVector aceleración normal en función del tiempo
atVector aceleración tangencial en función del tiempo
vmodMódulo del vector velocidad en función del tiempo
dv_dtDerivada del módulo de la velocidad con respecto al tiempo
utVector unitario en la dirección de la velocidad en función del tiempo
RRadio de curvatura en función del tiempo
trayectoriaRepresentación gráfica de la trayectoria entre tmin y tmax
PiRepresentación gráfica del punto en que se encuentra la partícula en el instante ti
riRepresentación gráfica del vector de posición de la partícula en el instante ti

Las funciones

Todos los lenguajes de programación proporcionan una serie de funciones predefinidas que realizan distintas tareas. Dado que SageMath es un lenguaje especializado en matemáticas, ofrece una grandísima variedad de funciones matemáticas que aprovecharemos para resolver nuestro problema. A continuación reunimos todas las funciones que hemos usado en el programa con su significado, los argumentos que necesita y un ejemplo de su uso. Aquí debemos ser muy estrictos, ya que cualquier cambio en el nombre, los paréntesis o corchetes, los argumentos, etc. va a provocar un error en la ejecución del programa.

var() 
DescripciónCrea una variable.
ArgumentosNombre de la variable que se crea.
Ejemplo
var('t')
vector() 
DescripciónConstruye un vector.
ArgumentosCoordenadas del vector.
Ejemplo
vector([1,-2,-1])
derivative() 
DescripciónCalcula la función derivada.
ArgumentosPrimer argumento: función que se deriva.
Segundo argumento: variable con respecto a la que se calcula la derivada.
Tercer argumento (opcional): orden de la derivada.
Ejemplo
f = 2*x^3 - x^2 + 5*x - 2
derivative(f,x)
norm() 
DescripciónHalla el módulo de un vector.
ArgumentosVector cuyo módulo se calcula.
Ejemplo
v = vector([1,-2,-1])
norm(v)
n() 
DescripciónAproximación numérica.
ArgumentosExpresión cuyo valor se quiere presentar como un número real.
Ejemplo
n(2/3)
point() 
DescripciónRepresentación gráfica de un punto.
ArgumentosPrimer argumento: coordenadas del punto (en dos o tres dimensiones).
Otros argumentos (opcionales): tamaño, color...
Ejemplo
point((0,0), size=30)
plot() 
DescripciónMuestra un objeto gráfico (curva, vector, punto, etc.).
ArgumentosPrimer argumento: objeto que se quiere representar.
Otros argumentos (opcionales): color, grosor de la línea...
Ejemplo
v = vector([1,-2,-1])
plot(v, color='red', thickness=4)
parametric_plot() 
DescripciónCrea la gráfica de una curva dadas sus ecuaciones paramétricas.
ArgumentosPrimer argumento: ecuaciones paramétricas.
Segundo argumento: la variable y sus valores mínimo y máximo para la representación gráfica.
Otros argumentos (opcionales): color, grosor de la línea...
Ejemplo
var('t')
x = sin(t)
y = cos(t)
z = 2
parametric_plot((x,y,z), (t,0,2*pi))
show() 
DescripciónMuestra texto u objetos gráficos.
ArgumentosPrimer argumento: texto u objeto gráfico que se quiere mostrar.
Otros argumentos (opcionales): tamaño, ejes...
Ejemplo
A = point((0,0))
B = point((2,2))
show(A + B, gridlines=True)

¿Qué más?

El programa del ejemplo resuelve un problema concreto; ahora te toca a ti probar con otros similares. En algunas ocasiones llegará con que realices pequeños cambios en el código del ejemplo, pero en otras deberás hacer modificaciones más profundas para adaptar el ejemplo al problema concreto que estés resolviendo. Además, ¿se te ocurre alguna funcionalidad que puedas añadir al programa?

Por otro lado, el programa ha sido escrito primando la sencillez y claridad sobre una codificación eficiente, por lo que tampoco se ha hecho ninguna comprobación de los posibles errores que pueden surgir en la ejecución. ¿Has probado, por ejemplo, el caso de que la trayectoria sea una recta? Se obtiene un error muy obvio, que deberíamos haber controlado. ¿Serías capaz de mejorar el programa? Si has llegado a este punto, en algún momento necesitarás recurrir a http://www.sagemath.org/ para obtener más información sobre lo que se puede hacer con Sage.