Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:python_advanced_problems [2025-10-17 18:58] scatalit:python_advanced_problems [2025-10-20 11:14] (aktuell) sca
Zeile 470: Zeile 470:
  
 Im Bild oben sind alle *schwarzen Punkte* diejenigen, die zur Mandelbrot-Menge gehören. Die farbigen gehören nicht dazu. Im Bild oben sind alle *schwarzen Punkte* diejenigen, die zur Mandelbrot-Menge gehören. Die farbigen gehören nicht dazu.
 +
 +**Umgang mit AI:**
 +
 +   * Der **Weg ist das Ziel**!
 +   * Es geht darum, dass du Fraktale wirklich verstehst ...
 +   * ... und diese Programmieren kannst.
 +   * Challenge:
 +     * Verwende keine AI.
 +     * Schalter WLAN aus, verwende nur um Module zu installieren.
  
 **Vorgehen:** **Vorgehen:**
Zeile 478: Zeile 487:
    1. Punkte, die den Schwellenwert nicht erreichen, gelten als Teil der Mandelbrot-Menge (meist schwarz).    1. Punkte, die den Schwellenwert nicht erreichen, gelten als Teil der Mandelbrot-Menge (meist schwarz).
    1. Speichere in einem **Array für jeden Pixelpunkt** also die Anzahl Schritte bis der Schwellenwert erreicht wird resp. $0$ falls der Punkt zur Mandelbrotmenge gehört.    1. Speichere in einem **Array für jeden Pixelpunkt** also die Anzahl Schritte bis der Schwellenwert erreicht wird resp. $0$ falls der Punkt zur Mandelbrotmenge gehört.
-   1. **Visualisiere** die Mandelbrot-Menge mit einer Colormap: Verschiedene Werte im Array werden durch verschiedene Zahlen dargestellt. Tipp: Wenn man die Werte verändert, indem man z.B. das ganze Array mit eine Zahl multipliziert oder eine Funktion auf dieses anwendet, so kann man die Darstellung verändern.+   1. **Visualisiere** die Mandelbrot-Menge mit einer Colormap: Verschiedene Werte im Array werden durch verschiedene Zahlen dargestellt. Tipp: Wenn man die Werte verändert, indem man z.B. das ganze Array mit eine Zahl multipliziert oder eine Funktion auf dieses anwendet, so kann man die Darstellung verändern. Siehe unten für ein Code-Beispiel.
    1. Da diese Berechnung für eine vernünftige Auflösung ziemlich lange geht, sollten die Berechnungen **parallelisiert** werden. Verwende dazu z.B. [[python_advanced#numba]]    1. Da diese Berechnung für eine vernünftige Auflösung ziemlich lange geht, sollten die Berechnungen **parallelisiert** werden. Verwende dazu z.B. [[python_advanced#numba]]
 +   1. (Optional) **Zoom:** Schreibe eine Animation, die immer weiter ins Fraktal hinein zoomt.
 +
 +**Beispiel: Code für Visualisierung**
 +
 +<code python>
 +import numpy as np
 +from PIL import Image
 +import matplotlib.pyplot as plt
 +
 +array_pixels = ... # ist numpy array, Wert für jedes Pixel
 +
 +img_fn = Image.fromarray(array_pixels)
 +
 +cm = "magma" # colormap
 +
 +plt.figure(figsize=(10,10))
 +plt.imshow(img_fn, cmap=cm) 
 +plt.axis("off")
 +plt.show()
 +
 +cmap_hot = plt.get_cmap(cm)
 +norm = plt.Normalize(vmin=array_pixels.min(), vmax=array_pixels.max())
 +rgba = (cmap_hot(norm(array_pixels)) * 255).astype(np.uint8)  # shape (H,W,4)
 +img = Image.fromarray(rgba, mode="RGBA")
 +img.save("file_name.png", format="PNG", compress_level=6)
 +</code>
  
 ==== Newton Fraktale ==== ==== Newton Fraktale ====
Zeile 512: Zeile 547:
 $$ $$
  
 +Doch wie findet man die Nullstellen von einem Polynom? Für quadratische Funktionen kann man die Mitternachtsformel verwenden, doch im allgemeinen gibt es keine Formel dafür. Stattdessen kann man das **Newton Verfahren** verwenden, um die Nullstellen einer Funktion $f(z)$ *numerisch* zu bestimmen:
 +
 +   1. Wähle einen Startwert $z\_0$.
 +   1. Wende die Formel folgende Formel mehrfach an:$$z\_{n+1} = z\_n - \frac{f(z\_n)}{f'(z\_n)}$$
 +   1. Je mehr Iterationen man macht, desto näher kommt man an die tatsächliche Lösung.
 +   1. Achtung: Die Lösung, die man damit findet, hängt vom gewählten Startwert ab. Möchte man alle Lösungen finden, muss man das Verfahren mehrfach anwenden für verschiedene Startwerte.
 +
 +Nun sind wir ready für Newton Fraktale! Vorgehen:
 +
 +   1. Wähle ein (komplexes) **Polynom**, z.B. $f(z) = z^3 - 1$
 +   1. Ermittle die **Nullstellen** des Polynoms, z.B. mit `numpy.roots()`
 +   1. Wähle einen **Bereich der komplexen Ebene** und rastere ihn (Pixel → $z$-Werte).
 +   1. Iteriere über jeden dieser Werte (Pixel). Verwende diesen Wert als **Startwert** im Newton-Verfahren. Dieses wird zu einer der Nullstellen führen. Speichere, wie viele Iterationsschritte notwendig sind, um genügend nahe an eine der Lösungen zu kommen.
 +   1. Färbe nun alle Pixel, die zur gleichen Nullstelle führen, mit der gleichen Farbe ein. Variiere den genauen Farbton entsprechend der Iterationsschritte, die notwendig waren.
 +   
  
  • talit/python_advanced_problems.1760727506.txt.gz
  • Zuletzt geändert: 2025-10-17 18:58
  • von sca