使用SymPy.Diffgeom确定平面球的Christoffel符号和曲率张量

时间:2015-10-31 16:37:51

标签: python sympy

使用SymPy.Diffgeom library,我试图确定给定度量张量的Christoffel符号。我在确定平面球体的Christoffel符号时存在一些问题(r =常数,θ,phi)。 curve元素定义如下:

flat_metric = r**2*sin(theta)**2*TensorProduct(dphi, dphi) + r**2*TensorProduct(dtheta, dtheta)

度量张量以

表示
flat_g = Matrix([[r**2,0],[0,r**2*sin(theta)**2]]).

在坐标(r,theta,phi)的3维中,这转换为

g = Matrix([[0,0,0],[0,r**2,0],[0,0,r**2*sin(theta)**2]]).

将此g提供给代码会产生flat_metric。 (我在此处粘贴了我的源代码:Riemannfind_metric)。

请注意,对于球体,度量张量定义为

g = Matrix([[1,0,0],[0,r**2,0],[0,0,r**2*sin(theta)**2]]).

使用这个最后的张量,我的代码将生成以下曲线元素

metric_sphere = TensorProduct(dr, dr) + r**2*sin(theta)**2*TensorProduct(dphi, dphi) + r**2*TensorProduct(dtheta, dtheta)

我的代码采用指标g,

g = Matrix([[0,0,0],[0,r**2,0],[0,0,r**2*sin(theta)**2]]).

并确定曲线元素(上面以双格形式列出; flat_metric)。请注意,度量g是单数,因此它不能用于确定Christoffel符号。相反,我强制用户在这种情况下,提供flat_g作为附加参数,以便在确定了curve元素后将g重置为flat_g。所以最明显的答案不再那么明显(即我提供一个单数矩阵作为论证。)

有了这两种形式,我可以使用Sympy.Diffgeom库来确定第一类和第二类的Christoffel符号,Riemann-Christoffel张量,Ricci张量,Scalar-Curvature等。但是,我遇到了一些问题。我提供flat_metric作为以下任何函数的参数:metric_to_*(在Sympy.Diffgeom模块中)。

当我试图确定第二种Christoffel符号时,我得到以下错误:

ValueError: Matrix det == 0; not invertible.

(我已粘贴整个错误消息here)。

我得到了更好的"结果,如果我只是为这个特定情况手工编码。在这种情况下,以下代码试图找到第二种Christoffel符号:

from sympy.diffgeom import Manifold, Patch, CoordSystem
from sympy.diffgeom import TensorProduct, metric_to_Christoffel_2nd
from sympy import sin, Matrix
dim = 2
m = Manifold("M",dim)
patch = Patch("P",m)
flat_sphere = CoordSystem("flat_sphere", patch, ["theta", "phi"])
theta, phi = flat_sphere.coord_functions()
from sympy.abc import r
g = Matrix([[r**2,0],[0,r**2*sin(theta)**2]])
diff_forms = flat_sphere.base_oneforms()
curve = sum([TensorProduct(di, dj)*g[i, j] 
           for i, di in enumerate(diff_forms) 
           for j, dj in enumerate(diff_forms)])
Matrix(metric_to_Christoffel_2nd(curve))

使用这个曲线元素(它产生与我的实现完全相同的!)我可以计算Christoffel符号,以及任何阶数曲率张量(即Riemann,Ricci,Scalar)。但是,计算出的Christoffel符号不正确。我已在scicomp的帖子中讨论了这个问题。从上面的代码生成的第二类Christoffel符号是:

Matrix([[(0,                     0), (0, -sin(theta)*cos(theta))],
        [(0, cos(theta)/sin(theta)), (cos(theta)/sin(theta), 0)]])

但是,如scicomp帖子所述,正确的Christoffel符号是

Matrix([[(0,       -tan(theta)), (0, 0)],
        [(sin(theta)*cos(theta), 0), (0, 0)]])

所以即使手动编码的例子也失败了。

2 个答案:

答案 0 :(得分:1)

您的问题似乎有点令人困惑,但也许您可以尝试一些事情。

首先, ValueError:Matrix det == 0;不可逆。意味着你需要一个可逆矩阵。您的指标是单数,因此它不是指标,您不能在算法中使用它。

在我看来,您已经在二维流形中定义了一个度量标准,并且您试图通过向您的2中添加一行和一列零来在三维流形中找到该度量的扩展。 - 度量标准。我认为这不是正确的程序。

使用适当的公式可以找到在子流形上引起的度量,请参阅: https://en.wikipedia.org/wiki/Induced_metric

在超流形上查找度量(如在您的情况下)并不是唯一定义的问题,因为3D流形上可能有许多度量会在2D流形上引起您的度量。但是,您仍可以尝试使用该公式并尝试构建在3D空间中使用的超级衡量指标。

答案 1 :(得分:-2)

sympy.diffgeom.metric_to_Christoffel_2nd(表达式) 返回给定度量的嵌套Christoffel符号列表。