4.5

4.5 Simulering og stokastiske eksperimenter

Monte Carlo-simulering, Python og GeoGebra, store talls lov.

50 min
10 oppgaver
Monte CarloSimuleringPythonStore talls lov
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 10 oppgaver
Kapitlets plass i kurset

Simulering og Monte Carlo-metoden

Mange sannsynlighetsproblemer er vanskelige eller umulige å løse analytisk. I slike tilfeller kan vi bruke simulering - å gjenta et tilfeldig forsøk mange ganger på en datamaskin og telle utfall.

Monte Carlo-simulering er en metode der vi:
1. Definerer en modell for det stokastiske forsøket
2. Genererer tilfeldige tall for å simulere forsøket
3. Gjentar forsøket et stort antall ganger (NN)
4. Bruker de observerte frekvensene som estimat for sannsynligheter

Navnet kommer fra kasinoet i Monte Carlo, fordi metoden bygger på tilfeldighet - akkurat som et kasino.

Hvorfor simulering?
- Noen problemer er for kompliserte til å løse eksakt
- Simulering gir en intuitiv forståelse av sannsynligheter
- Digitale verktøy gjør det enkelt å kjøre tusenvis av forsøk
- Resultatene kan brukes til å kontrollere analytiske beregninger

Tilfeldige tall og pseudotilfeldighet

Et tilfeldig tall er et tall som er generert av en tilfeldig prosess, der hvert tall i et gitt intervall er like sannsynlig.

I praksis bruker datamaskiner pseudotilfeldige tallgeneratorer (PRNG) - algoritmer som produserer tallsekvenser som ser ut som tilfeldige, men som egentlig er deterministiske (bestemt av en startverdi kalt «seed»).

Vanlige funksjoner i Python:
- random.random() gir et uniformt tilfeldig tall i [0,1)[0, 1)
- random.randint(a, b) gir et tilfeldig heltall mellom aa og bb (inklusiv)
- random.choice(liste) velger et tilfeldig element fra en liste

GeoGebra-kommandoer:
- TilfeldigMellom(a, b) genererer tilfeldig heltall i [a,b][a, b]
- Tilfeldig() gir uniformt tilfeldig tall i [0,1)[0, 1)

For reproduserbare resultater kan man sette seed med random.seed(42) i Python.

📜Store talls lov
Store talls lov sier at gjennomsnittet av observasjonene i et forsøk vil nærme seg forventningsverdien når antall forsøk øker.

Mer presist: La X1,X2,…,XnX_1, X_2, \ldots, X_n være uavhengige stokastiske variabler med samme fordeling og forventningsverdi μ\mu. Da gjelder:

Xˉn=X1+X2+⋯+Xnn→μna˚r n→∞\bar{X}_n = \frac{X_1 + X_2 + \cdots + X_n}{n} \to \mu \quad \text{når } n \to \infty

I praksis betyr dette:
- Den relative frekvensen av en hendelse nærmer seg den teoretiske sannsynligheten
- Gjennomsnittlig gevinst i et spill nærmer seg forventningsverdien
- Estimatene fra simulering blir bedre (med lavere standardfeil) for større nn

Standardfeil for en simulert andel: SE(p^)=p(1−p)N≤0,5N\displaystyle \text{SE}(\hat{p}) = \sqrt{\frac{p(1-p)}{N}} \leq \frac{0{,}5}{\sqrt{N}}

For N=10 000N = 10\,000 er standardfeilen høyst 0,005. For N=1 000 000N = 1\,000\,000 er den høyst 0,0005. Standardfeilen er proporsjonal med 1N\displaystyle \frac{1}{\sqrt{N}}: 100 ganger flere forsøk gir 10 ganger mindre standardfeil.

Advarsel: Store talls lov sier ikke at det vil «jevne seg ut» på kort sikt (gamblerfeilslutning). Hvert enkelt forsøk er fortsatt helt tilfeldig.

✏️Monte Carlo-simulering i Python

Bruk Monte Carlo-simulering til å estimere arealet av en sirkel med radius 1 ved å bruke tilfeldige punkter i kvadratet [−1,1]×[−1,1][-1, 1] \times [-1, 1].

Metoden: Et tilfeldig punkt (x,y)(x, y) i kvadratet med sidelengde 2 er innenfor sirkelen dersom x2+y2≤1x^2 + y^2 \leq 1.

