atensorは、代数テンソル操作パッケージです。
atensorを使うには、load("atensor")をタイプしてください。
続いて、init_atensor関数コールしてください。
atensorの本質は非可換(ドット)積演算子 (".")の整理ルール一式です
atensorはいくつかの代数型を認識します;
init_atensor関数がコールされた時、
対応する整理ルールが有効になります。
atensorの能力は、
四元数代数を2つの基底ベクトルを持つClifford代数 Cl(0,2)として
定義することで実演することができます。
3つの四元数虚数単位は2つの基底ベクトルとその積、すなわち以下の通りです:
i = v j = v k = v . v
1 2 1 2
atensorパッケージは
四元数代数に関する組み込みの定義を持ちますが、
この例では使わず、四元数乗算表を行列として組むよう試みます:
(%i1) load("atensor");
(%o1) /share/tensor/atensor.mac
(%i2) init_atensor(clifford,0,0,2);
(%o2) done
(%i3) atensimp(v[1].v[1]);
(%o3) - 1
(%i4) atensimp((v[1].v[2]).(v[1].v[2]));
(%o4) - 1
(%i5) q:zeromatrix(4,4);
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
(%o5) [ ]
[ 0 0 0 0 ]
[ ]
[ 0 0 0 0 ]
(%i6) q[1,1]:1;
(%o6) 1
(%i7) for i thru adim do q[1,i+1]:q[i+1,1]:v[i];
(%o7) done
(%i8) q[1,4]:q[4,1]:v[1].v[2];
(%o8) v . v
1 2
(%i9) for i from 2 thru 4 do for j from 2 thru 4 do
q[i,j]:atensimp(q[i,1].q[1,j]);
(%o9) done
(%i10) q;
[ 1 v v v . v ]
[ 1 2 1 2 ]
[ ]
[ v - 1 v . v - v ]
[ 1 1 2 2 ]
(%o10) [ ]
[ v - v . v - 1 v ]
[ 2 1 2 1 ]
[ ]
[ v . v v - v - 1 ]
[ 1 2 2 1 ]
atensorは
添字付きシンボルを基底ベクトルと認識します。
シンボルはasymbolの中に記憶されたものであり、
添字は1からadimまで間です。
添字付きシンボルだけに関して
双一次形式
sf, af, avが評価されます。
評価は
fun(v[i],v[j])に
aform[i,j]の値を代入します
ここで、vは asymbolの値を表し、
funは afか sfを示します;
あるいは、
av(v[i],v[j])に v[aform[i,j]]を代入します。
言うまでもなく、関数 sf, af, avは再定義するこができます。
atensorパッケージがロードされる時、以下のフラグが設定されます:
dotscrules:true; dotdistrib:true; dotexptsimp:false;
もし非結合代数で実験したいなら、
dotassocを falseに設定することも考えるかもしれません。
しかし、この場合、
atensimpはいつも
望みの整理を得ることができるわけではありません。
特定の代数型で
atensorパッケージを初期化します。
alg_typeは以下のいずれかであり得ます:
universal: 普遍代数は交換規則を持ちません。
grassmann: Grassman代数は交換関係 u.v+v.u=0で定義されます。
clifford: Clifford代数は
交換関係 u.v+v.u=-2*sf(u,v)で定義されます。
ここで、 sfは対称スカラ値函数です。
この代数では、 opt_dimsは、
代数の正の次元数、縮退次元数、負の次元数をそれぞれ表す3つの非負整数までありえます。
もしいずれかの opt_dims値が供給されたら、
atensorは
adimと aformの値を適切に構成します。
そうでなければ、
adimはデフォルトが0で、 aformは未定義です。
symmetric: 対称代数は交換関係 u.v-v.u=0で定義されます。
symplectic: シンプレクティック代数は
交換関係 u.v-v.u=2*af(u,v)で定義されます。
ここで、 afは反対称スカラ値函数です。
シンプレクティック代数では、
opt_dimsは
非縮退次元数、縮退次元数をそれぞれ表す2つの非負整数までありえます。
もしいずれかの opt_dims値が供給されたら、
atensorは
adimと aformの値を適切に構成します。
そうでなければ、
adimはデフォルトが0で、 aformは未定義です。
lie_envelop: Lie包絡代数は交換関係 u.v-v.u=2*av(u,v)で定義されます。
ここで、 avは反対称函数です。
init_atensor関数はいくつかの予め定義された代数型も認識します:
complexは複素数代数をClifford代数 Cl(0,1)として実装します。
init_atensor(complex)をコールすることは
init_atensor(clifford,0,0,1)と同値です。
quaternionは四元数代数を実装します。
init_atensor (quaternion)をコールすることは
init_atensor (clifford,0,0,2)と同値です。
pauliはPauliスピノール代数をClifford代数 Cl(3,0)として実装します。
init_atensor(pauli)をコールすることは
init_atensor(clifford,3)と同値です。
diracはDiracスピノール代数をClifford代数 Cl(3,1)として実装します。
init_atensor(dirac)をコールすることは
init_atensor(clifford,3,0,1)と同値です。
init_atensorのコールで構成された規則に従って、
代数テンソル式 exprを整理します。
整理は、
適用可能な場所への
交換関係の再帰的な適用とsf, af, avのコールの決定を含みます。
複雑な式に関してさえ、
関数がいつでも終了することを確実にするために
保護手段が使われます。
デフォルト値: 0
代数の次元。
atensorは
添字付きオブジェクトが有効な基底ベクトルか決定するのに
adimの値を使います。
abasepを参照してください。
デフォルト値: ident(3)
双一次形式sf, af, avのデフォルト値。
デフォルトは、単位行列 ident(3)です。
デフォルト値: v
基底ベクトルのシンボル。
交換関係で使われる対称スカラ関数。
デフォルトの実装は
両方の引数がabasepを使った基底ベクトルかチェックし、
もしそうなら、行列 aformから対応する値を代入します。
交換関係で使われる反対称スカラ関数。
デフォルトの実装は
両方の引数がabasepを使った基底ベクトルかチェックし、
もしそうなら、行列 aformから対応する値を代入します。
交換関係で使われる反対称スカラ関数。
デフォルトの実装は
両方の引数がabasepを使った基底ベクトルかチェックし、
もしそうなら、行列 aformから対応する値を代入します。
例えば:
(%i1) load("atensor");
(%o1) /share/tensor/atensor.mac
(%i2) adim:3;
(%o2) 3
(%i3) aform:matrix([0,3,-2],[-3,0,1],[2,-1,0]);
[ 0 3 - 2 ]
[ ]
(%o3) [ - 3 0 1 ]
[ ]
[ 2 - 1 0 ]
(%i4) asymbol:x;
(%o4) x
(%i5) av(x[1],x[2]);
(%o5) x
3
引数が atensor基底ベクトルかチェックします。
すなわち、asymbolの値と同じシンボルと
1と adimの間の数値の添字を持つ添字付きシンボルかどうか、チェックします。