Есть ли векторизованный способ вычисления градиента в sympy?

как вычислить (символический) градиент многомерной функции в 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").

2 ответов


просто используйте понимание списка над m:

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

кроме того, не используйте np.sum Если вы работаете с числовыми значениями. Здание sum - это лучше.


вот альтернатива @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)