gpt4 book ai didi

wolfram-mathematica - 从 0 开始张量指数

转载 作者:行者123 更新时间:2023-12-03 18:30:16 25 4
gpt4 key购买 nike

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

有像 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 session 中定义,例如为静态球对称时空放置 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理所当然。

我的问题是:
  • 我如何重新定义 V 以便能够评估“表”组件 [0, 0] ?
  • 引入索引从 0 开始的矩阵 g 的最方便的方法是什么?
  • 由于我不得不放弃使用 Part访问张量分量 0,0如何在包中引入自由选择其他对象的索引范围,例如 Christoffel(假设默认索引范围 - {0, 1, 2, 3} 或者如果更喜欢 - {1, 2, 3, 4})?

  • 虽然这些问题乍一看似乎微不足道,但欢迎任何全面的答案。任何使用包的人都不应该为 Mathematica 的微妙之处而烦恼。

    最佳答案

    我无意对您的担忧轻率或轻率,但是我在理解您的困境的重要性时遇到了一些麻烦。 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

    This works because the heads themselves contains your data. This is not advisable, but presented for academic interest.


    In specific answer to your first question, and for explanation of the trick above, you must be familiar with Mathematica heads. Every expression conceptually has a head. In the expression a + b the head is Plus. In {1, 2, 3} it is List. You can see these written out by using FullForm. Other types also have conceptual heads, even if they are not explicit in FullForm. You can determine these using Head. For example:

    Head /@ {"abc", 1, Pi, 3.14, 1/2}
    {String, Integer, Symbol, Real, Rational}

    The Part syntax [[0, 0]] asks for the head of the head. In the case of your array, which is a list of lists, the head is List, and the head of List itself is Symbol, which defines its type.


    In reply to your second question, I would define a new Part function that indexes from zero.

    myPart[x_, spec__] := Part[x, ##] & @@ ({spec} /. n_Integer :> n + 1)

    V = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    myPart[V, 0, 0]
    1

    This also works with Span:

    myPart[V, All, 0 ;; 1]

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

    关于wolfram-mathematica - 从 0 开始张量指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087854/

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