2016-03-23 17 views
2

Bitte beachten Sie das folgende Skript; Wie können wir die Lie Ableitung von h in Bezug auf f mit Python berechnen?Python - Sympy: wie man Lügenableitung berechnet

import sympy as sym 

x, y, L, u , v = sym.symbols('x y L u v') 
X = sym.Matrix([[x],[y], [L], [u], [v]]) 

# f(x,y,L,u,v) : R^5-->R^3 
f = sym.Matrix([[ x + u], [ y + v ], [L]]) 

# h(x,y,L) : R^3-->R^1 
h = sym.Matrix([[ sym.sqrt(L**2 + (y - x)**2) ]]) 

# L1hf : first-order lie derivative of h wrt f 
L1hf = sym.diffgeom.LieDerivative(f,h) # ??? 

Antwort

1

Sie sollten in sympy.diffgeom definierten Symbole verwenden, wenn Betreiber von diffgeom verwenden.

Ihre Einrichtung aussehen könnte:

In [1]: from sympy.diffgeom import * 

In [4]: M = Manifold("M", 5) 

In [5]: P = Patch("P", M) 

In [6]: coord = CoordSystem("coord", P, ["x", "y", "L", "u", "v"]) 

In [7]: x, y, L, u, v = coord.coord_functions() 

Matrices werden derzeit nicht unterstützt, müssen Sie sie als lineare Kombination von Basisvektorfelder zum Ausdruck bringen:

In [19]: e_x, e_y, e_L, e_u, e_v = coord.base_vectors() 

Dann definieren den Vektor WRT Sie ableiten als eine Summe von Komponenten und Basisvektoren:

In [27]: expr = (x + u)*e_x + (y + v)*e_y + L*e_L 

In [28]: LieDerivative(expr, sqrt(L**2 + (y - x)**2)) 
Out[28]: 
                 2   
    (-x + y)⋅(x + u)  (-x + y)⋅(y + v)    L   
- ─────────────────── + ─────────────────── + ─────────────────── 
    ________________  ________________  ________________ 
    ╱   2 2  ╱   2 2  ╱   2 2 
    ╲╱ (-x + y) + L  ╲╱ (-x + y) + L  ╲╱ (-x + y) + L 

Um mehr zu sein präzise, ​​Sie sollten eine neue Mannigfaltigkeit der Dimension 3 definieren, dann ein Patch darauf, dann ein Koordinatensystem auf dem Patch, um den Raum, auf den Sie projizieren, darzustellen. Der Einfachheit halber habe ich die Projektion auf die gleiche Mannigfaltigkeit verwendet, um zu vermeiden, dass eine neue Mannigfaltigkeit definiert wird.

HINWEIS: Sie wahrscheinlich benötigen die neueste Version von SymPy (Version 1.0), früher ein Fehler war, die Objekte Vereinfachung der diffgeom behindert.

+0

Vielen Dank. – sci9

+0

Aber was ist mit Derivaten zweiter Ordnung? Ist das folgende Setup korrekt oder gibt es einen effektiveren Weg? >>> 'expr = (x + u) * e_x + (y + v) * e_y + L * e_L' >>>' L1fh = LieDerivativ (expr, sqrt (L ** 2 + (y - x) * * 2)) ' >>>' expr2 = L1fh.args [2] * e_x + L1fh.args [1] * e_y + L1fh.args [0] * e_L' >>> 'L2fh = LieDerivativ (ausdr2 , sqrt (L ** 2 + (y - x) ** 2)) ' >>>' pprint (L2fh) ' – sci9

+0

Wenn das Ergebnis korrekt ist, nehme ich an, das ist der Weg zu gehen. –