2014-01-16 3 views
7

Wie berechnet man den (symbolischen) Gradienten einer multivariaten Funktion in sympy?Gibt es eine vektorisierte Methode, um den Gradienten in sympy zu berechnen?

Offensichtlich könnte ich separat die Ableitung für jede Variable berechnen, aber gibt es eine vektorisierte Operation, die das tut?

Zum Beispiel

m=sympy.Matrix(sympy.symbols('a b c d')) 

Jetzt für i = 0..3 kann ich tun:

sympy.diff(np.sum(m*m.T),m[i]) 

, die funktionieren wird, aber ich eher so etwas wie:

sympy.diff(np.sum(m*m.T),m) 

Was nicht funktioniert ("AttributeError: ImmutableMatrix hat kein Attribut _diff_wrt").

+0

Dies funktioniert nicht, weil es erwarten würde, die Ableitung in Bezug auf "m" als eine Variable zu nehmen, die es nicht zu tun weiß. Verwenden Sie einfach ein Listenverständnis über 'm'. – asmeurer

Antwort

6

Verwenden Sie einfach eine Liste Verständnis über m:

[sympy.diff(sum(m*m.T), i) for i in m] 

Auch nicht np.sum verwenden, wenn Sie mit numerischen Werten arbeiten. Das eingebaute sum ist besser.

0

Hier ist eine Alternative zu @asmeurer. Ich bevorzuge diesen Weg, weil es ein SymPy-Objekt anstelle einer Python-Liste zurückgibt.

def gradient(scalar_function, variables): 
    matrix_scalar_function = Matrix([scalar_function]) 
    return matrix_scalar_function.jacobian(variables) 

mf = sum(m*m.T) 
gradient(mf, m) 
Verwandte Themen