Дифференциальный оператор, используемый в матричной форме, в модуле Python Sympy

Нам нужны две матрицы дифференциальных операторов[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 должно быть лучшее нативное решение для этого. Кто-нибудь знает, что это может быть?

Ответы на вопрос(4)

Ваш ответ на вопрос