@Julio «s utmerket svar beskriver flyveivinkelen, og forklarer at den er vinkelen mellom den tangentielle retningen (vinkelrett på den radiale vektoren til det sentrale legemet) og den nåværende hastighetsvektoren.
Jeg har først prøvd å få vinkelen fra dette uttrykket, men det er åpenbart feil , siden $ \ arccos $ er en jevn funksjon, og vinkelen kan gå fra $ – \ pi / 2 $ til $ \ pi / 2 $:
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) – \ frac {\ pi} {2} \ \ \ \ text {(incorrect!)} $$
Jeg har integrerte baner for GM ($ \ mu $) og SMA ($ a $) med enhet og startdistanser fra 0,2 til 1,8. Det gjør at perioden alltid er $ 2 \ pi $. Når jeg plotter resultatet av funksjonen min, får jeg for mange vri.
Hvilket uttrykk kan jeg bruke for å få den korrekte flyvebanevinkelen gamma fra tilstandsvektorer?
Revidert python for den feilaktige delen vil bli verdsatt, men absolutt ikke nødvendig 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ørsmålet vær TLDRed for å indikere at det var en kodingsfeil, ettersom det fremdeles ser ut til å spørre hva ‘ er galt med formelen
Svar
Dette er et problem som har plaget grupper av mennesker som er veldig kunnskapsrike om orbitaldynamikk, men som lærte å bruke forskjellige lærebøker: det er to forskjellige definisjoner av «flyveivinkel «!!
I tillegg til $ \ gamma $, vinkelen mellom tangentiell retning og hastighetsvektoren, er det $ \ beta $, vinkelen mellom radial retning og hastighetsvektoren. Folk sier ofte «flight path angle» uten å si hvilken definisjon de bruker . Forvirrende! (Jeg la merke til at diagrammet i Julios svar også viser $ \ beta $)
Hvis du jobber med $ \ beta $ i stedet for $ \ gamma $, blir $ \ beta $ gitt av
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {1} $$
som går fra 0 («rett opp») til $ \ pi $ ( «rett ned»). Ved å bruke $ \ gamma $ er «rett opp» $ \ pi / 2 $ og «rett ned» er $ – \ pi / 2 $, så konvertering av $ \ beta $ til $ \ gamma $ trekker du bare $ \ beta $ fra $ \ pi / 2 $:
$$ \ gamma = \ pi / 2 – \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {2} $$
Dette tilsvarer
$$ \ gamma = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Jeg er ikke kjent med språket du brukte til beregningene og plottene dine, så jeg har ikke sett på algoritmen din for å se hvorfor det er «for mange vri».
Kommentarer
- Takk! Jeg ‘ har lagt til -koder (tall) i ligninger. Vil du si at det er for mange vrikker, eller er den vriende oppførselen faktisk rimelig? Siden $ \ beta $ (ekv. 1) er det samme som min feil $ \ gamma $ bortsett fra en forskyvning på halv pi, så skal vrikningene i plottet mitt være de samme som i en riktig plott av $ \ beta $ (lik 1).
- Ser ut for mange vrikker for meg. Jeg ‘ Jeg vil sjekke det senere.
- @uhoh, faktisk er min likestilling 1 bare den negative av ligningen din. Noe annet er galt. Selvfølgelig vet du at noe er galt fordi alle de plottede $ \ gamma $ s er negative eller null, noe som ‘ ikke kan være bortsett fra en indre spiral. For en kepleriansk eksentrisk bane bør $ \ gamma $ krysse null nøyaktig to ganger, ved periapsis og apoapsis, og være monoton mellom ekstremen, for både den korte (extremum gjennom periapsis til den andre extremum) og lang (extremum gjennom apoapsis til den andre extremum ) segmenter. Jeg ‘ Jeg ser om jeg kan tegne et eksempel på hvordan $ \ gamma $ -kurven skal se ut.
- Ups, jeg burde ha sagt ovenfor, » Min ekv. 2 er bare det negative fra deg. » Jeg burde logge av og legge meg!
- @uhoh » tangentiell » til en sfære sentrert i primæren, ikke i bane. Personlig foretrekker jeg ‘ » sideveis hastighet » men min første Orbital Dynamics professor i Stanford brukte » tangential «.
Svar
Jeg fant feilen i skriptet, det skyldtes «hjemmebrygget» punktproduktet mitt.Jeg hadde en ekstra kvadrat:
dotted = ((xx*vv)**2).sum(axis=0) # WRONG dotted = (xx*vv).sum(axis=0) # Correct
Så ved å bruke dette pluss @TomSpilker «s gode avklaringer Jeg har brukt følgende to metoder for å 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 for å dobbeltsjekke:
$$ \ 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 $$
Moduloperasjonen er bare nødvendig i dataprogrammet siden hver theta kommer fra en egen arctan2-operasjon:
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 det jeg forventet. Hurra! God sleuthing.