Eulers metode, Python for fysikksimuleringer, modellering av bevegelse.
Numeriske metodar og programmering
Kvifor treng vi numeriske metodar?
Mange fysiske problem kan ikkje løysast analytisk (med penn og papir). Eksempel:
- Fritt fall med luftmotstand
- Trekroppsproblem i astronomi
- Værsimuleringar
- Kvanteproblem
Løysing: Bruk datamaskinen til å rekne ut tilnærma løysingar!
Kva er ein numerisk metode?
Ein numerisk metode er ein algoritme som:
- Deler opp eit problem i små steg
- Reknar ut ei tilnærma løysing steg for steg
- Gir resultat med kontrollert presisjon
Fordelar:
- Kan løyse problem utan analytisk løysing
- Rask (med moderne datamaskiner)
- Visuell (kan lage grafar og animasjonar)
Ulemper:
- Tilnærma (ikkje eksakt)
- Krev programmering
- Kan akkumulere feil
Programmering i fysikk
Python er det mest populære språket for vitskapleg programmering:
- Enkelt å lære
- Kraftige bibliotek (NumPy, Matplotlib)
- Gratis og open kjeldekode
- Blir brukt i forsking og industri
Kva skal vi lære:
1. Grunnleggjande Python-syntaks
2. Eulers metode for differensiallikningar
3. Simulering av rørsle
4. Visualisering av resultat
Ein algoritme som reknar ut ei tilnærma løysing på eit matematisk problem ved å dele det opp i mange små steg. Blir brukt når analytiske løysingar ikkje finst eller er for kompliserte.
Differensiallikningar i fysikk
Ei differensiallikning er ei likning som inneheld deriverte.
Newtons 2. lov som differensiallikning
Newtons 2. lov:
Akselerasjon er den dobbeltderiverte av posisjon:
Difor:
Dette er ei andreordens differensiallikning.
Eksempel: Fritt fall utan luftmotstand
Kraft:
(Negativ fordi tyngdekrafta peikar nedover)
Differensiallikning:
Analytisk løysing:
Denne kan vi løyse med penn og papir! ✓
Eksempel: Fritt fall MED luftmotstand
Krefter:
- Tyngdekraft:
- Luftmotstand: (oppover viss nedover rørsle)
Total kraft:
Differensiallikning:
Problem: Denne har INGA analytisk løysing! ✗
Løysing: Bruk numeriske metodar! ✓
Omskriving til første orden
For å bruke Eulers metode skriv vi om til førsteordens system:
Dette er to kopla førsteordens differensiallikningar.
Eulers metode
Eulers metode er den enklaste numeriske metoden for å løyse differensiallikningar.
Grunnidé
Derivert = helling av tangent:
Tilnærming:
Viss vi kjenner ved , kan vi estimere ved :
Eulers algoritme
Gitt:
- Differensiallikning:
- Initialverdi:
- Tidssteg: (ofte skrive )
Algoritme:
1. Start med
2. Rekn ut
3. Estimer neste verdi:
4. Oppdater tid:
5. Gjenta frå steg 2 med
Generell formel:
Visualisering
Tenk på Eulers metode som å:
1. Stå på ei kurve
2. Sjå tangentretninga (derivert)
3. Ta eit lite steg i tangentretninga
4. Gjenta
Presisjon:
- Mindre → Betre presisjon (men fleire utrekningar)
- Større → Raskare, men mindre nøyaktig
Eksempel: Eksponentiell vekst
Differensiallikning:
med og .
Analytisk løysing:
Numerisk løysing (Eulers metode):
La .
Steg 1:
- ,
-
-
-
Steg 2:
- ,
-
-
-
Osv.
Samanlikning:
| 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! ✓
Ein bil akselererer frå kvile med konstant akselerasjon m/s². Bruk Eulers metode til å rekne ut farten etter 5 sekund med tidssteg s. Samanlikn med den analytiske løysinga.
- Akselerasjon: m/s²
- Startfart: m/s
- Tid: s
- Tidssteg: s
Differensiallikning:
Analytisk løysing:
---
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øysing når akselerasjonen er konstant! ✓
Kvifor?
- Når er konstant, er ei rett linje
- Eulers metode følgjer tangenten, som er ei rett linje
- Perfekt samsvar!
Generelt: Eulers metode er eksakt for lineære problem.
Python-grunnlag for fysikk
Variablar og berekningar
# 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()Ein ball med masse 0.5 kg og radius 0.05 m blir sleppt frå 100 m høgd. Bruk Eulers metode til å simulere fallet med luftmotstand. Samanlikn med fritt fall utan luftmotstand.
- Masse: kg
- Radius: m
- Starthøgd: m
- Startfart: m/s
- Tettleiken til lufta: kg/m³
- Luftmotstandskoeffisient:
Fysikk:
Tverrsnittareal:
Krefter:
- Tyngdekraft: N
- Luftmotstand: (oppover når rørsle nedover)
Netto kraft:
Akselerasjon:
Differensiallikningar:
---
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
- Utan luftmotstand: 4.52 s
- Forskjell: 0.35 s (8% lengre)
Forklaring: Luftmotstanden bremsar ballen, så han bruker lengre tid.
2. Sluttfart:
- Med luftmotstand: -42.1 m/s
- Utan luftmotstand: -44.3 m/s
- Forskjell: 2.2 m/s lågare
Forklaring: Luftmotstanden reduserer sluttfarten.
3. Terminalfart:
- Teoretisk: 71.4 m/s
- Ballen når ikkje terminalfart (berre 42 m/s)
- 100 m er ikkje høgt nok
4. Graf-observasjonar:
- Høgd-tid graf: Kurvene divergerer (luftmotstand gir meir "kurva" bane)
- Fart-tid graf: Med luftmotstand flatar farten ut (nærmar seg terminalfart)
Konklusjon:
For denne ballen ved 100 m høgd er luftmotstanden moderat betydeleg (8% effekt på tid). For høgare høgder eller lettare objekt ville effekten vore større.
For lite tidssteg:
- ✓ Svært nøyaktig
- ✗ Svært treigt (mange utrekningar)
For stort tidssteg:
- ✓ Rask utrekning
- ✗ Unøyaktig
- ✗ Kan gi ustabile løysingar
Korleis velje?
1. Start med lite tidssteg (t.d. )
2. Test forskjellige verdiar (0.01, 0.001, 0.0001)
3. Sjekk konvergens: Når løysinga ikkje endrar seg betydeleg ved mindre , er du OK
4. Tommelfingerregel: Bruk slik at systemet endrar seg lite per steg
Eksempel:
For fritt fall frå 100 m:
- Falltid ≈ 4.5 s
- Bruk minst 1000 steg: s
- Betre: 10000 steg: s
Kjelde til feil:
1. Avrundingsfeil: Datamaskinen bruker avgrensa presisjon
2. Diskretiseringsfeil: Vi approksimerer ein kontinuerleg prosess med diskrete steg
3. Stabilitetsproblem: For store tidssteg kan gi eksplosive feil
Løysingar:
- Bruk mindre tidssteg
- Bruk meir avanserte metodar (Runge-Kutta, sjå vidaregåande kurs)
- Valider mot analytiske løysingar når mogleg
- Test konvergens ved å redusere tidssteg
Eksempel:
Simulering av planetbanar over millionar av år krev svært presise metodar. Eulers metode ville akkumulere feil og "predikere" at planeten flyg 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.
