2014-01-16 18 views
7

如何計算sympy中多元函數的(符號)梯度?是否有向量化的方式來計算sympy中的漸變?

很明顯,我可以分別計算每個變量的派生值,但有沒有這樣做的矢量化操作?

例如現在

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

對於i = 0..3我可以這樣做:

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

這將工作,但我寧願做這樣的事情:

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

哪個不起作用(「AttributeError:ImmutableMatrix沒有屬性_diff_wrt」)。

+0

這不起作用,因爲它可能會把'm'的衍生物作爲一個變量,它不知道該怎麼做。只需使用'm'上的列表理解。 – asmeurer

回答

6

只需用一個列表理解了m

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

另外,不要使用np.sum,除非你用數值工作。內置sum更好。

0

這是@asmeurer的替代方案。我更喜歡這種方式,因爲它返回一個SymPy對象而不是Python列表。

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) 
相關問題