====== - 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