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


person Bitwise    schedule 16.01.2014    source источник
comment
Это не работает, поскольку предполагается, что производная по отношению к m будет приниматься как переменная, а она не знает, как это сделать. Просто используйте понимание списка вместо m.   -  person asmeurer    schedule 17.01.2014


Ответы (2)


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

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

Кроме того, не используйте np.sum, если вы не работаете с числовыми значениями. Встроенный sum лучше.

person asmeurer    schedule 17.01.2014

Вот альтернатива @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)
person Alex Walczak    schedule 05.05.2017