Next: , Previous:   [Contents][Index]

26 ctensor


26.1 Introduction to ctensor

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


26.2 Functions and Variables for ctensor

26.2.1 Initialization and setup

関数: csetup ()

パッケージを初期化し、ユーザーに計量を対話的に入力可能にする ctensor(成分テンソル)パッケージの関数 より詳細はctensorを参照してください。

関数: cmetric (dis)
関数: cmetric ()

計量の逆元を計算し、将来の計算のためパッケージを設定する ctensor(成分テンソル)パッケージの関数

もしcframe_flagfalseなら、 関数は逆計量ugを(ユーザー定義の)行列lgから計算します。 計量の行列式も計算され、変数gdetに保存されます。 更に、パッケージは計量が対角的か調べ、結果に従ってdiagmetricの値を設定します。 もしオプション引数disが渡されて、それがfalseでないなら、 ユーザーは計量の逆元を見るように促されます。

もしcframe_flagtrueなら、 関数はfri (逆標構行列)とlfg(標構計量)の値が定義されていると考えます。 これらから、標構行列frと逆標構計量ufgが計算されます。

関数: ct_coordsys (coordinate_system, extra_arg)
関数: ct_coordsys (coordinate_system)

あらかじめ定義された座標系と計量を設定します。 引数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_flagtrueの時 変換関数も使うことができます:


