Bruk av numeriske metoder (Eulers metode) til å modellere komplekse bevegelser.
Kvifor treng vi numeriske metodar?
I dei tidlegare kapitla har vi løyst rørslelikningar analytisk – det vil seie at vi har funne eksakte formlar for posisjon og fart som funksjon av tid. Til dømes lærte vi at for konstant akselerasjon gjeld:
Men i røynda er akselerasjonen sjeldan konstant. Tenk på:
- Luftmotstand som aukar med farten
- Fjørkrefter som avheng av posisjon
- Gravitasjon som varierer med avstand
- Magnetiske krefter som avheng av både posisjon og fart
For slike problem finst det ofte inga analytisk løysing. Då bruker vi i staden numeriske metodar – algoritmar som reknar ut tilnærma verdiar steg for steg.
Numeriske metodar:
- Deler opp tida i små intervall
- Reknar ut posisjon og fart trinnvis
- Gjev tilnærma, men ofte svært nøyaktige, løysingar
- Kan implementerast på datamaskiner
Bruksområde:
- Simulering av romfart og satellittbaner
- Vêrvarsling og klimamodellar
- Dataspel og animasjonar
- Partikkelfysikk og molekylsimuleringar
- Strukturanalyse i ingeniørfag
I staden for å finne ein eksakt formel, reknar vi ut verdiar punkt for punkt:
Nøkkelomgrep:
- Tidssteg (): Kor lang tid mellom kvar utrekning
- Iterasjon: Eitt utrekningssteg i algoritmen
- Diskretisering: Å dele opp kontinuerlege storleikar i diskrete verdiar
Eulers metode – matematisk bakgrunn
Eulers metode (oppkalla etter matematikaren Leonhard Euler, 1707-1783) er den enklaste numeriske metoden for å løyse differensiallikningar.
Den deriverte som stigingstal
Hugs at den deriverte av ein funksjon er definert som:
Dette er stigingstalet til tangenten ved punktet .
Eulers approksimasjon
Viss vi ikkje tek grensa, men bruker ein liten, men endeleg , får vi ei tilnærming:
Ved å løyse for får vi Euler-formelen:
Geometrisk tolking
Euler-metoden følgjer tangentlinja i kvart punkt. I staden for å følgje den bøygde kurva eksakt, tek vi eit lite steg langs tangenten. Jo mindre , jo betre følgjer vi den verkelege kurva.
Viktig innsikt:
Euler-metoden erstattar den bøygde løysingskurva med ei rekkje rette linjesegment (tangentane). Dette gjev ei tilnærma løysing som blir betre jo mindre tidssteg vi bruker.
der er den deriverte ved tidspunkt .
For rørsle i éin dimensjon:
der:
- er posisjonen ved tidspunkt
- er farten ved tidspunkt
- er akselerasjonen ved tidspunkt
- er tidssteget
Merk: Vi bruker den gamle farten for å oppdatere posisjonen. Dette blir kalla eksplisitt Euler-metode.
Implementasjon av Eulers metode
Algoritmen steg for steg
1. Set startverdiar: Vel , , og
2. Vel tidssteg: Fastsett (mindre = meir nøyaktig, men fleire utrekningar)
3. Gjenta for kvart tidssteg:
- Rekn ut akselerasjonen (frå kreftene)
- Oppdater farten:
- Oppdater posisjonen:
- Oppdater tida:
4. Hald fram til ønskt 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 tidVal av tidssteg
Tommelregel: bør vere mykje mindre enn den karakteristiske tidsskalaen for systemet.
- Fritt fall (nokre sekund): -
- Pendel (periodar på 1-2 s): -
- Raske svingingar: Bruk endå mindre
Ein ball blir sleppt frå kvile frå ei høgd på 20 m. Bruk Eulers metode med tidssteg s til å finne høgda og farten etter 1.0 s og 2.0 s.
Samanlikn med dei analytiske formlane. Bruk m/s².
- Starthøgd: m
- Startfart: m/s (blir sleppt frå kvile)
- Akselerasjon: m/s² (negativ fordi nedover)
- Tidssteg: s
Euler-formlar:
Utrekning 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
Samanlikning med analytisk løysing:
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: Farten er eksakt, men posisjonen har feil fordi vi bruker den gamle farten i posisjonsoppdateringa. Feilen aukar med tid. Med mindre ville feilen vore mindre.
Feilkjelder og nøyaktigheit
Diskretiseringsfeil (avkuttingsfeil)
Den største feilkjelda i Euler-metoden er diskretiseringsfeil. Denne oppstår fordi vi erstattar den glatte løysingskurva med rette linjesegment.
For Eulers metode gjeld:
- Feilen per steg er proporsjonal med
- Total feil etter mange steg er proporsjonal med
Dette tyder at viss vi halverer tidssteget, halverer vi den totale feilen. Euler-metoden er derfor ein førsteordens metode.
Akkumulering av feil
For kvart steg blir det lagt til ein liten feil. Over mange steg kan desse feila akkumulerast og vekse:
- Feil i posisjon påverkar utrekning av krefter
- Feil i fart påverkar utrekning av posisjon
- Feila kan forsterke kvarandre
Numerisk stabilitet
For nokre problem kan Euler-metoden bli ustabil – feila veks eksponentielt. Dette skjer typisk når:
- Tidssteget er for stort
- Systemet har raske svingingar
- Kreftene er sterkt avhengige av posisjon
Stabilitetsregel: må vere mykje mindre enn den karakteristiske tidsperioden til systemet.
Forbetra metodar
Det finst mange betre metodar enn enkel Euler:
- Euler-Cromer (symplektisk Euler): Bruker i staden for i posisjonsoppdateringa
- Midtpunktmetoden: Bruker farten midt i intervallet
- Runge-Kutta: Meir nøyaktige, men meir komplekse metodar
Euler-Cromer-modifikasjon:
Denne enkle endringa gjev mykje betre energibevaring for periodiske system.
Fordelar:
- Bevarer energien betre i oscillerande system
- Meir stabil for pendlar og fjører
- Like enkel å implementere som vanleg Euler
Tilråding: Bruk Euler-Cromer i staden for vanleg Euler for dei fleste fysikkproblem!
Bruk begge metodane til å simulere fritt fall frå 20 m med s i 2 sekund. Samanlikn posisjonane med den analytiske løysinga.
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øysing ved t = 1 s:
Samanlikning ved t = 1 s:
- Euler: m, feil = +0.5 m (for høgt)
- Euler-Cromer: m, feil = -0.5 m (for lågt)
- Analytisk: m
Ved t = 2 s:
- Analytisk: m
- Euler: m (for høgt)
- Euler-Cromer: m (for lågt)
Konklusjon: Begge metodane har feil, men dei ligg på kvar si side av den rette verdien. Euler gjev systematisk for høge posisjonar (fordi vi bruker for låg fart), medan Euler-Cromer gjev for låge posisjonar.
Python-døme: Fritt fall
Her er eit 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")Forventa resultat:
- Ballen treff bakken etter ca. 4.52 sekund
- Sluttfart: ca. -44.3 m/s
Analytisk kontroll:
Ein fallskjermhoppar (masse 80 kg) hoppar frå eit fly. Luftmotstanden er gitt ved , der kg/m.
a) Set opp rørslelikninga.
b) Finn terminalfarten analytisk.
c) Forklar kvifor dette problemet eignar seg for numerisk løysing.
Krefter på hopparen (positiv retning nedover):
- Tyngde: (nedover)
- Luftmotstand: (motsett rørsleretninga)
Sidan hopparen fell nedover (), blir:
Newtons 2. lov:
b) Terminalfart:
Ved terminalfart er :
Dette svarar til ca. 200 km/t.
c) Kvifor numerisk løysing?
Rørslelikninga er ei ikkje-lineær differensiallikning fordi akselerasjonen avheng av .
Sjølv om denne likninga faktisk kan løysast analytisk (med hyperbolske funksjonar), er løysinga komplisert:
Med numeriske metodar kan vi enkelt:
- Løyse likninga utan å kjenne den analytiske løysinga
- Leggje til meir realistiske modellar (t.d. som avheng av høgd)
- Simulere opning av fallskjerm (brå endring i )
- Inkludere vind og andre effektar
Python-døme: 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 observasjonar:
1. Farten aukar raskt i starten
2. Auken avtek når luftmotstanden blir monaleg
3. Farten nærmar seg terminalfarten asymptotisk
4. Den numeriske løysinga matchar den analytiske svært godt
Python-døme: Matematisk pendel
For ein pendel med lengd og utslag er akselerasjonen:
For små vinklar () kan vi bruke og få ei analytisk løysing. Men for store vinklar må vi løyse 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 observasjonar:
1. Euler-Cromer bevarer energien godt (viktig for oscillerande system!)
2. For store vinklar er perioden litt lengre enn liten-vinkel-formelen gjev
3. Vanleg Euler-metode ville gitt aukande energi over tid (ustabilt)
Bruksområde for numerisk modellering
1. Skrått kast med luftmotstand
Utan luftmotstand har vi den kjende parabelbanen. Med luftmotstand:
- Banen blir asymmetrisk (brattare nedstiging)
- Rekkjevidda blir monaleg redusert
- Optimal kastevinkel er under 45°
2. Fallskjermhopping
Simulering med varierande luftmotstandskoeffisient:
- Fritt fall: låg , fart ca. 200 km/t
- Fallskjerm utløyst: høg , fart ca. 20 km/t
- Brå endring i gjev rask oppbremsing
3. Planetbaner
For elliptiske baner der gravitasjonen varierer med avstand:
Må løysast numerisk fordi akselerasjonen avheng av posisjon.
4. Bilkøyring og bremsing
- Bremsekraft avhengig av fart (ABS-bremser)
- Friksjon som varierer med underlaget
- Luftmotstand ved høge fartar
5. Sportsanalyse
- Golfball med spinn (Magnus-effekt)
- Fotball som svingar i lufta
- Luftmotstand og oppdrift til skihopparar
6. Vêrmodellering
- Atmosfæriske rørsler
- Havsirkulasjon
- Klimaendringar over tid
Kva er hovudfordelen med numeriske metodar samanlikna med analytiske løysingar?
I Euler-metoden, kva skjer viss vi gjer tidssteget mindre?
Ein ball fell frå kvile () frå høgda m.
Bruk Euler-metoden med s og m/s² til å finne posisjonen og farten ved s.
Hald fram frå oppgåve 1.3. Bruk Euler-metoden til å finne posisjonen og farten ved s og s.
Samanlikn med dei analytiske formlane og .
Bruk Euler-Cromer-metoden på same problem som i oppgåve 1.3 og 1.4.
Start med m, , s, og m/s². Finn posisjon og fart ved , og s.
Samanlikn resultata med Euler-metoden og den analytiske løysinga.
Ein bil med masse 1200 kg bremsar med ei konstant bremsekraft på 6000 N. Startfarten er 20 m/s.
a) Finn akselerasjonen.
b) Bruk Euler-Cromer med s til å finne posisjon og fart ved , , og s.
c) Når stoppar bilen (numerisk og analytisk)?
Ein fallskjermhoppar med masse 70 kg fell frå eit fly. Luftmotstanden er (der er i m/s og i N).
a) Finn terminalfarten.
b) Set opp akselerasjonsuttrykket som funksjon av .
c) Skildr kort korleis du ville programmert dette i Python.
Ein pendel med lengd m blir sleppt frå kvile ved .
a) Skriv opp formelen for vinkelakselerasjonen .
b) Bruk Euler-Cromer med s til å rekne ut og ved , og s.
c) Samanlikn med liten-vinkel-tilnærminga: .
Skriv eit Python-program som simulerer ein ball som blir kasta skrått opp med følgjande verdiar:
- Starthøgd: m
- Startfart: m/s
- Kastevinkel:
- Luftmotstand: Ingen (for enkelheit)
Programmet skal finne:
a) Maksimal høgd
b) Total tid i lufta
c) Horisontal rekkjevidd
Bruk s.
Bruk:
- Masse: kg (baseball)
- Tverrsnittsareal: m²
- Lufttettleik: kg/m³
- Dragkoeffisient:
Samanlikn rekkjevidda med og utan luftmotstand.
Ei fjørvekt med masse kg heng i ei fjør med fjørkonstant N/m. Fjørvekta blir trekt 0.1 m ned frå likevektsposisjonen og sleppt.
a) Finn svingefrekvensen og perioden analytisk.
b) Skriv opp akselerasjonen som funksjon av posisjon.
c) Bruk Euler-Cromer med s til å simulere dei første 3 periodane.
d) Kvifor er Euler-Cromer betre enn vanleg Euler for dette problemet?
a) Bruk numerisk simulering ( s) til å finne:
- Fart og posisjon ved s
- Total bremselengd (når )
- Total tid for å stoppe
b) Samanlikn med bremselengda viss krafta var konstant lik 12000 N frå starten.
Oppsummering
Viktige konsept:
1. Numeriske metodar blir brukte når analytiske løysingar ikkje finst eller er for komplekse
2. Eulers metode er den enklaste numeriske metoden:
-
-
3. Euler-Cromer-metoden er ei forbetring som bruker ny fart i posisjonsoppdateringa:
-
-
4. Tidssteg : Mindre steg gjev betre nøyaktigheit, men krev fleire utrekningar
5. Feilkjelder:
- Diskretiseringsfeil (avkuttingsfeil)
- Akkumulering av feil over tid
- Numerisk ustabilitet
6. Bruksområde:
- Rørsle med luftmotstand
- Pendlar og svingingar
- Planetbaner
- Komplekse system med variable krefter
Programmeringstips:
- Bruk Euler-Cromer for oscillerande system (bevarer energi betre)
- Vel mykje mindre enn den karakteristiske tidsskalaen til systemet
- Kontroller resultat mot analytiske løysingar når det er mogleg
- Sjekk energibevaring for å verifisere stabilitet
Neste kapittel:
Vi skal sjå på gravitasjon og planetrørsle, der numeriske metodar er essensielle for å rekne ut 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.
