Python - Sympy:如何计算谎言导数

时间:2016-03-23 13:14:16

标签: python sympy

请考虑以下脚本;我们如何使用python计算h相对于f的Lie导数?

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) # ???

1 个答案:

答案 0 :(得分:1)

使用 diffgeom 中的运算符时,应使用 sympy.diffgeom 中定义的符号。

您的设置可能如下所示:

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()

目前不支持矩阵,您必须将它们表示为基本矢量字段的线性组合:

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

然后将导出的向量定义为组件和基本向量的总和:

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  

更准确地说,你应该定义一个维度为3的新流形,然后是一个贴片,然后是贴片上的坐标系,以便表示 R ^ 3 空间。你投射。为简单起见,我使用相同歧管上的投影来避免定义新的投影。

注意:您可能需要最新版本的SymPy(版本1.0),之前有一个错误会阻碍 diffgeom 对象的简化。