Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Gravitacijska frača

Authors
Affiliations
Univerza v Ljubljani
Univerza v Ljubljani

Eden izmed najbolj uporabnih manevrov v astrofiziki je tako imenovana gravitacijska frača, kjer lahko telo ob obletu nekega drugega telesa prevzame njegovo energijo v obliki kinetične energije. Da si problem poenostavimo, predpostavimo, da je telo, ki ga bomo obleteli, zelo bolj masivno od našega telesa (recimo planet) - v relativnem sistemu se bomo torej gibali po stožnici. V teoriji, če se telesu približujemo po elipsi lahko dosežemo, da svoji hitrosti prištejemo hitrost planeta:

  1. da pridemo v relativni sistem moramo odšteti hitrost planeta,

  2. upoštevamo gibanje po stožnici in ustrezno spremenimo relativno hitrost na nasprotni strani,

  3. po preletu prištejemo hitrost planeta.

Kljub temu, da seveda ne želimo, da je telo vezano (ima e<1e<1) je možno ekscentričnost spreminjati z raketnim pogonom (kot si bomo pogledali kasneje). Podobno smo na primer opazili komete, ki so pri preletu Sonca nevezani (imajo e>1e>1) po preletu pa zaradi odmetavanja materiala ponovno postanejo vezani.

Source
from simulatorv2 import *
import numpy as np

def setup_orbit(
    e,
    theta=np.pi * 0.9,
    rp=1.0,
    sun_velocity=Vec2.zero()
):
    sun = Presets.sun(Vec2)
    earth = Presets.earth(Vec2)

    G = NewtonianGravity().G
    mu = G * (sun.mass + earth.mass)

    p = rp * (1 + e)

    r = p / (1 + e * np.cos(theta))

    earth.position = Vec2(
        r * np.cos(theta),
        r * np.sin(theta)
    )

    h = np.sqrt(mu * p)

    vr = mu / h * e * np.sin(theta)
    vt = h / r

    er = Vec2(np.cos(theta), np.sin(theta))
    et = Vec2(-np.sin(theta), np.cos(theta))

    earth.velocity = vr * er + vt * et

    sun.velocity = sun_velocity.copy()
    earth.velocity += sun_velocity

    return sun, earth

results=[]
references=[]

for e, c in zip([0, 0.5, 1.0, 1.5], ["blue", "orange", "green", "red"]):
    sun, earth = setup_orbit(e=e, theta=-np.pi * 0.5, sun_velocity=Vec2(-4,0))
    
    sim = Simulator(
        bodies=[sun, earth],
        timestep=0.001,
        steps=643,
        diagnostics=[
            KineticEnergy(),
            TotalEnergy()
        ]
    )
    results.append(sim.run(name=e, run_color=c))
    references.append(ReferenceConic(e, opacity=0.5, center_body="Sonce", t_0=-np.pi*0.5, t_1=np.pi*0.5))

viewer = SimulationViewer(
    results,
    ViewerConfig(
        fixed_center=(0, 0),
        trail_length=1000,
        view_size=2.5,
        references=references,
        diagnostics=[
            DiagnosticView(
                "Kinetična Energija",
                ["Zemlja"]
            ),
            DiagnosticView(
                "Celotna Energija",
                ["Zemlja"]
            ),
        ],
    )
)

viewer.show()
Loading...