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ć?

questionAnswers(4)

yourAnswerToTheQuestion