Sedaj ko imamo simulator simulirajmo rezultat naloge iz vaj predmeta Naša in druga Osončja - gravitacijska frača okoli Venere. Satelit želimo poslati proti Veneri. Svoje potovanje začne v Zemljini orbiti ter po eliptičnem tiru potuje do Venerine orbite. Srečanje se zgodi pri pravi anomaliji . Satelit nato po hiperbolični orbiti potuje mimo Venere (najbližja točka je nad Venero) in se nato utiri v novo eliptično orbito okoli Sonca. Zanimata nas novi orbiti v primeru ko satelit potuje mimo Venere po osvetljeni ali temni strani. Poznamo naslednje vrednosti:
Nalogo moramo očitno rešiti v treh delih: prvo moramo izračunati vse parametre elipse do Venere, nato parametre hiperbole pri obletu Venere in na koncu parametre elipse po obletu.
Polet do Venere¶
Prvo satelit pošljemo po eliptični orbiti do Venere. Spomnimo se, da je prava anomalija definirana kot kot med smerjo proti periapsidi (najbližji točki gorišču v kateremu je Sonce) in smerjo proti trenutni legi telesa. Takoj lahko izračunamo ekscentričnost, saj namreč poznamo enačbo elipse iz izhodišča:
Iz prve enačbe izpostavimo in jo nesemo v drugo enačbo, ter tako dobimo:
Takoj lahko izračunamo še polosi elipse:
Source
%%tikz -r
\usetikzlibrary{calc}
\begin{tikzpicture}
\clip (-10,-10) rectangle (10, 10);
\def\scale{7.5}
\def\aZ{1 * \scale}
\def\aV{0.723 * \scale}
\def\RZ{5pt}
\def\RV{5pt}
\def\RS{10pt}
\def\theta{130}
\coordinate (A) at (\theta: \aV);
\coordinate (B) at (0: \aZ);
\def\cx{\aZ * 23.76 / 149.6}
\def\rx{\aZ * 125.8 / 149.6}
\def\ry{\aZ * 123.5 / 149.6}
\draw[dashed] ({\cx + \rx}, 0) arc[start angle=0, end angle=180, x radius=\rx, y radius = \ry];
\draw[dashed] (0, 0) -- (-\rx + \cx, 0);
\draw[dashed] (0, 0) -- (A);
\draw[dashed] (-30pt, 0) arc (180:\theta:30pt);
\node[above left] at (90 - \theta/2 + \theta: 30pt) {$\Theta$};
\draw[dashed, orange] (0, 0) circle (\aV);
\draw[dashed, blue] (0, 0) circle (\aZ);
\fill[orange] (A) circle (\RV);
\fill[blue] (B) circle(\RZ);
\node[above left=8pt] at (A) {V};
\node[right=8pt] at (B) {Z};
\fill[white] (0, 0) circle (\RS);
\draw[thick] (0, 0) circle (\RS);
\fill (0, 0) circle (1.5pt);
\end{tikzpicture}
Ko dosežemo Venero, lahko s parametri elipse izračunamo še hitrost satelita:
Frača okoli Venere¶
Sedaj smo prileteli do Venere in moramo izračunati parametre hiperbole. Prvo izračunajmo vektorja hitrosti Venere in satelita, kar naredimo s pomočjo kota (spomnimo se, da je to kot med smerjo proti gorišču in smerjo gibanja).
Source
%%tikz -r
\usetikzlibrary{calc}
\begin{tikzpicture}
\clip (-11,-1) rectangle (5, 7);
\def\scale{7}
\def\theta{140}
\def\aV{0.723 * \scale}
\coordinate (A) at (\theta:\aV);
\draw[-stealth, dashed] (A) -- (0, 0);
\def\rx{\aV*0.8}
\def\ry{\aV*0.8}
\draw[dashed] (A) + (\rx/4.5, -\ry/2) arc[start angle=220, end angle=\theta, x radius=\rx, y radius = \ry];
\draw[-stealth, solid] (A) -- ++(.3, -2);
\node[left=5pt] at ($(A)+(0.3, -1)$) {$\vec{v}_0$};
\draw ($(A)+(1, -0.9)$) arc (-30:-110:20pt);
\node at ($(A)+(0.75, -1.4)$) {$\gamma$};
\draw[dashed, orange] (-\aV, 0) arc(180:\theta:\aV);
\draw[-stealth, solid] (A) -- ++(-1, -1.3);
\node at ($(A)+(-0.7, -0.4)$) {$\vec{v}_V$};
\fill[orange] (A) circle (5pt);
\node[above left=8pt] at (A) {V};
\node[below right=8pt] at (0, 0) {S};
\end{tikzpicture}
Izračunamo lahko kot in za prehod v sistem Venere izračunamo tangencialno in radialno hitrost satelita:
Izračunamo še hitrost Venere in ker ta kroži okoli Sonca, je njena hitrost kar tangencialna, zato lahko zelo preprosto preidemo v sistem Venere:
Začnemo z računanjem parametrov hiperbole. Izračunamo lahko hitrost v neskončnosti in poznamo najbližjo razdaljo Veneri, zanima pa nas sprememba kota :
Spremembo kota izračunamo s pomočjo dveh enačb za parameter :
V obeh primerih začnemo z enakim kotom, hitrost pa se v neskončnosti ne spremeni. Kota izračunamo tako, da prištejemo ali odštejemo spremembo :
Izračunamo lahko še novi hitrosti v sončevem sistemu in primerjamo rezultata:
V primeru ko Venero satelit obleti po svetli strani gre torej za pospešek, ko po temni pa pojemek.
Simulacija¶
Da si malo bolj predstavljamo rezultat in da vidimo, kako se realnost razlikuje od idealističnih enačb, simulirajmo taki gravitacijski frači.
Source
from simulatorv2 import *
import numpy as np
transfer_reference = ReferenceConic(eccentricity=0.1889, apoapsis=1, rotation=np.pi, t_0=0, t_1=np.pi, opacity=0.1)
sat = Body(
name="Satelit",
mass=500 / Units.SUN_MASS,
radius=5 / Units.ASTRONOMICAL_UNIT,
color=(200,200,200),
position=Vec2(1,0),
velocity=transfer_reference.velocityAtAngle(np.pi)
)
"""
# UPORABIL DA SEM ITERATIVNO NAŠEL REZULTATA
target_altitude = 300_000 / Units.ASTRONOMICAL_UNIT
guess = -52.0
step = 0.01
best = None
for _ in range(30):
venus, sun = initialize_binary(Presets.venus(Vec2), Presets.sun(Vec2), Vec2(0.723, 0).rotate(np.deg2rad(guess)), Vec2(0, 0))
sat = sat_og.copy()
sim = Simulator(
bodies=[sun, venus, sat],
timestep=0.0001,
steps=5000
)
result = sim.run()
r = result.positions[:, 2] - result.positions[:, 1]
d = np.linalg.norm(r, axis=1)
altitude = d.min() - result.body_radii[1]
error = altitude - target_altitude
print(_, guess, error * Units.ASTRONOMICAL_UNIT)
if best is None or abs(error) < abs(best[1]):
best = (guess, error)
step_size = np.arctan(abs(error * Units.ASTRONOMICAL_UNIT) / 5_000_000) / (np.pi * 0.5)
if error < 0:
guess += step * step_size
else:
guess -= step * step_size
print(best)
"""
r = -52.108266015541815
hr = 56.995+180
venus, sun = initialize_binary(Presets.venus(Vec2), Presets.sun(Vec2), Vec2(0.723, 0).rotate(np.deg2rad(r)), Vec2(0, 0))
sim = Simulator(
bodies=[sun, venus, sat],
timestep=0.0001,
steps=5000,
diagnostics=[
TotalEnergy()
]
)
result = sim.run()
viewer = SimulationViewer(
result,
ViewerConfig(
camera_mode="follow",
follow_body="Venera",
trail_length=1000,
references=[
ReferenceConic(opacity=0.1),
ReferenceConic(periapsis=0.723, opacity=0.1, n=10000),
ReferenceConic(periapsis=venus.radius + 300_000 / Units.ASTRONOMICAL_UNIT, opacity=0.1, follow_body="Venera"),
ReferenceConic(
periapsis=venus.radius + 300_000 / Units.ASTRONOMICAL_UNIT,
eccentricity=1.51,
max_distance=10 * venus.radius,
opacity=0.1,
follow_body="Venera",
rotation=np.deg2rad(hr)
),
transfer_reference
],
diagnostics=[
DiagnosticView(
"Celotna Energija",
["Satelit"]
),
DiagnosticView(
"Celotna Energija",
["Venera"]
)
],
),
)
viewer.show()Source
from simulatorv2 import *
import numpy as np
transfer_reference = ReferenceConic(eccentricity=0.1889, apoapsis=1, rotation=np.pi, t_0=0, t_1=np.pi, opacity=0.1)
sat = Body(
name="Satelit",
mass=500 / Units.SUN_MASS,
radius=5 / Units.ASTRONOMICAL_UNIT,
color=(200,200,200),
position=Vec2(1,0),
velocity=transfer_reference.velocityAtAngle(np.pi)
)
r = -52.09225981719751
hr = -24.412
venus, sun = initialize_binary(Presets.venus(Vec2), Presets.sun(Vec2), Vec2(0.723, 0).rotate(np.deg2rad(r)), Vec2(0, 0))
sim = Simulator(
bodies=[sun, venus, sat],
timestep=0.0001,
steps=5000,
diagnostics=[
TotalEnergy()
]
)
result = sim.run()
viewer = SimulationViewer(
result,
ViewerConfig(
camera_mode="follow",
follow_body="Venera",
trail_length=1000,
references=[
ReferenceConic(opacity=0.1),
ReferenceConic(periapsis=0.723, opacity=0.1, n=10000),
ReferenceConic(periapsis=venus.radius + 300_000 / Units.ASTRONOMICAL_UNIT, opacity=0.1, follow_body="Venera"),
ReferenceConic(
periapsis=venus.radius + 300_000 / Units.ASTRONOMICAL_UNIT,
eccentricity=1.51,
max_distance=10 * venus.radius,
opacity=0.1,
follow_body="Venera",
rotation=np.deg2rad(hr)
),
transfer_reference
],
diagnostics=[
DiagnosticView(
"Celotna Energija",
["Satelit"]
),
DiagnosticView(
"Celotna Energija",
["Venera"]
)
],
),
)
viewer.show()