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 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

Numerisk metode

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

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

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

Dette er ei andreordens differensiallikning.

Eksempel: Fritt fall utan luftmotstand

Kraft:
F=mgF = -mg

(Negativ fordi tyngdekrafta peikar nedover)

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

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

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

Denne kan vi løyse 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 viss nedover rørsle)

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

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

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:

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 kopla førsteordens differensiallikningar.

Eulers metode

Eulers metode er den enklaste numeriske metoden for å løyse differensiallikningar.

Grunnidé

Derivert = helling av tangent:
dydx=f(x,y)\frac{dy}{dx} = f(x, y)

Tilnærming:
Viss 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:
- Differensiallikning: dydt=f(t,y)\displaystyle \frac{dy}{dt} = f(t, y)
- Initialverdi: y(t0)=y0y(t_0) = y_0
- Tidssteg: Δt\Delta t (ofte skrive dtdt)

Algoritme:

1. Start med (t0,y0)(t_0, y_0)
2. Rekn ut dydt=f(t0,y0)\displaystyle \frac{dy}{dt} = f(t_0, y_0)
3. Estimer neste verdi: y1=y0+f(t0,y0)Δty_1 = y_0 + f(t_0, y_0) \cdot \Delta t
4. Oppdater tid: t1=t0+Δtt_1 = t_0 + \Delta t
5. Gjenta frå 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å ei kurve
2. Sjå tangentretninga (derivert)
3. Ta eit lite steg i tangentretninga
4. Gjenta

Presisjon:
- Mindre Δt\Delta t → Betre presisjon (men fleire utrekningar)
- Større Δt\Delta t → Raskare, men mindre nøyaktig

Eksempel: Eksponentiell vekst

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

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

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

Numerisk løysing (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.

Samanlikning:

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 rørsle

Ein bil akselererer frå kvile med konstant akselerasjon a=2a = 2 m/s². Bruk Eulers metode til å rekne ut farten etter 5 sekund med tidssteg Δt=1\Delta t = 1 s. Samanlikn med den analytiske løysinga.

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

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

Analytisk løysing:
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øysing når akselerasjonen er konstant! ✓
Kvifor?
- Når aa er konstant, er v(t)v(t) 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-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

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.

Gitt:
- Masse: m=0.5m = 0.5 kg
- Radius: r=0.05r = 0.05 m
- Starthøgd: s0=100s_0 = 100 m
- Startfart: v0=0v_0 = 0 m/s
- Tettleiken til lufta: ρ=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 rørsle 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}

Differensiallikningar:
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
- 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.

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.