8.1 SIMULATIONEN

 

 

EINFÜHRUNG

 

In der Forschung und Industrie, aber auch in der Finanzwelt spielen Computersimulationen eine wichtige Rolle. Dabei wird das Verhalten eines realen Systems mit Hilfe eines Computers nachgebildet. Computersimulationen haben gegenüber realen Experimenten und Untersuchungen den Vorteil, dass sie kostengünstig und umweltschonend durchführbar, sowie ungefährlich sind. Allerdings können sie die Wirklichkeit meist nie exakt wiedergeben. Die Gründe dafür sind vielfältig:

  • die Wirklichkeit kann wegen Messfehlern nie exakt in Zahlen gefasst werden (ausser bei Abzählungen)

  • das Zusammenwirken der Komponenten ist oft nicht exakt bekannt, da die zu Grunde liegenden Gesetze nicht exakt sind [mehr... Die meisten Naturgesetze liefern wegen Quantenphänomenen sowieso
    nur statistische Aussagen
    ] oder nicht alle Einflüsse berücksichtigt werden [mehr... Die Anzahl der beteiligten Komponenten kann bei Vielteilchensystemen in der Grössenordnung von 1023 liegen ]

Immerhin werden Computersimulationen mit steigender Rechenleistung der Computer immer präziser, man denke etwa an die Wetterprognosen für die nächsten Tage.

Der Zufall spielt in unserem Leben eine ausserordentlich grosse Rolle, denn viele Entscheide fällen wir nicht auf Grund rein logischer Argumente, sondern durch eine intuitive Abschätzung von Wahrscheinlichkeiten. Die Verwendung des Zufalls kann aber auch Probleme mit exakten Lösungen stark vereinfachen. So ist es beispielsweise sehr zeitaufwendig, auf einer Strassenkarte mit vielen Verbindungsmöglichkeiten den kürzesten Weg von A nach B mit einem Algorithmus exakt zu bestimmen; für die Praxis genügend ist es, den mit grosser Wahrscheinlichkeit kürzesten Weg zu finden [mehr... Es handelt sich um randomisierte Algorithmen, ein aktuelles Forschungsgebiet von grosser Bedeutung]

PROGRAMMIERKONZEPTE:Computersimulation, Computerexperiment, Statistische Schwankungen

 

 

DER COMPUTER ALS SPIELPARTNER

 

Deine Kameradin Nora schlägt dir folgendes Spiel vor: "Du darfst drei Würfel werfen. Treten dabei Sechser auf, so hast du gewonnen und ich gebe dir eine Murmel. Wenn keine Sechser vorkommen, habe ich gewonnen und du gibst mir eine Murmel".

Auf den ersten Blick scheint dir das Spiel fair zu sein, denn du überlegst rasch, dass für jeden Würfel die Wahrscheinlichkeit eines Sechser 1/6 beträgt, also die Wahrscheinlichkeit, im ersten ersten, zweiten oder dritten Wurf eine  Sechs zu haben 1/6 + 1/6 + 1/6 = 1/2 ist.

 

Mit dem Computer und deinen Programmierkenntnissen kannst du diese Überlegung nachprüfen. Dabei gehst du davon aus, dass es gleichgültig ist, ob du die 3 Würfe hintereinander oder miteinander machst oder anders gesagt, dass die Wahrscheinlichkeit, mit einem Würfel eine bestimmte Zahl zu erhalten, unabhängig von den anderen Würfeln immer 1/6 ist.

Es gibt zwei Möglichkeiten das Problem anzupacken, entweder statistisch oder kombinatorisch. Die statistische Lösung entspricht dem realen Spiel. Du simulierst das Werfen der Würfel, indem du im Programm oftmals 3 Zufallszahlen zwischen 1 und 6 erzeugst und die Gewinnfälle zählst.

from random import randint

n = 1000 # number of games
won = 0
repeat n:
    a = randint(1, 6)
    b = randint(1, 6)
    c = randint(1, 6)
    if a == 6 or b == 6 or c == 6:
        won += 1
 
print("Won:", won, " of ", n, "games")
print("My winning percentage:", won / n)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Es ergibt sich eine Gewinnwahrscheinlichkeit von ungefähr 0.42 und nicht 0.5, wie du vermutet hast. Der Wert ändert aber von Simulation zu Simulation leicht, denn er ist statistischen Schwankungen unterworfen. Wie du intuitiv vermutest, ist das Resultat umso genauer, je mehr Versuche du machst.

Die statistischen Schwankungen sind bei Computersimulationen von grosser Wichtigkeit.

Um sie zu untersuchen,  führst du den Versuch mit gewollt wenig Spielen (sagen wir 100) oftmals durch (sagen wir 10000 mal) und zeichnest ein Häufigkeitsdiagramm der gewonnenen Spiele. Es ergibt sich eine interessante, für die Statistik typische, glockenförmige Verteilung.

Im Programm verwendest du ein GPanel als Grafikfenster. Du kannst mit drawGrid() auch ein Koordinatengitter anzeigen. Einen einzelnen Hunderter-Versuch führst du mit der Funktion sim() aus, welche die Zahl der gewonnenen Spiele zurückgibt, deren Schwankung du untersuchen willst.

 

from gpanel import *
from random import randint

z = 10000
n = 100 