P(punkt i sirkel)=Areal sirkelAreal kvadrat=π⋅1222=π4P(\text{punkt i sirkel}) = \frac{\text{Areal sirkel}}{\text{Areal kvadrat}} = \frac{\pi \cdot 1^2}{2^2} = \frac{\pi}{4}

Dermed er π≈4⋅p^\pi \approx 4 \cdot \hat{p}.

import random

N = 1_000_000
innenfor = 0

for _ in range(N):
    x = random.uniform(-1, 1)
    y = random.uniform(-1, 1)
    if x**2 + y**2 <= 1:
        innenfor += 1

pi_estimat = 4 * innenfor / N
print(
    "Estimert pi ="
    f" {pi_estimat:.5f}"
)
print(
    f"Eksakt pi   = {3.14159:.5f}"
)

En kjøring ga: π^≈3,14123\hat{\pi} \approx 3{,}14123

p^≈π4≈0,785\displaystyle \hat{p} \approx \frac{\pi}{4} \approx 0{,}785
SE(p^)=0,785⋅0,215106≈0,00041\displaystyle \text{SE}(\hat{p}) = \sqrt{\frac{0{,}785 \cdot 0{,}215}{10^6}} \approx 0{,}00041
SE(π^)=4⋅SE(p^)≈0,0016\text{SE}(\hat{\pi}) = 4 \cdot \text{SE}(\hat{p}) \approx 0{,}0016

Svar: π^≈3,141\hat{\pi} \approx 3{,}141. Avviket fra π\pi er 0,00040{,}0004, godt innenfor standardfeilen 0,00160{,}0016. En ny kjøring gir et litt annet tall.

✏️Store talls lov illustrert ved myntkast

Simuler 5000 myntkast og vis grafisk hvordan andelen kron nærmer seg 0,5. Forklar hva grafen illustrerer om konvergensen av estimater.

import random
import matplotlib.pyplot as plt

N = 5000
antall_kron = 0
andel_kron = []

for i in range(1, N + 1):
    # 0 = mynt, 1 = kron
    kast = random.randint(0, 1)
    antall_kron += kast
    andel_kron.append(
        antall_kron / i
    )

plt.figure(figsize=(10, 5))
plt.plot(
    range(1, N + 1),
    andel_kron,
    linewidth=0.7,
    label='Estimert P(kron)',
)
plt.axhline(
    y=0.5,
    color='r',
    linestyle='--',
    label='Teoretisk verdi (0,5)',
)
plt.xlabel('Antall kast')
plt.ylabel('Andel kron')
plt.title(
    'Store talls lov: Konvergens'
    ' mot 0,5'
)
plt.legend()
plt.ylim(0.3, 0.7)
plt.show()

Tolkning: Grafen viser at andelen kron svinger mye i starten (stor usikkerhet for få kast), men gradvis stabiliserer seg rundt 0,50{,}5 etter noen tusen kast. Svingningene avtar i takt med 1n\displaystyle \frac{1}{\sqrt{n}} - dette er store talls lov i praksis.

✏️Simulere en binomisk fordeling

En terning kastes 10 ganger. Bruk simulering til å anslå sannsynligheten for nøyaktig to seksere, og sammenlikn med den binomiske fordelingen.

import random

random.seed(1)

forsok = 100000
treff = 0
for _ in range(forsok):
    seksere = 0
    for kast in range(10):
        if (
            random.randint(1, 6)
            == 6
        ):
            seksere = seksere + 1
    if seksere == 2:
        treff = treff + 1
print(treff / forsok)

Utskrift: 0.28826

P(X=2)=(102)(16)2(56)8≈0,2907P(X = 2) = \dbinom{10}{2}\left(\dfrac{1}{6}\right)^2\left(\dfrac{5}{6}\right)^8 \approx 0{,}2907

Standardavviket til en andel fra 100 000 forsøk er omtrent 0,29⋅0,71100 000≈0,0014\sqrt{\dfrac{0{,}29 \cdot 0{,}71}{100\,000}} \approx 0{,}0014.
0,2907−0,2883=0,00240{,}2907 - 0{,}2883 = 0{,}0024, under to standardavvik.

Svar: Simuleringen gir omtrent 0,2880{,}288, og teorien gir 0,29070{,}2907. Avviket er tilfeldig variasjon.

✏️Simulere normalfordelte utfall

