使用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
。 (我在此处粘贴了我的源代码:Riemann,find_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)]])
所以即使手动编码的例子也失败了。
答案 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符号列表。