用sympy.diffgeom

时间:2015-10-02 17:29:49

标签: python sympy

我试图用公制g的符号表达式确定黎曼曲率张量。我已经预先计算了指标。笛卡尔坐标以

给出
  • x = x(η,theta,psi)= a * sinh(eta)* cos(psi)/(cosh(η) - cos(theta))
  • y = y(η,theta,psi)= a * sinh(η)* sin(psi)/(cosh(η) - cos(theta))
  • z = z(η,theta,psi)= a * sin(theta))/(cosh(eta) - cos(theta))

从笛卡尔坐标(x,y,z)到环形坐标(η,theta,psi)的变换找到度量。使用符号包SymPy,以下脚本

from sympy.diffgeom import Manifold, Patch, CoordSystem, TensorProduct
from sympy.abc import theta, eta, psi
import sympy as sym

x,y,z,a = sym.symbols("x y z a")
m = Manifold("M",3)
patch = Patch("P",m)

cartesian = CoordSystem("cartesian",patch)
toroidal = CoordSystem("toroidal",patch)

from sympy import sin,cos,sinh,cosh
toroidal.connect_to(cartesian,[eta,theta,psi],
[(a*sinh(eta)*cos(psi))/(cosh(eta) - cos(theta)),
 (a*sinh(eta)*sin(psi))/(cosh(eta) - cos(theta)),
 (a*sin(theta))/(cosh(eta) - cos(theta))],inverse=False)

g = sym.Matrix([[a**2/(cos(theta) - cosh(eta))**2,        0,           0],
                [0,           a**2/(cos(theta) - cosh(eta)),           0],
                [0,   0,   a**2*sinh(eta)**2/(cos(theta) - cosh(eta))**2]])

diff_forms = toroidal.base_oneforms()
metric_diff_form = sum([TensorProduct(di, dj)*g[i, j] for i, di in enumerate(diff_forms) for j, dj in enumerate(diff_forms)])

from sympy.diffgeom import metric_to_Riemann_components
metric_to_Riemann_components(metric_diff_form)

生成结果

((((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0))),
 (((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0))),
 (((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0)),
  ((0, 0, 0), (0, 0, 0), (0, 0, 0))))

给定指标g的结果不正确。结果应该是非平凡的。

1 个答案:

答案 0 :(得分:1)

你应该将 eta,theta,phi 声明为坐标函数,即:

eta, theta, phi = toroidal.coord_functions()

坐标函数 diffgeom 模块中使用的标量变量。 此外,我建议在声明坐标系时声明坐标函数字符串:

toroidal = CoordSystem("toroidal", patch, ["eta", "theta", "psi"])

Riemann分量的推导是通过坐标函数的推导来实现的,它们是它们自己类型的变量(即它们不是实例 Symbol )。任何 Symbol 实例,即使具有坐标函数的相同名称,在推导时也被视为不同且常量。因此结果为零。

使用这些变量重新声明矩阵,它应该可以解决。