前段时间我在广义相对论中写了一个张量微积分包。为了使其他人可以轻松访问,应稍加修改。
有一些函数,例如用于计算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:
这种方式涉及缺点,因为指数范围是{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
。
我的问题是:
[0, 0]
? Part
来访问张量分量0,0
如何在一个包中引入一个自由选择其他对象的索引范围,如Christoffel(比如默认索引范围 - {0, 1, 2, 3}
或者更喜欢 - {1, 2, 3, 4}
)? 虽然这些问题乍一看似乎微不足道,但欢迎任何全面的答案。使用包装的任何人都不应该对Mathematica的微妙之处感到烦恼。
答案 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}
List
为FullForm
。您可以使用FullForm
查看这些内容。其他类型也有概念头,即使它们在Head
中不明确。您可以使用Head /@ {"abc", 1, Pi, 3.14, 1/2}
确定这些内容。例如:
Part
{String, Integer, Symbol, Real, Rational}
[[0, 0]]
语法List
要求头部的头部。对于数组(列表列表),头部为List
,Symbol
本身的头部为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