Gradienten-Berechnung mit python
Ich würde gerne wissen, wie funktioniert numpy.gradient
Arbeit.
Ich benutzte Gradienten zu versuchen zu berechnen group velocity (group velocity of a wave-packet ist die Ableitung von Frequenzen hinsichtlich wavenumbers, nicht eine Gruppe von Geschwindigkeiten). Ich fütterte ein 3-Spalten-array zu, die ersten 2 Spalten sind die x und y coords, die Dritte Spalte ist die Frequenz, die der Punkt (x,y). Ich brauche zu berechnen Steigung und ich erwartete, ein 2d-Vektor wird gradient definition
df/dx*i+df/dy*j+df/dz*k
und meine Funktion nur eine Funktion von x und y habe ich etwas erwarten wie
df/dx*i+df/dy*j
Aber ich habe 2 arrays mit 3 Spalten jeweils, also 2 3d-Vektoren; zuerst dachte ich, dass die Summe der beiden würde mir die vector ich waren searchin für aber die z-Komponente nicht verschwinden. Ich hoffe, ich habe hinreichend deutlich in meiner Erklärung. Ich würde gerne wissen, wie numpy.gradient
funktioniert und ob es die richtige Wahl für mein problem. Ansonsten würde ich gerne wissen, ob es andere python-Funktion, die ich verwenden kann.
Was ich meine ist: ich möchte berechnen Steigung ein array von Werten:
data=[[x1,x2,x3]...[x1,x2,x3]]
wobei x1,x2 sind die Koordinaten der Punkte, die auf einem einheitlichen raster (meine Punkte der brillouin-zone) und x3 den Wert der Frequenz für diesen Punkt. Ich gebe im input auch die Schritte für die Ableitung für die 2 Richtungen:
stepx=abs(max(unique(data[:,0])-min(unique(data[:,0]))/(len(unique(data[:,0]))-1)
das gleiche für die y-Richtung.
Ich nicht bauen, meine Daten auf einem raster, ich habe schon ein Gitter und dieses ist der Grund, warum Art-Beispiele, die hier Antworten, tun mir nicht helfen.
Ein passenderes Beispiel sollte ein raster von Punkten und Werten, wie ich Sie haben:
data=[]
for i in range(10):
for j in range(10):
data.append([i,j,i**2+j**2])
data=array(data,dtype=float)
gx,gy=gradient(data)
andere Sache, die ich hinzufügen kann ist, dass mein raster ist nicht ein Quadrat, sondern hat die Form eines Polygons wird die brillouin-zone von einem 2d-Kristall.
Habe ich verstanden, dass numpy.gradient
funktioniert nur auf einem quadratischen raster von Werten, nicht das, was ich searchin für. Auch wenn ich meine Daten als raster, das hätte viel Nullen außerhalb des Polygons von meinem ursprünglichen Daten, das wäre wirklich high-Vektoren, um meinen Verlauf zu beeinflussen (negativ) der die Genauigkeit der Berechnung. Dieses Modul scheint mir mehr ein Spielzeug als ein Werkzeug, es hat starke Einschränkungen imho.
Problem gelöst mit Wörterbüchern.
- Soooo, was ist die Frage? Welche module sollte man verwenden? Ist etwas schiefgegangen?
- Frage ist, was Farbverlauf tun? Warum gibt mir 2 3d-Vektoren anstelle von 1-2d-Vektor? Tun Verlauf tatsächlich compute wirklich ein Farbverlauf? Von der Ausgabe kann ich nicht sagen. Sieht nicht genau auf mich zu.
- Ich dachte, es war klar, der 3. Teil meiner Eingabe ist das Skalare Feld, jeder Wert auf der 3. Komponente ist der Wert der Funktion für jedes (x,y) zeigen.
- das problem ist, dass Sie geben gradient die falsche Eingabe. Es kümmert sich nicht um
x1,x2
oder im letzten Beispieli,j
. Es will nur eine matrix voni**2+j**2
Werte. Es ist implizit, dass Sie Ihre matrix deri**2+j**2
Werte entsprechen denxy
Ebene, und die optionalen skalaren Argumente, die vongradient
Konto für Schritt Größe Annahmen, d.h. wenn Ihrx
Punkte sind nicht1
entfernt von einander, und das gleiche für Ihrey
Punkte. Ich werde aus der Stadt heute, aber ich werde aktualisieren, meine Antwort, wenn ich wieder heute Abend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
gradient
eine matrix, die beschreibt Ihre Kreisfrequenz Werte für Ihre(x,y)
Punkte. z.B.Können Sie sehen, dass das Plotten Z als Oberfläche gibt:
Hier ist, wie interpretieren Sie Ihren Verlauf:
gx
ist eine matrix, gibt die änderungdz/dx
in allen Punkten. z.B. gx[0][0]dz/dx
bei(x0,y0
). Visualisierunggx
hilft beim Verständnis:Da meine Daten generiert wurde
f(x,y) = sin(x+y)
gy gleich aussieht.Hier ist ein eher offensichtliches Beispiel mit
f(x,y) = sin(x)
...f(x,y)
und die Verläufe
update werfen wir einen Blick auf die xy-Paare.
Dies ist der code, den ich verwendet:
Nun können wir schauen und sehen genau, was passiert. Sagen wir wollten wissen, was Punkt wurde im Zusammenhang mit dem value-at -
Z[20][30]
? Dann...Und der Punkt ist
Ist das richtig? Let ' s überprüfen.
Ja.
Und was sind unsere gradient-Komponenten an diesem Punkt?
Tun, überprüfen Sie heraus?
dz/dy always 0
überprüfen.dz/dx = cos(x)
und...Sieht gut aus.
Werden Sie feststellen, Sie sind nicht genau richtig, dass ist, weil meine Z-Daten nicht kontinuierlich, es ist ein Schritt Größe von
0.05
undgradient
können nur annähernd die rate der änderung.x,y,z
bereits Daten, so brauchen Sie nicht eine Funktion...nur machen Z entsprechend mit Ihrem Frequenz-Daten.gx
undgy
gebenx
undy
Derivate für jeden Punkt in Z-Richtung, das sollte dann einX
durchY
matrix.gradient
eine matrix der Z-Werte und berechnet schrittweise die Steigung zwischen den einzelnenX,X+1
undY,Y+1
geben Sie für jeden Punkt die Geschwindigkeit der änderung desx
undy
an diesem Punkt. d.h. es nähert sich die Auswertung von f(x,y) =(2x,2y)
.