Estoy tratando de implementar un péndulo esférico. El Lagrangiano (que aún no he entendido completamente) basado en , θ y φ tomados de esta página dan como resultado las ecuaciones:
estoy tratando como la aceleración y de como la velocidad de . ¿Es esto correcto? Ahora, cada paso del movimiento se implementa de la siguiente manera (Python):
theta_f = pow(phi_v, 2) * sin(theta) * cos(theta) - G / L * sin(theta)
phi_f = - 2 * theta_v * phi_v / tan(theta)
theta_v += theta_f / timesteps
phi_v += phi_f / timesteps
theta += theta_v
phi += phi_v
Esto funciona siempre que phi_v
(
) es 0 o cercano a 0.
Si , el movimiento es erróneo.
Mis valores iniciales son
theta = 0.8
phi = 0.5
timesteps = 60
L ~ 2
G = 2.0
theta_v = 0.0
phi_v = 0.1
Después de algunas iteraciones, el código produce un math range error
as phi_v
que se vuelve demasiado grande. Encontré esta pregunta que podría explicar el error de redondeo matemático.
Estoy usando 60 muestras por segundo, porque habrá interacción en tiempo real. Los valores aproximados estarán totalmente bien, pero no puedo creer que el estado actual sea simplemente un error de aproximación.
¿Cómo puedo corregir mi código para simular el péndulo esférico?
El problema parece ser que no está teniendo en cuenta el tamaño del paso a tiempo al integrar. Esto debería ser obvio cuando estás haciendo cosas como
phi_v += phi_f
en el código. 1 La aceleración no se puede simplemente sumar a la velocidad (¡las unidades no coinciden!). La relación esperada es,
Lo que deberías estar haciendo es usar las 4 ecuaciones (2 posiciones, 2 velocidades),
1. OP agregó el timesteps
término a las ecuaciones en la versión 6 ; esta respuesta se publicó antes de esa edición.
Me parece que estás tratando de resolver un sistema de ecuaciones diferenciales ordinarias estimando la solución en pequeños pasos. ¿Estoy en lo correcto? Si es así, hay una serie de cosas a considerar.
Primero, debe tener una buena estimación del operador derivado para aproximar el estado futuro dadas las condiciones iniciales. Este tipo de problema se llama problema de valor inicial (ivp).
Dado que la ecuación involucra derivadas temporales de primer y segundo orden, un paso común es definir las variables de impulso y propagar un sistema más grande. Esto ayudará a evitar errores a medida que aumenta el tiempo total. He visto ese problema en los códigos de trazado de rayos y lo que sugiero es tan común que la mayoría de las personas nunca propagan una ecuación de segundo orden. La idea es:
p_theta = d(theta)/dt
p_phi = d(phi)/dt
entonces tu ecuacion es
d(p_theta)/dt = (p_phi)^2*cos(theta)*sin(theta) - g/l*sin(theta)
d(p_phi)/dt = -2*p_theta*p_phi*cot(theta)
más las dos ecuaciones que definen las p.
Un simple paso de Euler se implementaría como,
p_theta(t0+dt) = p_theta(t0) + (d(p_theta)/dt)(t0)*dt
p_phi(t0+dt) = p_phi(t0) + (d(p_phi)/dt)(t0)*dt
más las ecuaciones para theta y phi en las definiciones de p.
Esta es la configuración típica. Ahora, el paso de Euler es muy pobre y nunca recomendado. Sería mejor implementar un método de orden superior como RK4 o RK5 (4), etc., con control de tamaño de paso.
Aparte de eso, el uso de ángulos a veces es un problema, ya que lleva a la posibilidad de que en algún paso no pueda determinar de manera única el siguiente valor debido a que el sistema es singular. En las simulaciones aeroespaciales usan cuarterones para arreglar esto. Puede consultar Goldstein Classical Mechanics para obtener detalles sobre las matemáticas o Zipfel Modeling and Simulation of Aerospace Vehicle Dynamics. Creo que no necesitas esta maquinaria en este momento. Debe escribir las ecuaciones correctamente y probar un algoritmo de paso simple antes de volverse demasiado sofisticado. Creo que Python tiene un paquete de resolución de ODE, por lo que no necesita escribir el suyo propio, solo configure correctamente y llame. Espero que eso ayude.
j murray
probablemente_alguien
biofísico
biofísico
kyle kanos
biofísico
kyle kanos
eli
usuario196418
Leandro
Leandro
usuario196418
usuario196418
Leandro
Leandro
usuario196418
qmecanico
rj mater