Dyferencjał Operator może być używany w postaci Matrix, w module Python Sympy
Potrzebujemy dwóch macierzy operatorów różnicowych[B]
i[C]
Jak na przykład:
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]
Można to również zastosować do obliczenia zwinięcia pola wektorowego, takiego jak:
culr = sympy.Matrix([[ D(x), D(y), D(z) ]])
field = sympy.Matrix([[ x**2*y, x*y*z, -x**2*y**2 ]])
Aby rozwiązać ten problem za pomocą Sympy, trzeba było utworzyć następującą klasę Pythona:
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 )
Sama ta klasa rozwiązuje się, gdy macierz operatorów różnicowych mnożona jest po lewej stronie. Tutajdiff
jest wykonywany tylko wtedy, gdy znana jest funkcja, która ma być zróżnicowana.
Aby obejść problem, gdy macierz operatorów różnicowych jest mnożona po prawej stronie,__mul__
metoda w klasie podstawowejExpr
musiał zostać zmieniony w następujący sposób:
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)
#...
Działa całkiem nieźle, ale w Sympy powinno być lepsze natywne rozwiązanie, aby sobie z tym poradzić. Czy ktoś wie, co to może być?