Inicial > Ars Physica, arXiv, astro-ph, gr-qc, hep-ph, hep-th > Relatividade Geral no Mathematica

Relatividade Geral no Mathematica

sábado, 5 mar 2011; \09\America/New_York\America/New_York\k 09 Deixe um comentário Go to comments

Esse post é diferente do que eu escrevo usualmente, será um tutorial de um programa em desenvolvimento para fazer contas simbólicas em gravitação no Mathematica. Isso pode ser muito últil em um curso de Relatividade Geral da pós-graduação e teoria quântica de campos em espaço-tempos curvos, além de pesquisa.

Primeiro, você vai precisar do pacote xAct:

http://www.xact.es/

O xAct é dividido em vários subpacotes, eu vou me concentrar nos dois primeiros destes aqui:

  1. xTensor: permite usar a mesma notação de tensores usada na física, dentro do Mathematica. É a função principal do xAct.
  2. xCoba: permite definir sistemas de coordenadas.
  3. xPert: teoria de perturbação em gravitação.

Eu coloquei o terceiro acima para chamar a sua atenção. O objetivo do xAct é permitir escrever contas complicadas usando tensores, o que se tornou necessário com o avanço da cosmologia que hoje já requer perturbação em segunda ordem em Relatividade Geral.

Primeiro, vamos carregar o pacote principal. No Mathematica, exceto a versão 8, execute esse comando:

<<xAct`xTensor`

No Mathematica 8, o pacote gera alarmes com respeito as funções internas de teoria de grupo do Mathematica, então antes de carregar o pacote, execute:

{xAct`xPerm`Cycles, xAct`xPerm`Permute,
xAct`xPerm`RightCosetRepresentative, xAct`xPerm`CyclicGroup};

Devido a uma configuração padrão do Mathematica, as equações vão sair com os índices tensoriais acompanhados por um cifrão $, então por questões de estética:

$PrePrint= ScreenDollarIndices ;

A primeira coisa que precisamos definir é uma variedade de dimensão específica para trabalhar:

DefManifold[M,4, IndexRange[a,q]]

O comando acima irá avisar ao Mathematica que vamos fazer as contas em cima de uma variedade de dimensão 4, e que vamos usar as letras de a a q para os índices dos tensores, como em gab, uma notação que não é estranha para quem conhece o livro do Robert Wald. Essa notação é mais útil para o Mathematica, mas se você prefere usar índices gregos, pode substituir o último argumento do DefManifold por uma lista, como

DefManifold[M, 4, {μ , ν , ρ , σ , κ}]

Quando uma expressão tiver mais índices do que os definidos pelo comando acima, o xAct vai imprimi-las usando números, como ga1 a2.

No xAct, um tensor sobre M é definido com o comando

DefTensor[vector[-a], M, PrintAs -> "A"]

Com isso eu posso agora invocar um vetor com o nome de vector. Após o nome, em colchetes deve vir os índices do tensor, nesse caso, eu coloquei um. Escalares são definidos com os colchetes vazios: scalar[]. Se você preferiu usar as letras gregas para índice, você deve usar uma delas no lugar do meu índice latino. O sinal na frente do índice indica se ele é covariante ou contravariante. A relevância dessa especificação no momento de declaração é que em comandos do xAct para simplificar expressões como ToCanonical e SeparateMetric[], que vão aparecer mais adiante, o xAct rebaixa ou sobe os índices para que eles adquiram a sua forma “natural”, i.e. aquela do momento de definição. A opção PrintAs é válida para vários comandos do xAct:

In = vector[-a]
Out = Aa

Há duas outras opções desse comando que são muito úteis e vale eu falar aqui mesmo. Primeiro, tensores no xAct podem depender do ponto da variedade M e de um parâmetro externo, não relacionado com M:

DefParameter[scale, PrintAs -> "λ"]
DefTensor[conformal[a, b], {M, scale}]

