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 13:33] – [Komplexe Zahlen] scatalit:python_advanced_problems [2025-10-20 11:14] (aktuell) sca
Zeile 443: Zeile 443:
 $$= 8 - 10i + 12i - 15i^2 = 8 + 2i + 15 = 23 + 2i$$ $$= 8 - 10i + 12i - 15i^2 = 8 + 2i + 15 = 23 + 2i$$
  
-Komplexe Zahlen kann man einfach **graphisch darstellen**. Die folgende Darstellung stellt die Zahlen $1 = 1 + 0i$, so wie+Komplexe Zahlen kann man einfach **graphisch darstellen**: Man stellt den Realteil auf der $x-$ und den Imaginärteil auf der $y-$Achse darDamit kann man jede komplexe Zahl als Punkt in der $2$D-Ebene darstellen. Als Beispiel stellt die folgende Darstellung die Zahlen $1 = 1 + 0i$, so wie $-\frac{1}{2} + \frac{\sqrt{3}}{2}\,i$ und $-\frac{1}{2} - \frac{\sqrt{3}}{2}\,i$ in der **komplexen Zahlenebene** dar:
  
 {{ :gf_math_sca:complex_z_3-1.png?400 |}} {{ :gf_math_sca:complex_z_3-1.png?400 |}}
  
-Das folgende Code-Beispiel zeigt, wie man in Python mit komplexen Zahlen arbeiten kann.+Das folgende Code-Beispiel zeigt, wie man mit **komplexe Zahlen in Python** arbeiten kann:
 <code python> <code python>
 z = 2 + 3j z = 2 + 3j
Zeile 456: Zeile 456:
 print(z * w) print(z * w)
 </code> </code>
 +
  
 ==== Mandelbrot Menge ==== ==== Mandelbrot Menge ====
Zeile 469: 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 477: 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.
  
-==== Julia Mengen ====+**Beispiel: Code für Visualisierung**
  
-Ein weiteres bekanntes Beispiel für Fraktale sind die **Julia-Mengen**:+<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 ==== 
 + 
 +Ein weiteres bekanntes Beispiel für Fraktale sind **Newton-Fraktale**:
  
 {{ :talit:julia_z_3-1.png?400 |}} {{ :talit:julia_z_3-1.png?400 |}}
Zeile 497: Zeile 533:
 z_3 = -\frac{1}{2} - \frac{\sqrt{3}}{2}\,i. z_3 = -\frac{1}{2} - \frac{\sqrt{3}}{2}\,i.
 $$ $$
 +
 +{{ :gf_math_sca:complex_z_3-1.png?400 |}}
  
 Daher kann man die Polynomgleichung wie folgt faktorisieren: Daher kann man die Polynomgleichung wie folgt faktorisieren:
Zeile 506: Zeile 544:
 $$ $$
 $$ $$
-\big(z - 1\big)\cdot \bigg(z - \Big(-\tfrac{1}{2} + \tfrac{\sqrt{3}}{2}\,i\Big)\bigg)\cdot \bigg(z - \Big(-\tfrac{1}{2} - \tfrac{\sqrt{3}}{2}\,i\Big)\bigg= 0.+\bigg[z - 1\bigg]\cdot \bigg[z - \Big(-\tfrac{1}{2} + \tfrac{\sqrt{3}}{2}\,i\Big)\bigg]\cdot \bigg[z - \Big(-\tfrac{1}{2} - \tfrac{\sqrt{3}}{2}\,i\Big)\bigg= 0.
 $$ $$
  
-{{ :gf_math_sca:complex_z_3-1.png?400 |}}+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.1760708028.txt.gz
  • Zuletzt geändert: 2025-10-17 13:33
  • von sca