Bruk av numeriske metoder (Eulers metode) til å modellere komplekse bevegelser.
Hvorfor trenger vi numeriske metoder?
I de tidligere kapitlene har vi løst bevegelseslikninger analytisk – det vil si at vi har funnet eksakte formler for posisjon og hastighet som funksjon av tid. For eksempel lærte vi at for konstant akselerasjon gjelder:
Men i virkeligheten er akselerasjonen sjelden konstant. Tenk på:
- Luftmotstand som øker med hastigheten
- Fjærkrefter som avhenger av posisjon
- Gravitasjon som varierer med avstand
- Magnetiske krefter som avhenger av både posisjon og hastighet
For slike problemer finnes det ofte ingen analytisk løsning. Da bruker vi i stedet numeriske metoder – algoritmer som beregner tilnærmede verdier steg for steg.
Numeriske metoder:
- Deler opp tiden i små intervaller
- Beregner posisjon og hastighet trinnvis
- Gir tilnærmede, men ofte svært nøyaktige, løsninger
- Kan implementeres på datamaskiner
Anvendelser:
- Simulering av romfart og satellittbaner
- Værvarsling og klimamodeller
- Dataspill og animasjoner
- Partikkelfysikk og molekylsimuleringer
- Strukturanalyse i ingeniørfag
I stedet for å finne en eksakt formel, beregner vi verdier punkt for punkt:
Nøkkelbegreper:
- Tidsstepp (): Hvor lang tid mellom hver beregning
- Iterasjon: Ett beregningssteg i algoritmen
- Diskretisering: Å dele opp kontinuerlige størrelser i diskrete verdier
Eulers metode – matematisk bakgrunn
Eulers metode (oppkalt etter matematikeren Leonhard Euler, 1707-1783) er den enkleste numeriske metoden for å løse differensiallikninger.
Den deriverte som stigningstall
Husk at den deriverte av en funksjon er definert som:
Dette er stigningstallet til tangenten ved punktet .
Eulers approksimasjon
Hvis vi ikke tar grensen, men bruker en liten, men endelig , får vi en tilnærming:
Ved å løse for får vi Euler-formelen:
Geometrisk tolkning
Euler-metoden følger tangentlinjen i hvert punkt. I stedet for å følge den buede kurven eksakt, tar vi et lite skritt langs tangenten. Jo mindre , jo bedre følger vi den virkelige kurven.
Viktig innsikt:
Euler-metoden erstatter den buede løsningskurven med en rekke rette linjesegmenter (tangentene). Dette gir en tilnærmet løsning som blir bedre jo mindre tidssteg vi bruker.
der er den deriverte ved tidspunkt .
For bevegelse i én dimensjon:
der:
- er posisjonen ved tidspunkt
- er hastigheten ved tidspunkt
- er akselerasjonen ved tidspunkt
- er tidsssteget
Merk: Vi bruker den gamle hastigheten for å oppdatere posisjonen. Dette kalles eksplisitt Euler-metode.
Implementasjon av Eulers metode
Algoritmen steg for steg
1. Sett startverdier: Velg , , og
2. Velg tidsstegg: Bestem (mindre = mer nøyaktig, men flere beregninger)
3. Gjenta for hvert tidssteg:
- Beregn akselerasjonen (fra kreftene)
- Oppdater hastigheten:
- Oppdater posisjonen:
- Oppdater tiden:
4. Fortsett til ønsket sluttid er nådd
Pseudokode
x = x0 # Startposisjon
v = v0 # Starthastighet
t = 0 # Starttid
dt = 0.01 # Tidsstegg
while t < t_slutt:
a = F(x, v, t) / m # Beregn akselerasjon fra krefter
v = v + a * dt # Oppdater hastighet
x = x + v * dt # Oppdater posisjon
t = t + dt # Oppdater tidValg av tidsstegg
Tommelregel: bør være mye mindre enn den karakteristiske tidsskalaen for systemet.
- Fritt fall (noen sekunder): -
- Pendel (perioder på 1-2 s): -
- Raske svingninger: Bruk enda mindre
En ball slippes fra hvile fra en høyde på 20 m. Bruk Eulers metode med tidsstegg s til å finne høyden og hastigheten etter 1.0 s og 2.0 s.
Sammenlign med de analytiske formlene. Bruk m/s².
- Starthøyde: m
- Starthastighet: m/s (slippes fra hvile)
- Akselerasjon: m/s² (negativ fordi nedover)
- Tidsstegg: s
Euler-formler:
Beregning steg for steg:
Steg 0 (t = 0 s):
- m
- m/s
Steg 1 (t = 0.5 s):
- m/s
- m
Steg 2 (t = 1.0 s):
- m/s
- m
Steg 3 (t = 1.5 s):
- m/s
- m
Steg 4 (t = 2.0 s):
- m/s
- m
Sammenligning med analytisk løsning:
Analytisk: og
| t (s) | Euler y (m) | Analytisk y (m) | Feil (m) | Euler v (m/s) | Analytisk v (m/s) |
|---|---|---|---|---|---|
| 1.0 | 17.5 | 15.0 | 2.5 | -10 | -10 |
| 2.0 | 5.0 | 0.0 | 5.0 | -20 | -20 |
Observasjon: Hastigheten er eksakt, men posisjonen har feil fordi vi bruker den gamle hastigheten i posisjonsoppdateringen. Feilen øker med tid. Med mindre ville feilen vært mindre.
Feilkilder og nøyaktighet
Diskretiseringsfeil (avkuttingsfeil)
Den største feilkilden i Euler-metoden er diskretiseringsfeil. Denne oppstår fordi vi erstatter den glatte løsningskurven med rette linjesegmenter.
For Eulers metode gjelder:
- Feilen per steg er proporsjonal med
- Total feil etter mange steg er proporsjonal med
Dette betyr at hvis vi halverer tidsstegget, halverer vi den totale feilen. Euler-metoden er derfor en førsteordens metode.
Akkumulering av feil
For hvert steg legges det til en liten feil. Over mange steg kan disse feilene akkumuleres og vokse:
- Feil i posisjon påvirker beregning av krefter
- Feil i hastighet påvirker beregning av posisjon
- Feilene kan forsterke hverandre
Numerisk stabilitet
For noen problemer kan Euler-metoden bli ustabil – feilene vokser eksponentielt. Dette skjer typisk når:
- Tidsstegget er for stort
- Systemet har raske svingninger
- Kreftene er sterkt avhengige av posisjon
Stabilitetsregel: må være mye mindre enn systemets karakteristiske tidsperiode.
Forbedrede metoder
Det finnes mange bedre metoder enn enkel Euler:
- Euler-Cromer (symplektisk Euler): Bruker i stedet for i posisjonsoppdateringen
- Midtpunktmetoden: Bruker hastigheten midt i intervallet
- Runge-Kutta: Mer nøyaktige, men mer komplekse metoder
Euler-Cromer-modifikasjon:
Denne enkle endringen gir mye bedre energibevaring for periodiske systemer.
Fordeler:
- Bevarer energien bedre i oscillerende systemer
- Mer stabil for pendler og fjærer
- Like enkel å implementere som vanlig Euler
Anbefaling: Bruk Euler-Cromer i stedet for vanlig Euler for de fleste fysikkproblemer!
Bruk begge metodene til å simulere fritt fall fra 20 m med s i 2 sekunder. Sammenlign posisjonene med den analytiske løsningen.
Bruk m/s², m, .
| t (s) | (m/s) | (m) | (Euler) | |
|---|---|---|---|---|
| 0.0 | 0 | 20 | -1 | 20 |
| 0.1 | -1 | 20 | -2 | 19.9 |
| 0.2 | -2 | 19.9 | -3 | 19.7 |
| 0.3 | -3 | 19.7 | -4 | 19.4 |
| ... | ... | ... | ... | ... |
| 1.0 | -10 | 15.5 | -11 | 14.5 |
Euler-Cromer-metoden (første 1 sekund):
| t (s) | (m/s) | (m) | (E-C) | |
|---|---|---|---|---|
| 0.0 | 0 | 20 | -1 | 19.9 |
| 0.1 | -1 | 19.9 | -2 | 19.7 |
| 0.2 | -2 | 19.7 | -3 | 19.4 |
| ... | ... | ... | ... | ... |
| 1.0 | -10 | 14.5 | -11 | 13.4 |
Analytisk løsning ved t = 1 s:
Sammenligning ved t = 1 s:
- Euler: m, feil = +0.5 m (for høyt)
- Euler-Cromer: m, feil = -0.5 m (for lavt)
- Analytisk: m
Ved t = 2 s:
- Analytisk: m
- Euler: m (for høyt)
- Euler-Cromer: m (for lavt)
Konklusjon: Begge metodene har feil, men de ligger på hver sin side av den riktige verdien. Euler gir systematisk for høye posisjoner (fordi vi bruker for lav hastighet), mens Euler-Cromer gir for lave posisjoner.
Python-eksempel: Fritt fall
Her er et komplett Python-program som simulerer fritt fall med Euler-Cromer-metoden:
# Fritt fall med Euler-Cromer-metoden
import matplotlib.pyplot as plt
# Fysiske konstanter
g = 9.81 # Tyngdeakselerasjon (m/s^2)
# Startverdier
y = 100 # Starthøyde (m)
v = 0 # Starthastighet (m/s)
t = 0 # Starttid (s)
# Numeriske parametere
dt = 0.01 # Tidsstegg (s)
t_slutt = 5 # Sluttid (s)
# Lister for å lagre resultater
t_liste = [t]
y_liste = [y]
v_liste = [v]
# Hovedløkke - Euler-Cromer
while t < t_slutt and y > 0: # Stopp når ballen treffer bakken
# Akselerasjon (konstant for fritt fall)
a = -g
# Oppdater hastighet først
v = v + a * dt
# Deretter posisjon (med ny hastighet - Euler-Cromer)
y = y + v * dt
# Oppdater tid
t = t + dt
# Lagre verdier
t_liste.append(t)
y_liste.append(y)
v_liste.append(v)
# Plot resultatene
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
ax1.plot(t_liste, y_liste, 'b-', label='Numerisk')
ax1.set_xlabel('Tid (s)')
ax1.set_ylabel('Høyde (m)')
ax1.set_title('Fritt fall - Posisjon')
ax1.grid(True)
ax1.legend()
ax2.plot(t_liste, v_liste, 'r-', label='Numerisk')
ax2.set_xlabel('Tid (s)')
ax2.set_ylabel('Hastighet (m/s)')
ax2.set_title('Fritt fall - Hastighet')
ax2.grid(True)
ax2.legend()
plt.tight_layout()
plt.show()
# Skriv ut sluttresultat
print(f"Ballen traff bakken etter {t:.2f} sekunder")
print(f"Sluthastighet: {v:.2f} m/s")Forventet resultat:
- Ballen treffer bakken etter ca. 4.52 sekunder
- Sluthastighet: ca. -44.3 m/s
Analytisk kontroll:
En fallskjermhopper (masse 80 kg) hopper fra et fly. Luftmotstanden er gitt ved , der kg/m.
a) Sett opp bevegelseslikningen.
b) Finn terminalhastigheten analytisk.
c) Forklar hvorfor dette problemet egner seg for numerisk løsning.
Krefter på hopperen (positiv retning nedover):
- Tyngde: (nedover)
- Luftmotstand: (motsatt bevegelsesretningen)
Siden hopperen faller nedover (), blir:
Newtons 2. lov:
b) Terminalhastighet:
Ved terminalhastighet er :
Dette tilsvarer ca. 200 km/t.
c) Hvorfor numerisk løsning?
Bevegelseslikningen er en ikke-lineær differensialligning fordi akselerasjonen avhenger av .
Selv om denne likningen faktisk kan løses analytisk (med hyperbolske funksjoner), er løsningen komplisert:
Med numeriske metoder kan vi enkelt:
- Løse likningen uten å kjenne den analytiske løsningen
- Legge til mer realistiske modeller (f.eks. som avhenger av høyde)
- Simulere åpning av fallskjerm (brå endring i )
- Inkludere vind og andre effekter
Python-eksempel: Fall med luftmotstand
# Fall med luftmotstand - kvadratisk drag
import matplotlib.pyplot as plt
import numpy as np
# Fysiske parametere
g = 9.81 # Tyngdeakselerasjon (m/s^2)
m = 80 # Masse (kg)
b = 0.25 # Luftmotstandskoeffisient (kg/m)
# Terminalhastighet (for sammenligning)
v_terminal = np.sqrt(m * g / b)
print(f"Terminalhastighet: {v_terminal:.1f} m/s")
# Startverdier
y = 4000 # Starthøyde (m)
v = 0 # Starthastighet (m/s)
t = 0 # Starttid (s)
# Numeriske parametere
dt = 0.01 # Tidsstegg (s)
t_slutt = 60 # Sluttid (s)
# Lister for resultater
t_liste = [t]
y_liste = [y]
v_liste = [v]
# Hovedløkke - Euler-Cromer
while t < t_slutt and y > 0:
# Akselerasjon med luftmotstand
# F = mg - b*v^2 (positiv v betyr nedover)
a = g - (b/m) * v * abs(v)
# Euler-Cromer oppdatering
v = v + a * dt
y = y - v * dt # Minus fordi y er høyde, v er positiv nedover
t = t + dt
# Lagre
t_liste.append(t)
y_liste.append(y)
v_liste.append(v)
# Analytisk løsning for hastighet
t_analytisk = np.linspace(0, max(t_liste), 100)
v_analytisk = v_terminal * np.tanh(g * t_analytisk / v_terminal)
# Plot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
ax1.plot(t_liste, y_liste, 'b-')
ax1.set_xlabel('Tid (s)')
ax1.set_ylabel('Høyde (m)')
ax1.set_title('Fall med luftmotstand - Posisjon')
ax1.grid(True)
ax2.plot(t_liste, v_liste, 'b-', label='Numerisk')
ax2.plot(t_analytisk, v_analytisk, 'r--', label='Analytisk')
ax2.axhline(y=v_terminal, color='g', linestyle=':',
label=f'Terminal: {v_terminal:.1f} m/s')
ax2.set_xlabel('Tid (s)')
ax2.set_ylabel('Hastighet (m/s)')
ax2.set_title('Fall med luftmotstand - Hastighet')
ax2.legend()
ax2.grid(True)
plt.tight_layout()
plt.show()Viktige observasjoner:
1. Hastigheten øker raskt i starten
2. Økningen avtar når luftmotstanden blir betydelig
3. Hastigheten nærmer seg terminalhastigheten asymptotisk
4. Den numeriske løsningen matcher den analytiske svært godt
Python-eksempel: Matematisk pendel
For en pendel med lengde og utslag er akselerasjonen:
For små vinkler () kan vi bruke og få en analytisk løsning. Men for store vinkler må vi løse numerisk.
# Matematisk pendel - numerisk løsning
import matplotlib.pyplot as plt
import numpy as np
# Fysiske parametere
g = 9.81 # Tyngdeakselerasjon (m/s^2)
L = 1.0 # Pendellengde (m)
# Startverdier
theta = np.radians(45) # Startvinkel (45 grader)
omega = 0 # Startvinkelhastighet (rad/s)
t = 0
# Numeriske parametere
dt = 0.001 # Tidsstegg (s) - må være lite for pendel!
t_slutt = 10 # Sluttid (s)
# Lister for resultater
t_liste = [t]
theta_liste = [theta]
omega_liste = [omega]
# Beregn total mekanisk energi (for å sjekke bevaring)
def energi(theta, omega):
E_kin = 0.5 * L**2 * omega**2 # Kinetisk (per masse)
E_pot = g * L * (1 - np.cos(theta)) # Potensiell (per masse)
return E_kin + E_pot
E0 = energi(theta, omega)
E_liste = [E0]
# Hovedløkke - Euler-Cromer
while t < t_slutt:
# Vinkelakselerasjon
alpha = -(g/L) * np.sin(theta)
# Euler-Cromer
omega = omega + alpha * dt
theta = theta + omega * dt
t = t + dt
# Lagre
t_liste.append(t)
theta_liste.append(theta)
omega_liste.append(omega)
E_liste.append(energi(theta, omega))
# Plot
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 10))
ax1.plot(t_liste, np.degrees(theta_liste))
ax1.set_xlabel('Tid (s)')
ax1.set_ylabel('Vinkel (grader)')
ax1.set_title('Pendel - Vinkelutslag')
ax1.grid(True)
ax2.plot(t_liste, omega_liste)
ax2.set_xlabel('Tid (s)')
ax2.set_ylabel('Vinkelhastighet (rad/s)')
ax2.set_title('Pendel - Vinkelhastighet')
ax2.grid(True)
# Energibevaring
ax3.plot(t_liste, np.array(E_liste)/E0)
ax3.set_xlabel('Tid (s)')
ax3.set_ylabel('E/E0')
ax3.set_title('Energibevaring (bør være 1.0)')
ax3.set_ylim(0.99, 1.01)
ax3.grid(True)
plt.tight_layout()
plt.show()
# Beregn periode
perioder = []
forrige_null = None
for i in range(1, len(theta_liste)):
if theta_liste[i-1] > 0 and theta_liste[i] <= 0:
if forrige_null is not None:
perioder.append(t_liste[i] - forrige_null)
forrige_null = t_liste[i]
if perioder:
print(f"Målt periode: {np.mean(perioder):.3f} s")
print(f"Liten-vinkel-formel: {2*np.pi*np.sqrt(L/g):.3f} s")Viktige observasjoner:
1. Euler-Cromer bevarer energien godt (viktig for oscillerende systemer!)
2. For store vinkler er perioden litt lengre enn liten-vinkel-formelen gir
3. Vanlig Euler-metode ville gitt økende energi over tid (ustabilt)
Anvendelser av numerisk modellering
1. Skrått kast med luftmotstand
Uten luftmotstand har vi den kjente parabelbanen. Med luftmotstand:
- Banen blir asymmetrisk (brattere nedstigning)
- Rekkevidden reduseres betydelig
- Optimal kastevinkel er under 45°
2. Fallskjermhopping
Simulering med varierende luftmotstandskoeffisient:
- Fritt fall: lav , hastighet ca. 200 km/t
- Fallskjerm utløst: høy , hastighet ca. 20 km/t
- Brå endring i gir rask oppbremsing
3. Planetbaner
For elliptiske baner der gravitasjonen varierer med avstand:
Må løses numerisk fordi akselerasjonen avhenger av posisjon.
4. Bilkjøring og bremsing
- Bremskraft avhengig av hastighet (ABS-bremser)
- Friksjon som varierer med underlaget
- Luftmotstand ved høye hastigheter
5. Sportsanalyse
- Golfball med spin (Magnus-effekt)
- Fotball som svinger i lufta
- Skihopperes luftmotstand og oppdrift
6. Værmodellering
- Atmosfæriske bevegelser
- Havsirkulasjon
- Klimaendringer over tid
Hva er hovedfordelen med numeriske metoder sammenlignet med analytiske løsninger?
I Euler-metoden, hva skjer hvis vi gjør tidsstegget mindre?
En ball faller fra hvile () fra høyden m.
Bruk Euler-metoden med s og m/s² til å finne posisjonen og hastigheten ved s.
Fortsett fra oppgave 1.3. Bruk Euler-metoden til å finne posisjonen og hastigheten ved s og s.
Sammenlign med de analytiske formlene og .
Bruk Euler-Cromer-metoden på samme problem som i oppgave 1.3 og 1.4.
Start med m, , s, og m/s². Finn posisjon og hastighet ved , og s.
Sammenlign resultatene med Euler-metoden og den analytiske løsningen.
En bil med masse 1200 kg bremser med en konstant bremskraft på 6000 N. Starthastigheten er 20 m/s.
a) Finn akselerasjonen.
b) Bruk Euler-Cromer med s til å finne posisjon og hastighet ved , , og s.
c) Når stopper bilen (numerisk og analytisk)?
En fallskjermhopper med masse 70 kg faller fra et fly. Luftmotstanden er (der er i m/s og i N).
a) Finn terminalhastigheten.
b) Sett opp akselerasjonsuttrykket som funksjon av .
c) Beskriv kort hvordan du ville programmert dette i Python.
En pendel med lengde m slippes fra hvile ved .
a) Skriv opp formelen for vinkelakselerasjonen .
b) Bruk Euler-Cromer med s til å beregne og ved , og s.
c) Sammenlign med liten-vinkel-tilnærmingen: .
Skriv et Python-program som simulerer en ball som kastes skrått opp med følgende verdier:
- Starthøyde: m
- Starthastighet: m/s
- Kastevinkel:
- Luftmotstand: Ingen (for enkelhet)
Programmet skal finne:
a) Maksimal høyde
b) Total tid i luften
c) Horisontal rekkevidde
Bruk s.
Bruk:
- Masse: kg (baseball)
- Tverrsnittsareal: m²
- Lufttetthet: kg/m³
- Dragkoeffisient:
Sammenlign rekkevidden med og uten luftmotstand.
En fjærvekt med masse kg henger i en fjær med fjærkonstant N/m. Fjærvekten trekkes 0.1 m ned fra likevektsposisjonen og slippes.
a) Finn svingefrekvensen og perioden analytisk.
b) Skriv opp akselerasjonen som funksjon av posisjon.
c) Bruk Euler-Cromer med s til å simulere de første 3 periodene.
d) Hvorfor er Euler-Cromer bedre enn vanlig Euler for dette problemet?
a) Bruk numerisk simulering ( s) til å finne:
- Hastighet og posisjon ved s
- Total bremselengde (når )
- Total tid for å stoppe
b) Sammenlign med bremselengden hvis kraften var konstant lik 12000 N fra starten.
Oppsummering
Viktige konsepter:
1. Numeriske metoder brukes når analytiske løsninger ikke eksisterer eller er for komplekse
2. Eulers metode er den enkleste numeriske metoden:
-
-
3. Euler-Cromer-metoden er en forbedring som bruker ny hastighet i posisjonsoppdateringen:
-
-
4. Tidsstegg : Mindre steg gir bedre nøyaktighet, men krever flere beregninger
5. Feilkilder:
- Diskretiseringsfeil (avkuttingsfeil)
- Akkumulering av feil over tid
- Numerisk ustabilitet
6. Anvendelser:
- Bevegelse med luftmotstand
- Pendler og svingninger
- Planetbaner
- Komplekse systemer med variable krefter
Programmeringstips:
- Bruk Euler-Cromer for oscillerende systemer (bevarer energi bedre)
- Velg mye mindre enn systemets karakteristiske tidsskala
- Kontroller resultater mot analytiske løsninger når mulig
- Sjekk energibevaring for å verifisere stabilitet
Neste kapittel:
Vi skal se på gravitasjon og planetbevegelse, der numeriske metoder er essensielle for å beregne satellittbaner og interplanetære reiser.
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.
