Python 用辛微分几何求黎曼曲率张量

Python 用辛微分几何求黎曼曲率张量,python,sympy,Python,Sympy,我试图用度量g的符号表达式来确定黎曼曲率张量。我已经预先计算了指标。笛卡尔坐标如下所示: x=x(eta,θ,psi)=a*sinh(eta)*cos(psi)/(cosh(eta)-cos(θ)) y=y(eta,θ,psi)=a*sinh(eta)*sin(psi)/(cosh(eta)-cos(θ)) z=z(eta,θ,psi)=a*sin(θ))/(cosh(eta)-cos(θ)) 从笛卡尔坐标系(x,y,z)到环面坐标系(eta,θ,psi)的变换中可以找到度量。使用符号包Sy

我试图用度量g的符号表达式来确定黎曼曲率张量。我已经预先计算了指标。笛卡尔坐标如下所示:

  • x=x(eta,θ,psi)=a*sinh(eta)*cos(psi)/(cosh(eta)-cos(θ))
  • y=y(eta,θ,psi)=a*sinh(eta)*sin(psi)/(cosh(eta)-cos(θ))
  • z=z(eta,θ,psi)=a*sin(θ))/(cosh(eta)-cos(θ))
从笛卡尔坐标系(x,y,z)到环面坐标系(eta,θ,psi)的变换中可以找到度量。使用符号包Symphy,可以创建以下脚本

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"])
黎曼分量的推导是通过坐标函数的推导来实现的,坐标函数是其自身类型的变量(即它们不是符号实例)。任何符号实例,即使具有坐标函数的相同名称,在派生过程中也会被视为不同的常量。因此,结果为零


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

我现在得到的结果非同寻常!我还注意到,如果度量是用sympy.abc eta,theta,psi预定义的,那么结果再次变得微不足道。我必须使用这些定义为“sympy.diffgeom.diffgeom.BaseScalarField”对象的变量。环形.connect_to()函数调用会导致异常AttributeError:“BaseScalarField”对象没有“as_dummy”属性。我想您需要使用带有connect_to()的符号,不是BaseScalarField。在曲率张量的条目上,simplify和trigsimp似乎也有问题。AttributeError:'int'对象没有属性'is_Rational'。通过将每个条目转换为字符串,然后对字符串表达式执行simplify,我成功地解决了这个问题,并在度量中找到了一个错误。g_22部件错误。修正了这个问题,并遵循下面的建议,我仍然得到了上面描述的微不足道的结果。度量应该如下:
g=sym.矩阵([[a**2/(cos(θ)-cosh(eta))**2,0,0],[0,a**2/(cos(θ)-cosh(eta))**2,0],[0,0,a**2*sinh(eta)**2/(cos(θcos-cosh(eta))**2])
。以下是脚本的更正版本: