Jython

13. Simulationen

Die Koordinatengrafik eignet sich hervorragend für die Visualisierung von Simulationen. Zusätzlich können mit Python die simulierten Daten einfach rechnerisch ausgewertet werden.

Beispiel 1: Mittlere Wartezeit beim Würfelspiel
Man wirft einen Würfel. Wir stellen uns die Frage, wie oft muss man im Mittel würfeln, bis eine bestimmte Zahl, z.B. eine 6 vorkommt. Stellt man sich vor, dass jeder Wurf gleich viel Zeit benötigt, so handelt es sich um die Frage nach der mittleren Wartezeit.

Statt mathematisch vorzugehen, simuliert man das Würfeln mit Zufallszahlen 1, 2, 3, ...6 und wiederholt dieses Experiment, bis die Zahl 6 vorkommt. Die Zahl der benötigen Versuche wird in der Variablen k gespeichert. Man wiederholt das Experiment 10000 mal und stellt die Häufigkeiten in einem Häufigkeitsdiagramm dar. Gleichzeitig bildet man die Summe von k, damit man am Schluss die mittlere Wartezeit berechnen kann. Diese wird im Titel angezeigt.

# Gp13a.py
from gpanel import *
from random import randint
n = 10000

def sim():
    k = 1
    r = randint(1, 6)
    while r != 6:
        r = randint(1, 6)
        k += 1
    return k

makeGPanel(-5, 55, -200, 2200)
drawGrid(0, 50, 0, 2000)
title("Waiting on a 6")
setColor("blue")
h = [0] * 51
lineWidth(5)
count = 0
repeat n:
    k = sim()
    print k
    count += k
    if k <= 50:
        h[k] += 1
        line(k, 0, k, h[k])
mean = count / n
title("Mean waiting time = " + str(mean))
► In Zwischenablage kopieren
 



Erklärungen zum Programmcode:

sim(): Gibt die Anzahl Würfe zurück, bis die Zahl 6 vorkommt
h = [0] * 51: Erstellt eine Liste mit 51 Nullen


Beispiel 2: Berechnung des Zahl PI mit der Monte-Carlo-Methode
Es handelt sich um ein klassisches Beispiel einer Computersimulation. Auf ein Quadrat mit der Seitenlänge 1 wird eine grosse Zahl n Zufallspunkte geworfen. Der Anteil der Punkte  innerhalb des Viertelkreises entspricht offensichtlich ungefähr seinem Flächenanteil.

Wirft man also n Punkte und befinden sich die Zahl hits innerhalb des Viertelkreises, so gilt

hits / n = Viertelkreisfläche / Quadratfläche

Mit einem GPanel lässt sich die Aufgabe grafisch und rechnerisch lösen.

# Gp13b.py
from gpanel import *
from random import random

makeGPanel(-0.3, 1.3, -0.3, 1.3)
rectangle(0, 0, 1, 1)
arc(1, 0, 90)
hits = 0
n = input("Number of rain drops")
i = 0
while i < n:
   x = random()
   y = random()
   if x*x + y*y < 1:
     hits = hits + 1
     setColor("red")
   else:
     setColor("green")  
   i = i + 1
   point(x, y)
pi = 4 * hits / n
title("Result: pi = " + str(pi))
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

n = input(): Die gewünschte Anzahl Zufallspunkte kann in einem Inputdialog eingegeben werden
pi = 4 * hits/n: Die Fläche des Viertelreises mit dem Radius 1 ist pi/4, die Fläche des Quadrats ist 1. Also ist hits/n = pi/4 oder pi = 4 * hits / n



Beispiel 3: Simulation eines senkrechten Wurfs
Mit der Beschleunigung a ist in einem kleinen Zeitintervall dt die neue Geschwindigkeit  vneu = v + a * dt und der neue Ort xneu = x + v * dt. Hier ist die Beschleunigung a = -g.  Der neue Zustand wird alle 0.05 Sekunden berechnet.

# Gp13c.py
from gpanel import *
import time

makeGPanel(-6, 6, -220, 70)
setColor("red")
enableRepaint(False)

g = 9.81
dt= 0.05

t = 0; y = 0
v = 25 

while t < 10: 
    v = v - g * dt 
    y = y + v * dt 
    t = t + dt
    drawGrid(-5, 5, -200, 50, "gray")
    pos(0, y)  
    fillCircle(0.3)
    repaint()  
    time.sleep(dt)
    clear()   
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

enableRepaint(False): Es handelt sich um einen Animation. Um das Flackern zu vermeiden, wird das automatische Rendering abgeschaltet

 


Aufgaben: Serie 13

1)


Drei Würfel werden gleichzeitig geworfen, wobei s ist die Summe der Augenzahlen ist. Simuliere dieses Experiment 10'000 mal und erstelle ein Häufigkeitsdiagramm für s.

 


2)


Man stellt sich die Frage, wie oft man im Mittel würfeln muss, um alle Würfelzahlen 1, 2, 3, 4, 5, 6 mindestens einmal zu erhalten.
Löse die Frage mit einer Simulation.