La excelente respuesta de @Julio describe un ángulo de trayectoria de vuelo y explica que es el ángulo entre la dirección tangencial (perpendicular al vector radial al cuerpo central) y el vector de velocidad actual.
Primero intenté obtener el ángulo a partir de esta expresión, pero obviamente está mal , ya que $ \ arccos $ es una función par y el ángulo puede ir de $ – \ pi / 2 $ a $ \ pi / 2 $:
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) – \ frac {\ pi} {2} \ \ \ \ text {(¡incorrecto!)} $$
He integrado órbitas para GM ($ \ mu $) y SMA ($ a $) de unidad y distancias iniciales de 0.2 a 1.8. Eso hace que el período sea siempre $ 2 \ pi $. Cuando trazo el resultado de mi función, obtengo demasiados meneos.
¿Qué expresión puedo usar para obtener el ángulo gamma correcto de la trayectoria de vuelo a partir de los vectores de estado?
Se agradecería que Python revisado para la parte errónea, pero ciertamente no es necesario para una respuesta.
def deriv(X, t): x, v = X.reshape(2, -1) acc = -x * ((x**2).sum())**-1.5 return np.hstack((v, acc)) import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint as ODEint halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)] T = twopi time = np.linspace(0, twopi, 201) a = 1.0 rstarts = 0.2 * np.arange(1, 10) vstarts = np.sqrt(2./rstarts - 1./a) # from vis-viva equation answers = [] for r, v in zip(rstarts, vstarts): X0 = np.array([r, 0, 0, v]) answer, info = ODEint(deriv, X0, time, full_output= True) answers.append(answer.T) gammas = [] for a in answers: xx, vv = a.reshape(2, 2, -1) dotted = ((xx*vv)**2).sum(axis=0) rabs, vabs = [np.sqrt((thing**2).sum(axis=0)) for thing in (xx, vv)] gamma = np.arccos(dotted/(rabs*vabs)) - halfpi gammas.append(gamma) if True: plt.figure() plt.subplot(4, 1, 1) for x, y, vx, vy in answers: plt.plot(x, y) plt.plot(x[:1], y[:1], ".k") plt.plot([0], [0], "ok") plt.title("y vs x") plt.subplot(4, 1, 2) for x, y, vx, vy in answers: plt.plot(time, x, "-b") plt.plot(time, y, "--r") plt.title("x (blue) y (red, dashed)") plt.xlim(0, twopi) plt.subplot(4, 1, 3) for x, y, vx, vy in answers: plt.plot(time, vx, "-b") plt.plot(time, vy, "--r") plt.title("vx (blue) vy (red), dashed") plt.xlim(0, twopi) plt.subplot(4, 1, 4) for gamma in gammas: plt.plot(time, gamma) plt.title("gamma?") plt.xlim(0, twopi) plt.show()
Comentarios
- si esta pregunta ser TLDRed para indicar que fue un error de codificación, ya que todavía parece preguntar qué ‘ está mal con la fórmula
Responder
Este es un problema que ha afectado a grupos de personas muy conocedoras de la dinámica orbital pero que aprendieron utilizando diferentes libros de texto: hay dos definiciones diferentes de «ángulo de trayectoria de vuelo «!!
Además de $ \ gamma $, el ángulo entre la dirección tangencial y el vector de velocidad, hay $ \ beta $, el ángulo entre la dirección radial y el vector de velocidad. La gente suele decir «ángulo de trayectoria de vuelo» sin decir qué definición están usando . ¡Es confuso! (Acabo de notar que el diagrama en la respuesta de Julio también muestra $ \ beta $)
Si trabaja con $ \ beta $ en lugar de $ \ gamma $, $ \ beta $ viene dado por
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {1} $$
que va de 0 («hacia arriba») a $ \ pi $ ( «hacia abajo»). Usando $ \ gamma $, «directamente hacia arriba» es $ \ pi / 2 $ y «directamente hacia abajo» es $ – \ pi / 2 $, por lo que al convertir $ \ beta $ en $ \ gamma $ solo resta $ \ beta $ de $ \ pi / 2 $:
$$ \ gamma = \ pi / 2 – \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {2} $$
Esto es equivalente a
$$ \ gamma = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
No estoy familiarizado con el idioma que usaste para tus cálculos y gráficos, así que no he mirado tu algoritmo para ver por qué hay «demasiados movimientos».
Comentarios
- ¡Gracias! ‘ he añadido etiquetas (números) a las ecuaciones. ¿Diría que hay demasiados meneos, o ese comportamiento de meneo de hecho es razonable? Dado que su $ \ beta $ (eq 1) es el mismo que mi $ \ gamma $ erróneo, excepto por un desplazamiento de la mitad de pi, entonces los movimientos en mi gráfico deberían ser los mismos que los de un gráfico adecuado de su $ \ beta $ (ec. 1).
- Me parecen demasiados meneos. ‘ comprobaré eso más tarde.
- @uhoh, en realidad, mi ecuación 1 es solo el negativo de tu ecuación. Algo más está mal. Por supuesto que sabe que algo está mal porque todos los $ \ gamma $ s graficados son negativos o cero, lo que ‘ t no puede ser excepto por una espiral hacia adentro. Para una órbita excéntrica kepleriana, $ \ gamma $ debe cruzar cero exactamente dos veces, en periapsis y apoapsis, y ser monótona entre los extremos, tanto para el corto (extremo a través de periapsis hasta el otro extremo) como largo (extremo a través de apoapsis hasta el otro extremo ) segmentos. ‘ veré si puedo dibujar un ejemplo de cómo debería verse la curva $ \ gamma $.
- Vaya, debería haber dicho antes, » Mi eq. 2 es solo el negativo tuyo. » ¡Debería cerrar la sesión e irme a la cama!
- @uhoh » tangencial » a una esfera centrada en el primario, no en la órbita. Personalmente, ‘ prefiero decir » velocidad lateral » pero mi primer profesor de dinámica orbital en Stanford usó » tangencial «.
Respuesta
Encontré el error en el script, se debía a mi producto escalar «homebrew».Tuve una cuadratura adicional:
dotted = ((xx*vv)**2).sum(axis=0) # WRONG dotted = (xx*vv).sum(axis=0) # Correct
Entonces, usando este plus @TomSpilker «s excelentes aclaraciones He utilizado los dos métodos siguientes para calcular gamma:
Método 1:
$$ \ gamma_1 = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Método 2:
Un método alternativo de fuerza bruta para verificar dos veces:
$$ \ theta_r = \ arctan2 (y, x) $$
$$ \ theta_v = \ arctan2 (vy, x) $$
$$ \ theta_ {tanj} = \ theta_r + \ frac {\ pi} {2} $$
$$ \ gamma_2 = \ theta_ {tanj} – \ theta_v $$
$$ \ gamma_ {2mod} = \ mod (\ gamma_2 + \ pi, 2 \ pi) – \ pi $$
La operación de módulo solo es realmente necesaria en el programa de computadora ya que cada theta proviene de una operación arctan2 separada:
gammas_1, gammas_2 = [], [] for a in answers: xx, vv = a.reshape(2, 2, -1) dotted = (xx*vv).sum(axis=0) rabs, vabs = [np.sqrt((thing**2).sum(axis=0)) for thing in (xx, vv)] gamma_1 = np.arcsin(dotted/(rabs*vabs)) # Per Tom Spilker"s answer Eq. 3 theta_r = np.arctan2(xx[1], xx[0]) theta_v = np.arctan2(vv[1], vv[0]) theta_tanj = theta_r + halfpi gamma_2 = theta_tanj - theta_v gamma_2 = np.mod(gamma_2 + pi, twopi) - pi gammas_1.append(gamma_1) gammas_2.append(gamma_2) plt.figure() plt.subplot(2, 1, 1) for gamma_1 in gammas_1: plt.plot(time, gamma_1) plt.title("gammas_1", fontsize=16) plt.subplot(2, 1, 2) for gamma_2 in gammas_2: plt.plot(time, gamma_2) plt.title("gammas_2", fontsize=16)
Comentarios
- De hecho, el nuevo $ \ gamma $ plot es lo que esperaba. ¡Hurra! Buen detective.