Berechne die Divergenz des Vektorfeldes mit Python

8

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

%Vor%

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?

    
nyvltak 11.07.2012, 15:14
quelle

8 Antworten

8
%Vor%     
user2818943 26.09.2013 10:00
quelle
8

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)] ?

  1. über 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.
  2. über die Anwendung der Divergenz auf das Gradientenfeld (skaliert nach 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:

%Vor%

Somit können Sie diesen gewichteten Gradienten einfach mit: A*divergence(F)

erhalten

Wenn A stattdessen eine Liste von Faktoren ist, eine für jede Dimension, dann wäre die Lösung:

%Vor%     
Juh_ 15.01.2014 10:01
quelle
5

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!

    
Polly 09.12.2014 10:12
quelle
2

Ссылка

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.

    
Slater Victoroff 11.07.2012 22:13
quelle
1

Die Divergenz als eingebaute Funktion ist in Matlab enthalten, aber nicht numpy. Dies ist die Art von Sache, die es vielleicht wert ist, zu pylab beizutragen, eine Anstrengung, um eine brauchbare Open-Source-Alternative zu Matlab zu schaffen.

Ссылка

Bearbeiten: Jetzt Ссылка

genannt     
Joshua Cook 14.01.2014 21:15
quelle
1

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.

    
Joshua Cook 14.01.2014 20:35
quelle
1

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)

>     
Daniel 03.05.2017 12:16
quelle
1

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%

    
Paul Chen 20.12.2017 11:28
quelle

Tags und Links