Table of Contents

Wichtiges zur Projektarbeit der Klassen 2aLM und 2dNP

Ich habe versucht, einige wichtige Informationen zusammenzustellen. Bei Fragen oder Bemerkungen bitte direkt an mich wenden.

Allgemeines und Zeitplan

Themenwahl

Zeitmanagement

Ehrlichkeit

alias “Abschreiben verboten” alias (an der Uni) “wissenschaftlich korrektes Arbeiten”

Einige Punkte, auf die ich bei der Bewertung achte

Beispiel

Hier ist mein Projekt, für das ich mir eine 6 geben würde 8-) - eine ähnliche Simulation findet sich auf Wikipedia: Percolation.

# Autor: Olaf Schnürer
#
# Simulation eines Versickerungsprozesses (Perkolation).
#
# Zuerst erzeugen wir ein "poröses Gestein": In einem rechteckigen Raster 
# von Pixeln (= Bildpunkten, hier eigentlich kleinen Quadraten) werden Pixel 
# mit einer fixierten Wahrscheinlichkeit p dunkel gefärbt. Dunkle Pixel stehen 
# für wasserundurchlässigen Fels. Die restlichen Pixel stehen für Luft.
#
# Wir stellen uns vor, dass oberhalb des Gesteins beliebig viel Wasser vorhanden
# ist und simulieren, wie dieses in das Gestein eindringt (Luft kann dabei beliebig entweichen).
#
# Mögliche Anschlussfrage: Ab welcher Wahrscheinlichkeit erreicht
# das Wasser "meist" den Boden? Dazu könnte man (in einem neuen Programm)
# etwa für alle p zwischen 0.4 und 0.5 in Schritten von 0.01 jeweils 100 Simulationen
# laufen lassen (ohne grafische Ausgabe, damit es schneller geht) und 
# dann in einem "Balkendiagramm darstellen, wie oft der Boden bei welcher
# Wahrscheinlichkeit erreicht wird. (Monte-Carlo-Methode) 
 
from gpanel import *
from random import randint, random
 
# Abmessungen des Gesteins:
Xmax = 400
Ymax = 200
 
# Seitenlänge eines Quadrats in Bildschirm-Pixel 
skalierung = 4
 
# Wahrscheinlichkeit für Fels
p = 0.41
 
def zeichne_quadrat(x, y, farbe):
    setColor(farbe)
    fillRectangle(x * skalierung, y * skalierung, (x + 1) * skalierung, (y + 1) * skalierung)
    setColor("black")
    rectangle(x * skalierung, y * skalierung, (x + 1) * skalierung, (y + 1) * skalierung)
 
# Öffne Fenster und vereinbare Koordinaten.
makeGPanel(Size(Xmax * skalierung, Ymax * skalierung + 30))
window(0, Xmax * skalierung, -30, Ymax * skalierung)
 
# poröses Gestein wird zufällig erzeugt
# Der folgende Code verwendet, dass man beim Erzeugen von Listen 
# zusätzlich eine "if-(then-)else"-Abrage machen kann.
feld = [["gray" if random() < p else "white" for j in range(-1, Ymax + 1)] for i in range(-1, Xmax + 1)]
 
# Die folgenden beiden for-Schleifen erzeugen eine "bounding box"
# aus Fels. (Das erspart später das Abfragen, ob man gerade einen Punkt am Rand betrachtet.)
for i in range(-1, Xmax + 1):
    feld[i][-1] = "gray"
    feld[i][Ymax] = "gray"
 
for j in range(-1, Ymax + 1):
    feld[-1][j] = "gray"
    feld[Xmax][j] = "gray"
 
# Zeichne das poröse Gestein.
for i in range(0, Xmax):
    for j in range(0, Ymax):
        zeichne_quadrat(i, j, feld[i][j])
 
# getKeyCodeWait()
 
# Erstelle Start-Liste blauer Felder alias Wasser: 
# Alle "Luftfelder" in der obersten Zeile werden aufgenommen.
# Für jedes Wasserfeld werden seine Koordinaten gespeichert.
blaue_felder = []                
for i in range(0, Xmax):
    if feld[i][Ymax - 1] == "white":
        feld[i][Ymax - 1] = "blue"
        blaue_felder.append([i, Ymax - 1])        
#        zeichne_quadrat(i, Ymax - 1, "blue")
 
# print(blaue_felder)    
 
# Solange die Liste blauer Felder nicht leer ist,
# wird jeweils das erste blaue Feld betrachtet, eingefärbt und eventuelle Luftnachbarn
# werden hinten an die Liste drangehängt.
while len(blaue_felder) > 0:
    aktuell = blaue_felder.pop(0)
    x = aktuell[0]
    y = aktuell[1]
#    print(blaue_felder)
#    print(x, y)
    zeichne_quadrat(x, y, "blue")
    if (x > 0) and (feld[x-1][y] == "white"):
        feld[x-1][y] = "blue"
        blaue_felder.append([x-1, y])
    if (x < Xmax - 1) and (feld[x+1][y] == "white"):
        feld[x+1][y] = "blue"
        blaue_felder.append([x+1, y])
    if (y > 0) and (feld[x][y-1] == "white"):
        feld[x][y-1] = "blue"
        blaue_felder.append([x, y-1])
    if (y < Ymax - 1) and (feld[x][y+1] == "white"):
        feld[x][y+1] = "blue"
        blaue_felder.append([x, y+1])
# Folgende Zeile auskommentieren, wenn sich das Wasser schneller ausbreiten soll.
    delay(1)
#    getKeyCodeWait()
 
# Textausgabe
text(Xmax * skalierung/3, -20, "Zum Schliessen irgendeine Taste drücken.", Font("Courier", Font.PLAIN, 20), "white", "red")
 
# Warten, bis der Benutzer eine Taste drückt.                
getKeyCodeWait()
 
# Fenster schliessen.
dispose()        

Zur Kursseite