gpt4 book ai didi

python - 使用 sympy.diffgeom 求黎曼曲率张量

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:08 27 4
gpt4 key购买 nike

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

  • x = x(eta,theta,psi) = a*sinh(eta)*cos(psi)/(cosh(eta) - cos(theta))
  • y = y(eta,theta,psi) = a*sinh(eta)*sin(psi)/(cosh(eta) - cos(theta))
  • z = z(eta,theta,psi) = a*sin(theta))/(cosh(eta) - cos(theta))

该度量是通过从笛卡尔 (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实例,即使与坐标函数同名,在推导过程中也被认为是不同且恒定的。因此结果为零。

用这些变量重新声明你的矩阵,它应该可以工作。

关于python - 使用 sympy.diffgeom 求黎曼曲率张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32912669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com