Contour plot einer Funktin f(x1,x2), Punkte einzeichnen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Demoisel
User
Beiträge: 3
Registriert: Sonntag 31. Mai 2015, 12:15

Hallo
Ich bin völlig neu in der Programmier und Python Welt und ziemlich überfordert was das darstellen von Funktionen angeht.

Ich möchte eine Funktion f(x1,x2)=12*x1^2+4*x2^2-12*x1*x2+2*x1 mit einem contour Plot darstellen und dann am liebsten noch mehrere Punkte auf dieser funktion einzeichnen.

Habe dazu das hier gefunden: http://matplotlib.org/examples/pylab_ex ... _demo.html

un derzeit so umgesetzt:

Code: Alles auswählen

from pylab import *

delta=0.5
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)

Z = 12*X**2+4*Y**2-12*X*Y+2*X

figure()
CP1 = contour(X, Y, Z) 
clabel(CP1, inline=True, fontsize=10)


title('Contour Plot')
xlabel('x')
ylabel('y')
show()



Zum einen würde ich gerne noch mehr Höhenlinien in der mitte des Plots haben und zum anderen möchte nun 3 Punkte makieren
(x,y,z)=(-1,-2,2)
(x,y,z)=(-1.09615385,-1.80769231,1.51923077)
(x,y,z)=(-1/3,-1/2,-1/3)

Kann mir da wer Weiter helfen? :K


Viele Grüße
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Schau Dir das mal an:

Code: Alles auswählen

from pylab import *
 
delta=0.1
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
 
Z = 12*X**2+4*Y**2-12*X*Y+2*X

figure()
CP1 = contour(X, Y, Z, [0.1, 0.2, 0.5, 1, 2, 3, 5, 10, 30, 50, 100])
clabel(CP1, inline=True, fontsize=10)

points = np.array([[-2,1], [2.4, 1.3], [0.5, -1.1]])
plot(points[:,0], points[:,1], "o")
cross = np.array([[2,2], [-2.5,-2.3]])
plot(cross[:,0], cross[:,1], "x")
 
title('Contour Plot')
xlabel('x')
ylabel('y')
show()
Mit Deinem delta=0.5 sehen die Konturlinien sehr eckig aus, mit delta=0.1 sieht's besser aus.
Mit dem 4. Parameter der Funktion contour kannst Du die Wahl der Konturlinien beeinflussen, entweder gibst Du dort die gewünschte Anzahl an oder ein Array.
Einzelne Punkte kannst Du mit dem gleichen Befehl plotten wie eine Kurve. Du gibst aber als Linestyle z.B. "o" oder "x" an.
a fool with a tool is still a fool, www.magben.de, YouTube
Demoisel
User
Beiträge: 3
Registriert: Sonntag 31. Mai 2015, 12:15

Hey,
Danke der Tip mit dem kleineren Delta war schonmal gut.
Das mit den Punkten bekomme ich aber irgendwie nicht hin. Ich bekomme immer einen IndentationError: unexpected indent
Kannst du mir sagen woran das liegt?


Grüße
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Demoisel hat geschrieben:Ich bekomme immer einen IndentationError: unexpected indent
Kannst du mir sagen woran das liegt?
An einer Stelle in Deinem Code stimmt die Einrückung nicht. Die Zeilennummer steht in der Fehlermeldung. In Python ist die Einrückung des Codes Teil der Syntax. Wenn Du die Stelle nicht findest, dann poste den Code, dann kann ich Dir genau sagen was nicht stimmt.
a fool with a tool is still a fool, www.magben.de, YouTube
Demoisel
User
Beiträge: 3
Registriert: Sonntag 31. Mai 2015, 12:15

Danke.
Das mit der Einrückung habe ich glaube ich behoben.
Habe das nun mehr oder weniger von dir Kopiert, jetzt bekomme ich die meldung ValueError: negative dimensions are not allowed.
Wenn ich die negativen vorzeichen der Punkte lösche ( ob ich da nun nen Punkt haben möchte oder nicht, ersteinmal außen vor gestellt) kommt die meldung TypeError: 'NoneType' object is not iterable.

Hier mal mein aktueller code:

Code: Alles auswählen

delta=0.1
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z = 12*X**2+4*Y**2-12*X*Y+2*X



figure()
CP1 = contour(X, Y, Z,[0.0, 0.6, 1.5, 3, 5, 10, 30, 50]) 
clabel(CP1, inline=True, fontsize=10)

points = np.array([[-2,1], [2.4, 1.3], [0.5, -1.1]])
plot(points[:,0], points[:,1], "o")
cross = np.array([[2,2], [-2.5,-2.3]])
plot(cross[:,0], cross[:,1], "x")




title('Contour Plot')
xlabel('x')
ylabel('y')
show()

Grüße
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Der Code den Du gepostet hast funktioniert mit und ohne negative Vorzeichen (nachdem ich "from pylab import *" ergänzt habe). Da musst Du noch was anderes gemacht haben und nicht blos die Vorzeichen gelöscht. Poste den Code der nicht funktioniert (und lass die doppelten und dreifachen Leerzeilen weg, eine Leerzeile reicht).

Fehlermeldung sind in Python ziemlich informativ und mehrzeilig. Es kann Dir schneller geholfen werden, wenn Du hier im Forum immer die ganze Fehlermeldung postest, also auch den Stacktrace mit den Zeilennummern.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten