Python - Sympy:如何计算 lie 导数
Python - Sympy: how to compute lie derivative
请考虑以下脚本;我们如何使用 python?
计算 h 关于 f 的李导数
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) # ???
在使用 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维流形,然后在上面定义一个patch,然后在patch上定义一个坐标系,为了表示R^3 space 你投射的。为简单起见,我使用同一流形上的投影以避免定义新流形。
注意:您可能需要最新版本的 SymPy(1.0 版),之前有一个错误阻碍了 diffgeom 的简化对象。
请考虑以下脚本;我们如何使用 python?
计算 h 关于 f 的李导数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) # ???
在使用 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维流形,然后在上面定义一个patch,然后在patch上定义一个坐标系,为了表示R^3 space 你投射的。为简单起见,我使用同一流形上的投影以避免定义新流形。
注意:您可能需要最新版本的 SymPy(1.0 版),之前有一个错误阻碍了 diffgeom 的简化对象。