Eulers metode, Python for fysikksimuleringer, modellering av bevegelse.
Numeriske metoder og programmering
Hvorfor trenger vi numeriske metoder?
Mange fysiske problemer kan ikke løses analytisk (med penn og papir). Eksempler:
- Fritt fall med luftmotstand
- Trekroppsproblemer i astronomi
- Værsimuleringer
- Kvanteproblemer
Løsning: Bruk datamaskinen til å beregne tilnærmede løsninger!
Hva er en numerisk metode?
En numerisk metode er en algoritme som:
- Deler opp et problem i små steg
- Beregner en tilnærmet løsning steg for steg
- Gir resultater med kontrollert presisjon
Fordeler:
- Kan løse problemer uten analytisk løsning
- Rask (med moderne datamaskiner)
- Visuell (kan lage grafer og animasjoner)
Ulemper:
- Tilnærmet (ikke eksakt)
- Krever programmering
- Kan akkumulere feil
Programmering i fysikk
Python er det mest populære språket for vitenskapelig programmering:
- Enkelt å lære
- Kraftige biblioteker (NumPy, Matplotlib)
- Gratis og åpen kildekode
- Brukes i forskning og industri
Hva skal vi lære:
1. Grunnleggende Python-syntaks
2. Eulers metode for differensiallikninger
3. Simulering av bevegelse
4. Visualisering av resultater
En algoritme som beregner en tilnærmet løsning på et matematisk problem ved å dele det opp i mange små steg. Brukes når analytiske løsninger ikke finnes eller er for kompliserte.
Differensiallikninger i fysikk
En differensialligning er en likning som inneholder deriverte.
Newtons 2. lov som differensialligning
Newtons 2. lov:
Akselerasjon er den dobbeltderiverte av posisjon:
Derfor:
Dette er en andreordens differensialligning.
Eksempel: Fritt fall uten luftmotstand
Kraft:
(Negativ fordi tyngdekraften peker nedover)
Differensialligning:
Analytisk løsning:
Denne kan vi løse med penn og papir! ✓
Eksempel: Fritt fall MED luftmotstand
Krefter:
- Tyngdekraft:
- Luftmotstand: (oppover hvis nedover bevegelse)
Total kraft:
Differensialligning:
Problem: Denne har INGEN analytisk løsning! ✗
Løsning: Bruk numeriske metoder! ✓
Omskriving til første orden
For å bruke Eulers metode omskriver vi til førsteordens system:
Dette er to koblede førsteordens differensiallikninger.
Eulers metode
Eulers metode er den enkleste numeriske metoden for å løse differensiallikninger.
Grunnidé
Derivert = helling av tangent:
Tilnærming:
Hvis vi kjenner ved , kan vi estimere ved :
Eulers algoritme
Gitt:
- Differensialligning:
- Initialverdi:
- Tidssteg: (ofte skrevet )
Algoritme:
1. Start med
2. Beregn
3. Estimér neste verdi:
4. Oppdatér tid:
5. Gjenta fra steg 2 med
Generell formel:
Visualisering
Tenk på Eulers metode som å:
1. Stå på en kurve
2. Se tangentretningen (derivert)
3. Ta et lite steg i tangentretningen
4. Gjenta
Presisjon:
- Mindre → Bedre presisjon (men flere beregninger)
- Større → Raskere, men mindre nøyaktig
Eksempel: Eksponentiell vekst
Differensialligning:
med og .
Analytisk løsning:
Numerisk løsning (Eulers metode):
La .
Steg 1:
- ,
-
-
-
Steg 2:
- ,
-
-
-
Osv.
Sammenligning:
| Tid | Analytisk | Euler () | Feil |
|---|---|---|---|
| 0.0 | 1.0000 | 1.0000 | 0% |
| 0.1 | 1.0513 | 1.0500 | 0.12% |
| 0.2 | 1.1052 | 1.1025 | 0.24% |
| 1.0 | 1.6487 | 1.6289 | 1.2% |
Eulers metode gir god tilnærming! ✓
En bil akselererer fra hvile med konstant akselerasjon m/s². Bruk Eulers metode til å beregne hastigheten etter 5 sekunder med tidssteg s. Sammenlign med den analytiske løsningen.
- Akselerasjon: m/s²
- Starthastighet: m/s
- Tid: s
- Tidssteg: s
Differensialligning:
Analytisk løsning:
---
Eulers metode:
Algoritme:
Steg for steg:
Steg 0:
- s, m/s
Steg 1:
- m/s²
- m/s
- s
Steg 2:
- m/s²
- m/s
- s
Steg 3:
- m/s
- s
Steg 4:
- m/s
- s
Steg 5:
- m/s
- s
---
Resultat:
| Tid (s) | Euler (m/s) | Analytisk (m/s) | Feil |
|---|---|---|---|
| 0 | 0 | 0 | 0% |
| 1 | 2 | 2 | 0% |
| 2 | 4 | 4 | 0% |
| 3 | 6 | 6 | 0% |
| 4 | 8 | 8 | 0% |
| 5 | 10 | 10 | 0% |
Konklusjon: Eulers metode gir eksakt løsning når akselerasjonen er konstant! ✓
Hvorfor?
- Når er konstant, er en rett linje
- Eulers metode følger tangenten, som er en rett linje
- Perfekt samsvar!
Generelt: Eulers metode er eksakt for lineære problemer.
Python-grunnlag for fysikk
Variabler og beregninger
# Variabler
m = 0.5 # masse i kg
v = 10 # hastighet i m/s
g = 9.81 # tyngdeakselerasjon i m/s²
# Beregninger
Ek = 0.5 * m * v**2 # Kinetisk energi
Ep = m * g * h # Potensiell energi
p = m * v # Bevegelsesmengde
# Skriv ut
print("Kinetisk energi:", Ek, "J")
print(f"Bevegelsesmengde: {p} kg·m/s") # f-stringLister (arrays)
# Liste med tall
tid = [0, 1, 2, 3, 4, 5]
hastighet = [0, 2, 4, 6, 8, 10]
# Tilgang til elementer
print(tid[0]) # 0 (første element)
print(tid[-1]) # 5 (siste element)
print(hastighet[2]) # 4
# Legge til elementer
tid.append(6)
hastighet.append(12)
# Lengde av liste
n = len(tid) # 7Løkker
# For-løkke
for i in range(5):
print(i) # Skriver 0, 1, 2, 3, 4
# While-løkke
t = 0
while t < 5:
print(t)
t = t + 1 # Eller: t += 1
# Løkke over liste
hastigheter = [0, 2, 4, 6]
for v in hastigheter:
Ek = 0.5 * m * v**2
print(f"v = {v} m/s, Ek = {Ek} J")Betingelser
v = 10
if v > 0:
print("Beveger seg fremover")
elif v < 0:
print("Beveger seg bakover")
else:
print("I ro")Funksjoner
# Definere funksjon
def kinetisk_energi(m, v):
"""Beregner kinetisk energi."""
return 0.5 * m * v**2
# Bruke funksjon
Ek = kinetisk_energi(0.5, 10)
print(Ek) # 25.0NumPy for numeriske beregninger
import numpy as np
# Array (mer effektiv enn liste)
tid = np.array([0, 1, 2, 3, 4, 5])
hastighet = np.array([0, 2, 4, 6, 8, 10])
# Elementvise operasjoner
Ek = 0.5 * m * hastighet**2 # Beregner for alle verdier
# Nyttige funksjoner
print(np.max(hastighet)) # 10 (største verdi)
print(np.min(hastighet)) # 0 (minste verdi)
print(np.mean(hastighet)) # 5.0 (gjennomsnitt)
print(np.sum(hastighet)) # 30 (sum)Matplotlib for plotting
import matplotlib.pyplot as plt
# Data
tid = [0, 1, 2, 3, 4, 5]
hastighet = [0, 2, 4, 6, 8, 10]
# Plott
plt.plot(tid, hastighet, 'b-') # Blå linje
plt.xlabel('Tid (s)')
plt.ylabel('Hastighet (m/s)')
plt.title('Hastighet som funksjon av tid')
plt.grid(True)
plt.show()Eulers metode i Python
Mal for Eulers metode
import numpy as np
import matplotlib.pyplot as plt
# Parametere
t0 = 0 # Starttid
y0 = 1 # Startverdi
t_slutt = 10 # Sluttid
dt = 0.1 # Tidssteg
# Derivert (differensialligning)
def f(t, y):
"""Returnerer dy/dt."""
return -0.5 * y # Eksempel: eksponentiell nedgang
# Initialiser lister
tid = [t0]
y = [y0]
# Eulers metode
t = t0
y_verdi = y0
while t < t_slutt:
# Beregn derivert
dydt = f(t, y_verdi)
# Euler-steg
y_verdi = y_verdi + dydt * dt
t = t + dt
# Lagre
tid.append(t)
y.append(y_verdi)
# Plott
plt.plot(tid, y)
plt.xlabel('Tid')
plt.ylabel('y')
plt.title('Løsning av differensialligning')
plt.grid(True)
plt.show()Eksempel: Fritt fall
import numpy as np
import matplotlib.pyplot as plt
# Parametere
g = 9.81 # m/s²
s0 = 100 # Starthøyde (m)
v0 = 0 # Starthastighet (m/s)
dt = 0.01 # Tidssteg (s)
# Initialiser
tid = [0]
s = [s0]
v = [v0]
# Eulers metode
t = 0
s_verdi = s0
v_verdi = v0
while s_verdi > 0: # Stopp når objektet treffer bakken
# Akselerasjon
a = -g
# Euler-steg
v_verdi = v_verdi + a * dt
s_verdi = s_verdi + v_verdi * dt
t = t + dt
# Lagre
tid.append(t)
s.append(s_verdi)
v.append(v_verdi)
# Resultat
print(f"Falltid: {t:.3f} s")
print(f"Slutthastighet: {v_verdi:.3f} m/s")
# Analytisk løsning
t_analytisk = np.sqrt(2 * s0 / g)
v_analytisk = -g * t_analytisk
print(f"Analytisk tid: {t_analytisk:.3f} s")
print(f"Analytisk hastighet: {v_analytisk:.3f} m/s")
# Plott
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# Høyde
ax1.plot(tid, s, 'b-', label='Numerisk')
ax1.set_xlabel('Tid (s)')
ax1.set_ylabel('Høyde (m)')
ax1.set_title('Høyde som funksjon av tid')
ax1.grid(True)
ax1.legend()
# Hastighet
ax2.plot(tid, v, 'r-', label='Numerisk')
ax2.set_xlabel('Tid (s)')
ax2.set_ylabel('Hastighet (m/s)')
ax2.set_title('Hastighet som funksjon av tid')
ax2.grid(True)
ax2.legend()
plt.tight_layout()
plt.show()En ball med masse 0.5 kg og radius 0.05 m slippes fra 100 m høyde. Bruk Eulers metode til å simulere fallet med luftmotstand. Sammenlign med fritt fall uten luftmotstand.
- Masse: kg
- Radius: m
- Starthøyde: m
- Starthastighet: m/s
- Luftens tetthet: kg/m³
- Luftmotstandskoeffisient:
Fysikk:
Tverrsnittareal:
Krefter:
- Tyngdekraft: N
- Luftmotstand: (oppover når bevegelse nedover)
Netto kraft:
Akselerasjon:
Differensiallikninger:
---
Python-kode:
import numpy as np
import matplotlib.pyplot as plt
# Parametere
m = 0.5 # kg
r = 0.05 # m
A = np.pi * r**2 # m²
rho = 1.2 # kg/m³
Cd = 0.5
g = 9.81 # m/s²
s0 = 100 # m
v0 = 0 # m/s
dt = 0.001 # s (lite tidssteg for nøyaktighet)
# Initialiser med luftmotstand
tid_luft = [0]
s_luft = [s0]
v_luft = [v0]
t = 0
s = s0
v = v0
while s > 0:
# Luftmotstand (oppover hvis v < 0, dvs. nedover bevegelse)
Fd = 0.5 * Cd * rho * A * v**2 if v < 0 else -0.5 * Cd * rho * A * v**2
# Akselerasjon
a = -g + Fd / m
# Euler-steg
v = v + a * dt
s = s + v * dt
t = t + dt
# Lagre
tid_luft.append(t)
s_luft.append(s)
v_luft.append(v)
# Resultat med luftmotstand
t_luft_slutt = t
v_luft_slutt = v
# Uten luftmotstand (analytisk)
tid_ingen = np.linspace(0, t_luft_slutt, 1000)
s_ingen = s0 - 0.5 * g * tid_ingen**2
v_ingen = -g * tid_ingen
# Analytisk falltid uten luftmotstand
t_analytisk = np.sqrt(2 * s0 / g)
v_analytisk = -g * t_analytisk
# Print resultater
print("MED LUFTMOTSTAND:")
print(f" Falltid: {t_luft_slutt:.3f} s")
print(f" Slutthastighet: {v_luft_slutt:.3f} m/s")
print()
print("UTEN LUFTMOTSTAND:")
print(f" Falltid: {t_analytisk:.3f} s")
print(f" Slutthastighet: {v_analytisk:.3f} m/s")
print()
print("FORSKJELL:")
print(f" Falltid: {t_luft_slutt - t_analytisk:.3f} s lengre med luftmotstand")
print(f" Hastighet: {abs(v_luft_slutt) - abs(v_analytisk):.3f} m/s lavere med luftmotstand")
# Terminalhastighet (teoretisk)
v_terminal = np.sqrt(2 * m * g / (Cd * rho * A))
print(f" Terminalhastighet: {v_terminal:.3f} m/s")
# Plott
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
# Høyde
ax1.plot(tid_luft, s_luft, 'b-', label='Med luftmotstand', linewidth=2)
ax1.plot(tid_ingen, s_ingen, 'r--', label='Uten luftmotstand', linewidth=2)
ax1.set_xlabel('Tid (s)', fontsize=12)
ax1.set_ylabel('Høyde (m)', fontsize=12)
ax1.set_title('Høyde som funksjon av tid', fontsize=14)
ax1.legend(fontsize=11)
ax1.grid(True, alpha=0.3)
ax1.set_xlim(0, max(t_luft_slutt, t_analytisk) * 1.1)
# Hastighet
ax2.plot(tid_luft, v_luft, 'b-', label='Med luftmotstand', linewidth=2)
ax2.plot(tid_ingen, v_ingen, 'r--', label='Uten luftmotstand', linewidth=2)
ax2.axhline(-v_terminal, color='g', linestyle=':', label='Terminalhastighet', linewidth=2)
ax2.set_xlabel('Tid (s)', fontsize=12)
ax2.set_ylabel('Hastighet (m/s)', fontsize=12)
ax2.set_title('Hastighet som funksjon av tid', fontsize=14)
ax2.legend(fontsize=11)
ax2.grid(True, alpha=0.3)
ax2.set_xlim(0, max(t_luft_slutt, t_analytisk) * 1.1)
plt.tight_layout()
plt.show()---
Resultat (typisk):
MED LUFTMOTSTAND:
Falltid: 4.87 s
Slutthastighet: -42.1 m/s
UTEN LUFTMOTSTAND:
Falltid: 4.52 s
Slutthastighet: -44.3 m/s
FORSKJELL:
Falltid: 0.35 s lengre med luftmotstand
Hastighet: 2.2 m/s lavere med luftmotstand
Terminalhastighet: 71.4 m/s---
Analyse:
1. Falltid:
- Med luftmotstand: 4.87 s
- Uten luftmotstand: 4.52 s
- Forskjell: 0.35 s (8% lengre)
Forklaring: Luftmotstanden bremser ballen, så den bruker lengre tid.
2. Slutthastighet:
- Med luftmotstand: -42.1 m/s
- Uten luftmotstand: -44.3 m/s
- Forskjell: 2.2 m/s lavere
Forklaring: Luftmotstanden reduserer slutthastigheten.
3. Terminalhastighet:
- Teoretisk: 71.4 m/s
- Ballen når ikke terminalhastighet (kun 42 m/s)
- 100 m er ikke høyt nok
4. Graf-observasjoner:
- Høyde-tid graf: Kurvene divergerer (luftmotstand gir mer "kurvet" bane)
- Hastighet-tid graf: Med luftmotstand flater hastigheten ut (nærmer seg terminalhastighet)
Konklusjon:
For denne ballen ved 100 m høyde er luftmotstanden moderat betydelig (8% effekt på tid). For høyere høyder eller lettere objekter ville effekten vært større.
For lite tidssteg:
- ✓ Meget nøyaktig
- ✗ Meget treigt (mange beregninger)
For stort tidssteg:
- ✓ Rask beregning
- ✗ Unøyaktig
- ✗ Kan gi ustabile løsninger
Hvordan velge?
1. Start med lite tidssteg (f.eks. )
2. Test forskjellige verdier (0.01, 0.001, 0.0001)
3. Sjekk konvergens: Når løsningen ikke endrer seg betydelig ved mindre , er du OK
4. Tommelfingerregel: Bruk slik at systemet endrer seg lite per steg
Eksempel:
For fritt fall fra 100 m:
- Falltid ≈ 4.5 s
- Bruk minst 1000 steg: s
- Bedre: 10000 steg: s
Kilde til feil:
1. Avrundingsfeil: Datamaskinen bruker begrenset presisjon
2. Diskretiseringsfeil: Vi approximerer en kontinuerlig prosess med diskrete steg
3. Stabilitetsproblemer: For store tidssteg kan gi eksplosive feil
Løsninger:
- Bruk mindre tidssteg
- Bruk mer avanserte metoder (Runge-Kutta, se videregående kurs)
- Valider mot analytiske løsninger når mulig
- Test konvergens ved å redusere tidssteg
Eksempel:
Simulering av planetbaner over millioner av år krever meget presise metoder. Eulers metode ville akkumulere feil og "predikere" at planeten flyr ut av solsystemet!
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.