O meu campo tensorial conformal depende de ponto de M e de um parâmetro real λ.

A segunda opção é que o tensor pode conter índices que não são de espaço-tempo:

DefTensor[X[LI@L,LI@M,-a], M]

O comando acima define um conjunto de tensores XL,Ma, com os índices L, M sendo números inteiros não relacionados a métrica da variedade. Eles podem representar, e.g., o conjunto das harmônicas esféricas vetoriais.

Agora é possível escrever expressões no Mathematica com a notação usual da física:

In = vector[-a] vector[b] vector[-c] vector[c]
Out = Aa Ab AcAc

com a soma das componentes subentendida e dois índices livres.

Okay! Agora vamos dotar M de uma métrica. xAct suporta tanto métricas de espaço-tempo como métricas positivas:

DefMetric[-1, metric[-a,-b], Cd, PrintAs -> "g"]

No primeiro argumento, definimos qual o “sinal” da métrica, -1 é o caso do espaço-tempo (-,+++), e +1 é o caso positivo (++++). O segundo argumento define um tensor que é invocado nos comandos com o nome de metric. A métrica sempre tem os dois índices para baixo no comando de definição. O terceiro argumento é o nome do comando para derivada covariante:

In = Cd[-a][metric[-b,-c]]
Out= 0

A derivada covariante recebe dois argumentos, o primeiro é o índice, e o segundo é o tensor no qual ela vai agir.

Com uma métrica, já é possível manipular expressões mais interessantes. Para evidenciar o que eu quis dizer com o xAct permitir a notação de Einstein, podemos considerar, por exemplo, o divergente do vetor:

In = Cd[a][vector[-a]]
Out = ∇aAa

O xAct é dotado de vários comandos para manipular expressões com tensores. Por exemplo:

Cd[a][Cd[-a][vector[-b]]] //ChangeCovD

vai expandir o Laplaciano de A em símbolos de Christoffel:

Out =

Junto com a métrica, são definidos os tensores de curvatura com o nome usual seguido pelo nome do operador derivada covariante. No nosso exemplo, RicciScalarCd[], RicciCd[-a,-b], RiemannCd[-a,-b,-c,-d], etc. A lista de todos os tensores definidos aparece na saída do comando DefMetric. Podemos então construir e manipular expressões como

RicciCd[a,b] vector[-a] vector[-b]
+ (1/2) metric[a,b] RicciScalarCd[] vector[-a] vector[-b]

Agora, vamos ver como lidar com coordenadas. Isso é útil em situações como quando queremos resolver a equação de onda para um tensor. Para isso, precisamos do pacote xCoba:

<<xAct`xCoba`

O comando primordial do xCoba é definir um atlas. Vamos introduzir coordenadas polares:

DefChart[polar, M, {0,1,2,3}, {η[], χ[], θ[], φ[]}]

O nome das coordenadas vem com um par de colchetes porque no xAct as coordenadas serão tratadas como campos escalares.

Para definir a métrica nessas coordenadas, eu vou querer introduzir duas funções novas:

DefScalarFunction[scalefactor, PrintAs-> "a"]
DefScalarFunction[Φ]

Antes de definir minha métrica em coordenadas polares, eu defino uma tabela comum do Mathematica:

metricpolar = scalefactor[η[]] { {-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, Φ[χ[]]^2, 0}, {0, 0, 0, Φ[χ[]]^2 Sin[θ[] ]^2} }

Você pode dar um comando metricpolar // MatrixForm para visualizar melhor a métrica. Finalmente:

MetricInBasis[metric, -polar, metricpolar]

vai associar a métrica a forma dada por metricpolar em coordenadas polar. É muito útil agora usar o comando

MetricCompute[metric, polar, All]

que vai explicitamente calcular os símbolos de Christoffel, o tensor de Riemann, Ricci, o escalar de Ricci, o tensor de Weyl, o tensor de Einstein e outros, em coordenadas polares. Se você quiser ver os tensores que são computados, pode ver rapidamente com:

