ctensorは、成分テンソル操作パッケージです。
ctensorパッケージを使うには、load("ctensor")をタイプしてください。
ctensorと対話的セッションを始めるには、csetup()をタイプしてください。
最初に、多様体の次元を指定するよう尋ねられます。
もし次元が、2, 3, 4のいずれかなら、
座標のリストがそれぞれ、[x,y], [x,y,z], [x,y,z,t]に設定されます。
これらの名前は、座標の新しいリストを(以下で記述する)変数ct_coords に
割り当てることで変えることができ、ユーザーは、これについて尋ねられます。
座標名が他のオブジェクト定義と衝突することを避けるように、注意が払われなければいけません。
次に、ユーザーは計量を直接、または順序位置(ordinal position)を指定してファイルから、入力します。
計量は行列lgに保存されます。
最後に、計量の逆元が計算され、
行列ugに保存されます。
すべての計算を冪級数で実行するオプションがあります。
サンプルプロトコルは、
例として、(Schwarzschild解に至る)Einsteinの真空方程式を導出する問題に適用される
静的な球対称計量(標準座標)に関して、以下のように開始されます。
ctensorの関数の多くは例のように標準計量に対して表示されます。
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) csetup();
Enter the dimension of the coordinate system:
4;
Do you wish to change the coordinate names?
n;
Do you want to
1. Enter a new metric?
2. Enter a metric from a file?
3. Approximate a metric with a Taylor series?
1;
Is the matrix 1. Diagonal 2. Symmetric 3. Antisymmetric 4. General
Answer 1, 2, 3 or 4
1;
Row 1 Column 1:
a;
Row 2 Column 2:
x^2;
Row 3 Column 3:
x^2*sin(y)^2;
Row 4 Column 4:
-d;
Matrix entered.
Enter functional dependencies with the DEPENDS function or 'N' if none
depends([a,d],x);
Do you wish to see the metric?
y;
[ a 0 0 0 ]
[ ]
[ 2 ]
[ 0 x 0 0 ]
[ ]
[ 2 2 ]
[ 0 0 x sin (y) 0 ]
[ ]
[ 0 0 0 - d ]
(%o2) done
(%i3) christof(mcs);
a
x
(%t3) mcs = ---
1, 1, 1 2 a
1
(%t4) mcs = -
1, 2, 2 x
1
(%t5) mcs = -
1, 3, 3 x
d
x
(%t6) mcs = ---
1, 4, 4 2 d
x
(%t7) mcs = - -
2, 2, 1 a
cos(y)
(%t8) mcs = ------
2, 3, 3 sin(y)
2
x sin (y)
(%t9) mcs = - ---------
3, 3, 1 a
(%t10) mcs = - cos(y) sin(y)
3, 3, 2
d
x
(%t11) mcs = ---
4, 4, 1 2 a
(%o11) done
ctensorパッケージを初期化し、ユーザーに計量を対話的に入力可能にする
ctensor(成分テンソル)パッケージの関数
より詳細はctensorを参照してください。
計量の逆元を計算し、将来の計算のためパッケージを設定する
ctensor(成分テンソル)パッケージの関数
もしcframe_flagがfalseなら、
関数は逆計量ugを(ユーザー定義の)行列lgから計算します。
計量の行列式も計算され、変数gdetに保存されます。
更に、パッケージは計量が対角的か調べ、結果に従ってdiagmetricの値を設定します。
もしオプション引数disが渡されて、それがfalseでないなら、
ユーザーは計量の逆元を見るように促されます。
もしcframe_flagがtrueなら、
関数はfri (逆標構行列)とlfg(標構計量)の値が定義されていると考えます。
これらから、標構行列frと逆標構計量ufgが計算されます。
あらかじめ定義された座標系と計量を設定します。 引数coordinate_systemは以下のシンボルのいずれかです:
SYMBOL Dim Coordinates Description/comments ------------------------------------------------------------------ cartesian2d 2 [x,y] Cartesian 2D 座標系 polar 2 [r,phi] 極座標系 elliptic 2 [u,v] 楕円座標系 confocalelliptic 2 [u,v] 共焦点楕円座標 bipolar 2 [u,v] 二極座標系 parabolic 2 [u,v] 放物座標系 cartesian3d 3 [x,y,z] Cartesian 3D 座標系 polarcylindrical 3 [r,theta,z] 円筒z極2D ellipticcylindrical 3 [u,v,z] 円筒z楕円2D confocalellipsoidal 3 [u,v,w] 共焦点楕円 bipolarcylindrical 3 [u,v,z] 円筒z二極2D paraboliccylindrical 3 [u,v,z] 円筒z放物2D paraboloidal 3 [u,v,phi] Paraboloidal coords. conical 3 [u,v,w] 円錐座標 toroidal 3 [u,v,phi] 環状座標 spherical 3 [r,theta,phi] 球座標系 oblatespheroidal 3 [u,v,phi] 偏球座標系 oblatespheroidalsqrt 3 [u,v,phi] prolatespheroidal 3 [u,v,phi] 長形球座標系 prolatespheroidalsqrt 3 [u,v,phi] ellipsoidal 3 [r,theta,phi] 楕円体座標系 cartesian4d 4 [x,y,z,t] Cartesian 4D 座標系 spherical4d 4 [r,theta,eta,phi] 球 4D 座標系 exteriorschwarzschild 4 [t,r,theta,phi] Schwarzschild 計量 interiorschwarzschild 4 [t,z,u,v] 内部 Schwarzschild 計量 kerr_newman 4 [t,r,theta,phi] 荷電軸対称計量
coordinate_systemは
座標変数を含むリストが続く変換関数のリストでもあり得ます。
例えば、
以下のように球計量を指定できます:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) ct_coordsys([r*cos(theta)*cos(phi),r*cos(theta)*sin(phi),
r*sin(theta),[r,theta,phi]]);
(%o2) done
(%i3) lg:trigsimp(lg);
[ 1 0 0 ]
[ ]
[ 2 ]
(%o3) [ 0 r 0 ]
[ ]
[ 2 2 ]
[ 0 0 r cos (theta) ]
(%i4) ct_coords;
(%o4) [r, theta, phi]
(%i5) dim;
(%o5) 3
cframe_flagが trueの時
変換関数も使うことができます:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) cframe_flag:true;
(%o2) true
(%i3) ct_coordsys([r*cos(theta)*cos(phi),r*cos(theta)*sin(phi),
r*sin(theta),[r,theta,phi]]);
(%o3) done
(%i4) fri;
(%o4)
[cos(phi)cos(theta) -cos(phi) r sin(theta) -sin(phi) r cos(theta)]
[ ]
[sin(phi)cos(theta) -sin(phi) r sin(theta) cos(phi) r cos(theta)]
[ ]
[ sin(theta) r cos(theta) 0 ]
(%i5) cmetric();
(%o5) false
(%i6) lg:trigsimp(lg);
[ 1 0 0 ]
[ ]
[ 2 ]
(%o6) [ 0 r 0 ]
[ ]
[ 2 2 ]
[ 0 0 r cos (theta) ]
オプションの引数 extra_argは以下のいずれかです:
cylindricalは ct_coordsysに追加の極座標を結びつけるように言います。
minkowskiは ct_coordsysに
負の計量符号を持つ追加の座標を結びつけるように言います。
allは ct_coordsysに
計量を設定した後、
cmetricと christof(false)をコールするように言います。
もしグローバル変数 verboseが trueに設定されているなら、
ct_coordsysは、
cframe_flagの値に依存して、
dim, ct_coordsと、 lgか lfgのいずれかと
friの値を表示します。
ctensorパッケージを初期化します。
init_ctensor関数はctensorパッケージを再初期化します。
それはctensorが使う配列、行列すべてを削除し、
フラグすべてをリセットし、
dimを4にリセットし、
標構計量を Lorentz標構にリセットします。
ctensorパッケージの
主な目的は曲がった空間(時間)のテンソル、
最も顕著には一般相対性理論で使われるテンソルを計算することです。
計量基底が使われる時、
ctensorは以下のテンソルを計算できます:
lg -- ug
\ \
lcs -- mcs -- ric -- uric
\ \ \
\ tracer - ein -- lein
\
riem -- lriem -- weyl
\
uriem
ctensorは動標構を使って機能することもできます。
cframe_flagが trueに設定されている時、
以下のテンソルを計算できます:
lfg -- ufg
\
fri -- fr -- lcs -- mcs -- lriem -- ric -- uric
\ | \ \ \
lg -- ug | weyl tracer - ein -- lein
|\
| riem
|
\uriem
ctensor (成分テンソル)パッケージの関数。
各種Christoffel記号を計算します。
引数 disは
どの結果をすぐに表示するか決めます。
第一種と第二種Christoffel記号は
それぞれ配列 lcs[i,j,k]と mcs[i,j,k]に格納され、
最初の2つの添字に対して対称と定義されます。
もし christofの引数が lcsか mcsなら
それぞれ、lcs[i,j,k]か mcs[i,j,k]の固有の非零値が
表示されます。
もし引数が allなら、
lcs[i,j,k]と mcs[i,j,k]の固有の非零値が表示されます。
もし引数が falseなら、
要素の表示はされません。
配列要素 mcs[i,j,k]は
最後の添字が反変であるような方法で定義されます。
ctensor (成分テンソル)パッケージの関数。
ricciは
Ricciテンソルの共変(対称)成分 ric[i,j]を計算します。
もし引数 disが trueなら、
非零成分が表示されます。
この関数は最初にRicciテンソルの共変成分 ric[i,j]を計算します。
そして、混合 Ricciテンソルが反変計量テンソルを使って計算されます。
もし引数 disの値が trueなら
これらの(添字 iは共変で、添字 jは反変の)混合成分 uric[i,j]
は直接表示されます。
そうでないなら、 ricci(false)は
結果を表示することなく、単に配列 uric[i,j]の要素を計算します。
与えられた計量を持つ Riemannian多様体の (Ricciテンソルを縮約することで得られる)スカラ曲率を返します。
ctensor (成分テンソル)パッケージの関数。
einsteinは、
(関数 christofと ricciを使って)
Christoffel記号と Ricciテンソルを得られた後、
混合 Einsteinテンソルを計算します。
もし引数 disが trueなら、
混合 Einsteinテンソル ein[i,j]の非零値が表示されます。
ここで jは反変添字です。
変数 rateinsteinは
これらの成分上の有理整理をもたらします。
もし ratfacが trueなら、
成分は因数分解もされます。
共変 Einsteinテンソル。
leinsteinは
配列 leinに共変 Einsteinテンソルの値を格納します。
共変 Einsteinテンソルは、
計量テンソルを掛けることで
混合 Einsteinテンソル einから計算されます。
もし引数 disが trueなら、
共変 Einsteinテンソルの非零値が表示されます。
ctensor (成分テンソル)パッケージの関数。
riemannは
与えられた計量と対応するChristoffel記号から
Riemann曲率テンソルを計算します。
以下の添字慣例が使われます:
l _l _l _l _m _l _m
R[i,j,k,l] = R = | - | + | | - | |
ijk ij,k ik,j mk ij mj ik
この表記法は
itensorパッケージとその icurvature関数で使われる表記法と
一致しています。
もしオプション引数 disが trueなら、
固有の非零成分 riem[i,j,k,l]が表示されます。
Einsteinテンソルと同様に
ユーザーが設定する様々なスイッチが
Riemannテンソルの成分の整理を制御します。
もし ratriemannが trueなら、
有理整理がされます。
もし ratfacが trueなら、
成分のそれぞれは因数分解もされます。
もし変数 cframe_flagが falseなら、
Riemannテンソルは
Christoffel記号から直接計算されます。
もし cframe_flagが trueなら、
共変 Riemannテンソルは
標構場係数から最初に計算されます。
共変 Riemannテンソル (lriem[]).
配列 lriemとして
共変 Riemannテンソルを計算します。
もし引数 disが trueなら、
固有の非零値が表示されます。
もし変数 cframe_flagが trueなら、
共変 Riemannテンソルは
標構場係数から直接計算されます。
そうでないなら、
(3,1) Riemannテンソルが最初に計算されます。
添字順序の情報は riemannを参照してください。
配列要素 uriem[i,j,k,l]として
Riemann曲率テンソルの反変成分を計算します。
もし disが trueなら、これらが表示されます。
テンソル
lriem[i,j,k,l]*uriem[i,j,k,l].
を縮約することで得られるKretschmann不変量 (kinvariant)を形成します。
このオブジェクトは非常に大きくなるかもしれないので、 自動的には整理されません。
Weylの共形テンソルを計算します。
もし引数 disが trueなら、
非零成分 weyl[i,j,k,l]がユーザーに表示されます。
そうでないなら、これらの成分は
単に計算され、格納されます。
もしスイッチ ratweylが trueに設定されているなら、
成分は有理整理されます;
もし ratfacが trueなら、
結果は因数分解もされます。
ctensorパッケージは
結果が Taylor級数近似であると仮定することで、結果を切り詰める機能を持ちます。
この振る舞いは ctayswitch変数で制御されます;
trueに設定されている時、
結果を整理する際に
ctensorは内部的に関数 ctaylorを利用します。
以下の ctensor関数が ctaylor関数を呼び出します:
Function Comments
---------------------------------
christof() For mcs only
ricci()
uricci()
einstein()
riemann()
weyl()
checkdiv()
ctaylor関数は、
taylorを使ってその後ratdisrepをコールすることで
引数をTaylor級数に変換することで、
引数を切り詰めます。
これは
展開変数 ctayvarに関してより高い項を落とす合わせ効果を持ちます。
落とす項の次数はctaypovで定義されます;
級数展開が実行される点は
ctayptで指定されます。
例として、 Minkowski計量の置換である簡単な計量を考えます。 追加の制約なしでは、 対角計量でさえ はるかに複雑すぎるEinsteinテンソルの式を生成します:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) ratfac:true;
(%o2) true
(%i3) derivabbrev:true;
(%o3) true
(%i4) ct_coords:[t,r,theta,phi];
(%o4) [t, r, theta, phi]
(%i5) lg:matrix([-1,0,0,0],[0,1,0,0],[0,0,r^2,0],
[0,0,0,r^2*sin(theta)^2]);
[ - 1 0 0 0 ]
[ ]
[ 0 1 0 0 ]
[ ]
(%o5) [ 2 ]
[ 0 0 r 0 ]
[ ]
[ 2 2 ]
[ 0 0 0 r sin (theta) ]
(%i6) h:matrix([h11,0,0,0],[0,h22,0,0],[0,0,h33,0],[0,0,0,h44]);
[ h11 0 0 0 ]
[ ]
[ 0 h22 0 0 ]
(%o6) [ ]
[ 0 0 h33 0 ]
[ ]
[ 0 0 0 h44 ]
(%i7) depends(l,r);
(%o7) [l(r)]
(%i8) lg:lg+l*h;
[ h11 l - 1 0 0 0 ]
[ ]
[ 0 h22 l + 1 0 0 ]
[ ]
(%o8) [ 2 ]
[ 0 0 r + h33 l 0 ]
[ ]
[ 2 2 ]
[ 0 0 0 r sin (theta) + h44 l ]
(%i9) cmetric(false);
(%o9) done
(%i10) einstein(false);
(%o10) done
(%i11) ntermst(ein);
[[1, 1], 62]
[[1, 2], 0]
[[1, 3], 0]
[[1, 4], 0]
[[2, 1], 0]
[[2, 2], 24]
[[2, 3], 0]
[[2, 4], 0]
[[3, 1], 0]
[[3, 2], 0]
[[3, 3], 46]
[[3, 4], 0]
[[4, 1], 0]
[[4, 2], 0]
[[4, 3], 0]
[[4, 4], 46]
(%o12) done
しかし、もしこの例を
変数 lに対して線形という近似として
再研鑽するなら、
もっと簡潔な式を得ます:
(%i14) ctayswitch:true;
(%o14) true
(%i15) ctayvar:l;
(%o15) l
(%i16) ctaypov:1;
(%o16) 1
(%i17) ctaypt:0;
(%o17) 0
(%i18) christof(false);
(%o18) done
(%i19) ricci(false);
(%o19) done
(%i20) einstein(false);
(%o20) done
(%i21) ntermst(ein);
[[1, 1], 6]
[[1, 2], 0]
[[1, 3], 0]
[[1, 4], 0]
[[2, 1], 0]
[[2, 2], 13]
[[2, 3], 2]
[[2, 4], 0]
[[3, 1], 0]
[[3, 2], 2]
[[3, 3], 9]
[[3, 4], 0]
[[4, 1], 0]
[[4, 2], 0]
[[4, 3], 0]
[[4, 4], 9]
(%o21) done
(%i22) ratsimp(ein[1,1]);
2 2 4 2 2
(%o22) - (((h11 h22 - h11 ) (l ) r - 2 h33 l r ) sin (theta)
r r r
2 2 4 2
- 2 h44 l r - h33 h44 (l ) )/(4 r sin (theta))
r r r
この能力は 例えば、 重力源から遠く、弱い場極限で取り組む時に 役に立つかもしれません。
変数 cframe_flagが trueに設定している時、
ctensorパッケージは
動標構(moving frame)を使って計算を実行します。
標構(frame)ブラケット (fb[]).
以下の定義に従って標構ブラケットを計算します:
c c c d e ifb = ( ifri - ifri ) ifr ifr ab d,e e,d a b
ctensorの(2004年11月時点で)新しい特長は
4次元時空計量のPetrov分類を計算する能力です。
この機能のデモンストレーションは、
ファイル share/tensor/petrov.dem参照してください。
Newman-Penroseヌルテトラド(null tetrad) (np)と上付き添字対応物
(npi)を計算します。
例えば、 petrovを参照してください。
ヌルテトラドは 計量符号 (-,+,+,+)を持つ4次元直交標構計量が使われいるという仮定の上で 構成されます。 ヌルテトラドの成分は、 以下のように、 逆標構行列に関係します:
np = (fri + fri ) / sqrt(2) 1 1 2 np = (fri - fri ) / sqrt(2) 2 1 2 np = (fri + %i fri ) / sqrt(2) 3 3 4 np = (fri - %i fri ) / sqrt(2) 4 3 4
5つの Newman-Penrose係数 psi[0]...psi[4]を計算します。
もし disが trueに設定されているなら、
係数が表示されます。
例は petrovを参照してください。
これらの係数は
座標基底に関して、Weylテンソルから計算されます。
もし標構基底が使われるなら、
最初にWeylテンソルが座標基底に変換されます。
座標基底は計算に関して高価な手続きであり得ます。
この理由で、
いくつかの場合、
Weylテンソルを計算する前に
まず座標基底を使うことはより都合がいいかも知れません。
しかし、
Newman-Penroseヌルテトラドを構成することは標構基底を要求することに注意してください。
それ故に、
重要な一連の計算は、標構基底で始めることができます。
標構基底は、後で (cmetricが自動的に計算する) lgと
ugを計算するのに使われます。
この時点で、
Christoffel記号を計算し始める前に
cframe_flagを falseに設定することで
座標基底に戻ることができます。
後の段階で標構基底に変えることは、
標構基底で計算したいくつか、座標基底でのいくつかと
2つを識別する方法がないまま、テンソルの混ざった状態で終わるかもしれないので、
矛盾する結果をもたらすかもしれません。
psi[0]...psi[4]で特徴付けられる
計量のPetrov分類を計算します。
例えば、以下は Kerr計量の Petrov分類を得る方法を例示します:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) (cframe_flag:true,gcd:spmod,ctrgsimp:true,ratfac:true);
(%o2) true
(%i3) ct_coordsys(exteriorschwarzschild,all);
(%o3) done
(%i4) ug:invert(lg)$
(%i5) weyl(false);
(%o5) done
(%i6) nptetrad(true);
(%t6) np =
[ sqrt(r - 2 m) sqrt(r) ]
[--------------- --------------------- 0 0 ]
[sqrt(2) sqrt(r) sqrt(2) sqrt(r - 2 m) ]
[ ]
[ sqrt(r - 2 m) sqrt(r) ]
[--------------- - --------------------- 0 0 ]
[sqrt(2) sqrt(r) sqrt(2) sqrt(r - 2 m) ]
[ ]
[ r %i r sin(theta) ]
[ 0 0 ------- --------------- ]
[ sqrt(2) sqrt(2) ]
[ ]
[ r %i r sin(theta)]
[ 0 0 ------- - ---------------]
[ sqrt(2) sqrt(2) ]
sqrt(r) sqrt(r - 2 m)
(%t7) npi = matrix([- ---------------------,---------------, 0, 0],
sqrt(2) sqrt(r - 2 m) sqrt(2) sqrt(r)
sqrt(r) sqrt(r - 2 m)
[- ---------------------, - ---------------, 0, 0],
sqrt(2) sqrt(r - 2 m) sqrt(2) sqrt(r)
1 %i
[0, 0, ---------, --------------------],
sqrt(2) r sqrt(2) r sin(theta)
1 %i
[0, 0, ---------, - --------------------])
sqrt(2) r sqrt(2) r sin(theta)
(%o7) done
(%i7) psi(true);
(%t8) psi = 0
0
(%t9) psi = 0
1
m
(%t10) psi = --
2 3
r
(%t11) psi = 0
3
(%t12) psi = 0
4
(%o12) done
(%i12) petrov();
(%o12) D
Petrov分類関数は以下の文献で発表されたアルゴリズムに基づいています。
"Classifying geometries in general relativity: III Classification in practice" by Pollney, Skea, and d’Inverno, Class. Quant. Grav. 17 2885-2902 (2000).
いくつかの簡単なテストケースを除いて、 2004年12月19日時点、実装はテストされていなく、 エラーを含みそうです。
ctensorは
ねじれ係数と非計量性係数を計算し、接続係数内に含める能力を持ちます。
ねじれ係数はゆーざーが供給するテンソル trから計算されます。
trは階数 (2,1)テンソルでなければいけません。
これから、
ねじれ係数 ktは以下の公式に従って計算されます:
m m m
- g tr - g tr - tr g
im kj jm ki ij km
kt = -------------------------------
ijk 2
k km
kt = g kt
ij ijm
混合添字テンソルだけが計算され、配列 ktに格納されることに注意してください。
非計量性係数はユーザーが供給する非計量性ベクトル nmから計算されます。
これから、
非計量性係数 nmcは以下のように計算されます:
k k km
-nm D - D nm + g nm g
k i j i j m ij
nmc = ------------------------------
ij 2
ここで、DはKroneckerのデルタを表します。
ctorsion_flagが trueに設定されている時、
ktの値が
christofで計算された
混合添字付き接続係数から引かれ、
mcsに格納されます。
同様に、もし cnonmet_flagが trueに設定されているなら、
nmcの値が
混合添字付き接続係数から引かれます。
もし必要なら、 christofは、
ktと nmを計算するために
関数 contortionと nonmetricityをコールします。
ねじれテンソル trから(2,1)コントーション(contortion)係数を計算します。
非計量性ベクトル nmから(2,1)非計量性係数を計算します。
任意の平方対称行列 M上で座標変換を実行する
ctensor (成分テンソル)パッケージの関数。
ユーザーは変換を定義する函数を入力しなければいけません。
(以前transformと呼ばれていました。)
n次元の平方配列 A要素に対応する
独自の(unique)微分方程式(式)のリストを返します。
現在、 nは2か3を指定できます
deindexは
これらの独自の微分方程式に従う
Aの添字を含む
グローバルリストです。
2次元配列であるEinsteinテンソル (ein)に関して、
もし以下の例で計量に関して計算するなら、
finddeは以下の独立微分方程式を与えます:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) derivabbrev:true;
(%o2) true
(%i3) dim:4;
(%o3) 4
(%i4) lg:matrix([a, 0, 0, 0], [ 0, x^2, 0, 0],
[0, 0, x^2*sin(y)^2, 0], [0,0,0,-d]);
[ a 0 0 0 ]
[ ]
[ 2 ]
[ 0 x 0 0 ]
(%o4) [ ]
[ 2 2 ]
[ 0 0 x sin (y) 0 ]
[ ]
[ 0 0 0 - d ]
(%i5) depends([a,d],x);
(%o5) [a(x), d(x)]
(%i6) ct_coords:[x,y,z,t];
(%o6) [x, y, z, t]
(%i7) cmetric();
(%o7) done
(%i8) einstein(false);
(%o8) done
(%i9) findde(ein,2);
2
(%o9) [d x - a d + d, 2 a d d x - a (d ) x - a d d x
x x x x x x
2 2
+ 2 a d d - 2 a d , a x + a - a]
x x x
(%i10) deindex;
(%o10) [[1, 1], [2, 2], [4, 4]]
スカラ関数の
共変勾配を計算します。
contragradが以下で例示する例のように
ユーザーは対応するベクトル名を選べます。
スカラ関数の反変勾配を計算します。 Computes the contravariant gradient of a scalar function allowing Schwarzschild計量に関する以下の例が例示するように ユーザーは対応するベクトル名を選べます:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) derivabbrev:true;
(%o2) true
(%i3) ct_coordsys(exteriorschwarzschild,all);
(%o3) done
(%i4) depends(f,r);
(%o4) [f(r)]
(%i5) cograd(f,g1);
(%o5) done
(%i6) listarray(g1);
(%o6) [0, f , 0, 0]
r
(%i7) contragrad(f,g2);
(%o7) done
(%i8) listarray(g2);
f r - 2 f m
r r
(%o8) [0, -------------, 0, 0]
r
依存性が関数に宣言されるとすぐ、 スカラ関数のテンソルd’Alembert演算子を計算します。 例えば:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) derivabbrev:true;
(%o2) true
(%i3) ct_coordsys(exteriorschwarzschild,all);
(%o3) done
(%i4) depends(p,r);
(%o4) [p(r)]
(%i5) factor(dscalar(p));
2
p r - 2 m p r + 2 p r - 2 m p
r r r r r r
(%o5) --------------------------------------
2
r
ベクトル場(発散)の対応するn個の成分を印字することで
(最初の添字が共変でなければいけない)混合二階テンソルの共変発散を計算します。
ここでn = dimです。
もし関数の引数が gなら、
Einsteinテンソルの発散が形成され、零にならなければいけません。
加えて、発散(ベクトル)は
配列名 divを与えられます。
ctensor (成分テンソル)パッケージの関数。
cgeodesicは
与えられた計量での運動の測地方程式を計算します。
それらは配列 geod[i]に格納されます。
もし引数 disが trueなら、
これらの方程式が表示されます。
Brans- Dicke重力理論の
真空場の方程式の
共変成分を生成します。
スカラ場は引数 fで指定されます。
fは、
例えば、'p(x)のように、
関数依存性を持つ(クォートされた)関数名でなければいけません。
二階共変場テンソルの成分は配列 bdで表されます。
R^2の不変密度に関する
混合Euler- Lagrangeテンソル(場の方程式)を生成します。
場の方程式は inv1と名付けられた配列の成分です。
*** NOT YET IMPLEMENTED ***
ric[i,j]*uriem[i,j]の不変密度に関する
混合Euler- Lagrangeテンソル(場の方程式)を生成します。
場の方程式は inv2と名付けられた配列の成分です。
*** NOT YET IMPLEMENTED ***
Rosenの二計量(bimetric)理論の場の方程式を生成します。
場の方程式は rosenと名付けられた配列の成分です。
もし Mが対角行列か対角 (2D) 配列なら
trueを返します。
もし Mが対称行列か対称 (2D) 配列なら
trueを返します。
ユーザーに 二重に下付き添字テンソル(配列) fの「サイズ」のquick pictureを与えます。 二番目の要素が 一番目の要素が指定する成分のNTERMSに対応する2つの要素のリストを印字します。 この方法で、 非零式をすばやく見つけて整理を試みることが可能です。
多次元配列で表されるように、
テンソル tenの要素すべてを表示します。
他のタイプの変数はもちろん、
階数0と1のテンソルが
ldisplayを使ったように表示されます。
階数2のテンソルは
2次元行列として表示され、
より高い階数のテンソルは2次元行列のリストとして表示されます。
例えば、
Schwarzschild計量のRiemannテンソルは以下のように見ることができます:
(%i1) load("ctensor");
(%o1) /share/tensor/ctensor.mac
(%i2) ratfac:true;
(%o2) true
(%i3) ct_coordsys(exteriorschwarzschild,all);
(%o3) done
(%i4) riemann(false);
(%o4) done
(%i5) cdisplay(riem);
[ 0 0 0 0 ]
[ ]
[ 2 ]
[ 3 m (r - 2 m) m 2 m ]
[ 0 - ------------- + -- - ---- 0 0 ]
[ 4 3 4 ]
[ r r r ]
[ ]
riem = [ m (r - 2 m) ]
1, 1 [ 0 0 ----------- 0 ]
[ 4 ]
[ r ]
[ ]
[ m (r - 2 m) ]
[ 0 0 0 ----------- ]
[ 4 ]
[ r ]
[ 2 m (r - 2 m) ]
[ 0 ------------- 0 0 ]
[ 4 ]
[ r ]
riem = [ ]
1, 2 [ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ m (r - 2 m) ]
[ 0 0 - ----------- 0 ]
[ 4 ]
[ r ]
riem = [ ]
1, 3 [ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ m (r - 2 m) ]
[ 0 0 0 - ----------- ]
[ 4 ]
[ r ]
riem = [ ]
1, 4 [ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ ]
[ 2 m ]
[ - ------------ 0 0 0 ]
riem = [ 2 ]
2, 1 [ r (r - 2 m) ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ 2 m ]
[ ------------ 0 0 0 ]
[ 2 ]
[ r (r - 2 m) ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ m ]
2, 2 [ 0 0 - ------------ 0 ]
[ 2 ]
[ r (r - 2 m) ]
[ ]
[ m ]
[ 0 0 0 - ------------ ]
[ 2 ]
[ r (r - 2 m) ]
[ 0 0 0 0 ]
[ ]
[ m ]
[ 0 0 ------------ 0 ]
riem = [ 2 ]
2, 3 [ r (r - 2 m) ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ ]
[ m ]
[ 0 0 0 ------------ ]
riem = [ 2 ]
2, 4 [ r (r - 2 m) ]
[ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ m ]
3, 1 [ - 0 0 0 ]
[ r ]
[ ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ m ]
3, 2 [ 0 - 0 0 ]
[ r ]
[ ]
[ 0 0 0 0 ]
[ m ]
[ - - 0 0 0 ]
[ r ]
[ ]
[ m ]
[ 0 - - 0 0 ]
riem = [ r ]
3, 3 [ ]
[ 0 0 0 0 ]
[ ]
[ 2 m - r ]
[ 0 0 0 ------- + 1 ]
[ r ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ 2 m ]
3, 4 [ 0 0 0 - --- ]
[ r ]
[ ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ 0 0 0 0 ]
4, 1 [ ]
[ 2 ]
[ m sin (theta) ]
[ ------------- 0 0 0 ]
[ r ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ 0 0 0 0 ]
4, 2 [ ]
[ 2 ]
[ m sin (theta) ]
[ 0 ------------- 0 0 ]
[ r ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
[ ]
riem = [ 0 0 0 0 ]
4, 3 [ ]
[ 2 ]
[ 2 m sin (theta) ]
[ 0 0 - --------------- 0 ]
[ r ]
[ 2 ]
[ m sin (theta) ]
[ - ------------- 0 0 0 ]
[ r ]
[ ]
[ 2 ]
[ m sin (theta) ]
riem = [ 0 - ------------- 0 0 ]
4, 4 [ r ]
[ ]
[ 2 ]
[ 2 m sin (theta) ]
[ 0 0 --------------- 0 ]
[ r ]
[ ]
[ 0 0 0 0 ]
(%o5) done
n番目の要素を削除したLから成る新しいリストを返します。
ctensorデフォルト値: 4
ctensor (成分テンソル)パッケージのオプション。
dimは
デフォルト4の多様体の次元です。
コマンド dim: nは
次元を任意の別の値 nに再設定します。
デフォルト値: false
ctensor (成分テンソル)パッケージのオプション。
もし diagmetricが trueなら、
特殊なルーチンが
計量の対角性を考慮して
(計量テンソルを明示的に含む)幾何的オブジェクトすべてを
計算します。
もちろん、実行時間短縮になります。
注意:
もし対角計量が指定されたら、
csetupは自動的にこのオプションを設定します。
テンソルを計算する時、三角関数整理を使うようにします。
現在、
ctrgsimpは
動標構を含む計算だけに影響します。
計算を
ホロノミック(holonomic)計量と対比して動標構に関係して実行するようにします。
標構は逆標構配列 friと標構計量 lfgで定義されます。
Cartesian標構を使う計算に関して、
lfgは適切な次元の単位行列でなければいけません;
Lorentz標構での計算に関して、
lfgは適切な符号を持たなければいけません。
コントーションテンソルが
接続係数の計算に含まれるようにします。
コントーションテンソル自体は
ユーザーが提供するテンソル trから
contortionによって計算されます。
非計量性係数が
接続係数の計算に含まれるようにします。
コントーションテンソルは
ユーザーが提供する非計量性ベクトル nmから
関数 nonmetricityによって計算されます。
もし trueに設定されているなら、
いくつかの ctensor計算が
Taylor級数展開を使って実行されるようにします。
現在、 christof, ricci, uricci, einstein,
weylがこの設定を考慮します。
ctayswitchが trueに設定されているなら
Taylor級数展開で使われる変数。
ctayswitchが trueに設定されている時
Taylor級数展開で使われる最大べき数
ctayswitchが trueに設定されている時
Taylor級数展開が実行される点。
計量テンソル lgの行列式。
cframe_flagが falseに設定されている時、
cmetricによって計算されます。
christofが有理整理を適用するようにします。
デフォルト値: true
もし trueなら、
Einsteinテンソルの非零成分上で
有理整理が実行されます;
もし
ratfacが trueなら、
成分は因数分解もされます。
デフォルト値: true
Riemannテンソルの整理を制御するスイッチの1つです;
もし trueなら、
有理整理がされます;
もし ratfacが trueなら、
成分それぞれは因数分解もされます。
デフォルト値: true
もし trueなら、
このスイッチは,
weyl関数が
Weylテンソルの値に有理整理を適用するようにします。
もしratfacが trueなら、
成分は因数分解もされます。
共変標構計量。
デフォルトでは、
符号 (+,+,+,-)を持つ4次元Lorentz標構に初期化されます。
cframe_flagが trueの時使われます。
逆標構計量。
cframe_flagが trueに設定されているなら、
cmetricがコールされた時
lfgから計算されます。
(3,1) Riemannテンソル。
関数 riemannが呼び出された時計算されます。
添字順序についての情報については、
riemannの記述を参照してください。
もし cframe_flagが trueなら、
riemは
共変Riemannテンソル lriemから計算されます。
共変Riemannテンソル。
lriemannが計算します。
反変Riemannテンソル。
混合Ricciテンソル。
ricciが計算します。
反変Ricciテンソル。
ricciが計算します。
計量テンソル。
このテンソルは
他の計算が実行される前に
(dim掛け dim行列として)指定されなければいけません。
計量テンソルの逆元。
cmetricが計算します。
Weylテンソル。
weylが計算します。
frame_bracketによって計算される、
標構ブラケット係数。
Kretchmann不変量。
rinvariantが計算します。
Newman-Penroseヌルテトラド。
nptetradが計算します。
上付き添字 Newman-Penroseヌルテトラド。
nptetradが計算します。
ug.npとして定義されます。
積 np.transpose(npi)は定数です:
(%i39) trigsimp(np.transpose(npi));
[ 0 - 1 0 0 ]
[ ]
[ - 1 0 0 0 ]
(%o39) [ ]
[ 0 0 0 1 ]
[ ]
[ 0 0 1 0 ]
ユーザーが提供するねじれを表す階数3のテンソル
contortionが使います。
コントーションテンソル。
contortionが trから計算します。
ユーザーが提供する非計量性ベクトル。
nonmetricityが使います。
nonmetricityが nmから計算する
非計量性係数。
テンソルパッケージが初期化されたかを示す変数。
csetupが設定し使います。
init_ctensorが再設定します。
デフォルト値: []
ctensor (成分テンソル)パッケージのオプション。
ct_coordsは座標のリストを含みます。
関数 csetupがコールされる時通常定義される一方、
割り当て ct_coords: [j1, j2, ..., jn]で座標を再定義できます。
ここで、jは新しい座標名です。
csetupも参照してください。
ctensorパッケージによって
以下の名前が内部的に使われます。
なので再定義してはいけません:
Name Description --------------------------------------------------------------------- _lg() Evaluates to lfg if frame metric used, lg otherwise _ug() Evaluates to ufg if frame metric used, ug otherwise cleanup() Removes items drom the deindex list contract4() Used by psi() filemet() Used by csetup() when reading the metric from a file findde1() Used by findde() findde2() Used by findde() findde3() Used by findde() kdelt() Kronecker-delta (not generalized) newmet() Used by csetup() for setting up a metric interactively setflags() Used by init_ctensor() readvalue() resimp() sermet() Used by csetup() for entering a metric as Taylor-series txyzsum() tmetric() Frame metric, used by cmetric() when cframe_flag:true triemann() Riemann-tensor in frame base, used when cframe_flag:true tricci() Ricci-tensor in frame base, used when cframe_flag:true trrc() Ricci rotation coefficients, used by christof() yesp()
2004年11月に ctensorパッケージは広範囲に渡って書き直されました。
多くの関数と変数は、パッケージにMacsymaの商用版との互換性を持たせるために、
リネームされました。
New Name Old Name Description --------------------------------------------------------------------- ctaylor() DLGTAYLOR() Taylor-series expansion of an expression lgeod[] EM Geodesic equations ein[] G[] Mixed Einstein-tensor ric[] LR[] Mixed Ricci-tensor ricci() LRICCICOM() Compute the mixed Ricci-tensor ctaypov MINP Maximum power in Taylor-series expansion cgeodesic() MOTION Compute geodesic equations ct_coords OMEGA Metric coordinates ctayvar PARAM Taylor-series expansion variable lriem[] R[] Covariant Riemann-tensor uriemann() RAISERIEMANN() Compute the contravariant Riemann-tensor ratriemann RATRIEMAN Rational simplif. of the Riemann-tensor uric[] RICCI[] Contravariant Ricci-tensor uricci() RICCICOM() Compute the contravariant Ricci-tensor cmetric() SETMETRIC() Set up the metric ctaypt TAYPT Point for Taylor-series expansion ctayswitch TAYSWITCH Taylor-series setting switch csetup() TSETUP() Start interactive setup session ctransform() TTRANSFORM() Interactive coordinate transformation uriem[] UR[] Contravariant Riemann-tensor weyl[] W[] (3,1) Weyl-tensor