Solving Advanced Problems with Python

Idee & Ziele:

  • Verschiedene anspruchsvolle Probleme aus dem mathematisch-naturwissenschaftlichen Bereich mit Python lösen.
  • Mit Jupyter-Notebooks arbeiten

Zeit: 1 Woche

Bei einer Gleichung (hier: quadratische Gleichung) wie z.B. $$x^2 = 20 - x$$ sucht man alle Zahlen, die man für die Variable $x$ einsetzen kann, so dann die Gleichung erfüllt ist. Die Gleichung in diesem Beispiel hat zwei Lösungen: $x=-5$ und $x=4$.

Eine Differentialgleichungen (DGL) ist vom Prinzip her ähnlich. Allerings sucht man als Lösung(en) nicht Zahlen, sondern Funktionen, die eine gewisse Bedingung erfüllen. Ein Beispiel wäre:

$$y'(x) = \frac{2 \cdot y(x)}{x}$$

Hier suchen wir alle Funktionen $y(x)$, deren Ableitung $y'(x)$ gleich ist wie zwei mal die ursprüngliche Funktion dividiert durch die Variable $x$. Die Lösung von dieser Differentialgleichung ist die Funktion

$$y(x) = k \cdot x^2$$

Dabei ist $k$ eine beliebige Zahl. Da wir für $k$ unendlich viele Möglichkeiten haben, gibt es also unendlich viele Lösungen.

Zum Schluss wollen wir uns noch vergewissern, dass die gefundene Funktion tatsächlich die DGL löst:

$$y'(x) = 2 k x = \frac{2kx^2}{x} = \frac{2 \cdot y(x)}{x}$$

Differentialgleichungen von Hand zu lösen kann sehr anspruchsvoll und oft sogar unmöglich sein. Wie dem auch sei, dies ist nicht das, was wir hier machen wollen - dies wird im PHAM behandelt. Hier geht es um das numerische Lösen von Differentialgleichungen, wir überlassen also dem Computer das Lösen.

Beispiel

Wir betrachten die Differentialgleichung

$$y'(x) = - k y(x)$$

wobei $k$ irgend eine konstante Zahl ist. Wir suchen also eine Funktion $y(x)$, die, wenn man sie ableitet, minus sich selbst mal eine fixe Konstante ergibt.

Wir wollen nun diese DGL mithilfe von Python lösen. Dazu verwenden wir den ODEINT Solver. ODE steht für Ordinary Differential Equation (Gewöhnliche Differentialgleichungen) und INT für Integrate. ODEs sind Differentialgleichungen, die von nur einer Variablen, hier $x$, abhängen. Im Gegensatz dazu hängen Partielle Differentialgleichung von mehreren Variablen ab.

Beachte: Es gibt unendlich viele Funktionen $y(x)$, die die DGL erfüllen, alle haben aber die gleiche Form. Um eine eindeutige Lösung zu erhalten, muss man deshalb eine Anfangsbedingung festlegen. Zum Beispiel kann man sagen, dass für $x=0$ der Funktionswert $y=5$ sein soll. Diese Anfangsbedingung muss dem Solver als Argument übergeben werden. Die gesamte Information, die man benötigt, um eine eindeutige Lösung zu finden, sieht dann wie folgt aus:

$$y'(x) = - k y(x)$$ $$y(0) = 5$$

Wichtig ist, dass in der DGL die Ableitung alleine auf der linken Seite steht.

Links:

Lösung mit odeint:

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
 
def dgl(y,x): # contains right side of DGL y'(x) = ...
    k = 0.4
    y_prime = - k * y
    return y_prime
 
x = np.linspace(0,20,100)
 
y0 = 15
 
y = odeint(dgl,y0,x)
 
plt.plot(x,y)
  • Wissen, was DGL sind …
  • und wozu sie nützlich sind
  • Wissen, warum DGL Anfangsbedingungen brauchen
  • DGL mit odeint lösen können
  • Mit matplotlib ansprechende Figuren erstellen können

Aufgabe A0

  1. Erstelle auf GitHub ein Repo für diesen Kurs, z.B. advanced_python_problems, klone es auf deinen Computer und gib es der LP frei.
  2. Erstelle ein File mit Namen 01_einfache_dgl.ipynb im entsprechenden Repo.
  3. Richte Jupyter Notebooks in VSCode ein (falls noch nicht gemacht)

Aufgabe A1: Beispiel oben