(%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は以下のいずれかです:

cylindricalct_coordsysに追加の極座標を結びつけるように言います。

minkowskict_coordsysに 負の計量符号を持つ追加の座標を結びつけるように言います。

allct_coordsysに 計量を設定した後、 cmetricchristof(false)をコールするように言います。

もしグローバル変数 verbosetrueに設定されているなら、 ct_coordsysは、 cframe_flagの値に依存して、 dim, ct_coordsと、 lglfgのいずれかと friの値を表示します。

関数: init_ctensor ()

ctensorパッケージを初期化します。

init_ctensor関数はctensorパッケージを再初期化します。 それはctensorが使う配列、行列すべてを削除し、 フラグすべてをリセットし、 dimを4にリセットし、 標構計量を Lorentz標構にリセットします。

26.2.2 The tensors of curved space

ctensorパッケージの 主な目的は曲がった空間(時間)のテンソル、 最も顕著には一般相対性理論で使われるテンソルを計算することです。

計量基底が使われる時、 ctensorは以下のテンソルを計算できます:


 lg  -- ug
   \      \
    lcs -- mcs -- ric -- uric
              \      \       \
               \      tracer - ein -- lein
                \
                 riem -- lriem -- weyl
                     \
                      uriem


ctensorは動標構を使って機能することもできます。 cframe_flagtrueに設定されている時、 以下のテンソルを計算できます:


 lfg -- ufg
     \
 fri -- fr -- lcs -- mcs -- lriem -- ric -- uric
      \                       |  \      \       \
       lg -- ug               |   weyl   tracer - ein -- lein
                              |\
                              | riem
                              |
                              \uriem

関数: christof (dis)

ctensor (成分テンソル)パッケージの関数。 各種Christoffel記号を計算します。 引数 disは どの結果をすぐに表示するか決めます。 第一種と第二種Christoffel記号は それぞれ配列 lcs[i,j,k]mcs[i,j,k]に格納され、 最初の2つの添字に対して対称と定義されます。 もし christofの引数が lcsmcsなら それぞれ、lcs[i,j,k]mcs[i,j,k]の固有の非零値が 表示されます。 もし引数が allなら、 lcs[i,j,k]mcs[i,j,k]の固有の非零値が表示されます。 もし引数が falseなら、 要素の表示はされません。 配列要素 mcs[i,j,k]は 最後の添字が反変であるような方法で定義されます。

関数: ricci (dis)

ctensor (成分テンソル)パッケージの関数。 ricciは Ricciテンソルの共変(対称)成分 ric[i,j]を計算します。 もし引数 distrueなら、 非零成分が表示されます。

関数: uricci (dis)

この関数は最初にRicciテンソルの共変成分 ric[i,j]を計算します。 そして、混合 Ricciテンソルが反変計量テンソルを使って計算されます。 もし引数 disの値が trueなら これらの(添字 iは共変で、添字 jは反変の)混合成分 uric[i,j] は直接表示されます。 そうでないなら、 ricci(false)は 結果を表示することなく、単に配列 uric[i,j]の要素を計算します。

関数: scurvature ()

与えられた計量を持つ Riemannian多様体の (Ricciテンソルを縮約することで得られる)スカラ曲率を返します。

関数: einstein (dis)

ctensor (成分テンソル)パッケージの関数。 einsteinは、 (関数 christofricciを使って) Christoffel記号と Ricciテンソルを得られた後、 混合 Einsteinテンソルを計算します。 もし引数 distrueなら、 混合 Einsteinテンソル ein[i,j]の非零値が表示されます。 ここで jは反変添字です。 変数 rateinsteinは これらの成分上の有理整理をもたらします。 もし ratfactrueなら、 成分は因数分解もされます。

関数: leinstein (dis)

共変 Einsteinテンソル。 leinsteinは 配列 leinに共変 Einsteinテンソルの値を格納します。 共変 Einsteinテンソルは、 計量テンソルを掛けることで 混合 Einsteinテンソル einから計算されます。 もし引数 distrueなら、 共変 Einsteinテンソルの非零値が表示されます。

関数: riemann (dis)

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関数で使われる表記法と 一致しています。 もしオプション引数 distrueなら、 固有の非零成分 riem[i,j,k,l]が表示されます。 Einsteinテンソルと同様に ユーザーが設定する様々なスイッチが Riemannテンソルの成分の整理を制御します。 もし ratriemanntrueなら、 有理整理がされます。 もし ratfactrueなら、 成分のそれぞれは因数分解もされます。

もし変数 cframe_flagfalseなら、 Riemannテンソルは Christoffel記号から直接計算されます。 もし cframe_flagtrueなら、 共変 Riemannテンソルは 標構場係数から最初に計算されます。

関数: lriemann (dis)

共変 Riemannテンソル (lriem[]).

配列 lriemとして 共変 Riemannテンソルを計算します。 もし引数 distrueなら、 固有の非零値が表示されます。

もし変数 cframe_flagtrueなら、 共変 Riemannテンソルは 標構場係数から直接計算されます。 そうでないなら、 (3,1) Riemannテンソルが最初に計算されます。

添字順序の情報は riemannを参照してください。

関数: uriemann (dis)

配列要素 uriem[i,j,k,l]として Riemann曲率テンソルの反変成分を計算します。 もし distrueなら、これらが表示されます。

関数: rinvariant ()

テンソル

lriem[i,j,k,l]*uriem[i,j,k,l].

を縮約することで得られるKretschmann不変量 (kinvariant)を形成します。

このオブジェクトは非常に大きくなるかもしれないので、 自動的には整理されません。

関数: weyl (dis)

Weylの共形テンソルを計算します。 もし引数 distrueなら、 非零成分 weyl[i,j,k,l]がユーザーに表示されます。 そうでないなら、これらの成分は 単に計算され、格納されます。 もしスイッチ ratweyltrueに設定されているなら、 成分は有理整理されます; もし ratfactrueなら、 結果は因数分解もされます。

26.2.3 Taylor series expansion

ctensorパッケージは 結果が Taylor級数近似であると仮定することで、結果を切り詰める機能を持ちます。 この振る舞いは ctayswitch変数で制御されます; trueに設定されている時、 結果を整理する際に ctensorは内部的に関数 ctaylorを利用します。

以下の ctensor関数が ctaylor関数を呼び出します:


    Function     Comments
    ---------------------------------
    christof()   For mcs only
    ricci()
    uricci()
    einstein()
    riemann()
    weyl()
    checkdiv()
関数: ctaylor ()

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



この能力は 例えば、 重力源から遠く、弱い場極限で取り組む時に 役に立つかもしれません。

26.2.4 Frame fields

変数 cframe_flagが trueに設定している時、 ctensorパッケージは 動標構(moving frame)を使って計算を実行します。

関数: frame_bracket (fr, fri, diagframe)

標構(frame)ブラケット (fb[]).

以下の定義に従って標構ブラケットを計算します:

   c          c         c        d     e
ifb   = ( ifri    - ifri    ) ifr   ifr
   ab         d,e       e,d      a     b

26.2.5 Algebraic classification

ctensorの(2004年11月時点で)新しい特長は 4次元時空計量のPetrov分類を計算する能力です。 この機能のデモンストレーションは、 ファイル share/tensor/petrov.dem参照してください。

関数: nptetrad ()

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

関数: psi (dis)

5つの Newman-Penrose係数 psi[0]...psi[4]を計算します。 もし distrueに設定されているなら、 係数が表示されます。 例は petrovを参照してください。

これらの係数は 座標基底に関して、Weylテンソルから計算されます。 もし標構基底が使われるなら、 最初にWeylテンソルが座標基底に変換されます。 座標基底は計算に関して高価な手続きであり得ます。 この理由で、 いくつかの場合、 Weylテンソルを計算する前に まず座標基底を使うことはより都合がいいかも知れません。 しかし、 Newman-Penroseヌルテトラドを構成することは標構基底を要求することに注意してください。 それ故に、 重要な一連の計算は、標構基底で始めることができます。 標構基底は、後で (cmetricが自動的に計算する) lgugを計算するのに使われます。 この時点で、 Christoffel記号を計算し始める前に cframe_flagを falseに設定することで 座標基底に戻ることができます。 後の段階で標構基底に変えることは、 標構基底で計算したいくつか、座標基底でのいくつかと 2つを識別する方法がないまま、テンソルの混ざった状態で終わるかもしれないので、 矛盾する結果をもたらすかもしれません。

関数: petrov ()

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日時点、実装はテストされていなく、 エラーを含みそうです。

26.2.6 Torsion and nonmetricity

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_flagtrueに設定されている時、 ktの値が christofで計算された 混合添字付き接続係数から引かれ、 mcsに格納されます。 同様に、もし cnonmet_flagtrueに設定されているなら、 nmcの値が 混合添字付き接続係数から引かれます。

もし必要なら、 christofは、 ktnmを計算するために 関数 contortionnonmetricityをコールします。

関数: contortion (tr)

ねじれテンソル trから(2,1)コントーション(contortion)係数を計算します。

関数: nonmetricity (nm)

非計量性ベクトル nmから(2,1)非計量性係数を計算します。

26.2.7 Miscellaneous features

関数: ctransform (M)

任意の平方対称行列 M上で座標変換を実行する ctensor (成分テンソル)パッケージの関数。 ユーザーは変換を定義する函数を入力しなければいけません。 (以前transformと呼ばれていました。)

関数: findde (A, n)

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]]
関数: cograd ()

スカラ関数の 共変勾配を計算します。 contragradが以下で例示する例のように ユーザーは対応するベクトル名を選べます。

関数: 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
関数: dscalar ()

依存性が関数に宣言されるとすぐ、 スカラ関数のテンソル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
関数: checkdiv ()

ベクトル場(発散)の対応するn個の成分を印字することで (最初の添字が共変でなければいけない)混合二階テンソルの共変発散を計算します。 ここでn = dimです。 もし関数の引数が gなら、 Einsteinテンソルの発散が形成され、零にならなければいけません。 加えて、発散(ベクトル)は 配列名 divを与えられます。

関数: cgeodesic (dis)

ctensor (成分テンソル)パッケージの関数。 cgeodesicは 与えられた計量での運動の測地方程式を計算します。 それらは配列 geod[i]に格納されます。 もし引数 distrueなら、 これらの方程式が表示されます。

関数: bdvac (f)

Brans- Dicke重力理論の 真空場の方程式の 共変成分を生成します。 スカラ場は引数 fで指定されます。 fは、 例えば、'p(x)のように、 関数依存性を持つ(クォートされた)関数名でなければいけません。

二階共変場テンソルの成分は配列 bdで表されます。

関数: invariant1 ()

R^2の不変密度に関する 混合Euler- Lagrangeテンソル(場の方程式)を生成します。 場の方程式は inv1と名付けられた配列の成分です。

関数: invariant2 ()

*** NOT YET IMPLEMENTED ***

ric[i,j]*uriem[i,j]の不変密度に関する 混合Euler- Lagrangeテンソル(場の方程式)を生成します。 場の方程式は inv2と名付けられた配列の成分です。

関数: bimetric ()

*** NOT YET IMPLEMENTED ***

Rosenの二計量(bimetric)理論の場の方程式を生成します。 場の方程式は rosenと名付けられた配列の成分です。

26.2.8 Utility functions

関数: diagmatrixp (M)

もし Mが対角行列か対角 (2D) 配列なら trueを返します。

関数: symmetricp (M)

もし Mが対称行列か対称 (2D) 配列なら trueを返します。

関数: ntermst (f)

ユーザーに 二重に下付き添字テンソル(配列) fの「サイズ」のquick pictureを与えます。 二番目の要素が 一番目の要素が指定する成分のNTERMSに対応する2つの要素のリストを印字します。 この方法で、 非零式をすばやく見つけて整理を試みることが可能です。

関数: cdisplay (ten)

多次元配列で表されるように、 テンソル 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

関数: deleten (L, n)

n番目の要素を削除したLから成る新しいリストを返します。

26.2.9 Variables used by ctensor

オプション変数: dim

デフォルト値: 4

ctensor (成分テンソル)パッケージのオプション。 dimは デフォルト4の多様体の次元です。 コマンド dim: nは 次元を任意の別の値 nに再設定します。

オプション変数: diagmetric

デフォルト値: false

ctensor (成分テンソル)パッケージのオプション。 もし diagmetrictrueなら、 特殊なルーチンが 計量の対角性を考慮して (計量テンソルを明示的に含む)幾何的オブジェクトすべてを 計算します。 もちろん、実行時間短縮になります。 注意: もし対角計量が指定されたら、 csetupは自動的にこのオプションを設定します。

