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.

gráficas de órbita

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:

ingresar imagen descripción aquí

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *