Начальные тензорные индексы с 0 - PullRequest
4 голосов
/ 11 ноября 2011

Некоторое время назад я написал пакет для тензорного исчисления в Общей теории относительности. Чтобы сделать его легкодоступным для других, его следует немного изменить.

Существуют такие функции, как, например, Кристоффель для вычисления символа Кристоффеля:

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 после прямой загрузки пакета, помещая, например, анзац для статического сферически-симметричного пространства-времени: 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, чтобы можно было оценить "табличный" компонент [0, 0]?
  2. Какой самый удобный способ представить матрицу g с ее индексами, начинающимися с 0?
  3. Поскольку я вынужден отказаться от использования Part для доступа к тензорным компонентам 0,0 как ввести в пакет свободу выбора диапазонов индексов других объектов, таких как Christoffel (скажем, по умолчанию диапазоны индексов - {0, 1, 2, 3} или, если предпочитают - {1, 2, 3, 4})?

Хотя эти вопросы на первый взгляд кажутся тривиальными, но любые исчерпывающие ответы приветствуются. Любой, кто использует пакет, не должен беспокоиться о тонкостях Mathematica.

Ответы [ 2 ]

10 голосов
/ 11 ноября 2011

Я не собираюсь быть легкомысленным или легкомысленным в отношении вашей заботы, однако мне трудно понять значение вашей дилеммы. 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}
{String, Integer, Symbol, Real, Rational}

Синтаксис Part [[0, 0]] запрашивает голову.В случае вашего массива, который представляет собой список списков, заголовок равен List, а заголовок самого List равен Symbol, что определяет его тип.


В ответна ваш второй вопрос, я бы определил новую функцию Part, которая индексирует от нуля.

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

Это также работает с Span:

myPart[V, All, 0 ;; 1]
{{1, 2}, {4, 5}, {7, 8}}
6 голосов
/ 11 ноября 2011

(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), чтобы понять, что Часть НЕ является прямым путем.

Даниэль Лихтблау

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...