Part I
  1. Gehe das Beispiel oben Schritt für Schritt durch, stelle sicher, dass du alles verstehst. Studiere dazu z.B. das Manual von ODEINT.
  2. Um was für eine Funktion $y(x)$ handelt es sich hier?
  3. Spiele mit dem Wert für den Parameter $k$. Welchen Einfluss hat dieser auf die Funktion?
  4. Was kann im real life durch eine solche Funktion beschrieben werden? Mache ein Beispiel
Part II
  1. Verschönere die Figur, unter anderem sollst du folgendes machen:
    1. Achsen beschriften
    2. Kurve dicker und andere Farbe
    3. Legende hinzufügen
    4. Titel hinzufügen
  2. Nun soll die DGL für verschiedene Werte für $k$ gelöst werden. Finde dazu einen Weg, wie dem odeint-Solver ein zusätzliches Argument übergeben werden kann. Visualisiere dann alle Funktionsgraphen in einer Figur und beschrifte die Graphen in der Legende.
Part III

Mache eine Kopie des Codes und füge einen Slider ein, mit dem man den Wert von $k$ einstellen kann.

Aufgabe A2

  1. Löse die Differentialgleichung $$f'(x) = a$$ mit odeint, wobei $a$ ein beliebiger Parameter ist.
  2. Stelle die Funktion $f(x)$ graphisch dar.
  3. Um was für eine Funktion handelt es sich bei $f(x)$?

Aufgabe A3

  1. Löse die DGL vom Theorieteil am Anfang des Kapitels: $$f'(x) = \frac{2 \cdot f(x)}{x}$$
  2. Stelle die Lösung graphisch dar und vergleiche sie mit der exakten Lösung $f(x) = k x^2$.

Aufgabe A4: Matplotlib

Gehe zurück zum Plot der letzten Aufgabe und verschönere diese, z.B.:

  1. Grösse der Figur
  2. Farbe und Liniendicke von Graph
  3. Hintergrundfarbe
  4. Ticks auf Achsen
  5. Beschriftungen: Titel, Achsen, Graph, Legende

Zeit: 1 Woche

In der Physik beschreibt man die Bewegungen von Objekten (Beispiele: Stein fällt nach unten, Masse an Feder die oszilliert, …) durch sogenannte Bewegungsgleichungen, welche Differentialgleichungen (DGL) sind.

Position, Geschwindigkeit & Beschleunigung

Dabei ist es wichtig zu wissen, wie Position, Geschwindigkeit und Beschleunigung zusammenhängen:

Sei $x(t)$ die Position eines Objekts als Funktion der Zeit. Die Geschwindigkeit des Objekts zu jedem Zeitpunkt ist dann gegeben durch die Ableitung der Position: $$v(t) = x'(t)$$ Die Geschwindigkeit gibt also an, wie fest sich die Position mit der Zeit verändert. Ganz analog ist die Beschleunigung die Änderung der Geschwindigkeit und ist deshalb gegeben durch $$a(t) = v'(t) = x''(t)$$ Die Beschleunigung ist also die zweite Ableitung der Position.

Harmonischer Oszillator

Aus dem Physikunterricht kennst du sicher das Hookesche Gesetz: $$ F = - k x $$ Es beschreibt die Bewegung eines Federpendels ohne Reibung. Das Hookesche Gesetz gibt uns die Federkraft $F$ eines Federpendels an. Es besagt, dass die Federkraft gegeben ist durch minus die Federkonstante $k$ mal die Auslenkung der Feder aus ihrer Gleichgewichtsposition. Das Minus sagt, dass die Kraft immer gegen der Auslenkung wirkt: Ist die Feder gedehnt, so will die Kraft die Feder zusammendrücken. Ist sie aber zusammengedrückt, will die Kraft sie wieder auseinander ziehen.

Das Hookesche Gesetz können wir nun als Differentialgleichung schreiben. Die Beschleunigung der Feder $a$ und die Federkraft $F$ hängen über das zweite Newtonsche Gesetz zusammen: $F = m a$, wobei $m$ die Masse des Objekts ist, welches an der Feder befestigt ist. Damit können wir das Hookesche Gesetz wie folgt umschreiben:

$$F = - k x$$

$$m a = - k x$$

$$m x''(t) = - k x(t)$$

$$x''(t) = - \frac{k}{m} x(t)$$

