4.5 Simulering og stokastiske eksperimenter
Monte Carlo-simulering, Python og GeoGebra, store talls lov.
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 ()
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
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
- random.randint(a, b) gir et tilfeldig heltall mellom og (inklusiv)
- random.choice(liste) velger et tilfeldig element fra en liste
GeoGebra-kommandoer:
- TilfeldigMellom(a, b) genererer tilfeldig heltall i
- Tilfeldig() gir uniformt tilfeldig tall i
For reproduserbare resultater kan man sette seed med random.seed(42) i Python.
Mer presist: La være uavhengige stokastiske variabler med samme fordeling og forventningsverdi . Da gjelder:
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
Standardfeil for en simulert andel:
For er standardfeilen høyst 0,005. For er den høyst 0,0005. Standardfeilen er proporsjonal med : 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.
Bruk Monte Carlo-simulering til å estimere arealet av en sirkel med radius 1 ved å bruke tilfeldige punkter i kvadratet .
Dermed er .
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:
Svar: . Avviket fra er , godt innenfor standardfeilen . En ny kjøring gir et litt annet tall.
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 etter noen tusen kast. Svingningene avtar i takt med - dette er store talls lov i praksis.
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
Standardavviket til en andel fra 100 000 forsøk er omtrent .
, under to standardavvik.
Svar: Simuleringen gir omtrent , og teorien gir . Avviket er tilfeldig variasjon.
Høyden til voksne menn i en gruppe er normalfordelt med cm og 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
Svar: Simuleringen gir og normalfordelingen . random.gauss(170, 8) trekker et tall fra normalfordelingen med og .
Løs oppgavene:
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.
Forklar hva som menes med pseudotilfeldige tall og hvorfor de er tilfredsstillende for praktisk bruk i statistikk.
Løs oppgavene:
I en gruppe på 30 personer, hva er sannsynligheten for at minst to har bursdag på samme dag? Estimer svaret med Monte Carlo-simulering ( gjentagelser). (Anta 365 dager per år.)
Kjøres simuleringen med gjentagelser versus gjentagelser, hva forventer du å se? Hva sier store talls lov om forskjellen i nøyaktighet?
Løs oppgavene:
To terninger kastes og produktet beregnes. Bruk simulering () til å estimere og .
Bruk Python til å tegne et histogram over fordelingen til basert på 100 000 simuleringer. Beskriv formen på fordelingen. Er den symmetrisk?
Forklar sammenhengen mellom store talls lov og sentralgrensesetningen. Hva sier sentralgrensesetningen om fordelingen til for store ?
To skihoppere hopper hvert sitt hopp. Lengdene er normalfordelte og uavhengige: Anna hopper i snitt m med m, og Bea i snitt m med 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)Forklar hva programmet anslår.
Differansen er normalfordelt med og . Regn ut og sammenlikn.
Endre programmet i eksempelet med terningkast slik at det anslår sannsynligheten for minst tre seksere i 10 kast.
Skriv den linja som må endres, og sammenlikn med teorien.
Oppsummering
Monte Carlo-simulering:
- Estimer
- Standardfeil for en andel:
- Typisk brukes for god presisjon
Store talls lov:
- når
- 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
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.