def sim():
    won = 0
    repeat n:
        a = randint(1, 6)
        b = randint(1, 6)
        c = randint(1, 6)
        if a == 6 or b == 6 or c == 6:
            won += 1
    return won

makeGPanel(-10, 110, -100, 1100)
drawGrid(0, 100, 0, 1000)
h = [0] * (n + 1)
title("Simulation started. Please wait...")
repeat z:
    x = sim()
    h[x] += 1
title("Simulation ended")

lineWidth(2)
setColor("blue")
for x in range(n + 1):
    line(x, 0, x, h[x])
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Das Maximum der Verteilung liegt bei etwa 42, da ja die Wahrscheinlichkeit zu gewinnen etwa 0.42 ist und man 100 Spiele macht. Spielst du mit Nora 100 Mal, so kann es trotz deiner Gewinnchance von nur 0.42 durchaus sein, dass du in über 50 Fällen das Spiel gewinnst. Die Wahrscheinlichkeit dafür ist aber gering (ca. 5 %)  und darum ist das Spiel nicht fair.

Computerexperimente mit Zufallszahlen unterliegen statistischen Schwankungen, die umso kleiner werden, je grösser die Anzahl der Versuche ist.

 

 

Für die kombinatorische Lösung lässt du den Computer alle möglichen Würfe mit 3 Würfeln ausführen. Der erste Wurf kann die Zahlen 1 bis 6 ergeben, ebenfalls der zweite und der dritte. In der geschachtelten for-Schleife bildest du also alle Zahlentripel und zählst mit der Variablen moegliche alle Möglichkeiten und mit der Variablen guenstige solche, die mindestens eine 6 enthalten, bei denen du also gewinnst.

possible = 0
favorable = 0
for i in range(1, 7):
    for j in range(1, 7):
        for k in range(1, 7):
            possible += 1
            if i == 6 or j == 6 or k == 6:
                favorable += 1
print("favorable:", favorable, "possible:", possible)
print("My winning percentage:", favorable / possible)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Es ergeben sich 91 günstige von 216 möglichen Fällen und damt eine Gewinnwahrscheinlichkeit w = guenstige / moegliche von 91/216 = 0.42. Diesen Wert hast du auch mit der Computersimulation erhalten.

 

ZUSATZSTOFF

Du kannst natürlich die Aufgabe auch ganz ohne Computer lösen. Dazu überlegst du Folgendes: Es gibt für den Gewinn drei Ereignisse E1, E2, E3:

E1: Beim ersten Wurf eine 6 werfen. Wahrscheinlichkeit: 1/6
E2: Beim ersten Wurf keine 6, aber im 2. Wurf eine 6 zu werfen.
Wahrscheinlichkeit: 5 /6 * 1/6
E3:

Beim ersten und zweiten Wurf keine 6, aber im 3. Wurf eine 6 zu werfen.
Wahrscheinlichkeit: 5/6 * 5 /6 * 1/6

Da E1, E2 und E3 unabhängig sind, ist die Wahrscheinlichkeit die Summe, also 1 /6 + 5 /36 + 25 /216 = 91/216 = 0.421296.

Du kannst den Prozess baumartig darstellen:

Für die Lösung gibt es auch noch einen Königsweg: Die Wahrscheinlichkeit, in den drei Würfen keine 6 zu werfen ist p = 5/6 * 5/6 * 5/6 = 125/216. Die gesuchte Wahrscheinlichkeit also w = 1 - p =  91/216.

 

 

AUFGABEN

 
1.

Der Herzog Ferdinando de Medici von Florenz stellte um 1600 fest, dass man beim Werfen von drei Würfeln die Augensumme 9 und 10 mit einer gleich grossen Zahl von Würfelaugen erhalten kann:

Augensumme 9 Augensumme 10
1 + 2 + 6 1 + 3 + 6
1 + 3 + 5 1 + 4 + 5
1 + 4 + 4 2 + 2 + 6
2 + 2 + 5 2 + 3 + 5
2 + 3 + 4 2 + 4 + 4
3 + 3 + 3 3 + 3 + 4

Der Herzog stellte aber fest, dass beim Dreierwurf die Augensummen 9 und 10 nicht gleichwahrscheinlich sind und fragte den Mathematikprofessor Galileo Galilei um Rat. Berechne diese Wahrscheinlichkeiten mit einer Computersimulation
a. statistisch
b. kombinatorisch

2.

Bestimme mit einer statistischen Computersimulation die Wahrscheinlichkeit, dass in einer Klasse mit 20 Kindern (mindestens) zwei Kinder am gleichen Tag Geburtstag haben (keine Schaltjahre).

3.

Der Chevalier de Méré befragte um 1650 in Paris den Mathematiker Blaise Pascal nach den Gewinnchancen der beiden folgenden Ereignisse:
a. beim 4-maligen Würfeln mindestens eine Sechs werfen
b. beim 24-maligen Würfeln mit jeweils 2 Würfeln mindestens eine Doppelsechs werfen.
Er war der Meinung, dass die Gewinnchancen gleich seien, denn bei b) ist zwar die Gewinnwahrscheinlichkeit bei einem Einzelwurf 6 mal so klein, dafür wird der Versuch aber 6 mal so oft wiederholt. Hat er recht?

4*.

Bestimme im Spiel mit Nora, wie gross die Wahrscheinlichkeit ist, dass du bei einem Hunderterspiel in mehr als 50 Fällen gewinnst.