2014-01-16 18 views
7

Как вычислить (символический) градиент многомерной функции в sympy?Есть ли векторизованный способ вычисления градиента в sympy?

Очевидно, что я мог бы рассчитать отдельно производную для каждой переменной, но есть ли она векторизованная операция?

Например

m=sympy.Matrix(sympy.symbols('a b c d')) 

Теперь при г = 0..3 я могу сделать:

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

, который будет работать, но я предпочел бы сделать что-то вроде:

sympy.diff(np.sum(m*m.T),m) 

Что не работает («AttributeError: ImmutableMatrix не имеет атрибута _diff_wrt»).

+0

Это не сработает, потому что он рассчитывал взять производную по отношению к 'm' как переменную, которую он не знает, как это сделать. Просто используйте представление списка над 'm'. – asmeurer

ответ

6

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

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

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

0

А вот альтернатива @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) 
Смежные вопросы