====== - Solving Advanced Problems with Python LEGACY bis 2024 ======
**Idee & Ziele:**
* Verschiedene anspruchsvolle Probleme aus dem **mathematisch-naturwissenschaftlichen Bereich** mit Python lösen.
* Mit **Jupyter-Notebooks** arbeiten
===== Auftrag 1: Jupyter-Widgets & Markdown =====
1. Studiere das kurze Tutorial zu [[talit:python_advanced#jupyter_notebook|Jupyter Notebooks]] und **installiere beide Varianten**, also Jupyter im Browser und Jupyter in VSCode.
1. Lade das PDF mit dem [[talit:python_advanced#magic_cheat_sheet|Jupyter-Cheat Sheet]] herunter und verschaffe dir eine grobe Übersicht.
1. Lade das folgende Jupyter-Notebook herunter (zuerst entzippen) und arbeite es durch: {{ :talit:01_intro_widgets.ipynb.zip |}}
===== Auftrag 2: Einfache Differentialgleichungen (DGL) =====
1. Kurze Einführung in DGL
1. Lade das folgende Jupyter-Notebook herunter (zuerst entzippen) und arbeite es durch: {{ :talit:02_einfache_dgl.ipynb.zip |}}
===== Auftrag 3: Bewegungsgleichungen =====
TODO: Federpendel mitbringen
Unterlagen: {{ :talit:03_bewegungsgleichungen.ipynb.zip |}}
1. Selbständig Theorie zu Bewegungsgleichungen studieren (sca mit 2M beschäftigt am Anfang)
1. Aufgaben lösen
1. Besprechung mit sca:
1. Fragen zu Auftrag 2?
1. Physik & Mathe hinter Bewegungsgleichung besprechen, Experimente anschauen
===== Auftrag 4: Eigener DGL-Solver =====
Unterlagen: {{ :talit:04_eigener_dgl_solver.ipynb.zip |}}
1. Kurzer Input zu DGL-Solvern
1. Auftrag lösen
1. Fragen zu Auftrag 3?
===== Auftrag 5: Game of Life =====
==== Version 1 ====
* Studiere nur [[https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens#Die_Spielregeln|Spielregeln]]
* Implementiere das Game of Life mit Python (normal oder Jupyter)
* Wie du es visualisierst, ist dir überlassen: Konsole, PyGame, PyQt, Jupyter, ...
* Programmiere **ganz alleine** (keine Inspiration von Google, weiter unten auf Wiki, ...)
==== Version 2 ====
++++Rückmeldung Codes HS 2023 Gruppe I|
* abgegebene Codes gut bis sehr gut für 1. Version
* einige bereits zumindest teilweise objektorientiert
* meist Modell und View noch nicht sauber getrennt
* typische Fehler / Probleme / Limitationen:
* endliche Welt: Zellen können ausserhalb des angezeigten Bereichs nicht existieren
* Code sehr ineffizient, da auch alle toten Zellen gespeichert. Beispiel: 100x100 Grid -> 10'000 Zellen, die updated werden müssen in jedem Schritt
* Code etw. chaotisch: Ordne Code sauber (Konstanten, Klassen, Funktionen, ...)
* Kommentare meist zu spärlich
++++
++++Vorgaben Version v02|
* Mache eine Kopie von v01 oder starte neu und gebe einen passenden Namen, z.B. `game_of_life_v02.py` (manchmal einfacher: neues File, dann Code Stück für Stück hinein kopieren)
* Modell überarbeiten / neu schreiben (View von v01 übernehmen)
* muss **komplett objektorientiert** sein (siehe unten empfohlene Klassen)
* **unendlich grosse Welt:** Zellen können ausserhalb des auf Bildschirm angezeigten Bereichs leben
* speichere nur die lebendigen Zellen, die toten werden aus Liste entfernt
* **Model und View komplett getrennt**.
* Bitte ausreichend **Kommentieren**
++++
++++Theorie Model vs. View|
* Ist ein **Programmierparadigma** ("Programmier-Philosophie")
* **Model:** Abbildung des Game-States im Code (Objekte, Listen, ...)
* **View:** Anzeige des Game-States (z.B. Console-View, PyGame, ...)
* Die beiden sollten *strikt getrennt sein*
* Vorteil: Kann Modell 1x programmieren und dann in verschiedenen Views verwenden, z.B. Console-App, PyGame, Webgame, ...
++++
++++Empfohlene Klassen|
# MODELL
"""
Die ersten beiden Klassen bilden das Modell und haben nichts mit der Darstellung zu tun.
Deshalb dürfen diese KEINE print, PyGame usw. Befehle beinhalten.
"""
class World:
"""
Create only one object of this class.
Contains list with all cells that are alive, updated them, ...
"""
def __init__(self,...):
self.cells = [] # saves all cells that are ALIVE
...
def update(self):
pass
....
class Cell:
"""
describes a single cell
"""
def __init__(self,...):
self.x = ... # x coordinate
self.y = ... # y coordinate
self.is_alive = ... # is currently alive
self.stays_alive = ... # will still be alive in next round
self.neighbours = []
....
# VIEW
"""
Die Klasse(n) hier ist für die Darstellung zuständig.
"""
class ConsoleApp: # or PygameApp
pass
# EXECUTE PROGRAM
"""
Könnte etwa wie folgt aussehen:
"""
if __name__ == "__main__":
world = World("static 1") # erstelle Welt mit vordefiniertem Preset, weitere Möglichkeiten: "glider 1", "random", ...
console_app = ConsoleApp(world) # erstelle eine Console App (oder PyGame, ...)
console_app.animate() # führe aus
++++
==== Version 3 ====
**Vorgaben:**
* Basierend auf v02 (alles OOP, strikte Trennung von Modell und Logik)
* Verwende Python-Bibliothek für GUI wie PyGame, PyQT, ... (Konsole reicht nicht!)
* sehr ansprechende Grafik
* verschiedene Buttons für versch. Startbedingungen:
* random mit einstellbarer Wahrscheinlichkeit (z.B. Slider)
* einige coole Objekte (Glider, Kanonen, ... siehe hier für Inspiration [[https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens#Gleiterkanonen]])
==== Version 4 ====
* Web-Version mit Flask
* Verwende Model von letzter Version