Eulers metode, Python for fysikksimuleringer, modellering av bevegelse.
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!
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
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.
En differensialligning er en likning som inneholder deriverte.
Newtons 2. lov:
Akselerasjon er den dobbeltderiverte av posisjon:
Derfor:
Dette er en andreordens differensialligning.
Kraft:
(Negativ fordi tyngdekraften peker nedover)
Differensialligning:
Analytisk løsning:
Denne kan vi løse med penn og papir! ✓
Krefter:
- Tyngdekraft:
- Luftmotstand: (oppover hvis nedover bevegelse)
Total kraft:
Differensialligning:
Problem: Denne har INGEN analytisk løsning! ✗
Løsning: Bruk numeriske metoder! ✓
For å bruke Eulers metode omskriver vi til førsteordens system:
Dette er to koblede førsteordens differensiallikninger.
Eulers metode er den enkleste numeriske metoden for å løse differensiallikninger.
Derivert = helling av tangent:
Tilnærming:
Hvis vi kjenner ved , kan vi estimere ved :
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:
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
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% |
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.
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% |
``pythonVariabler
m = 0.5 # masse i kg
v = 10 # hastighet i m/s
g = 9.81 # tyngdeakselerasjon i m/s²
Lister (arrays)
`python
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]) # 4Legge til elementer
tid.append(6)
hastighet.append(12)Lengde av liste
n = len(tid) # 7
`Løkker
`python
For-løkke
for i in range(5):
print(i) # Skriver 0, 1, 2, 3, 4While-løkke
t = 0
while t < 5:
print(t)
t = t + 1 # Eller: t += 1Lø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
`python
v = 10if v > 0:
print("Beveger seg fremover")
elif v < 0:
print("Beveger seg bakover")
else:
print("I ro")
`Funksjoner
`python
Definere funksjon
def kinetiskenergi(m, v):
"""Beregner kinetisk energi."""
return 0.5 m v2Bruke funksjon
Ek = kinetiskenergi(0.5, 10)
print(Ek) # 25.0
`NumPy for numeriske beregninger
`python
import numpy as npArray (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 verdierNyttige 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
`python
import matplotlib.pyplot as pltData
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()
````python
import numpy as np
import matplotlib.pyplot as plt
# Euler-steg
yverdi = yverdi + dydt
# Lagre
tid.append(t)
y.append(yverdi)
Eksempel: Fritt fall
`python
import numpy as np
import matplotlib.pyplot as pltParametere
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
sverdi = s0
vverdi = v0while s
verdi > 0: # Stopp når objektet treffer bakken
# Akselerasjon
a = -g # Euler-steg
vverdi = vverdi + a dt
sverdi = sverdi + vverdi dt
t = t + dt
# Lagre
tid.append(t)
s.append(sverdi)
v.append(vverdi)
Resultat
print(f"Falltid: {t:.3f} s")
print(f"Slutthastig het: {vverdi:.3f} m/s")Analytisk løsning
tanalytisk = np.sqrt(2 s0 / g)
vanalytisk = -g tanalytisk
print(f"Analytisk tid: {tanalytisk:.3f} s")
print(f"Analytisk hastighet: {vanalytisk:.3f} m/s")Plott
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))Høyde
ax1.plot(tid, s, 'b-', label='Numerisk')
ax1.setxlabel('Tid (s)')
ax1.setylabel('Høyde (m)')
ax1.settitle('Høyde som funksjon av tid')
ax1.grid(True)
ax1.legend()Hastighet
ax2.plot(tid, v, 'r-', label='Numerisk')
ax2.setxlabel('Tid (s)')
ax2.setylabel('Hastighet (m/s)')
ax2.settitle('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.
Fysikk:
Tverrsnittareal:
Krefter:
- Tyngdekraft: N
- Luftmotstand: (oppover når bevegelse nedover)
Netto kraft:
Akselerasjon:
Differensiallikninger:
---
Python-kode:
``python
import numpy as np
import matplotlib.pyplot as plt
t = 0
s = s0
v = v0
while s > 0:
# Luftmotstand (oppover hvis v < 0, dvs. nedover bevegelse)
Fd = 0.5
# Akselerasjon
a = -g + Fd / m
# Euler-steg
v = v + a
# Lagre
tid
plt.tight
layout()---
Resultat (typisk):
`
MED LUFTMOTSTAND:
Falltid: 4.87 s
Slutthastig het: -42.1 m/sUTEN LUFTMOTSTAND:
Falltid: 4.52 s
Slutthastig het: -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. Slutthastig het:
- 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. Stabilitets problemer: 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!