Wir haben nun also wieder eine Differenzialgleichung. Im Gegensatz zu den DGL von der letzten Übung enthält diese aber eine zweite Ableitung. Zur Erinnerung: Die DGL von der letzten Übung, welche erste Ableitungen beinhaltet haben, hatten immer unendlich viele Lösungen. Wir mussten deshalb eine Randbedingung festlegen.

Löst man nun die neue DGL (Hook'sches Gesetz), so erhält man die Position der Feder als Funktion der Zeit $x(t)$. Hier gibt es wieder unendlich viele Möglichkeiten. Da die neue DGL eine zweite Ableitung beinhaltet, muss man nun zwei Randbedingungen angeben - eine für $x(t)$ und eine für deren Ableitung $x'(t)$, z.B.:

$$x(0) = x_0$$

$$x'(0) = 0$$

Man muss also einen Zeitpunkt (typischerweise den Anfang) wählen und sagen wo und wie schnell das Federpendel dann ist. Wir legen also fest, dass die Feder zum anfänglichen Zeitpunkt $t=0$ an der Position $x_0$ ist und die Geschwindigkeit dann $=0$ ist. Dies macht Sinn, wenn man von Hand eine Feder spannt und zum Zeitpunkt $t=0$ los lässt.

Diese Differentialgleichung kann man analytisch, also exakt, lösen. Mit den obigen Randbedingungen erhält man

$$x(t) = x_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$$

Ein System, welches so schwingt, nennt man einen harmonischen Oszillator und seine Bewegung eine harmonische Bewegung. Diese Bewegung ist ungedämpft, das Federpendel schwingt also unendlich lange.

DGL mit 2. Ableitungen lösen

Die DGL für den Harmonischen Oszillator enthält eine zweite Ableitung. Wie können wir solche mit odeint lösen? Der Trick ist folgender: Wandle die eine DGL mit einer zweiten Ableitung um in zwei DGL mit nur ersten Ableitungen:

Anstelle von

$$x''(t) = - \frac{k}{m} x(t)$$

betrachten wir

$$x'(t) = v(t)$$

$$v'(t) = - \frac{k}{m} x(t)$$

Nun können wir diese beiden DGL zusammen mit odeint lösen. Die Funktion, die odeint übergeben wird, sieht dann wie folgt aus:

def harmonic(x_v,t,k,m):
    x = x_v[0]
    v = x_v[1] 
    return [v, -k/m * x]

Beachte, dass x_v eine Liste ist. Das erste Element beinhaltet die Position $x$, das zweite die Geschwindigkeit $v$ (also die Ableitung von $x$).

Gedämpfter harmonischer Oszillator

Der harmonische Oszillator ist gut und schön, in Realität tritt aber meist Reibung auf, welche die Bewegung dämpft. Die Amplitude (Auslenkung) eines Federpendels nimmt aufgrund von Reibungskräften wie Luftwiderstand kontinuierlich ab.

Wir können in unserer DGL nun Reibung ganz einfach einbauen, in dem wir einen entsprechende Kraftterm in unsere DGL einbauen. Zum Beispiel hängt der Luftwiderstand von der Geschwindigkeit ab: Je höher die Geschwindigkeit, desto grösser der Luftwiderstand. Wir führen deshalb einen Reibungsterm ein, der linear ist in der Geschwindigkeit: $$F = - k x - c v$$ Dabei ist $c$ eine Konstante, die uns angibt, wie stark der Luftwiderstand ist.

Erstelle ein Jupyter-NB mit Namen 02_bewegungsgleichungen.ipynb im entsprechenden Repo.

Aufgabe B1: Harmonischer Oszillator

  1. Beweise, dass $x(t) = x_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$ eine Lösung des harmonischen Oszillators ist: Setze einfach in die DGL ein und zeige, dass links und rechts das Gleiche herauskommt.
  2. Simuliere nun einen harmonischen Oszillator $x''(t) = - \frac{k}{m} x(t)$ wie ein Federpendel ohne Reibung, in dem du die DGL mit odeint löst.
  3. Stelle die Lösungsfunktion $x(t)$ dann mit matplotlib schön graphisch dar.
  4. Vergleiche nun deine numerische Lösung mit der analytischen Lösung $x(t) = x_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$ und stelle sicher, dass diese übereinstimmen.

Aufgabe B2: Gedämpfter harmonischer Oszillator

  1. Simuliere nun den gedämpften harmonischen Oszillator mit einem Reibungsterm, der linear von der Geschwindigkeit abhängt.
  2. Füge nun Slider (widgets, siehe Link am Anfang) hinzu, mit denen du die Werte für die Konstanten $k,m,c$, die Anfangsposition $x_0$, sowie die Zeit-Range einstellen kannst. Sobald ein Slider geändert wurde, soll der Graph entsprechend angepasst werden. Siehe Tipps unten.

Zeit: 1 Woche

Stell dir vor, du beobachtest ein einfaches Pendel – wie eine Schaukel. Es schwingt regelmässig hin und her, und du kannst ziemlich genau vorhersagen, wo es in einer Sekunde sein wird. Aber was passiert, wenn du ein zweites Pendel an das erste hängst? Dann erhältst du ein Doppelpendels, welches chaotisches Verhalten an den Tag legt.

Ein Doppelpendel besteht also aus zwei Pendeln, die miteinander verbunden sind: Das erste Pendel hängt an einem festen Punkt, und das zweite Pendel hängt am Ende des ersten. Wenn du es loslässt, beginnt es sich zu bewegen – aber nicht so ruhig und vorhersehbar wie ein einzelnes Pendel. Stattdessen sieht es oft wild, unregelmässig und fast zufällig aus, es verhält sich chaotisch.

In der Physik bedeutet 'chaotisch' nicht einfach 'durcheinander' oder 'zufällig'. Es bedeutet, dass ein System extrem empfindlich auf Anfangsbedingungen reagiert. Wenn du das Doppelpendel also nur ein winziges bisschen anders startest – z.B. einen Millimeter höher – kann sich der gesamte Bewegungsverlauf komplett verändern. Dieses Verhalten nennt man auch den Schmetterlingseffekt: Ein kleiner Unterschied am Anfang kann riesige Auswirkungen haben – wie der berühmte Flügelschlag eines Schmetterlings, der einen Sturm auslöst.

Das Doppelpendel zeigt uns, dass selbst einfache physikalische Systeme unvorhersehbar werden können, obwohl sie vollständig durch Naturgesetze beschrieben sind. Es ist ein perfektes Beispiel für deterministisches Chaos: Die Regeln sind klar, aber das Ergebnis ist schwer vorherzusagen.

Ziel hier ist, das Doppelpendel zu simulieren: Wir integrieren also seine Bewegungsgleichungen (Differenzialgleichungen) und erstellen damit eine schöne Animation.

Auftrag

In Jupiter-Notebook: doppelpendel.ipynb

  1. Integriere die Bewegungsgleichungen des Doppelpendels mit odeint, genau so, wie du es bereits vom Harmonischen Oszillator kennst. Stelle die beiden Winkel $\theta_1$ und $\theta_2$ als Funktionen der Zeit dar. Verzichte hier auf AI.
  2. Überprüfe, ob alles korrekt ist, in dem du zu jedem Zeitpunkt die Gesamtenergie $E_\text{tot} = E_\text{kin} + E_\text{pot}$ berechnest. Diese muss aufgrund der wohl bekannten Energieerhaltung konstant bleiben.
  3. Erstelle nun eine schöne Simulation des Pendels, z.B. mit PyGame. Hier ist AI-Hilfe erlaubt.
  4. Sorge dafür, dass die Animation beliebig lange läuft: Integriere über einen relativ kurzen Abschnitt, integriere danach erneut, wobei du die letzten Werte vom vorherigen Abschnitt als Anfangswerte verwendest.
  5. Optional: Erstelle ein artistisches Video des Doppelpendels mithilfe eines Programms, welches beliebig viele Bilder überlagern kann.

Gleichungen und Formeln

Die Position der beiden Massen wird vollständig durch die beiden Winkel $\theta\_1$ ('Theta') und $\theta\_2$ bestimmt. Deshalb sucht man nach Bewegungsgleichungen für diese beiden Winkel. Diese beschreiben also, wie sich diese beiden Winkel mit der Zeit verändern.

Bewegungsgleichungen: $$\ddot{\theta_1} = \frac{ -g\cdot (2\cdot m_1+m_2)\cdot \sin(\theta_1) - m_2\cdot g\cdot \sin(\theta_1-2\cdot \theta_2) - 2\cdot \sin(\theta_1-\theta_2)\cdot m_2\cdot (\dot{\theta_2}^2\cdot l_2 + \dot{\theta_1}^2\cdot l_1\cdot \cos(\theta_1-\theta_2)) }{ l_1\cdot (2\cdot m_1+m_2-m_2\cdot \cos(2\cdot \theta_1-2\cdot \theta_2))}$$ $$\ddot{\theta_2} = \frac{ 2\cdot \sin(\theta_1-\theta_2) \cdot ( \dot{\theta_1}^2\cdot l_1\cdot (m_1+m_2) + g\cdot (m_1+m_2)\cdot \cos(\theta_1) + \dot{\theta_2}^2\cdot l_2\cdot m_2\cdot \cos(\theta_1-\theta_2) ) }{ l_2\cdot (2\cdot m_1+m_2-m_2\cdot \cos(2\cdot \theta_1-2\cdot \theta_2))}$$

Koordinaten:

$$x_1 = l_1 \cdot \sin(\theta_1)$$ $$y_1 = - l_1 \cdot \cos(\theta_1)$$ $$x_2 = x_1 + l_2 \cdot \sin(\theta_2)$$ $$y_2 = y_1 - l_2 \cdot \cos(\theta_2)$$

Geschwindigkeit: $$v_1 = l_1 \cdot \dot{\theta_1}$$ $$v_2 = \sqrt{l_1^2\cdot \dot{\theta_1}^2 + l_2^2\cdot \dot{\theta_2}^2 + 2\cdot l_1\cdot l_2\cdot \dot{\theta_1} \cdot \dot{\theta_2} \cdot \cos(\theta_1-\theta_2) }$$

Energie: $$E_\text{kin} = \frac12\cdot m_1\cdot v_1^2 + \frac12 \cdot m_2 \cdot v_2^2$$ $$E_\text{pot} = -m_1\cdot g\cdot l_1\cdot \cos(\theta_1) - m_2\cdot g\cdot (l_1\cdot \cos(\theta_1) + l_2\cdot \cos(\theta_2))$$ $$E_\text{tot} = E_\text{kin} + E_\text{pot}$$

Quellen:

Der Lorenz‑Attraktor Der Lorenz‑Attraktor ist ein einfaches deterministisches System von drei gewöhnlichen Differentialgleichungen: $$\dot{x} = \sigma (y - x)$$ $$\dot{y} = x(\rho - z) - y$$ $$\dot{z} = xy - \beta z$$ Er dient als Prototyp für chaotisches Verhalten. Edward N. Lorenz (MIT, 1963) entwickelte das Modell als stark vereinfachtes Modell für atmosphärische Konvektion. Trotz seiner einfachen Form zeigt das System komplexe, nichtperiodische Bahnen mit empfindlicher Abhängigkeit von den Anfangsbedingungen („Schmetterlingseffekt“).

Typische Parameter (klassisch) $\sigma = 10, \rho = 28, \beta = 8/3$ — diese Wahl führt zum bekannten chaotischen Attraktor.

Programmiere den Lorenz-Attraktor und stelle das Bild schön dar. Ob das Bild auf 1x oder fortlaufend angezeigt wird, ist dir überlassen. Erstelle dazu ein Jupiter-Notebook: lorenz_attraktor.ipynb

Wir haben bereits gelernt, wie man mithilfe von odeint Differenzialgleichungen (DGL) numerisch lösen kann. Nun wollen wir eigene DGL-Solver programmieren. Dadurch verstehen wir, was odeint im Hintergrund eigentlich (so ungefähr) macht.

Dazu betrachten wir das folgende Anfangswert-Problem:

$$y'(t) = f(t,y(t))$$

$$y(t_0) = y_0$$

Es beinhaltet also eine gewöhnliche Differentialgleichung erster Ordnung (nur erste Ableitung) sowie eine Anfangsbedingung. Anschliessen werden verschiedene Lösungsverfahren erläutert:

Explizites Euler-Verfahren

https://de.wikipedia.org/wiki/Explizites_Euler-Verfahren#Das_Verfahren

Das einfachste (und auch schlechteste) Verfahren ist das explizite Euler-Verfahren.

Man wählt eine diskrete Schrittweite $h>0$ und betrachte dann die Zeitpunkte

$$t_k = t_0 + k \cdot h$$

Die zugehörigen Funktionswerte der Lösungsfunktion sind dann gegeben durch

$$y_{k+1} = y_k + h \cdot f(t_k,y_k)$$

Achtung: Wie bei allen numerischen Lösungsverfahren ist die Lösung nicht zu 100\% exakt. Die Werte $y_{k+1}$ weichen von der tatsächlichen, mathematisch korrekten Lösung $y(t_k)$ ab. Je kleiner die Schrittweite $h$ gewählt wird, desto genauer aber stimmen sie überein.

Verbessertes explizites Euler-Verfahren

https://de.wikipedia.org/wiki/Explizites_Euler-Verfahren#Verbessertes_explizites_Euler-Verfahren

Mit einer einfachen Modifikation des expliziten Euler-Verfahrens erhält man bessere Resultate:

$$y_{k+\frac12} = y_k + \frac{h}{2} f(t_k,y_k)$$

$$y_{k+1} = y_k + h \cdot f\left(t_k+\frac{h}{2},y_{k+\frac12}\right)$$

Runge-Kutta

https://de.wikipedia.org/wiki/Runge-Kutta-Verfahren#Beispiel

Wie beim Euler-Verfahren oben, wählt man eine Schrittweite. Allerdings wählt man nun auch eine beliebige Anzahl von gewichteten Zwischenstufen. Das dreistufige Runge-Kutta Verfahren sieht dann wie folgt aus:

$$y_{k+1} = y_k + h \cdot \left(\frac16k_1 + \frac46k_2 + \frac16k_3 \right)$$

Wobei:

$$k_1 = f(t_k,y_k)$$

$$k_2 = f(t_k+\frac h2,y_k + \frac h2 k_1)$$

$$k_1 = f(t_k+h,y_k-h\cdot k_1 + 2h\cdot k_2)$$

In Jupiter-Notebook: eigener_dgl_solver.ipynb

Auftrag 1

Implementiere die drei oben vorgestellten Lösungsverfahren für gewöhnliche Differentialgleichungen erster Ordnung. Wende sie auf Beispiele aus früheren Lektionen an. Achtung: Bewegungsgleichungen (beinhalten 2. Ableitungen) können damit noch nicht gelöst werden.

Vergleiche dann die Resultate dieser drei Verfahren sowie der odeint-Funktion miteinander. Stelle dazu alle 4 Lösungen gemeinsam in einem Graph dar.

Auftrag 2

Modifiziere eines der Lösungsverfahren von oben so, dass du Differentialgleichungen 2. Ordnung, also mit 2. Ableitungen, lösen kannst. Löse damit z.B. den harmonischen Oszillator.

Gravitationspotenzial einer homogenen Kugel (Masse $m_k$, Radius $R_k$ an Position $(x_k,y_k)$): $$\Phi_k(x,y) = - \frac{G m_k}{r} \quad \text{falls } r > R_k$$ $$\Phi_k(x,y) = - \frac{G m_k}{2\cdot R_k^3}(3\cdot R_k^2 - r^2) \quad \text{falls } r \leq R_k$$ wobei $r = \sqrt{(x-x_k)^2 + (y-y_k)^2}$.

Gravitationspotential von $n$ homogenen Kugeln: $$\Phi(x,y) = \sum_{k=1}^{n} \Phi_k(x,y)$$

Da das Gravitationspotenzial an vielen Punkten berechnet werden soll, macht es Sinn Numba zu verwenden, um die Performance des Python-Codes massiv zu optimieren.

Fun-Fact: Aus dem Gravitationspotenzial kann wortwörtlich die Gravitationskraft abgeleitet werden. Die Gravitationskraft, die auf Masse $m_j$ wirkt, ist: $$\vec{F}_j = - m \cdot \nabla \Phi$$ Dabei ist $$\nabla \Phi = \begin{pmatrix} \partial_x \Phi \\ \partial_y \Phi \end{pmatrix}$$ wobei $\partial_x \Phi$ und $\partial_y \Phi$ die Ableitung von $\Phi$ nach $x$, resp. nach $y$ ist.

In Jupiter-Notebook: gravitationspotenzial.ipynb

Auftrag I: Visualisiere das Gravitationspotenzial von $n$ homogener Kugeln (konstante Dichte), welche sich in einer Ebene (also in 2D) befinden. Verwende AI nur für die Anzeige des Potenzials.

Auftrag II: Implementiere nun die Dynamik: Die Massen sollen sich aufgrund ihrer Gravitation bewegen. Das Gravitationspotenzial soll sich also fortlaufend ändern. Schön wäre, wenn man oben die Massen und unterhalb das Potenzial sehen würde.

  • talit/python_advanced_problems.txt
  • Zuletzt geändert: 2025-09-15 11:17
  • von sca