オプション変数: ctrgsimp

テンソルを計算する時、三角関数整理を使うようにします。 現在、 ctrgsimpは 動標構を含む計算だけに影響します。

オプション変数: cframe_flag

計算を ホロノミック(holonomic)計量と対比して動標構に関係して実行するようにします。 標構は逆標構配列 friと標構計量 lfgで定義されます。 Cartesian標構を使う計算に関して、 lfgは適切な次元の単位行列でなければいけません; Lorentz標構での計算に関して、 lfgは適切な符号を持たなければいけません。

オプション変数: ctorsion_flag

コントーションテンソルが 接続係数の計算に含まれるようにします。 コントーションテンソル自体は ユーザーが提供するテンソル trから contortionによって計算されます。

オプション変数: cnonmet_flag

非計量性係数が 接続係数の計算に含まれるようにします。 コントーションテンソルは ユーザーが提供する非計量性ベクトル nmから 関数 nonmetricityによって計算されます。

オプション変数: ctayswitch

もし trueに設定されているなら、 いくつかの ctensor計算が Taylor級数展開を使って実行されるようにします。 現在、 christof, ricci, uricci, einstein, weylがこの設定を考慮します。

オプション変数: ctayvar

ctayswitchtrueに設定されているなら Taylor級数展開で使われる変数。

オプション変数: ctaypov

ctayswitchtrueに設定されている時 Taylor級数展開で使われる最大べき数

オプション変数: ctaypt

ctayswitchtrueに設定されている時 Taylor級数展開が実行される点。

システム変数: gdet

計量テンソル lgの行列式。 cframe_flagfalseに設定されている時、 cmetricによって計算されます。

オプション変数: ratchristof

christofが有理整理を適用するようにします。

オプション変数: rateinstein

デフォルト値: true

もし trueなら、 Einsteinテンソルの非零成分上で 有理整理が実行されます; もし ratfactrueなら、 成分は因数分解もされます。

オプション変数: ratriemann

デフォルト値: true

Riemannテンソルの整理を制御するスイッチの1つです; もし trueなら、 有理整理がされます; もし ratfactrueなら、 成分それぞれは因数分解もされます。

オプション変数: ratweyl

デフォルト値: true

もし trueなら、 このスイッチは, weyl関数が Weylテンソルの値に有理整理を適用するようにします。 もしratfactrueなら、 成分は因数分解もされます。

変数: lfg

共変標構計量。 デフォルトでは、 符号 (+,+,+,-)を持つ4次元Lorentz標構に初期化されます。 cframe_flagtrueの時使われます。

変数: ufg

逆標構計量。 cframe_flagtrueに設定されているなら、 cmetricがコールされた時 lfgから計算されます。

変数: riem

(3,1) Riemannテンソル。 関数 riemannが呼び出された時計算されます。 添字順序についての情報については、 riemannの記述を参照してください。

もし cframe_flagtrueなら、 riemは 共変Riemannテンソル lriemから計算されます。

変数: lriem

共変Riemannテンソル。 lriemannが計算します。

変数: uriem

反変Riemannテンソル。

変数: ric

混合Ricciテンソル。 ricciが計算します。

変数: uric

反変Ricciテンソル。 ricciが計算します。

変数: lg

計量テンソル。 このテンソルは 他の計算が実行される前に (dim掛け dim行列として)指定されなければいけません。

変数: ug

計量テンソルの逆元。 cmetricが計算します。

変数: weyl

Weylテンソル。 weylが計算します。

変数: fb

frame_bracketによって計算される、 標構ブラケット係数。

変数: kinvariant

Kretchmann不変量。 rinvariantが計算します。

変数: np

Newman-Penroseヌルテトラド。 nptetradが計算します。

変数: npi

上付き添字 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 ]
変数: tr

ユーザーが提供するねじれを表す階数3のテンソル contortionが使います。

変数: kt

コントーションテンソル。 contortiontrから計算します。

変数: nm

ユーザーが提供する非計量性ベクトル。 nonmetricityが使います。

変数: nmc

nonmetricitynmから計算する 非計量性係数。

システム変数: tensorkill

テンソルパッケージが初期化されたかを示す変数。 csetupが設定し使います。 init_ctensorが再設定します。

オプション変数: ct_coords

デフォルト値: []

ctensor (成分テンソル)パッケージのオプション。 ct_coordsは座標のリストを含みます。 関数 csetupがコールされる時通常定義される一方、 割り当て ct_coords: [j1, j2, ..., jn]で座標を再定義できます。 ここで、jは新しい座標名です。 csetupも参照してください。

26.2.10 Reserved names

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()

26.2.11 Changes

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


Next: , Previous:   [Contents][Index]