Gibt es eine Funktion, die für die Berechnung der Divergenz des Vektorfeldes verwendet werden könnte? (in matlab ) Ich würde erwarten, dass es in numpy / scipy existiert, aber ich kann es nicht finden Google.
Ich muss div[A * grad(F)]
berechnen, wo
also grad(F)
ist eine Liste von 2D ndarray
s
Ich weiß, dass ich Divergenz wie dies berechnen kann, aber das Rad nicht neu erfinden will. (Ich hätte auch etwas Optimiertes erwartet) Hat jemand Vorschläge?
Die Antwort von @ user2818943 ist gut, aber es kann ein wenig optimiert werden:
%Vor%Timeit:
%Vor% Etwa 7 mal schneller:
sum
konstruiert implizit ein 3d-Array aus der Liste der Gradientenfelder, die von np.gradient
zurückgegeben werden. Dies wird vermieden mit reduce
Nun, in Ihrer Frage, was meinen Sie mit div[A * grad(F)]
?
A * grad(F)
: A
ist ein 2d-Array und grad(f)
ist eine Liste von 2d-Arrays. Also dachte ich, es bedeutet, jedes Gradientenfeld mit A
zu multiplizieren. A
) ist unklar. Nach Definition div(F) = d(F)/dx + d(F)/dy + ...
. Ich denke, das ist nur ein Fehler der Formulierung. Für 1
, multipliziert summierte Elemente Bi
mit demselben Faktor A
kann faktorisiert werden:
Somit können Sie diesen gewichteten Gradienten einfach mit: A*divergence(F)
Wenn A
stattdessen eine Liste von Faktoren ist, eine für jede Dimension, dann wäre die Lösung:
Nur ein Hinweis für alle, die das lesen:
Die obigen Funktionen berechnen nicht die Divergenz eines Vektorfeldes. sie summieren die Ableitungen eines skalaren Feldes A:
Ergebnis = dA / dx + dA / dy
im Gegensatz zu einem Vektorfeld (mit dreidimensionalem Beispiel):
Ergebnis = Summe dAi / dxi = dAx / dx + dAy / dy + dAz / dz
Stimme für alle ab! Es ist mathematisch einfach falsch.
Prost!
Auch wenn es die Divergenz nicht für Sie handpaketiert hat, ist die Divergenz ziemlich einfach und die derivativen Tools, die sie Ihnen in scipy geben (die oben verlinkten), geben Ihnen ungefähr 90% des vorverpackten Codes in einem netten, effizienter Weg.
Soweit ich das beurteilen kann, ist die Antwort, dass es in numpy keine native Divergence-Funktion gibt. Daher besteht das beste Verfahren zum Berechnen der Divergenz darin, die Komponenten des Gradientenvektors zu summieren, d. H. berechnen die Divergenz.
Basierend auf Juh_s Antwort, aber modifiziert für die korrekte Divergenz einer Vektorfeldformel
%Vor%Die Matlab-Dokumentation verwendet diese exakte Formel (scrollen Sie nach unten zur Divergenz eines Vektorfeldes)
>Was Daniel verändert hat, ist die richtige Antwort, lassen Sie mich die selbstdefinierte Funktionsdivergenz näher erläutern:
Funktion np.gradient () definiert als: np.gradient (f) = df / dx, df / dy, df / dz + ...
aber wir müssen Func-Divergenz definieren als: Divergenz (f) = dfx / dx + dfy / dy + dfz / dz + ... = np.gradient (fx) + np.gradient (fy) + np.gradient ( fz) + ...
Lass uns testen, vergleiche Beispiel für Divergenz in Matlab
%Vor%