Hvis vi vet n?r det er lurest ? skyte opp raketten, og vi vet hvor alle planetene er s? er det kanskje greit ? finne ut av hvor og i hvilken retning raketten burde skytes opp i. For det er ganske greit ? gi datamaskinen beskjed om hvor langt frem i tid og i hvilken retning det skal skytes opp og la den regne ut resten selv.
S? det vi m? gj?re f?rst er ? definere hva vi mener med vilk?rlig tid, og retning. S? derfor begynner vi med tid. Se for deg solsystemet v?rt, planetene g?r rundt og rundt og rundt. Men de g?r ikke rundt like fort, de beveger seg med varierende hastigheter og de bruker forskjellige tider rundt banen sin. Derfor er det viktig ? kunne regne ut hvordan oppskytningen og planetenes posisjon er i forhold til tiden. Det har seg slik at vi vil n?dvendigvis gj?re det enklest mulig ? komme fra Gallifrey til Kessel. Jo mindre drivstoff vi bruker jo bedre, vi har tross alt ikke en uendelig mengde til tross for at vi sitter med 5.5 tonn drivstoff vi kan bruke p? ? komme frem. Det vi gj?r er ? bruke v?re tidligere baneberegninger, men som du kanskje husker, de er ikke kontinuerlige, de er regnet ut i diskrete tidspunkter, vi vet ikke hvor planetene er mellom disse spesifikke, men vi har et lite matematisk triks vi kan bruke for ? p? en m?te lure oss unna dette. Vi bruker et matematisk triks som heter interpolering, vi bruker to punkter til ? lage en funksjon som beskriver planetens posisjon kontinuerlig mellom punktene. Dette hjelper oss veldig n?r vi skal finne ut av hvordan planetene er i forhold til raketten v?r, dessuten s? er det viktig ? vite hvor de andre og v?r planet er n?r vi bestemmer oss for ? skyte opp.
Interpolering i seg selv er en numerisk matematisk metode, den er veldig praktisk n?r en har et par punkter men ikke vet den faktiske funksjonen tilh?rende disse punktene. Da tillater interpolasjon deg ? tiln?rme en funksjon som g?r gjennom disse punktene og likner da p? den originale funksjonen men den er ikke lik s? den har sitt gyldighetsintervall, alts? den interpolerte funksjon er kun "riktig" for et visst omr?de. Legg merke til at riktig st?r skrevet i anf?rselstegn, den er egentlig ikke riktig det den er, er en fornuftig tiln?rming.
N?r det kommer til vilk?rlig retning s? ?nsker vi ? skyte opp raketten v?r radielt langs ekvator p? planeten v?r. Det gir ikke s? mye mening ? skyte opp raketten ikke radielt alts? andre retninger enn rett opp fra planetens overflate. S? kan vi ogs? nevne at hvor vi m? skyte opp raketten fra for ? skyte rett ut i solsystemet, alts? vekk fra solen s? m? du faktisk regne ut dette fordi denne posisjonen varierer. M?ten ? gj?re dette er ? bruke trikset vi gjorde tidligere vi interpolerer planetens posisjon, siden denne posisjonen er i forhold til stjernen s? bruker vi en vektor fra solen til planeten, deler denne p? avstanden fra stjernen til planeten. Siden vi vil at denne vektoren skal ha retning utifra planetens senter og lengde lik radiusen til planeten s? ganger vi denne vektoren med radiusen til planeten. Dermed har vi en vektor som uansett hvilken tid vi vil skyte opp peker fra senter av planeten og ut av solsystemet. For hvis vi klarer ? komme frem til en m?te ? utnytte disse to metodene i et program s? kan vi simulere en rakettoppskytning i et vilk?rlig tidspunkt og en vilk?rlig retning.
N? skal jeg vise dere noe veldig skummelt, jeg skal vise dere en bit med kode, ren og uendret kode s? skal jeg forklare n?yaktig hva den gj?r:
pos = np.array((interpolate_planets(launchtime)[0][0],interpolate_planets(launchtime)[0][1])) /(np.sqrt(interpolate_planets(launchtime)[0][0]**2 + interpolate_planets(launchtime)[0][1]**2)) * pradius[0] *1000
Det denne snippeten gj?r er n?yaktig det jeg pratet om isted, den finner ut av posisjonen til Gallifrey ved ? bruke en matematisk funksjon vi har definert f?r. Det den s? gj?r er vanlig vektor retning, den lager en to dimensjonal array som fors?vidt er en fancy dataspr?kmetode ? si liste som oppf?rer seg som en vektor. Det er bare noen tall i en liste som vi kan regne med som vanlige vektorer. Det den gj?r er s? ? finne den absolutte retningen p? vektoren og ganger den med planetradien, dette er s?nn vi f?r en retningsvektor som vi bruker til ? finne ut retningen vi skyter opp raketten i. N? er dette den enkleste biten ? regne ut. Det den linjen med kode over gj?r er essensielt det f?lgende p? tegningen som jeg egentlig har forklart men alt blir bedre med noen d?rlige figurer. S? her er npoen figurer som omtrent illustrerer det samme:
Dette er da en enkel illustrasjon men jeg h?per dere skj?nner tegningen, n? skal jeg forklare litt mer om hva koden vi har skrevet som beskriver og simulerer en rakettoppskytning.
Vi har egentlig bare gjort som sist, vi utvidet bare den forrige funksjonen til ? v?re et todimensjonalt tilfelle, det er ikke helt logisk ? skyte opp en rakett som har en retning i y og x retning i et en dimensjonalt tilfelle. Det er da veldig enkelt ? transformere dette til et tilfelle som er rent todimensjonelt. Vi regner da p? samme m?te i hver dimensjon som i det en dimensjonelle tilfelle, da har vi samme situasjon. N? skal jeg faktisk vise dere algoritmen vi bruker og forklare hva den gj?r.
for i in range(0,int(steps+1)): if i == int(time/dt): fail = ("No launch :( %.f" % vel[int(time/dt)]) print(fail) return None vel[0][i+1] = (vel[0][i] + acce[0] * dt) vel[1][i+1] = (vel[1][i] + acce[1] * dt) pos[0][i+1] = (pos[0][i] + vel[0][i+1] * dt) pos[1][i+1] = (pos[1][i] + vel[1][i+1] * dt) rocketmass -= (efficres[0] * engines) * dt acce = acceleration(efficres[1], rocketmass, homegravity(pmass[0]*smass,np.sqrt(pos[0][i+1]**2 + pos[1][i+1]**2)),engines) *dir escapevel = escvel(pmass[0]*smass,np.sqrt(pos[0][i+1]**2 + pos[1][i+1]**2))
Dette er da algoritmen vi bruker, vi kan f?rste begynne med ? si at dette er en Euler-Chromer algoritme, n?yaktig hva navnene og syntaksen til denne snippeten med kode er ikke s? viktig men det den gj?r er som sagt ? regne ut posisjon i y og x retning. Her kan dere se at det er til den variablen som heter vel og pos to klammeparentes indekser, dette betyr da at disse variablene er to dimensjonale, og derfor m? de regnes ut for to forskjellige dimensjoner. Vi m? ogs? oppdatere aksellerasjonen og massen til raketten, fordi raketten sitt drivstoff forbruk endrer seg ikke og kraften fra motorene endrer seg ikke men siden massen g?r ned s? f?r vi ved newtons andre lov h?yere aksellerasjon. Siden F = ma og F m? v?re konstant, vi vet at massen endrer seg derfor m? ogs? a eller da aksellerasjonen endre seg. Dette er da enten veldig vanskelig ? regne ut for h?nd, eller direkte umulig. Vi har da valgt ? gj?re dette p? datamaskinen siden det g?r fortere uansett og vi ?nsker ? bruke disse resultatene senere uansett.
Slik algoritmer er veldig vanlige og vi har brukt liknende metoder og kommer til ? prate om disse igjen s? da er det kanskje greit ? ta en skikkelig gjennomgang for de som er interreserte s? skal jeg n? gjennomg? denne biten med kode linje for linje.
F?rste linje sier at det som gj?res under skal gj?res s? lenge i er mindre enn antallet steg vi ?nsker ? bruke, hvorav steps er en variabel vi bestemmer oss for. Det den ogs? gj?r er at etter alt under f?rste linje er gjennomf?rt s? legges +1 til i s? i f?rste instans er i 0 deretter er i = 1, s? i = 2. ogs? videre til i er like stor som steps. Deretter bruker vi en if test for ? sjekke at vi ikke bruker for lang tid p? oppskytningen. Vi ?nsker ? bruke et sted mellom 5 og 20 min s? vi kj?rer en enkel test for ? se om vi klarer det p? kort nok tid. Deretter definerer vi en bit med tekst som forteller oss at vi ikke klarte og forteller oss hastigheten vi oppn?dde om testen trigger, noe den ikke gj?r om det er en suksessfull oppskytning. Deretter regner vi ut hastigheten i x-retning, dere kan kanskje legge merke til at vi ikke begynner ved tid 0 fordi vi begynner ved i+1, dette gj?r faktisk beregningene v?re mer n?yaktige og dessuten s? er faktisk hastigheten i tid 0 s? det gir matematisk mening og det er logisk at raketten st?r stille i begynnelsen. Deretter gj?r vi det samme i y-retning, det er n?yaktig samme greie. Her tiln?rmer vi da en integrasjon ved ? gange med sm? verdier av en delta t kalt dt. samme greia gj?res da med posisjon. Vi utnytter da f?lgende fysiske sammenheng: \(P(r) = v'(r) = a''(r)\) siden vi bare vet hva aksellerasjonen er s? finner vi da posisjonen og hastigheten med utgangspunkt i aksellerasjonen. Deretter oppdaterer vi aksellerasjonen og finner den som en funksjon av posisjon og masse, deretter oppdaterer vi unnslipningshastigheten som en funksjon av posisjon, ikke inkludert er testen p? om vi n?r denne hastigheten, men vi sjekker dette ogs?. Uansett s? er poenget med alt dette at dette tillater oss ? simulere oppskytningen ganske n?yaktig og presist, dessuten s? klarer vi ? finne alt det som er viktig for den fremtidige ferden i solsystemet. Dette lar oss ta hensyn til alle radielle planetretninger og tenkelige oppskytningstidspunkter. Vi har bestemt oss for at det er lurest ? skyte opp fra ekvator, rett og slett fordi solsystemer har en tendens til ? v?re litt flate og det gj?r det enklere ? treffe planeten vi skal til. Siden vi kan bestemme fra hvor p? planeten og hvor som helst p? banen til planeten som en funksjon av tiden.
Det var alt for denne gang vi snakkes p? neste!
-LSE Marius Torsvoll Ellefsen
Logg inn for ? kommentere