Есть ли векторизованный способ вычисления градиента в 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)