Høyden til voksne menn i en gruppe er normalfordelt med μ=170\mu = 170 cm og σ=8\sigma = 8 cm. Bruk simulering til å anslå sannsynligheten for at en tilfeldig valgt mann er over 185 cm, og sammenlikn med normalfordelingen.

import random
random.seed(1)

forsok = 100000
treff = 0
for _ in range(forsok):
    hoyde = random.gauss(170, 8)
    if hoyde > 185:
        treff = treff + 1
print(treff / forsok)

Utskrift: 0.0303

1 - Normal(170, 8, 185) gir 0,03040{,}0304

Svar: Simuleringen gir 0,03030{,}0303 og normalfordelingen 0,03040{,}0304. random.gauss(170, 8) trekker et tall fra normalfordelingen med μ=170\mu = 170 og σ=8\sigma = 8.

📝Oppgave 1

Løs oppgavene:

a

Skriv et Python-program som simulerer 10 000 kast med en vanlig seksidet terning og estimerer sannsynligheten for å få 6. Sammenlign med den teoretiske verdien.

b

Forklar hva som menes med pseudotilfeldige tall og hvorfor de er tilfredsstillende for praktisk bruk i statistikk.

📝Oppgave 2

Løs oppgavene:

a

I en gruppe på 30 personer, hva er sannsynligheten for at minst to har bursdag på samme dag? Estimer svaret med Monte Carlo-simulering (N=50 000N = 50\,000 gjentagelser). (Anta 365 dager per år.)

b

Kjøres simuleringen med N=100N = 100 gjentagelser versus N=100 000N = 100\,000 gjentagelser, hva forventer du å se? Hva sier store talls lov om forskjellen i nøyaktighet?

📝Oppgave 3

Løs oppgavene:

a

To terninger kastes og produktet P=X1⋅X2P = X_1 \cdot X_2 beregnes. Bruk simulering (N=100 000N = 100\,000) til å estimere E(P)E(P) og Var(P)\text{Var}(P).

b

Bruk Python til å tegne et histogram over fordelingen til PP basert på 100 000 simuleringer. Beskriv formen på fordelingen. Er den symmetrisk?

c

Forklar sammenhengen mellom store talls lov og sentralgrensesetningen. Hva sier sentralgrensesetningen om fordelingen til Xˉn\bar{X}_n for store nn?

📝Oppgave 4

To skihoppere hopper hvert sitt hopp. Lengdene er normalfordelte og uavhengige: Anna hopper i snitt μ=82\mu = 82 m med σ=4\sigma = 4 m, og Bea i snitt μ=80\mu = 80 m med σ=5\sigma = 5 m.

import random
random.seed(1)

forsok = 100000
treff = 0
for _ in range(forsok):
    anna = random.gauss(82, 4)
    bea = random.gauss(80, 5)
    if anna > bea:
        treff = treff + 1
print(treff / forsok)

a

Forklar hva programmet anslår.

b

Differansen D=A−BD = A - B er normalfordelt med μD=82−80\mu_D = 82 - 80 og σD=42+52\sigma_D = \sqrt{4^2 + 5^2}. Regn ut P(D>0)P(D > 0) og sammenlikn.

Løs oppgaven
📝Oppgave 5

Endre programmet i eksempelet med terningkast slik at det anslår sannsynligheten for minst tre seksere i 10 kast.

a

Skriv den linja som må endres, og sammenlikn med teorien.

Løs oppgaven

Oppsummering

Monte Carlo-simulering:
- Estimer P(A)≈antall ganger A inntrefferN\displaystyle P(A) \approx \frac{\text{antall ganger } A \text{ inntreffer}}{N}
- Standardfeil for en andel: SE=p(1−p)N≤0,5N\displaystyle \text{SE} = \sqrt{\frac{p(1-p)}{N}} \leq \frac{0{,}5}{\sqrt{N}}
- Typisk brukes N≥10 000N \geq 10\,000 for god presisjon

Store talls lov:
- Xˉn→μ\bar{X}_n \to \mu når n→∞n \to \infty
- Gjelder for alle fordelinger med endelig forventningsverdi
- Forklarer hvorfor simulering fungerer

Python-verktøy: random.random(), random.randint(), random.choice(), random.seed()

GeoGebra-verktøy: TilfeldigMellom(), Tilfeldig() og regnearket for simulering

Repetisjonsoppgaver
Din fremgang
0deloppgaver0 / 5 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.