Нам нужны две матрицы дифференциальных операторов [B] и [C], такие как:
B = sympy.Matrix([[ D(x), D(y) ],
                  [ D(y), D(x) ]])
C = sympy.Matrix([[ D(x), D(y) ]])
ans = B * sympy.Matrix([[x*y**2],
                        [x**2*y]])
print ans
[x**2 + y**2]
[      4*x*y]
ans2 = ans * C
print ans2
[2*x, 2*y]
[4*y, 4*x]
Это также может быть применено для вычисления завитка векторного поля, подобного:
culr  = sympy.Matrix([[ D(x), D(y), D(z) ]])
field = sympy.Matrix([[ x**2*y, x*y*z, -x**2*y**2 ]])
Чтобы решить эту проблему с помощью Sympy, необходимо создать следующий класс Python:
import sympy
class D( sympy.Derivative ):
    def __init__( self, var ):
        super( D, self ).__init__()
        self.var = var
    def __mul__(self, other):
        return sympy.diff( other, self.var )
Этот класс сам по себе решает, когда матрица дифференциальных операторов умножается слева. Здесь diff выполняется только тогда, когда известна дифференцируемая функция.
Чтобы обойти, когда матрица дифференциальных операторов умножается справа, метод __mul__ в базовом классе Expr должен был быть изменен следующим образом:
class Expr(Basic, EvalfMixin):
    # ...
    def __mul__(self, other):
        import sympy
        if other.__class__.__name__ == 'D':
            return sympy.diff( self, other.var )
        else:
            return Mul(self, other)
    #...
Это работает очень хорошо, но в Sympy должно быть лучшее собственное решение для Sympy. Кто-нибудь знает, что это может быть?
