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