在sympy中,是否有一种向量化的方式来计算梯度?

14

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


这不起作用,因为它期望将导数与变量m一起使用,但它不知道如何执行。只需在m上使用列表推导式即可。 - asmeurer
2个回答

10

只需在m上使用列表推导式:

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

此外,除非你在处理数字值,否则不要使用np.sum。内置的sum更好。


8

这里提供一种与 @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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接