? MetricCompute

Aliás, todos os comandos do xAct possuem uma explanação acessível com o comando ?, além da documentação mais extensa.

Agora podemos fazer um exercício simples: calcular a equação de onda para um tensor nesse sistema de coordenadas. O Laplaciano da componente radial de um vetor vai ser explicitamente dado por:

Basis[{1,polar},-b]Cd[-a][Cd[a][vector[b]]] // SeparateMetric[] //
ToBasis[polar] // ToBasis[polar] // ChangeCovD // TraceBasisDummy // ToValues // ToCanonical

Em pedaços: Basis é o tensor da base de coordenadas (em livros-texto muitas vezes denotado por e^a_{\mu}), que eu contrai com o Laplaciano de Ab para retirar a componente 1. SeparateMetric[] joga todos os índices da expressão

In = Cd[-a][Cd[a][vector[{1, polar}]]]
Out = ∇aaA1

em sua ordem natural, separando a métrica. Esse passo é necessário porque em MetricCompute nem todas as possíveis combinações de covariante/contravariante são calculadas. Depois, ToBasis é o comando que joga todos os índices da expressão para o sistema de coordenadas especificado. TraceBasisDummy substitui a notação de Einstein pela soma explicita das componentes, para que o comando ToValues substitua então cada um dos componentes de tensores que aparecem na expressão pelos seus valores nessas coordenadas. No caso, só a métrica e as curvaturas ganharam valores, então o vetor A permanece intacto. Eu coloquei no final um ToCanonical que é o comando do xAct para tentar simplificar expressões usando todas as simetrias conhecidas dos tensores que aparecem na fórmula. O resultado final:

Out =

Para traduzir isso numa equação que o Mathematica pode resolver com o comando interno DSolve, você pode antes de começar a conta, atribuir as componentes do vetor a funções:

vectorpolar = { Ar[η[], χ[], θ[], φ[] ] , ... }
ComponentValue[ ComponentArray[vector,{-polar}], vectorpolar ]

Na segunda linha, ComponentArray é o comando que gera uma tabela do Mathematica com as componentes do tensor com o sistema de coordenadas dado. Esse comando admite até índices com coordenadas mistas, por exemplo, se você definir além das coordenadas polares também um sistema cartesiano chamado cart, para um tensor de dois índices pode-se usar ComponentArray[T,{polar,-cart}]]. O comando ComponentValue associa a um componente do tensor em dado sistema de coordenadas um determinado valor. Ao definir mais de um sistema de coordenadas, é útil usar no DefChart a opção BasisColor, por exemplo, BasisColor -> Red para polares e BasisColor -> Green para cartesianas. Usando valores para o vetor A, a expressão acima vira uma equação diferencial do Mathematica para as funções definidas na tabela vectorpolar e agora se pode usar o DSolve para obter a solução da equação diferencial.

No site do xAct você pode ver alguns outros exemplos de exercícios.

Esse pacote do Mathematica é muito útil; é fácil imaginar dando um curso inteiro de Relatividade Geral com listas de exercícios mais divertidas usando o xAct. 🙂

O pacote xPert estende a capacidade do xAct para definir perturbações da métrica e de tensores. A lógica do tratamento é a mesma, sendo que xPert tem comandos que permitem expandir automaticamente tensores até ordem arbitrária. Por exemplo, se eu quiser escrever o tensor de Einstein até ordem quinta na perturbação da métrica. Usando apenas xPert e xTensor, você pode escrever essa equação na forma de índices abstratos, e usando também o xCoba pode escrever essa equação em algum sistema de coordenada da métrica não-perturbada.

Mais sobre a lógica do xAct

Os objetos principais do xAct são tensores. Os tensores tem índices e tem simetrias dos índices. Por exemplo,

DefTensor[T[a,b], M, Symmetric[{a,b}]]

O tensor Tab é um tensor simétrico. O comando ToCanonical vai utilizar essa propriedade para simplificar expressões. Os tensores do xAct funcionam como objetos, no sentido da programação:

In = ? T
Out = Global T
Dagger[T]^=T
DefInfo[T]^={tensor,}
DependenciesOfTensor[T]^={M}
HostsOf[T]^={M,TangentM}
PrintAs[T]^=T
SlotsOfTensor[T]^={TangentM,TangentM}
SymmetryGroupOfTensor[T]^=StrongGenSet[{1,2},GenSet[Cycles[{1,2}]]]
TensorID[T]^={}
xTensorQ[T]^=True

Ou seja, T carrega uma série de propriedades, como PrintAs.

Para cada Def existe um Undef:

In = UndefTensor[vector]
Out = ** UndefTensor: Undefined tensor vector

A lógica do xCoba é armazenar uma série de regras de substituições. O Mathematica faz o mesmo com comandos como DSolve. Isso significa que quando você usa, por exemplo, MetricInBasis, o xCoba adiciona as propriedades de metric as regras de substitiução que serão usadas pelo ToValues. Eu poderia gerar essas regras manualmente assim:

myrule = metric[{1,-polar},{1,-polar}] -> 1

A regra acima substituirá a componente 11 em coordenadas polar do tensor metric pelo número 1 quando for invocada:

In = metric[{1,-polar},{1,-polar}] /. myrule
Out= 1

Os símbolos de Christoffel em coordenadas polares no nosso exemplo recebem o nome de ChristoffelCdPDpolar. O nome geral dos símbolos de Christoffel em coordenadas é Christoffel seguido pelo nome da derivada covariante, PD e finalmente o sistema de coordenadas. PD no xAct é o nome do operador derivada parcial:

In = PD[-a]@vector[-b]
Out = ∂aAb

Nesse tutorial, o “@” apareceu lá em cima na definição de X. Esse símbolo é um atalho do Mathematica para aplicar o operador que precede @ no que vem depois. Assim, LI é uma definição do xAct para índices que não são tensorais. Um exemplo de índice assim é a ordem de perturbação do tensor.

Se você quiser listar as regras de substituição de um tensor, pode usar o comando TensorValues. Por exemplo, para a tarefa de saber as fórmulas dos símbolos de Christoffel em coordenadas polares da métrica do nosso exemplo:

In = TensorValues[ChristoffelCdPDpolar][[2]] // Column
Out = Γ[∇, ∂]000 -> a'[η]/ 2 a[η]
...

PS. Só após ter escrito o post eu percebi que eu esqueci de levar o scalefactor ao quadrado na métrica. 😛 Todas os resultados do MetricCompute estão como se a métrica fosse a(η)(…) ao invés de a(η)^2 (…). Se você está aprendendo Relatividade Geral ou Cosmologia, desculpe-me pelo lapso. E não esqueça de corrigi-lo no seu Notebook. 😉

  1. Houdini
    sábado, 12 nov 2011; \45\America/New_York\America/New_York\k 45 às 08:48:07 EST

    Olá… Eu não estou conseguindo instalar essa extensão no Mathematica 8.00.
    Você poderia colocar um post de como instalar esse pacote no Mathematica 8.00?

    Grato.

  2. Houdini
    sábado, 12 nov 2011; \45\America/New_York\America/New_York\k 45 às 09:15:34 EST

    Eu uso o Windows 7…

  3. Alexsandro Lucena Mota
    quinta-feira, 9 abr 2015; \15\America/New_York\America/New_York\k 15 às 16:33:37 EDT

    E se eu quiser usar a métrica (+,-,-,-,), como faço?

  4. quarta-feira, 1 jun 2016; \22\America/New_York\America/New_York\k 22 às 13:46:07 EDT

    Funciona em versões mais antigas do mathematica?

  1. No trackbacks yet.

Deixe um comentário