DUMMY Matematikk og fysikk RF3100 Løsningsforslag 16. mars 2015 Tidsfrist: 23. mars 2015 klokken 14.00 Oppgave 1 Her skal vi se på hvordan man kan sikte seg inn på stridsvogner i bevegelse. Ved t = 0 befinner vi oss i punktet P = (2, 3), mens den fiendtlige stridsvognen befinner seg i punktet F = (4, 6), med momentan hastighetsvektor v = [2, 2]. I denne oppgaven vil vi regne med at den fiendtlige stridsvognen har konstant hastighetsvektor. I en praktisk situasjon vil ofte det være en gal antagelse, men vi regner i alle fall på den måten. En annen forenkling vi gjør er å regne som om alle objektene er punkter. I virkeligheten vil objektene ha en viss utbredelse, og regneresultaten er således bare veiledende. I denne oppgaven er lengdeenheten og tidsenheten uspesifisert, men man kan se for seg at tiden måles i sekunder, mens avstander måles i meter. a) Hvor befinner den fiendtlige stridsvognen seg ved tid t = 1/2? Hva er avstanden mellom punktet P (altså vår posisjon ved t = 0) og den fiendtlige stridsvognens posisjon ved t = 1/2? La F betegne den aktuelle posisjonen. Da er OF = 1 OF + 2 v = [4, 6] + 1 [2, 2] = [5, 7] 2 Den fiendtlige stridsvognen befinner seg da altså i punktet F = (5, 7). Avstanden mellom de aktuelle punktene er AF = [5 2, 7 3] = [3, 4] = 3 2 + 4 3 = 25 = 5
b) Ved t = 0 fyrer vi av et prosjektil med tanke på å treffe den andre stridsvognen ved t = 1/2. Hvilken hastighetsvektor må dette prosjektilet ha dersom vi forutsetter at prosjektilet beveger seg med konstant hastighetsvektor? Hvor stor er farten (altså lengden til hastighetsvektoren)? Prosjektilet skal gjennomgå forflytning fra P til F i løpet av 1/2 tidsenhet. Dermed må hastighetsvektoren for prosjektilet, Farten v = [6, 8] = 10. v prosjektil = 2 P F = 2[3, 4] = [6, 8]. c) Anta at vi kun kan fyre av prosjektiler med fart v = 4 (lengdeenheter/tidsenhet). Dette gir ett mulig tidspunkt t 1 der vi kan treffe fienden dersom vi fyrer av prosjektilet ved t = 0. Bestem dette tidspunktet. Tips: Her bør man ta utgangspunkt i at t 1 er tidspunktet der Tilbakelagt distanse for prosjektilet = Fiendens avstand fra punktet P. La x(t) være forflytningsvektoren fra punktet P til fiendens posisjon ved tid t. Da er x(t) = x(0) + [2, 2]t = [2, 3] + [2, 2]t = [2 + 2t, 3 + 2t] Det betyr fienden ved tid t befinner seg i avstand x(t) = (2 + 2t) 2 + (3 + 2t) 2 = 4 + 8t + 4t 2 + 9 + 12t + 4t 2 = 8t 2 + 20t + 13 fra punktet P. Ved tid t kan prosjektilet ha tilbakelagt en distanse på 3t. Vi kan få treff når prosjektilets tilbakelagte distanse er lik fiendens avstand fra punkt P, d.v.s når 8t2 + 20t + 13 = 4t. Hvis vi kvadrerer (oppøyer i 2) på begge sider av likhetstegnet, får vi ligningen 8t 2 + 20t + 13 = 16t 2,
d.v.s Dette gir oss løsningene t = 20 ± 40 2 + 4 16 13 2 8 8t 2 20t 13 = 0. = 5 4 ± 25 13 2 = 5 ± 51 4 { 3.035 0.5 Den eneste aktuelle løsningen her er t 1 3.035, siden negative tidspunkter ikke er aktuelle. d) Regn ut hastighetsvektoren v prosjektil som prosjektilet må ha for å treffe den fiendtlige stridsvognen på det aktuelle tidspunktet. Ved det aktuelle tidspunktet (t 3.035) befinner den fiendtlige stridsvognen seg i punktet OQ [ ] OP + 3.035v 10.07 12.07, og P Q = [ ] 8.07 OQ OP. 9.07 v prosjektil er parallell med P Q, og har samme retning. Det betyr at det finnes et tall a slik at v prosjektil = a P Q. Vi vet at farten v prosjektil = 4. Det medfører at og a = 4 P Q 0.330, v prosjektil = a [ ] 8.07 P Q 0.330 9.07 [ ] 2.67 2.99 Oppgave 2 Filen PlanetSimulation.java inneholder et nesten komplett dataprogram for enkel simulering av planetbevegelser: Klassen PlanetSimulation definerer brukergresnesnitt og animasjon sammen med PlanetPanel. Den abstrakte klassen Planet definerer en del fellestrekk for planeter_
Grafisk fremstilling av planeter (draw). Fysikk (acceleration). Timing for simuleringen (Timer-objektet simulationtimer). Klassen Vector2 lar oss håndtere vektorer. Klassen CircularMotion demonstrerer at animasjonen fungerer. Noen halvferdige implementasjoner av fysikken EulerPlanet EulerPlanetAlternativeI EulerPlanetAlternativeII SVPlanet Oppgaven går ut på å gjøre ferdig update-metoden i de fire sistnevnte klassene. Det innebærer å kalle acceleration-metoden i Planetklassen for å regne ut gravitasjonskraften som virker på planeten. Deretter må man oppdatere planetens tilstand utifra kraften som virker og det tidssteget som gjelder for simuleringen, altså verdien av variabelen step. Legg merke til at timingen for animasjone er uavhengig av timingen for simuleringen, og at timingen for ulike simuleringer kan gjøres uavhengig av hverandre. Det gjør det mulig å eksperimentere med ulike tidssteg i simuleringene. Fysikken Simuleringen bygger på Newtons 2. lov: f = ma og Newtons gravitasjonslov: f = GmM r 3 r. Her står G for Newtons gravitasjonskonstant, m for planetens masse, M for solens masse og r for forflytningsvektoren fra solen til planeten. For enkelhets skyld, og for at animasjonen skal se grei ut, lar vi M = 1 og G = 900 i vår simulering (Dette er mer eller mindre tydelig definert i klassen Planet). I tillegg lar vi solen ligge i ro i origo O. Det betyr at hvis planeten befinner seg i posisjon (x, y), blir kraften Dermed er akselerasjonvektoren Gm f = ( [ x, y] x 2 + y 2 ) 3 a = f m = G ( [ x, y], x 2 + y 2 ) 3 slik det også fremgår av Planet.acceleration. Eulers metode, samt dens slekt og venner Når vi bruker Eulers metode er det planetens posisjon og hastighet (pos og vel) som definerer planetens tilstand, og når vi oppdaterer fra tidssteg i til i + 1, gjøres det slik:
Posisjon(i+1) = Posisjon(i) + Steglengde*Hastighet(i) Hastighet(i+1) = Hastighet(i) + Steglengde*Kraft(i). Vi regner ut tilstanden i tidssteg i + 1 utelukkende utifra tilstanden i tidssteg i. Det er nærliggende å variere dette skjemaet: Man kan oppdatere hastigheten før man oppdaterer posisjonen, d.v.s.: Posisjon(i+1) = Posisjon(i) + Steg*Hastighet(i+1). Man kan bruke oppdatert posisjon når man regner ut kraften, d.v.s.: Hastighet(i+1) = Hastighet(i) + Steg*Kraft(i+1). I korte trekk: Det finnes mange muligheter for å stokke om rekkefølgen i utregningene, og man kan spørre seg om det har noen betydning. Størmer-Verlet-metoden Nå bruker vi et annet sett med tilstandsvariabler, nemlig nåværende posisjon og forhenværende posisjon. Tilstanden oppdateres slik: Posisjon(i+1) = 2 Posisjon(i) - Posisjon(i-1) + Steglengde 2 *Kraft(i) Tilstanden i steg i er da representert av (Posisjon(i), Posisjon(i-1)), mens tilstanden i steg i + 1 er representert av (Posisjon(i+1),Posisjon(i)). I den foreliggende implementasjonen har jeg foreslått å bruke en array av 2 Vector2-objekter til å holde orden på tilstanden. Metoden update viser hvordan man får tak i nåværende, forrige og neste posisjon. Legg merke til at previous og next faktisk er den samme vektoren, så dersom man oppdaterer next, vil previous bli skrevet over. Det er uproblematisk, i og med at vi kun ønsker å ta vare på to posisjoner. Om innlevering av svar på denne oppgaven Arbeidet leveres i én java-fil, som heter PlanetSimulation.java. Selv om det kan være fristende å omorganisere koden ber jeg om at dere ikke gjør det. Det letter rettearbeidet. Kommentarene til det dere observerer kan skrives sammen med besvarelsen av oppgave 1. a) Gjør ferdig EulerPlanet og SVPlanet. Kommenter kort hvordan de to simuleringene oppfører seg over tid.
b) Lag to varianter av Eulers metode i EulerPlanetAlternativeI og EulerPlanetAlternativeII, og undersøk hvordan disse oppfører seg i forhold til de to andre. c) (Ekstra) Man kan variere steglengden i simuleringene ved endre verdien av rate. Dette kan enkelt gjøres i konstruktøren. For eksempel vil new EulerPlanet(10); new SVPlanet(1000); gi en Euler-simulering som oppdateres hvert tiende millisekund, og en Størmer- Verlet-simulering som oppdateres hvert sekund. I det første tilfellet blir steglengden mye kortere enn i det andre tilfellet, og det har stor betydning for nøyaktigheten. Dersom man vil sammenligne kvaliteten på de ulike simuleringsmetodene kan man kjøre en av dem med veldig kort steglengde, og bruke denne som en slags gullstandard. De fire metodene kan så kjøres med større steglengde, og vurderes utifra følgende kriterium: Kvaliteten på en simulering er god dersom den holder seg i nærheten av gullstandarden. Undersøk hvordan simuleringene oppfører seg ved ulike steglengder og gjør deg opp en mening om hvilken simuleringsmetode du foretrekker. (Obs: Her finnes det selvsagt ikke noe fasitsvar).