Python 用SymPy.Diffgeom确定平面球面的克里斯托弗符号和曲率张量

Python 用SymPy.Diffgeom确定平面球面的克里斯托弗符号和曲率张量,python,sympy,Python,Sympy,使用,我试图确定给定度量张量的Christoffel符号。我在确定平面球体的克里斯托弗符号(r=常数,θ,φ)时遇到了一些问题。曲线元素定义如下: 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,θ,φ)的三维中,这

使用,我试图确定给定度量张量的Christoffel符号。我在确定平面球体的克里斯托弗符号(r=常数,θ,φ)时遇到了一些问题。曲线元素定义如下:

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,θ,φ)的三维中,这转化为

g = Matrix([[0,0,0],[0,r**2,0],[0,0,r**2*sin(theta)**2]]).
将此g提供给代码会导致
平坦度
。(我已将源代码粘贴到此处:,)

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

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\u metric
)。注意,度量
g
是单数的,因此不能用于确定克里斯托弗符号。相反,在这种情况下,我强制用户提供
flat_g
作为附加参数,以便在确定曲线元素后将
g
重置为
flat_g
。因此,最明显的答案不再那么明显了(即,我提供了一个奇异矩阵作为参数)

有了这两种形式,我可以使用Symphy.Diffgeom库来确定第一类和第二类的Christoffel符号、Riemann-Christoffel张量、Ricci张量、标量曲率等。但是,当我将
flat\u metric
作为以下任何函数的参数时,我会遇到一些问题:
metric\u to*
(在Sympy.Diffgeom模块中)

当我试图确定第二类克里斯托菲尔符号时,我得到以下错误:

ValueError: Matrix det == 0; not invertible.
(我已经粘贴了整个错误消息)

如果我只是简单地为这种特定情况手工编写代码,我会得到“更好”的结果。在这种情况下,以下代码会尝试查找第二种类型的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))
使用这个curve元素(它产生的结果与我的实现完全相同!)我可以计算Christoffel符号,以及任意阶曲率张量(即Riemann、Ricci、Scalar)。但是,计算的克里斯托弗符号不正确。我已经在上的一篇文章中讨论了这一点。根据上述代码生成的第二类克里斯托弗符号是:

Matrix([[(0,                     0), (0, -sin(theta)*cos(theta))],
        [(0, cos(theta)/sin(theta)), (cos(theta)/sin(theta), 0)]])
然而,正如在文章中提到的,正确的克里斯托菲尔符号是

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

因此,即使是手工编码的示例也失败了。

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

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

在我看来,你已经在二维流形中定义了一个度量,你试图通过简单地在二维流形中添加一行和一列零来在三维流形中找到这个度量的扩展。我认为这不是正确的过程

子流形上的度量可以使用适当的公式找到,请参见:


在超人身上寻找度量(如您的情况)并不是一个唯一定义的问题,因为在3D流形上可能有许多度量将导致您在2D流形上的度量。但是,您仍然可以尝试使用该公式,并尝试构建一个在3D空间中使用的超级度量。

sympy.diffgeom.metric\u to\u Christoffel\u 2nd(expr)
返回给定指标的克里斯托弗符号嵌套列表。

这是一个德国网站,但代码是用英语注释的。我想了好几天才发布这个问题,但每次我鼓起勇气这么做,一想到要尽量减少我提供的信息(以免让读者不知所措),我就发抖.我希望我至少在某种程度上做到了这一点。即便如此,我还是要向有勇气经历这一过程的人提前道歉,谢谢你!我使用的度量标准不是单数:
g=Matrix([[r**2,0],[0,r**2*sin(θ)**2]]
。它实际上是正定的。诱导的度量链接很有用。谢谢!嗨,Alexander,欢迎使用SO!如果您能更努力地格式化您的答案并提供指向其他资源的链接,那就太好了。另请参阅抱歉,有人试图做一些在同一模块sympy.diffg中有特殊功能的事情eom。我想他知道在哪里可以得到这个模块的文档,因为他使用它。我给出了函数的名称以及它的功能。谢谢。