@Julio ”s utmärkt svar beskriver en flygvinkel och förklarar att den är vinkeln mellan den tangentiella riktningen (vinkelrät mot den radiella vektorn mot den centrala kroppen) och den aktuella hastighetsvektorn.
Jag har först försökt få vinkeln från detta uttryck, men det är uppenbarligen fel , eftersom $ \ arccos $ är en jämn funktion och vinkeln kan gå från $ – \ pi / 2 $ till $ \ pi / 2 $:
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) – \ frac {\ pi} {2} \ \ \ \ text {(felaktig!)} $$
Jag har integrerade banor för GM ($ \ mu $) och SMA ($ a $) av enhet och startavstånd från 0,2 till 1,8. Det gör att perioden alltid är $ 2 \ pi $. När jag plottar resultatet av min funktion får jag för många vippningar.
Vilket uttryck kan jag använda för att få rätt flygvägsvinkel gamma från tillståndsvektorer?
Omarbetad python för den felaktiga delen skulle uppskattas, men absolut inte nödvändigt för ett 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
- om denna fråga skulle vara vara TLDRed för att indikera att det var ett kodfel, eftersom det fortfarande verkar fråga vad ’ är fel med formeln
Svar
Detta är ett problem som har plågat grupper av människor som är mycket kunniga om omloppsdynamik men som lärde sig att använda olika läroböcker: det finns två olika definitioner av ”flygvägsvinkel ”!!
Förutom $ \ gamma $, vinkeln mellan tangentiell riktning och hastighetsvektorn finns $ \ beta $, vinkeln mellan radiell riktning och hastighetsvektorn. Människor säger ofta ”flygvägsvinkel” utan att säga vilken definition de använder . Förvirrande! (Jag märkte bara att diagrammet i Julios svar också visar $ \ beta $)
Om du arbetar med $ \ beta $ istället för $ \ gamma $, ges $ \ beta $ av
$$ \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {1} $$
som går från 0 (”rakt upp”) till $ \ pi $ ( ”rakt ner”). Med $ \ gamma $ är ”rakt upp” $ \ pi / 2 $ och ”rakt ner” är $ – \ pi / 2 $, så omvandlar du $ \ beta $ till $ \ gamma $ drar du bara $ \ beta $ från $ \ pi / 2 $:
$$ \ gamma = \ pi / 2 – \ arccos \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {2} $$
Detta motsvarar
$$ \ gamma = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Jag känner inte språket du använde för dina beräkningar och diagram, så jag har inte tittat på din algoritm för att se varför det finns ”för många vinklar”.
Kommentarer
- Tack! Jag ’ har lagt till taggar (siffror) i ekvationer. Skulle du säga att det finns för många vippningar, eller är det vacklande beteende i själva verket rimligt? Eftersom din $ \ beta $ (ekv 1) är densamma som min felaktiga $ \ gamma $ med undantag för en förskjutning på halv pi, bör vinklingarna i min plot vara desamma som i en korrekt plot av din $ \ beta $ (ekv 1).
- Ser ut som för många vinklar för mig. Jag ’ Jag ska kontrollera det senare.
- @uhoh, faktiskt är min ekv 1 bara negativ i din ekvation. Något annat är fel. Självklart vet du att något är fel eftersom alla de plottade $ \ gamma $ s är negativa eller noll, vilket kan ’ inte vara förutom en inåtgående spiral. För en kepleriansk excentrisk bana bör $ \ gamma $ korsa noll exakt två gånger, vid periapsis och apoapsis, och vara monoton mellan extrema, för både korta (extremum genom periapsis till andra extremum) och långa (extremum genom apoapsis till andra extremum ) segment. Jag ’ Jag ser om jag kan rita ett exempel på hur $ \ gamma $ -kurvan ska se ut.
- Oj, jag borde ha sagt ovan, ” Min ekv. 2 är bara ditt negativa. ” Jag borde logga av och gå och lägga mig!
- @uhoh ” tangentiell ” till en sfär centrerad vid den primära, inte till banan. Personligen vill jag ’ hellre säga ” lateral hastighet ” men min första Orbital Dynamics professor i Stanford använde ” tangentiell ”.
Svar
Jag hittade felet i skriptet, det berodde på min ”homebrew” dot-produkt.Jag hade en extra kvadrat:
dotted = ((xx*vv)**2).sum(axis=0) # WRONG dotted = (xx*vv).sum(axis=0) # Correct
Så med detta plus @TomSpilker ”s utmärkta förtydliganden Jag har använt följande två metoder för att beräkna gamma:
Metod 1:
$$ \ gamma_1 = \ arcsin \ left (\ frac {\ mathbf {r \ centerdot v}} {| \ mathbf {r} | \ | \ mathbf {v} |} \ right) \ tag {3} $$
Metod 2:
En alternativ metod för brute-force för att dubbelkontrollera:
$$ \ 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 behövs bara i datorprogrammet eftersom varje theta kommer från 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
- Faktiskt den nya $ \ gamma $ plot är vad jag förväntade mig. Hurra! Bra slumring.