Search code examples
pythonsympysymbolic-mathderivative

Is there a vectorized way to calculate the gradient in sympy?


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").


Solution

  • 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.