启动张量指数为0

时间:2011-11-10 23:26:54

标签: wolfram-mathematica

前段时间我在广义相对论中写了一个张量微积分包。为了使其他人可以轻松访问,应稍加修改。

有一些函数,例如用于计算Christoffel符号的Christoffel:

Christoffel[g_, xx_] := 
    Block[{ig, res, n}, 
           n = 4;
           ig = Simplify[Inverse[g]]; 
           res = Table[(1/2)*Sum[ig[[i,s]]*(-D[g[[j,k]], xx[[s]]] + D[g[[j,s]], xx[[k]]] 
                             + D[g[[s,k]], xx[[j]]]), {s, 1, n}], {i, 1, n}, {j, 1, n}, {k, 1, n}];
       res
     ] 

其中g和xx分别是度量张量和坐标,我在Mathematica会话中以直接的方式上传包后定义,例如为静态球对称时空设置ansatz:   metric  这种方式涉及缺点,因为指数范围是{1, 2, 3, 4},而相对论物理学中的常见做法建议将{0, 1, 2, 3}置于0代表时间坐标,而{1, 2, 3}代表类似空间的坐标。
   为了说明这个问题,让我们定义一个索引从0开始的表,即

V = Table[i - j, {i, 0, 3}, {j, 0, 3}] 
{{0, -1, -2, -3}, {1, 0, -1, -2}, {2, 1, 0, -1}, {3, 2, 1, 0}}

但是当我评价时  V[[0, 0]] 我得到Symbol - V的头,
  而对于V[[1, 2]],我应该得到-1

我的问题是:

  1. 如何重新定义V以便能够评估“table”组件[0, 0]
  2. 引入矩阵g且其索引从0开始的最方便的方法是什么?
  3. 由于我不得不放弃使用Part来访问张量分量0,0 如何在一个包中引入一个自由选择其他对象的索引范围,如Christoffel(比如默认索引范围 - {0, 1, 2, 3}或者更喜欢 - {1, 2, 3, 4})?
  4. 虽然这些问题乍一看似乎微不足道,但欢迎任何全面的答案。使用包装的任何人都不应该对Mathematica的微妙之处感到烦恼。

2 个答案:

答案 0 :(得分:10)

我不打算对你的担忧感到琐碎或轻率,但是我在理解你的困境的重要性时遇到了一些麻烦。 Mathematica ,或更具体地来自一个Part索引,这就是它的方式。我很想说使用例如V[[n+1]]但我必须假设您已经考虑过这一点。


索引0保留给表达式的头部。虽然它远非标准,但 Mathematica 语法的灵活性实际上允许这种结构:

V = 0[-1, -2, -3][{1, 0, -1, -2}, {2, 1, 0, -1}, {3, 2, 1, 0}];

V[[0,2]]
-2

这是有效的,因为磁头本身包含您的数据。这是不可取的,但是出于学术兴趣而提出。


在对第一个问题的具体回答中,以及对上述技巧的解释,您必须熟悉 Mathematica 元首。每个表达在概念上都有一个头脑。在表达式a + b中,头部为Plus{1, 2, 3} ListFullForm。您可以使用FullForm查看这些内容。其他类型也有概念头,即使它们在Head中不明确。您可以使用Head /@ {"abc", 1, Pi, 3.14, 1/2} 确定这些内容。例如:

Part
{String, Integer, Symbol, Real, Rational}

[[0, 0]]语法List要求头部的头部。对于数组(列表列表),头部为ListSymbol本身的头部为myPart[x_, spec__] := Part[x, ##] & @@ ({spec} /. n_Integer :> n + 1) V = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; myPart[V, 0, 0] ,用于定义其类型。


在回答你的第二个问题时,我会定义一个从零开始索引的新零件函数。

Span
1

这也适用于myPart[V, All, 0 ;; 1]

{{1}}
{{1, 2}, {4, 5}, {7, 8}}

答案 1 :(得分:6)

(1)Mathematica列表索引,通过Part([[]]用更常见的表示法)从1开始.0部分是表达式的头部。

(2)可以定义一个“函数”,它获取你想要的索引并为每个索引加1。

xx = {t, x, \[Theta], \[Phi]}; 
g = {{-E^(2*\[Nu][x]), 0, 0, 0}, {0, E^(2*\[Lambda][x]), 0, 0}, {0, 
    0, x^2, 0}, {0, 0, 0, x^2*Sin[\[Theta]]^2}}; 

gg[indices___] := g[[Sequence @@ ({indices} + 1)]]

示例:

In[121]:= gg[0]
Out[121]= {-E^(2*\[Nu][x]), 0, 0, 0}

In[123]:= gg[2, 2]
Out[123]= x^2

(3)可能的方法见(2)。请参阅(1)以了解该部分不是直接的方式。

Daniel Lichtblau