将sympy矩阵转换为双形式(sympy.diffgeom)

时间:2015-10-01 13:48:48

标签: python sympy

有没有办法将对称SymPy矩阵转换为双形式?

当我尝试使用

sym.diffgeom.metric_to_Christoffel_1st(expr)

以下矩阵

Matrix([[a**2/(cos(theta) - cosh(eta))**2, 0, 0], 
        [0, a**2/(cos(theta) - cosh(eta))**2, 0], 
        [0, 0, a**2*sinh(eta)**2/(cos(theta) - cosh(eta))**2]])

我收到错误

ValueError: The input expression is not a two-form.

矩阵表达式是笛卡尔坐标和环形坐标之间转换的度量。当我尝试在其他sympy.diffgeom.metric_to_*函数上使用指标时,我得到了同样的错误。

1 个答案:

答案 0 :(得分:1)

假设您的指标矩阵存储在变量 m 中,您可以执行以下操作:

diff_forms = your_coord_system.base_oneforms()

metric_diff_form = sum([TensorProduct(di, dj)*m[i, j] for i, di in enumerate(diff_forms) for j, dj in enumerate(diff_forms)])

请注意,对于单一形式, TensorProduct(dx,dy)= -TensorProduct(dy,dx),这意味着如果您的矩阵不是对角线,则元素 m [i, j] 将总结为元素 m [i,j] i!= j

如果你有一个对称矩阵,并且你希望只添加一次非对角线元素,那么为 i!= j 添加一个 1/2 项。