用 sympy.diffgeom 求黎曼曲率张量

Finding the Riemann curvature tensor with sympy.diffgeom

我正在尝试用度量 g 的符号表达式来确定黎曼曲率张量。我已经预先计算了指标。笛卡尔坐标为

从笛卡尔 (x,y,z) 到环形坐标 (eta,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,结果不正确。结果应该很重要。

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

eta, theta, phi = toroidal.coord_functions()

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

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

黎曼分量的推导是通过对坐标函数的推导实现的,它们是自己类型的变量(即它们不是实例Symbol).任何 Symbol 实例,即使具有与 坐标函数 相同的名称,在推导过程中也被认为是不同的和常量。因此结果为零。

用这些变量重新声明你的矩阵,它应该会成功。