如何用Mathematica做張量計算
來自專欄天文筆記
Mathematica可謂是符號計算的神器。算什麼東西的時候,可以先用mathematica算一下,如果可以算出來,再用手算,這樣比較省時間。
上一篇文章
李剛:Gravity by Hartle 筆記:真空中的場方程中我們學習了真空中的場方程。對於四維時空來說,其度規有16個分量,克里斯托夫符號有64個分量,黎曼張量有256個分量,里奇張量有16個分量,計算量不可謂不大。
所以我們還是來看看怎麼用mathematica計算張量吧。。
我們先聲明好坐標的變數和度規,比如用 和施瓦西度規來做個例子
v={t,r,theta, phi}L1={(1-2M/r), (1-2M/r)^(-1), r^2, r^2*(Sin[theta])^2}len=Dimensions[v][[1]];(*number of dimension*)g=DiagonalMatrix[ L1 ];(*metric*)Print["The metric is"]Print[g//MatrixForm](*其中 {a,b,c,e..}組成了一個表格,表格可以擴充為張量*)
有了度規,我們還要算其逆,可以這樣
invg=Simplify[Inverse[ g ]];(*inverse metric*)Print["The inverse metric is"];Print[Simplify[invg]//MatrixForm];
然後我們要用 來算克里斯托夫符號
dg1=Outer[D, g, v]; (*Partial devirative of the metric with respect to v*)dg2=Transpose[dg1, {1,3,2}];(*change indices orders*)dg3=Transpose[dg1, {2,3,1}];G=Simplify[(1/2)invg . (dg1+dg2-dg3)];(*christoffel symbols*)
其中Outer[D, g, v]可以計算右邊括弧里第一項 ,然後我們用Transpose交換角標的順序,於是就有了 和 。Simplify能化簡表達式。
然後我們就能算那256個量的黎曼張量了
dG=Outer[ D, G, v ];(*Partial devirative of the Christoffel symbols with respect to v*)(*Riemann tensor*)Rie1=dG;Rie2=Transpose[Rie1,{1,2,4,3}];Rie3=Table[ Sum[G[[i,k,l]]G[[l,j,h]],{l, len}] ,{i,len},{k,len},{j,len},{h,len} ];Rie4=Table[ Sum[G[[i,h,l]]G[[l,j,k]],{l, len}] ,{i,len},{k,len},{j,len},{h,len} ];Riemann=Simplify[Rie1-Rie2+Rie3-Rie4];Print["The Riemann tensor is"];Print[Simplify[Riemann]//MatrixForm];
我們又用了Outer[]算出了 這個偏導,然後 用Transpose[]交換下角標得到 。
然後有個新命令Sum[],Sum[G[[i,k,l]]G[[l,j,h]],{l, len}]就是 對 求和,但是別的指標是個定值,然後再用Table[]擴充成張量,得到 所有可能的值。
於是我們就算好了黎曼張量。。。
接下來算下里奇張量 ,我們就用Sum命令和Table命令,把黎曼張量的第一個指標和第三個指標加起來即可。
Ruv=Table[Sum[Riemann[[k,i,k,j]],{k,len}],{i,len},{j,len} ]
然後我們就算完啦~手算是不可能手算的,這輩子不可能手算的~
推薦閱讀:
※Note:GR初探之 張量基礎
※明日慣性下跌
※七十二 歲差有關相對性的應用——愛因斯坦相對論的時空誤區
※歲差比較地球引力場多普勒效應
※愛因斯坦為何「吐舌頭」
TAG:張量 | WolframMathematica | 廣義相對論 |