4.5

4.5 Simulering og stokastiske eksperiment

Monte Carlo-simulering, Python og GeoGebra, lova om store tal.

50 min
10 oppgaver
Monte CarloSimuleringPythonLova om store tal
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 10 oppgaver
Kapitlets plass i kurset

Simulering og Monte Carlo-metoden

Mange sannsynsproblem er vanskelege eller umoglege å løyse analytisk. I slike tilfelle kan vi bruke simulering - å gjenta eit tilfeldig forsøk mange gonger på ei datamaskin og telje utfall.

Monte Carlo-simulering er ein metode der vi:
1. Definerer ein modell for det stokastiske forsøket
2. Genererer tilfeldige tal for å simulere forsøket
3. Gjentek forsøket eit stort tal gonger (NN)
4. Bruker dei observerte frekvensane som estimat for sannsyn

Namnet kjem frå kasinoet i Monte Carlo, fordi metoden byggjer på tilfeldigheit - akkurat som eit kasino.

Kvifor simulering?
- Nokre problem er for kompliserte til å løyse eksakt
- Simulering gir ei intuitiv forståing av sannsyn
- Digitale verktøy gjer det enkelt å køyre tusenvis av forsøk
- Resultata kan brukast til å kontrollere analytiske berekningar

Tilfeldige tal og pseudotilfeldigheit

Eit tilfeldig tal er eit tal som er generert av ein tilfeldig prosess, der kvart tal i eit gitt intervall er like sannsynleg.

I praksis bruker datamaskiner pseudotilfeldige talgeneratorar (PRNG) - algoritmar som produserer talsekvensar som ser ut som tilfeldige, men som eigentleg er deterministiske (avgjorde av ein startverdi kalla «seed»).

Vanlege funksjonar i Python:
- random.random() gir eit uniformt tilfeldig tal i [0,1)[0, 1)
- random.randint(a, b) gir eit tilfeldig heiltal mellom aa og bb (inklusiv)
- random.choice(liste) vel eit tilfeldig element frå ei liste

GeoGebra-kommandoar:
- TilfeldigMellom(a, b) genererer tilfeldig heiltal i [a,b][a, b]
- Tilfeldig() gir uniformt tilfeldig tal i [0,1)[0, 1)

For reproduserbare resultat kan ein setje seed med random.seed(42) i Python.

📜Store tals lov
Store tals lov seier at gjennomsnittet av observasjonane i eit forsøk vil nærme seg forventningsverdien når talet på forsøk aukar.

Meir presist: La X1,X2,…,XnX_1, X_2, \ldots, X_n vere uavhengige stokastiske variablar med same fordeling og forventningsverdi μ\mu. Då gjeld:

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 tyder dette:
- Den relative frekvensen av ei hending nærmar seg det teoretiske sannsynet
- Gjennomsnittleg gevinst i eit spel nærmar seg forventningsverdien
- Estimata frå simulering blir betre (med lågare standardfeil) for større nn

Standardfeil for ein simulert del: 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øgst 0,005. For N=1 000 000N = 1\,000\,000 er han høgst 0,0005. Standardfeilen er proporsjonal med 1N\displaystyle \frac{1}{\sqrt{N}}: 100 gonger fleire forsøk gir 10 gonger mindre standardfeil.

Åtvaring: Store tals lov seier ikkje at det vil «jamne seg ut» på kort sikt (gamblarfeilslutninga). Kvart einskild forsøk er framleis heilt tilfeldig.

✏️Monte Carlo-simulering i Python

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

Metoden: Eit tilfeldig punkt (x,y)(x, y) i kvadratet med sidelengd 2 er innanfor 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}"
)

Ei køyring gav: π^≈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 frå π\pi er 0,00040{,}0004, godt innanfor standardfeilen 0,00160{,}0016. Ei ny køyring gir eit litt anna tal.

✏️Store tals lov illustrert ved myntkast

Simuler 5000 myntkast og vis grafisk korleis delen kron nærmar seg 0,5. Forklar kva grafen illustrerer om konvergensen av estimat.

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

