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