Niveaulinien Plotten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Leonie92
User
Beiträge: 3
Registriert: Sonntag 10. März 2019, 13:05

Hallo zusammen,

ich möchte die Niveaulinien einer komplexen Funktion f in der komplexen z-Ebene

f(z)=z+(a^2)/z

plotten (a ist eine beliebige aber feste positive Zahl). Die verschiedenen Niveaulinien erhält man aus dem Realteil und Imaginärteil von f

Re(f)=c , Im(f)= c

für verschiedene, positive, feste Werte von c. Das Ziel ist einen Plott zu erstellen der wie folgt aussieht Bild


Ich habe davor immer nur Excel benutzt um Plots zu erstellen, aber für dieses Problem ist es nicht geeignet. Deswegen möchte ich Python verwenden. Ich habe Python 3 und den Editor PyCharm heruntergeladen. Ich habe Ideen wie man es machen kann. Weiß aber nicht wie man diese in Python in Form eines Code überträgt, weil ich noch nie ein solches Programm benutzt habe. Deswegen wäre ich sehr dankbar, wenn wir mir jemand helfen könnte.

Idee 1:
- Erzeuge eine Liste I mit komplexen Zahlen I:=[-n,n] x [-i*n,i*n] (n natürliche Zahl)
- Verwende eine Funktion F die überprüft welche Zahlen aus I die Bedingung F(Re(f))=c, F(Im(f))=c erfüllt
- für jedes neue c sollen Listen mit komplexen Zahlen erzeugt welche die obige Bedingung erfüllen
- Verbinde die Punkte aus einer Liste --> Niveaulinie

Idee 2: Idee 1 beruht auf der Annahme das eine solche Funktion F existiert. Falls dem nicht so ist
- Berechene den Real und Imaginärteil von f in Termen von x,y (z=x+iy)
Re(f)= x+ (xa^2)/(x^2+y^2)=c , Im(f)= y - (ya^2)/(x^2+y^2)=c
- Stellen die jeweiligen Gleichungen nach y=y(x) um
Re(f): y(x)=pm* (i*sqrt{x}\sqrt{a^2-cx+x^2})(sqrt{x-c}) , pm:= + oder -
Laut Wolframalpha existiert auch eine Lösung y(x) für Im(f) ist aber zu lang zum aufschreiben
- Plotte die jeweiligen Funktionen y(x) in der Komplexen Zahlenebene für verschiedene, feste Werte von c (x kann dann z.B. Werte von -10 bis 10 annehmen).


Vielleicht kennt jemand von euch einen besseren/schnelleren Lösungsweg für dieses Problem. Würde mich über jede Hilfe freuen!

Grüße
Leonie
Agost
User
Beiträge: 2
Registriert: Donnerstag 4. April 2019, 14:14

Hallo,

Realteil und Imaginärteil können als implizite Funktionen gezeichnet werden.
Dazu muss das Paket Sympy verwendet werden. Sympy hat den Nachteil, dass das Aussehen der Plots nur eingeschränkt gestaltet werden kann.

Code: Alles auswählen

# -*- coding: utf-8 -*-
from sympy import plot_implicit, symbols, Eq
from sympy.plotting import plot
x, y = symbols('x y')

# Dummy um Plots zusammenfügen zu können
p0 = plot(x,(x,0,0), show=False)

# Niveaulinien zeichnen, hier für a=9 und c =0,1,2...5
a = 9
for c in range(6):
    p1 = plot_implicit(Eq(x + a*x/(x**2+y**2), c),
         (x, -10, 10), (y, -10, 15),line_color='red',show=False,adaptive=False)
    p2 = plot_implicit(Eq(y - a*y/(x**2+y**2), c),
         (x, -10, 10),(y, -10, 15),line_color='blue', show=False, adaptive=False)
    p0.append(p1[0])
    p0.append(p2[0])
    
p0.aspect_ratio=0.5 # hat keine Wirkung
 
p0.show()
Besser man benutzt SageMath. Diese Software verwendet zun Programmieren ebenfalls Python.
Code in SageMath:
x,y =var('x, y')
p =plot([(0,0)])
for c in range(6):
a = implicit_plot(x+9*x/(x**2+y**2)== c, (x, -10, 10), (y, -10, 15), linewidth=2, color='tomato')
b = implicit_plot(y-9*y/(x**2+y**2)== c, (x, -10, 10), (y, -10, 15), linewidth=2, color='cornflowerblue')
p=p+a+b
p.show(axes=true, frame=false, aspect_ratio=1)
Antworten