Tilbake
1.3
Numeriske metoder og programmering

1.3 Numeriske metoder og programmering

Eulers metode, Python for fysikksimuleringer, modellering av bevegelse.

90 min
10 oppgaver
Eulers metodePythonNumerisk integrasjonSimuleringIterasjon
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 10 oppgaver

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

Numerisk metode

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:
F=maF = ma

Akselerasjon er den dobbeltderiverte av posisjon:
a=dvdt=d2sdt2a = \frac{dv}{dt} = \frac{d^2s}{dt^2}

Derfor:
md2sdt2=Fm\frac{d^2s}{dt^2} = F

Dette er en andreordens differensialligning.

Eksempel: Fritt fall uten luftmotstand

Kraft:
F=mgF = -mg

(Negativ fordi tyngdekraften peker nedover)

Differensialligning:
md2sdt2=mgm\frac{d^2s}{dt^2} = -mg

d2sdt2=g\frac{d^2s}{dt^2} = -g

Analytisk løsning:
s(t)=s0+v0t12gt2s(t) = s_0 + v_0 t - \frac{1}{2}gt^2

Denne kan vi løse med penn og papir! ✓

Eksempel: Fritt fall MED luftmotstand

Krefter:
- Tyngdekraft: Fg=mgF_g = -mg
- Luftmotstand: Fd=12CdρAv2\displaystyle F_d = \frac{1}{2}C_d \rho A v^2 (oppover hvis nedover bevegelse)

Total kraft:
F=mg+12CdρAv2F = -mg + \frac{1}{2}C_d \rho A v^2

Differensialligning:
mdvdt=mg+12CdρAv2m\frac{dv}{dt} = -mg + \frac{1}{2}C_d \rho A v^2

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:

dsdt=v\frac{ds}{dt} = v

dvdt=g+CdρAv22m\frac{dv}{dt} = -g + \frac{C_d \rho A v^2}{2m}

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:
dydx=f(x,y)\frac{dy}{dx} = f(x, y)

Tilnærming:
Hvis vi kjenner yy ved xx, kan vi estimere yy ved x+Δxx + \Delta x:

y(x+Δx)y(x)+dydxΔxy(x + \Delta x) \approx y(x) + \frac{dy}{dx} \cdot \Delta x

y(x+Δx)y(x)+f(x,y)Δxy(x + \Delta x) \approx y(x) + f(x, y) \cdot \Delta x

Eulers algoritme

Gitt:
- Differensialligning: dydt=f(t,y)\displaystyle \frac{dy}{dt} = f(t, y)
- Initialverdi: y(t0)=y0y(t_0) = y_0
- Tidssteg: Δt\Delta t (ofte skrevet dtdt)

Algoritme:

1. Start med (t0,y0)(t_0, y_0)
2. Beregn dydt=f(t0,y0)\displaystyle \frac{dy}{dt} = f(t_0, y_0)
3. Estimér neste verdi: y1=y0+f(t0,y0)Δty_1 = y_0 + f(t_0, y_0) \cdot \Delta t
4. Oppdatér tid: t1=t0+Δtt_1 = t_0 + \Delta t
5. Gjenta fra steg 2 med (t1,y1)(t_1, y_1)

Generell formel:
yn+1=yn+f(tn,yn)Δty_{n+1} = y_n + f(t_n, y_n) \cdot \Delta t
tn+1=tn+Δtt_{n+1} = t_n + \Delta t

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 Δt\Delta t → Bedre presisjon (men flere beregninger)
- Større Δt\Delta t → Raskere, men mindre nøyaktig

Eksempel: Eksponentiell vekst

Differensialligning:
dydt=ky\frac{dy}{dt} = ky

med y(0)=1y(0) = 1 og k=0.5k = 0.5.

Analytisk løsning:
y(t)=ekty(t) = e^{kt}

Numerisk løsning (Eulers metode):

La Δt=0.1\Delta t = 0.1.

Steg 1:
- t0=0t_0 = 0, y0=1y_0 = 1
- dydt=0.5×1=0.5\displaystyle \frac{dy}{dt} = 0.5 \times 1 = 0.5
- y1=1+0.5×0.1=1.05y_1 = 1 + 0.5 \times 0.1 = 1.05
- t1=0.1t_1 = 0.1

Steg 2:
- t1=0.1t_1 = 0.1, y1=1.05y_1 = 1.05
- dydt=0.5×1.05=0.525\displaystyle \frac{dy}{dt} = 0.5 \times 1.05 = 0.525
- y2=1.05+0.525×0.1=1.1025y_2 = 1.05 + 0.525 \times 0.1 = 1.1025
- t2=0.2t_2 = 0.2

