Tilbake
4.5

4.5 Simulering og stokastiske eksperimenter

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

50 min
8 oppgaver
Monte CarloSimuleringPythonStore talls lov
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 8 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˚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 estimat: SE(p^)1N\displaystyle \text{SE}(\hat{p}) \approx \frac{1}{\sqrt{N}}

For N=10000N = 10\,000 er standardfeilen ca. 0,01. For N=1000000N = 1\,000\,000 er den ca. 0,001.

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+y21x^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 π4p^\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(f"Estimert pi = {pi_estimat:.5f}")
print(f"Eksakt pi   = {3.14159:.5f}")

Kjøring gir for eksempel: π^3,14152\hat{\pi} \approx 3{,}14152

Standardfeilen er 1106=0,001\displaystyle \approx \frac{1}{\sqrt{10^6}} = 0{,}001, som stemmer med avviket fra eksakt π\pi.

✏️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):
    kast = random.randint(0, 1)  # 0 = mynt, 1 = kron
    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.

📝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=50000N = 50\,000 gjentagelser). (Anta 365 dager per år.)

b

Kjøres simuleringen med N=100N = 100 gjentagelser versus N=100000N = 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=X1X2P = X_1 \cdot X_2 beregnes. Bruk simulering (N=100000N = 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 sentral grenseverdisetningen. Hva sier sentral grenseverdisetningen om fordelingen til Xˉn\bar{X}_n for store nn?

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 estimatet: SE1N\displaystyle \text{SE} \approx \frac{1}{\sqrt{N}}
- Typisk brukes N10000N \geq 10\,000 for god presisjon

Store talls lov:
- Xˉnμ\bar{X}_n \to \mu når nn \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.