13

如何在 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”)。

4

2 回答 2

9

只需使用列表理解m

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

此外,np.sum除非您使用数值,否则请勿使用。内置sum更好。

于 2014-01-17T01:07:56.457 回答
6

这是@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)
于 2017-05-05T22:00:40.733 回答