Osv.

Sammenligning:

Tid ttAnalytisk e0.5te^{0.5t}Euler (Δt=0.1\Delta t = 0.1)Feil
0.01.00001.00000%
0.11.05131.05000.12%
0.21.10521.10250.24%
1.01.64871.62891.2%

Eulers metode gir god tilnærming! ✓
✏️Eulers metode: Enkel bevegelse

En bil akselererer fra hvile med konstant akselerasjon a=2a = 2 m/s². Bruk Eulers metode til å beregne hastigheten etter 5 sekunder med tidssteg Δt=1\Delta t = 1 s. Sammenlign med den analytiske løsningen.

Gitt:
- Akselerasjon: a=2a = 2 m/s²
- Starthastighet: v0=0v_0 = 0 m/s
- Tid: t=5t = 5 s
- Tidssteg: Δt=1\Delta t = 1 s

Differensialligning:
dvdt=a=2\frac{dv}{dt} = a = 2

Analytisk løsning:
v(t)=v0+at=0+2×5=10 m/sv(t) = v_0 + at = 0 + 2 \times 5 = 10 \text{ m/s}

---

Eulers metode:

Algoritme:
vn+1=vn+aΔt=vn+2×1=vn+2v_{n+1} = v_n + a \cdot \Delta t = v_n + 2 \times 1 = v_n + 2

Steg for steg:

Steg 0:
- t0=0t_0 = 0 s, v0=0v_0 = 0 m/s

Steg 1:
- a=2a = 2 m/s²
- v1=v0+aΔt=0+2×1=2v_1 = v_0 + a \cdot \Delta t = 0 + 2 \times 1 = 2 m/s
- t1=1t_1 = 1 s

Steg 2:
- a=2a = 2 m/s²
- v2=v1+aΔt=2+2×1=4v_2 = v_1 + a \cdot \Delta t = 2 + 2 \times 1 = 4 m/s
- t2=2t_2 = 2 s

Steg 3:
- v3=4+2=6v_3 = 4 + 2 = 6 m/s
- t3=3t_3 = 3 s

Steg 4:
- v4=6+2=8v_4 = 6 + 2 = 8 m/s
- t4=4t_4 = 4 s

Steg 5:
- v5=8+2=10v_5 = 8 + 2 = 10 m/s
- t5=5t_5 = 5 s

---

Resultat:

Tid (s)Euler (m/s)Analytisk (m/s)Feil
0000%
1220%
2440%
3660%
4880%
510100%

Konklusjon: Eulers metode gir eksakt løsning når akselerasjonen er konstant! ✓
Hvorfor?
- Når aa er konstant, er v(t)v(t) 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-string

Lister (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)          # 7

Lø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.0

NumPy 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()
✏️Simulering: Fritt fall med luftmotstand

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.

Gitt:
- Masse: m=0.5m = 0.5 kg
- Radius: r=0.05r = 0.05 m
- Starthøyde: s0=100s_0 = 100 m
- Starthastighet: v0=0v_0 = 0 m/s
- Luftens tetthet: ρ=1.2\rho = 1.2 kg/m³
- Luftmotstandskoeffisient: Cd=0.5C_d = 0.5

Fysikk:

Tverrsnittareal:
A=πr2=π×0.052=0.00785 m2A = \pi r^2 = \pi \times 0.05^2 = 0.00785 \text{ m}^2

Krefter:
- Tyngdekraft: Fg=mg=0.5×9.81=4.905F_g = -mg = -0.5 \times 9.81 = -4.905 N
- Luftmotstand: Fd=12CdρAv2\displaystyle F_d = \frac{1}{2}C_d \rho A v^2 (oppover når bevegelse nedover)

Netto kraft:
F=mg+12CdρAv2F = -mg + \frac{1}{2}C_d \rho A v^2

Akselerasjon:
a=Fm=g+CdρAv22ma = \frac{F}{m} = -g + \frac{C_d \rho A v^2}{2m}

Differensiallikninger:
dsdt=v\frac{ds}{dt} = v
dvdt=g+CdρAv22m\frac{dv}{dt} = -g + \frac{C_d \rho A v^2}{2m}

---

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.

Oppgaver

Lett3 oppgaver
1Python
2Python
7Opplasting
Medium3 oppgaver
3Python
4Python
8Opplasting
Vanskelig4 oppgaver
5Python
6Python
9Python
10Python

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.