【问题标题】:Is there a vectorized way to calculate the gradient in sympy?有没有一种矢量化的方法来计算 sympy 中的梯度?
【发布时间】:2014-02-05 15:42:20
【问题描述】:

如何在 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 has no attribute _diff_wrt”)。

【问题讨论】:

  • 这行不通,因为它希望将关于m 的导数作为一个变量,它不知道该怎么做。只需对m 使用列表推导即可。

标签: python sympy symbolic-math derivative


【解决方案1】:

只需对m 使用列表推导:

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

另外,请勿使用np.sum,除非您使用的是数值。内置的sum 更好。

【讨论】:

    【解决方案2】:

    这是@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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多