Gradientenberechnung mit Python

7

Ich würde gerne wissen, wie funktioniert numpy.gradient . Ich habe Gradienten verwendet, um zu versuchen, Gruppengeschwindigkeit zu berechnen (die Gruppengeschwindigkeit eines Wellenpakets ist die Ableitung von Frequenzen in Bezug auf Wellenzahlen, nicht eine Gruppe von Geschwindigkeiten). Ich habe ihm ein 3-Spalten-Array zugeführt, die ersten 2 Spalten sind x- und y-Koordinaten, die dritte Spalte ist die Frequenz dieses Punktes (x, y). Ich muss den Gradienten berechnen und habe einen 2d-Vektor erwartet, der gradient definition ist

%Vor%

und meine Funktion nur eine Funktion von x und y Ich habe etwas wie

erwartet %Vor%

Aber ich habe zwei Arrays mit jeweils drei Spalten, d. h. zwei 3D-Vektoren; Zuerst dachte ich, dass die Summe der beiden den Vektor geben würde, nach dem ich gesucht habe, aber die z-Komponente verschwindet nicht. Ich hoffe, dass ich in meiner Erklärung klar genug war. Ich würde gerne wissen, wie numpy.gradient funktioniert und ob es die richtige Wahl für mein Problem ist. Ansonsten würde ich gerne wissen, ob es irgendeine andere Python-Funktion gibt, die ich benutzen kann.

Was ich meine ist: Ich möchte den Gradienten eines Array von Werten berechnen:

%Vor%

Dabei sind x1, x2 Punktkoordinaten in einem gleichmäßigen Raster (meine Punkte in der Brillouin-Zone) und x3 ist der Wert der Frequenz für diesen Punkt. Ich gebe auch Eingaben zur Ableitung für die 2 Richtungen ein:

%Vor%

das Gleiche für y-Richtung. Ich habe meine Daten nicht auf einem Raster erstellt, ich habe bereits ein Raster und deshalb helfen mir die hier gegebenen Beispiele in Antworten nicht. Ein passenderes Beispiel sollte ein Raster aus Punkten und Werten haben wie das, das ich habe:

%Vor%

Eine weitere Sache, die ich hinzufügen kann, ist, dass mein Gitter kein Quadrat ist, sondern die Form eines Polygons hat, das die Brillouin-Zone eines 2d-Kristalls ist.

Ich habe verstanden, dass numpy.gradient nur auf einem quadratischen Raster von Werten richtig funktioniert, nicht nach dem, wonach ich suche. Selbst wenn ich meine Daten als ein Gitter machen würde, das viele Nullen außerhalb des Polygons meiner Originaldaten hätte, würde dies meinem Graphen wirklich hohe Vektoren hinzufügen, die (negativ) die Genauigkeit der Berechnung beeinflussen würden. Dieses Modul scheint mir eher ein Spielzeug als ein Werkzeug, es hat starke Einschränkungen imho.

Problem gelöst mit Wörterbüchern.

    
Avulso Malloru 29.07.2013, 21:04
quelle

1 Antwort

23

Sie müssen gradient eine Matrix geben, die Ihre Winkelfrequenzwerte für Ihre (x,y) -Punkte beschreibt. z.B.

%Vor%

Sie können sehen, dass das Zeichnen von Z als Fläche ergibt:

Hier erfahren Sie, wie Sie Ihren Farbverlauf interpretieren:

gx ist eine Matrix, die die Änderung dz/dx an allen Punkten angibt. z.B. gx [0] [0] ist dz/dx at (x0,y0 ). Das Visualisieren von gx hilft beim Verständnis:

Da meine Daten aus f(x,y) = sin(x+y) gy erzeugt wurden, sieht das gleich aus.

Hier ist ein offensichtlicheres Beispiel mit f(x,y) = sin(x) ...

f (x, y)

und die Gradienten

update Werfen wir einen Blick auf die xy-Paare.

Dies ist der Code, den ich verwendet habe:

%Vor%

Jetzt können wir genau sehen und sehen, was passiert. Angenommen, wir wollten wissen, welcher Punkt mit dem Wert Z[20][30] verknüpft war. Dann ...

%Vor%

Und der Punkt ist

%Vor%

Stimmt das? Lass es uns überprüfen.

%Vor%

Ja.

Und was sind unsere Gradientenkomponenten an diesem Punkt?

%Vor%

Machen Sie das aus?

dz/dy always 0 check. dz/dx = cos(x) und ...

%Vor%

Sieht gut aus.

Sie werden feststellen, dass sie nicht genau richtig sind, da meine Z-Daten nicht kontinuierlich sind, es gibt eine Schrittgröße von 0.05 und gradient kann nur die Änderungsrate annähern.

    
seth 27.07.2013, 21:04
quelle

Tags und Links