Tolking: Grafen viser at delen kron svingar mykje i starten (stor usikkerheit for få kast), men gradvis stabiliserer seg rundt 0,50{,}5 etter nokre tusen kast. Svingingane avtek i takt med 1n\displaystyle \frac{1}{\sqrt{n}} - dette er store tals lov i praksis.

✏️Simulere ei binomisk fordeling

Ein terning blir kasta 10 gonger. Bruk simulering til å anslå sannsynet for nøyaktig to seksarar, og samanlikn med den binomiske fordelinga.

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 ein del frå 100 000 forsøk er om lag 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: Simuleringa gir om lag 0,2880{,}288, og teorien gir 0,29070{,}2907. Avviket er tilfeldig variasjon.

✏️Simulere normalfordelte utfall

Høgda til vaksne menn i ei gruppe er normalfordelt med μ=170\mu = 170 cm og σ=8\sigma = 8 cm. Bruk simulering til å anslå sannsynet for at ein tilfeldig vald mann er over 185 cm, og samanlikn med normalfordelinga.

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: Simuleringa gir 0,03030{,}0303 og normalfordelinga 0,03040{,}0304. random.gauss(170, 8) trekkjer eit tal frå normalfordelinga med μ=170\mu = 170 og σ=8\sigma = 8.

📝Oppgave 1

Løys oppgåvene:

a

Skriv eit Python-program som simulerer 10 000 kast med ein vanleg seksidig terning og estimerer sannsynet for å få 6. Samanlikn med den teoretiske verdien.

b

Forklar kva som blir meint med pseudotilfeldige tal og kvifor dei er tilfredsstillande for praktisk bruk i statistikk.

📝Oppgave 2

Løys oppgåvene:

a

I ei gruppe på 30 personar, kva er sannsynet for at minst to har bursdag på same dag? Estimer svaret med Monte Carlo-simulering (N=50 000N = 50\,000 gjentakingar). (Anta 365 dagar per år.)

b

Blir simuleringa køyrt med N=100N = 100 gjentakingar versus N=100 000N = 100\,000 gjentakingar, kva ventar du å sjå? Kva seier store tals lov om skilnaden i nøyaktigheit?

📝Oppgave 3

Løys oppgåvene:

a

To terningar blir kasta og produktet P=X1⋅X2P = X_1 \cdot X_2 blir rekna ut. Bruk simulering (N=100 000N = 100\,000) til å estimere E(P)E(P) og Var(P)\text{Var}(P).

b

Bruk Python til å teikne eit histogram over fordelinga til PP basert på 100 000 simuleringar. Skildr forma på fordelinga. Er ho symmetrisk?

c

Forklar samanhengen mellom store tals lov og sentralgrensesetninga. Kva seier sentralgrensesetninga om fordelinga til Xˉn\bar{X}_n for store nn?

📝Oppgave 4

To skihopparar hoppar kvart sitt hopp. Lengdene er normalfordelte og uavhengige: Anna hoppar 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 kva 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}. Rekn ut P(D>0)P(D > 0) og samanlikn.

Løs oppgaven
📝Oppgave 5

Endre programmet i dømet med terningkast slik at det anslår sannsynet for minst tre seksarar i 10 kast.

a

Skriv den linja som må endrast, og samanlikn med teorien.

Løs oppgaven

Oppsummering

Monte Carlo-simulering:
- Estimer P(A)≈talet pa˚ gonger A inntreffN\displaystyle P(A) \approx \frac{\text{talet på gonger } A \text{ inntreff}}{N}
- Standardfeil for ein del: SE=p(1−p)N≤0,5N\displaystyle \text{SE} = \sqrt{\frac{p(1-p)}{N}} \leq \frac{0{,}5}{\sqrt{N}}
- Typisk blir N≥10 000N \geq 10\,000 brukt for god presisjon

Store tals lov:
- Xˉn→μ\bar{X}_n \to \mu når n→∞n \to \infty
- Gjeld for alle fordelingar med endeleg forventningsverdi
- Forklarer kvifor simulering fungerer

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

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

Repetisjonsoppgåver
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.