Eulers metode i små tidssteg, fall med luftmotstand i Python, valg av tidssteg og modell mot måling.
Numeriske metoder for bevegelse
I kapittel 2.3 brukte vi bevegelseslikningene. De gjelder bare når akselerasjonen er konstant. Det er den i fritt fall uten luftmotstand, der eneste kraft er tyngden og .
Med luftmotstand er det annerledes. For en ball som faller, med positiv retning nedover og luftmotstand , gir Newtons andre lov
Akselerasjonen avhenger av farten, og farten endrer seg hele tiden. Det finnes ingen fast verdi av å sette inn i bevegelseslikningene.
I dette kapitlet deler vi bevegelsen opp i mange korte tidssteg. I hvert steg regner vi ut akselerasjonen fra kreftene akkurat da, og bruker den til å finne ny fart og ny posisjon. Et program gjør de mange stegene for oss.
I dette kapitlet
- Eulers metode: og i små tidssteg
- Fall med luftmotstand i Python, med lister og plott
- Luftmotstand og , og terminalfarten som kontroll
- Valg av tidssteg og stoppbetingelse
- Modell mot måling: bestemme ved å sammenligne programmet med målinger fra video eller forsøk
Akselerasjonen regnes som konstant innenfor hvert steg. Jo kortere tidssteg, jo mer nøyaktig blir resultatet.
Eulers metode
Fra akselerasjon til ny fart
Akselerasjonen er fartsendring per tid. Over et kort tidssteg endrer akselerasjonen seg lite, så
Fra fart til ny posisjon
På samme måte er farten posisjonsendring per tid. Det gir (vis dette i oppgave 3), og
Ett steg
I hvert tidssteg gjør vi fire ting, i denne rekkefølgen:
- regner ut akselerasjonen fra kreftene med farten vi har nå
- finner ny fart med
- finner ny posisjon med
- legger til tiden
Så gjentar vi, med den nye farten. Her bruker vi den nye farten når posisjonen flyttes. Noen programmer flytter posisjonen først, med farten fra starten av steget. Med kort tidssteg gir de to rekkefølgene nesten samme svar.
Hvorfor metoden virker
Innenfor ett steg regner vi som om akselerasjonen er konstant. Det er ikke helt riktig når kraften endrer seg, men feilen i hvert steg blir liten når steget er kort. Når akselerasjonen faktisk er konstant, gir metoden helt riktig fart: –-grafen er da en rett linje, og hvert steg øker farten med nøyaktig .
En fallskjermhopper med masse 80 kg hopper fra et helikopter som står stille i lufta. Før skjermen åpnes, er luftmotstanden med kg/m.
Bruk Eulers metode med s, og regn ut farten etter 1, 2 og 3 s. Sammenlign med farten uten luftmotstand.
| (s) | (m/s) | (m/s²) | (m/s) |
|---|---|---|---|
| 0 | 0 | ||
| 1 | |||
| 2 |
Uten luftmotstand:
Svar: Farten er ca. 9,8 m/s, 19,3 m/s og 28,0 m/s etter 1, 2 og 3 s. Uten luftmotstand ville den vært 29,4 m/s etter 3 s. Akselerasjonen avtar fordi luftmotstanden øker med farten.
Eulers metode i Python
Et program for Eulers metode har alltid de samme delene:
- konstanter: , masse, luftmotstandstall og tidssteget dt
- startverdier: tid, posisjon og fart når bevegelsen starter
- en løkke som gjør ett tidssteg hver gang: akselerasjon, ny fart, ny posisjon, ny tid
- en stoppbetingelse som avslutter løkka, for eksempel når ballen er ved bakken
- lister som tar vare på verdiene, så vi kan skrive ut og plotte dem
Fall uten luftmotstand
g = 9.81 # m/s^2
dt = 0.01 # tidssteg i s
t = 0.0
s = 0.0 # m, positiv nedover
v = 0.0 # m/s, positiv nedover
while s < 100:
a = g
v = v + a * dt
s = s + v * dt
t = t + dt
print(f"{t:.2f} s {v:.1f} m/s")Løkka går så lenge ballen har falt mindre enn 100 m. Programmet skriver ut 4.52 s 44.3 m/s. Bevegelseslikningene gir s og m/s. Uten luftmotstand kan vi altså kontrollere programmet med bevegelseslikningene.
Med luftmotstand
For å ta med luftmotstanden endrer vi bare linja for akselerasjonen:
a = g - k * v**2 / mResten av programmet er det samme. Det er styrken til metoden: alle krefter vi kan skrive som en formel, kan stå i denne linja.
En ball med masse 0,50 kg slippes fra 100 m høyde. Luftmotstanden er med kg/m.
a) Lag et program som regner ut falltiden og farten ved bakken, og som plotter farten mot tiden.
b) Sammenlign med fritt fall uten luftmotstand, og kontroller resultatet med terminalfarten.
from math import sqrt
import matplotlib.pyplot as plt
g = 9.81 # m/s^2
m = 0.50 # masse i kg
k = 0.0024 # luftmotstandstall i kg/m
dt = 0.001 # tidssteg i s
t = 0.0 # tid i s
s = 0.0 # strekning i m, positiv nedover
v = 0.0 # fart i m/s, positiv nedover
tider = [t]
farter = [v]
while s < 100:
a = g - k * v**2 / m
v = v + a * dt
s = s + v * dt
t = t + dt
tider.append(t)
farter.append(v)
print(f"Falltid: {t:.2f} s")
print(f"Fart ved bakken: {v:.1f} m/s")
print(f"Terminalfart: {sqrt(m * g / k):.1f} m/s")
plt.plot(tider, farter)
plt.xlabel("t (s)")
plt.ylabel("v (m/s)")
plt.show()Utskrift:
Falltid: 4.88 s
Fart ved bakken: 35.5 m/s
Terminalfart: 45.2 m/sSvar: a) Falltiden er 4,88 s, og farten ved bakken er 35,5 m/s.
b) Uten luftmotstand:
Terminalfart, :
Svar: b) Uten luftmotstand tar fallet 4,52 s, og farten blir 44,3 m/s. Med luftmotstand tar fallet 0,36 s lenger, og farten er 8,8 m/s lavere. Farten ved bakken er mindre enn terminalfarten 45,2 m/s, slik den må være: ballen nærmer seg terminalfarten, men rekker ikke å nå den på 100 m.
Luftmotstand i programmet
To modeller
Luftmotstanden virker alltid mot bevegelsen. To modeller er vanlige:
| Modell | Passer for | Terminalfart |
|---|---|---|
| de fleste gjenstander i lufta: baller, mennesker, biler | ||
| svært små eller lette gjenstander med lav fart: støv, frø, små dråper |
Enheten til er kg/m i den første modellen og kg/s i den andre. Hvilken modell som passer, avgjør vi med målinger, se avsnittet om modell mot måling.
Terminalfarten som kontroll
Når farten nærmer seg terminalfarten, går kraftsummen og akselerasjonen mot null. Et riktig program gir derfor en fart som flater ut ved , og aldri en fart over for en gjenstand som slippes fra ro. Regn ut med formelen og sammenlign med utskriften. Det er en rask kontroll av at akselerasjonslinja har riktig fortegn.
Fortegn når retningen skifter
For et fall er det enklest å velge positiv retning nedover. Da virker tyngden i positiv retning og luftmotstanden i negativ.
Kastes ballen opp, skifter bevegelsen retning, og luftmotstanden skifter retning med den. Med positiv retning oppover kan vi skrive det med en if-test:
if v > 0: # på vei opp: luftmotstanden virker nedover
a = -g - k * v**2 / m
else: # på vei ned: luftmotstanden virker oppover
a = -g + k * v**2 / mKontroll: kjør programmet med halvt så stort tidssteg. Endrer svaret seg mindre enn nøyaktigheten du trenger, er tidssteget lite nok.
Feilen i Eulers metode er omtrent proporsjonal med : ti ganger mindre tidssteg gir omtrent ti ganger mindre feil, men ti ganger så mange steg.
Antall steg: en løkke med for i in range(n) simulerer tiden . Gjør du dt mindre, må n bli større for at programmet skal simulere like lang tid.
- Akselerasjonen regnes ut før løkka. Da blir den konstant, og luftmotstanden følger ikke farten. Linja a = … skal stå inne i løkka.
- Feil fortegn. Luftmotstanden skal virke mot bevegelsen. Gir programmet en fart over terminalfarten, er fortegnet trolig feil.
- Feil stoppbetingelse. while v > 0 stopper når ballen snur på toppen, while s < 100 når den har falt 100 m. Tenk gjennom hva løkka skal vente på.
- Tiden oppdateres ikke. Uten t = t + dt blir tiden stående på null.
- Desimaltall med komma. Python bruker punktum: 0.0024, ikke 0,0024.
Modell mot måling
Et program gir bare riktige svar hvis modellen er god. Vi tester modellen ved å sammenligne programmet med målinger.
Målingene
Vi filmer et fall og leser av posisjonen i hvert bilde med et videoanalyseprogram, eller vi bruker en bevegelsessensor. Da får vi en tabell med tid og posisjon. Gjenstanden bør være lett i forhold til størrelsen, for eksempel en muffinsform, et kaffefilter eller en fjærball, så luftmotstanden betyr mye allerede etter kort fall.
Bestemme ved å prøve seg fram
- Vi kjører programmet med en gjettet verdi av og lagrer posisjonen ved de samme tidene som i målingene.
- Vi sammenligner modell og måling, i et plott eller med summen av de kvadrerte avvikene .
- Vi prøver nye verdier av til summen er så liten som mulig.
Avvikene kvadreres så positive og negative avvik ikke opphever hverandre, og så store avvik teller mer enn små.
Kontroll og vurdering
- Terminalfarten: den siste, rette delen av –-grafen gir som stigningstall. Da er , uavhengig av programmet.
- Formen på modellen: passer kurven dårlig for alle verdier av , kan det være modellen som er feil. Prøv i stedet for , eller mål terminalfarten med dobbel masse: med blir den ganger så stor, med dobbelt så stor.
- Gyldighetsområde: en modell som passer for et kort fall i et klasserom, trenger ikke passe for høyere fart eller en annen form.
En muffinsform av papir har masse 0,80 g. Den slippes fra ro, og fallet filmes. Tabellen viser hvor langt formen har falt:
| (s) | 0,1 | 0,2 | 0,3 | 0,4 | 0,5 | 0,6 | 0,7 | 0,8 | 0,9 | 1,0 |
|---|---|---|---|---|---|---|---|---|---|---|
| (m) | 0,05 | 0,14 | 0,27 | 0,39 | 0,52 | 0,64 | 0,76 | 0,89 | 1,02 | 1,14 |
a) Lag et program som simulerer fallet med for , , , og kg/m, og som regner ut summen av de kvadrerte avvikene fra målingene. Hvilken passer best?
b) Bestem terminalfarten fra målingene, og kontroller med den.
c) Hvor langt ville formen falt på 1,0 s uten luftmotstand? Vurder modellen.
i % 100 er resten når i deles på 100, så i % 100 == 0 er sann for i = 100, 200, 300, …
Tall med tierpotens skrives med e: 3.0e-3 betyr , og {k:.1e} skriver ut k på samme form med én desimal.
g = 9.81 # m/s^2
m = 0.00080 # masse i kg
dt = 0.001 # tidssteg i s
malt = [0.05, 0.14, 0.27, 0.39, 0.52, 0.64, 0.76, 0.89, 1.02, 1.14] # s i m, hvert 0,1 s
for k in [3.0e-3, 4.0e-3, 5.0e-3, 6.0e-3, 7.0e-3]:
v = 0.0
s = 0.0
modell = []
for i in range(1, 1001): # 1000 steg = 1,0 s
a = g - k * v**2 / m
v = v + a * dt
s = s + v * dt
if i % 100 == 0: # lagre hvert 0,1 s
modell.append(s)
sum_avvik = 0.0
for j in range(len(malt)):
sum_avvik = sum_avvik + (modell[j] - malt[j])**2
print(f"k = {k:.1e}: sum = {sum_avvik:.4f} m^2")Utskrift:
k = 3.0e-03: sum = 0.2746 m^2
k = 4.0e-03: sum = 0.0488 m^2
k = 5.0e-03: sum = 0.0002 m^2
k = 6.0e-03: sum = 0.0260 m^2
k = 7.0e-03: sum = 0.0854 m^2Svar: a) kg/m gir klart minst sum av kvadrerte avvik.
b) Fra 0,5 s til 1,0 s øker jevnt, så formen faller med terminalfarten:
Svar: b) m/s, som gir kg/m. Det stemmer med a).
c)
Svar: c) 4,9 m, mer enn fire ganger så langt som målt. Luftmotstanden er avgjørende for en muffinsform. Modellen med og kg/m treffer alle målingene innenfor 1 cm, så den beskriver dette fallet godt.
Oppgaver
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.
