@Julio “s fremragende svar beskriver en flyvevejsvinkel og forklarer, at den er vinklen mellem den tangentielle retning (vinkelret på den radiale vektor og det centrale legeme) og den aktuelle hastighedsvektor.
Jeg har først forsøgt at få vinklen fra dette udtryk, men det er tydeligt forkert , da $ \ arccos $ er en jævn funktion, og vinklen kan gå fra $ – \ pi / 2 $ til $ \ pi / 2 $:
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) – \ frac {\ pi} {2} \ \ \ \ text {(forkert!)} $$
Jeg har integrerede baner til GM ($ \ mu $) og SMA ($ a $) med enhed og startafstand fra 0,2 til 1,8. Det gør perioden altid $ 2 \ pi $. Når jeg plotter resultatet af min funktion, får jeg for mange vrikker.
Hvilket udtryk kan jeg bruge til at få den korrekte flyvevejsvinkel gamma startende fra tilstandsvektorer?
Revideret python til den fejlagtige del ville blive værdsat, men bestemt ikke nødvendigt for et svar.
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()
Kommentarer
- skulle dette spørgsmål være TLDRed for at angive, at det var en kodningsfejl, da det stadig ser ud til at spørge, hvad ‘ er forkert med formlen
Svar
Dette er et problem, der har plaget grupper af mennesker, der er meget vidende om banedynamik, men som lærte at bruge forskellige lærebøger: der er to forskellige definitioner af “flyvevejsvinkel “!!
Ud over $ \ gamma $, vinklen mellem tangential retning og hastighedsvektoren er der $ \ beta $, vinklen mellem radial retning og hastighedsvektoren. Folk siger ofte “flyvevejsvinkel” uden at sige hvilken definition de bruger . Forvirrende! (Jeg har lige bemærket, at diagrammet i Julios svar også viser $ \ beta $)
Hvis du arbejder med $ \ beta $ i stedet for $ \ gamma $, gives $ \ beta $ af
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {1} $$
som går fra 0 (“lige op”) til $ \ pi $ ( “lige ned”). Ved hjælp af $ \ gamma $ er “lige op” $ \ pi / 2 $ og “lige ned” er $ – \ pi / 2 $, så konvertering af $ \ beta $ til $ \ gamma $ trækker du bare $ \ beta $ fra $ \ pi / 2 $:
$$ \ gamma = \ pi / 2 – \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {2} $$
Dette svarer til
$$ \ gamma = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Jeg kender ikke sproget du brugte til dine beregninger og plots, så jeg har ikke kigget på din algoritme for at se, hvorfor der er “for mange vrikninger”.
Kommentarer
- Tak! Jeg ‘ har tilføjet tags (tal) til ligninger. Ville du sige, at der er for mange vrikker, eller er den svirrende adfærd faktisk rimelig? Da din $ \ beta $ (ækv. 1) er den samme som min fejlagtige $ \ gamma $ bortset fra en forskydning på halv pi, så skal vrikkerne i mit plot være de samme som dem i et korrekt plot af din $ \ beta $ (ligning 1).
- Ser ud for mange vrikker for mig. Jeg ‘ Kontrollerer det senere.
- @uhoh, faktisk er min ækvivalent kun den negative i din ligning. Noget andet er galt. Du ved selvfølgelig, at noget er forkert, fordi alle de afbildede $ \ gamma $ s er negative eller nul, hvilket ‘ ikke kan være bortset fra en indadgående spiral. For en kepleriansk excentrisk bane skal $ \ gamma $ krydse nul nøjagtigt to gange ved periapsis og apoapsis og være monoton mellem ekstremen for både den korte (extremum gennem periapsis til den anden extremum) og lang (extremum gennem apoapsis til den anden extremum ) segmenter. Jeg ‘ Jeg ser, om jeg kan tegne et eksempel på, hvordan $ \ gamma $ -kurven skal se ud.
- Ups, jeg skulle have sagt ovenfor, ” Min ækv. 2 er bare dit negative. ” Jeg skal logge af og gå i seng!
- @uhoh ” tangential ” til en kugle centreret ved den primære, ikke til kredsløbet. Personligt foretrækker jeg ‘ at sige ” lateral hastighed ” men min første Orbital Dynamics professor i Stanford brugte ” tangential “.
Svar
Jeg fandt fejlen i scriptet, det skyldtes mit “homebrew” dot-produkt.Jeg havde en ekstra kvadrat:
dotted = ((xx*vv)**2).sum(axis=0) # WRONG dotted = (xx*vv).sum(axis=0) # Correct
Så ved hjælp af dette plus @TomSpilker “s fremragende præciseringer Jeg har brugt følgende to metoder til at beregne gamma:
Metode 1:
$$ \ gamma_1 = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Metode 2:
En alternativ metode for brute-force til dobbeltkontrol:
$$ \ 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 $$
Moduloperationen er kun virkelig nødvendig i computerprogrammet, da hver theta kommer fra en separat arctan2-operation:
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)
Kommentarer
- Faktisk den nye $ \ gamma $ plot er, hvad jeg forventede. Hurra! God sleuthing.