Question

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

Était-ce utile?

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

Autres conseils

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top