Is there a vectorized way to calculate the gradien

2020-08-14 08:02发布

问题:

How does one calculate the (symbolic) gradient of a multivariate function in sympy?

Obviously I could calculate separately the derivative for each variable, but is there a vectorized operation that does this?

For example

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

Now for i=0..3 I can do:

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

which will work, but I rather do something like:

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

Which does not work ("AttributeError: ImmutableMatrix has no attribute _diff_wrt").

回答1:

Just use a list comprehension over m:

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

Also, don't use np.sum unless you are working with numeric values. The builtin sum is better.



回答2:

Here is an alternative to @asmeurer. I prefer this way because it returns a SymPy object instead of a Python list.

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)