Nächste: Tensorsymmetrien, Vorige: Funktionen und Variablen für ITENSOR, Nach oben: Funktionen und Variablen für ITENSOR [Inhalt][Index]
Ist vergleichbar mit der Funktion rename
und vereinfacht den Ausdruck
expr indem gebundene Indizes umbenannt und permutiert werden. Wie die
Funktion rename
kann canten
nur Ausdrücke mit Summen von
Tensorprodukten vereinfachen, in denen keine Ableitungen nach Tensorkomponenten
auftreten. Daher sollte canten
nur verwendet werden, wenn sich mit
der Funktion canform
nicht die gewünschte Vereinfachung eines
Ausdrucks erzielen lässt.
Das Ergebnis der Funktion canten
ist mathematisch nur korrekt, wenn
die Tensoren symmetrisch in ihren Indizes sind. Hat die Optionsvariable
allsym
nicht den Wert true
, bricht canten
mit einer
Fehlermeldung ab.
Siehe auch die Funktion concan
, mit der Ausdrücke mit Tensoren
ebenfalls vereinfacht werden können, wobei concan
zusätzlich
Tensorverjüngungen ausführt.
Ändert den Namen aller Tensoren im Ausdruck expr von
old nach new. Das Argument old kann ein Symbol oder eine
Liste der Form [name, m, n]
sein. Im letzteren Fall
werden nur die Tensoren zu new umbenannt, die den Namen name
sowie m kovariante und n kontravariante Indizes haben.
Beispiel:
In diesem Beispiel wird der Name c zu w geändert.
(%i1) load("itensor")$ (%i2) expr:a([i,j],[k])*b([u],[],v)+c([x,y],[])*d([],[])*e$ (%i3) ishow(changename(c, w, expr))$ k (%t3) d e w + a b x y i j u,v
Erlaubt die Zuweisung von Werten an die Komponenten eines Tensors tensor,
die mit dem Argument expr angegeben werden. Immer wenn der Tensor
tensor mit all seinen Indizes in einem Ausdruck auftritt, werden die
Komponenten mit den angegebenen Werten substituiert. Der Tensor muss die Form
t([...],[...])
haben, wobei die Listen auch leer sein können. Das
Argument expr ist irgendein Ausdruck, der dieselben freien Indizes wie
der Tensor tensor hat. Sollen Werte an einen Metriktensor zugewiesen
werden, der Dummy-Indizes hat, so muss auf die Benennung der Indizes
sorgfältig geachtet werden, um das Auftreten von Mehrfachen Dummy-Indizes zu
vermeiden. Mit der Funktion remcomps
werden Zuweisungen der Funktion
components
an die Komponenten eines Tensors entfernt.
Es muss beachtet werden, dass die Funktion components
nur den Typ eines
Tensors, aber nicht die Ordnung der Indizes beachtet. Werden daher Werte
an die Komponenten der Tensoren x([i,-j],[])
, x([-j,i],[])
oder
x([i],[j])
zugewiesen, ergibt sich jeweils dasselbe Ergebnis.
Komponenten können einem indizierten Ausdruck auf vier verschiedene Methoden
zugeordnet werden. Zwei Methoden nutzen die Funktion components
.
1) Als ein indizierte Ausdruck:
(%i2) components(g([],[i,j]), e([],[i])*p([],[j]))$ (%i3) ishow(g([],[i,j]))$ i j (%t3) e p
2) Als eine Matrix:
(%i5) lg:-ident(4)$ lg[1,1]:1$ lg; [ 1 0 0 0 ] [ ] [ 0 - 1 0 0 ] (%o5) [ ] [ 0 0 - 1 0 ] [ ] [ 0 0 0 - 1 ] (%i6) components(g([i,j],[]), lg); (%o6) done (%i7) ishow(g([i,j],[]))$ (%t7) g i j (%i8) g([1,1],[]); (%o8) 1 (%i9) g([4,4],[]); (%o9) - 1
3) Als eine Funktion: Die Werte der Komponenten eines Tensors werden durch eine Funktion gegeben.
(%i4) h(l1,l2,[l3]):=if length(l1)=length(l2) and length(l3)=0 then kdelta(l1,l2) else apply(g,append([l1,l2], l3))$ (%i5) ishow(h([i],[j]))$ j (%t5) kdelta i (%i6) ishow(h([i,j],[k],l))$ k (%t6) g i j,l
4) Mit Mustern und Regeln: Im Folgenden wird ein Beispiel mit den Funktionen
defrule
und applyb1
gezeigt.
(%i1) load("itensor"); (%o1) /share/tensor/itensor.lisp (%i2) matchdeclare(l1,listp); (%o2) done (%i3) defrule(r1,m(l1,[]),(i1:idummy(), g([l1[1],l1[2]],[])*q([i1],[])*e([],[i1])))$ (%i4) defrule(r2,m([],l1),(i1:idummy(), w([],[l1[1],l1[2]])*e([i1],[])*q([],[i1])))$ (%i5) ishow(m([i,n],[])*m([],[i,m]))$ i m (%t5) m m i n (%i6) ishow(rename(applyb1(%,r1,r2)))$ %1 %2 %3 m (%t6) e q w q e g %1 %2 %3 n
Ist vergleichbar mit der Funktion canten
. Im Unterschied zu
canten
werden zusätzlich Tensorverjüngungen ausgeführt.
Führt die Tensorverjüngungen im Ausdruck expr aus, die beliebige
Summen und Produkte sein können. contract
nutzt die Informationen,
die für die Tensoren mit der Funktion defcon
definiert sind. Die
besten Ergebnisse werden erzielt, wenn der Ausdruck expr vollständig
expandiert wird. Die Funktion radexpand
expandiert Produkte und
Potenzen von Summen am schnellsten, sofern keine Variablen im Nenner der Terme
auftreten. Die Optionsvariable gcd
sollte den Wert false
haben,
wenn das Kürzen durch einen größten gemeinsamen Teiler nicht notwendig
ist.
Die Liste contractions
enthält die Tensoren, die mit der Funktion
defcon
die Eigenschaft einer Tensorverjüngung erhalten haben.
Gibt einem Tensor tensor_1 die Eigenschaft, dass die Tensorverjüngung
des Produktes tensor_1 mit tensor_2 das Ergebnis tensor_3
hat. Wird nur ein Argument tensor_1 angegeben, dann hat die
Tensorverjüngung für jeden Tensor tensor
, der die korrekten
Indizes hat, das Ergebnis tensor
mit neuen Indizes, die die
Tensorverjüngung widerspiegeln.
Wird zum Beispiel die Metrik als imetric: g
gesetzt, dann wird
mit defcon(g)
das Hochstellen und Herunterstellen der Indizes mit dem
Metriktensor definiert.
Wird defcon
wiederholt für einen Tensor aufgerufen, ist jeweils die
letzte Definition wirksam.
Die Liste contractions
enthält die Tensoren, die mit der Funktion
defcon
die Eigenschaft einer Tensorverjüngung erhalten haben.
Zeigt die Kontraktionseigenschaften der Tensoren tensor_1, tensor_2,
… wie sie mit der Funktion defcon
definiert wurden. Das Kommando
dispcon(all)
zeigt alle vom Nutzer definierten Kontraktionseigenschaften.
Beispiel:
Wird das Paket itensor
geladen, gibt dispcon
das folgende
Ergebnis.
(%i1) load("itensor")$ (%i2) dispcon(all); (%o2) [[[ifr, ifri, ifg]], [[ifg, ifg, kdelta]]]
Die Funktion entertensor
ermöglicht die Eingabe eines indizierten
Tensors mit einer beliebigen Anzahl an Tensorindizes und Ableitungen. Es kann
ein einzelner Index oder eine Liste mit Indizes angegeben werden. Die Liste
kann eine leere Liste sein.
Beispiel:
(%i1) load("itensor")$ (%i2) entertensor()$ Enter tensor name: a; Enter a list of the covariant indices: [i,j]; Enter a list of the contravariant indices: [k]; Enter a list of the derivative indices: []; k (%t2) a i j
Standardwert: false
Hat die Optionsvariable flipflag
den Wert false
, werden die
Indizes von der Funktion rename
bei der Umbenennung in der Reihenfolge
der kontravarianten Indizes sortiert, ansonsten in der Reihenfolge der
kovarianten Indizes.
Siehe auch das Beispiel für die Funktion rename
.
Standardwert: 0
Enthält die laufende Nummer, um den nächsten Dummy-Index zu bilden.
icounter
wird automatisch erhöht, bevor der neue Index gebildet wird.
Dem Wert icounter
wird er Präfix idummyx
vorangestellt. Der
Standardwert von idummyx
ist %
.
Erhöht den Wert der laufenden Nummer icounter
und gibt einen neuen
Index zurück, indem der Präfix idummyx
der Nummer icounter
vorangestellt wird. Siehe auch die Funktion indices
.
Standardwert: %
Enthält den Präfix, der einem neuen Index vorangestellt wird, der mit der
Funktion idummy
gebildet wird.
Muss ausgeführt werden, bevor einem Tensors tensor Komponenten
zugewiesen werden, für die bereits interne Werte vorliegen wie für
ichr1
, ichr2
oder icurvature
. Siehe das Beispiel
zur Funktion icurvature
.
Gibt eine Liste mit zwei Elementen zurück. Das erste Element ist eine Liste mit den Indizes im Ausdruck expr die frei sind, also nur einmal auftreten. Das zweite Elemente ist eine Liste mit den Indizes, über die summiert wird, die also im Ausdruck genau zweimal auftreten.
Ein Tensorprodukt mit einem Index der mehr als zweimal auftritt, ist nicht
korrekt formuliert. Die Funktion indices
gibt in einem solchen Fall
jedoch keinen Fehler aus.
Beispiel:
(%i1) load("itensor")$ (%i2) ishow(a([i,j],[k,l],m,n)*b([k,o],[j,m,p],q,r))$ k l j m p (%t2) a b i j,m n k o,q r (%i3) indices(%); (%o3) [[l, p, i, n, o, q, r], [k, j, m]]
Zeigt den Ausdruck expr an, wobei Tensoren im Ausdruck mit tiefgestellten kovarianten Indizes und hochgestellten kontravarianten Indizes sowie die Ableitungen mit durch ein Komma getrennten tiefgestellte Indizes angezeigt werden.
Beispiel:
(%i1) load("itensor")$ (%i2) ishow(a([i,j], [k], v,w))$ k (%t2) a i j,v w
kdels
gibt wie die Funktion kdelta
ein Kronecker-Delta zurück.
Im Unterschied zu kdelta
ist das Kronecker-Delta der Funktion
kdels
symmetrisch.
Beispiele:
(%i1) load("itensor"); (%o1) /share/tensor/itensor.lisp (%i2) kdelta([1,2],[2,1]); (%o2) - 1 (%i3) kdels([1,2],[2,1]); (%o3) 1 (%i4) ishow(kdelta([a,b],[c,d]))$ c d d c (%t4) kdelta kdelta - kdelta kdelta a b a b (%i4) ishow(kdels([a,b],[c,d]))$ c d d c (%t4) kdelta kdelta + kdelta kdelta a b a b
Ist das verallgemeinerte Kronecker-Delta im itensor
-Paket. Das Argument
L1 ist die Liste der kovarianten und L2 der kontravarianten
Indizes. kdelta([i],[j])
gibt das einfache Kronecker-Delta zurück.
Das itensor
-Paket erlaubt die Definition des Kronecker-Delta nur mit
kovarianten oder kontravarianten Indizes, wie zum Beispiel
kdelta([i,j],[])
. Mit diesen Größen kann gerechnet werden, sie
sind jedoch keine Tensoren.
lc_l
ist eine Regel, um Ausdrücke zu vereinfachen, die
Levi-Civita-Symbole enthalten. Zusammen mit der Regel lc_u
kann die
Regel zum Beispiel mit der Funktion applyb1
angewendet werden, um
Ausdrücke effizienter zu vereinfachen, als durch eine Auswertung des Symbols
levi_civita
.
Beispiele:
(%i1) load("itensor"); (%o1) /share/tensor/itensor.lisp (%i2) el1:ishow('levi_civita([i,j,k],[])*a([],[i])*a([],[j]))$ i j (%t2) a a levi_civita i j k (%i3) el2:ishow('levi_civita([],[i,j,k])*a([i])*a([j]))$ i j k (%t3) levi_civita a a i j (%i4) canform(contract(expand(applyb1(el1,lc_l,lc_u)))); (%t4) 0 (%i5) canform(contract(expand(applyb1(el2,lc_l,lc_u)))); (%t5) 0
lc_u
ist eine Regel, um Ausdrücke zu vereinfachen, die
Levi-Civita-Symbole enthalten. Zusammen mit der Regel lc_c
kann die
Regel zum Beispiel mit der Funktion applyb1
angewendet werden, um
Ausdrücke effizienter zu vereinfachen, als durch eine Auswertung des Symbols
levi_civita
. Siehe lc_l
für Beispiele.
Vereinfacht den Ausdruck expr mit Levi-Civita-Symbolen. Wenn möglich
werden diese zu Kronecker-Delta-Symbolen vereinfacht. Im Unterschied zu der
Auswertung eines Ausdrucks mit Levi-Civita-Symbolen, vermeidet die Funktion
lc2kdt
das Einführen von numerischen Indizes, die für eine weitere
symbolische Vereinfachung zum Beispiel mit den Funktionen rename
oder
contract
nicht geeignet sind.
Beispiel:
(%i1) load("itensor"); (%o1) /share/tensor/itensor.lisp (%i2) expr:ishow('levi_civita([],[i,j]) *'levi_civita([k,l],[])*a([j],[k]))$ i j k (%t2) levi_civita a levi_civita j k l (%i3) ishow(ev(expr,levi_civita))$ i j k 1 2 (%t3) kdelta a kdelta 1 2 j k l (%i4) ishow(ev(%,kdelta))$ i j j i k (%t4) (kdelta kdelta - kdelta kdelta ) a 1 2 1 2 j 1 2 2 1 (kdelta kdelta - kdelta kdelta ) k l k l (%i5) ishow(lc2kdt(expr))$ k i j k j i (%t5) a kdelta kdelta - a kdelta kdelta j k l j k l (%i6) ishow(contract(expand(%)))$ i i (%t6) a - a kdelta l l
Die Funktion lc2kdt
benötigt in einigen Fällen den Metriktensor.
Ist der Metriktensor zuvor nicht mit der Funktion imetric
definiert,
dann meldet Maxima einen Fehler.
(%i7) expr:ishow('levi_civita([],[i,j]) *'levi_civita([],[k,l])*a([j,k],[]))$ i j k l (%t7) levi_civita levi_civita a j k (%i8) ishow(lc2kdt(expr))$ Maxima encountered a Lisp error: Error in $IMETRIC [or a callee]: $IMETRIC [or a callee] requires less than two arguments. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil. (%i9) imetric(g); (%o9) done (%i10) ishow(lc2kdt(expr))$
%3 i k %4 j l %3 i l %4 j (%t10) (g kdelta g kdelta - g kdelta g %3 %4 %3 k kdelta ) a %4 j k
(%i11) ishow(contract(expand(%)))$ l i l i j (%t11) a - g a j
Ist der Levi-Civita-Tensor, der auch Permutationstensor genannt wird. Der
Tensor hat den Wert 1
, wenn die Liste L eine gerade Permutation
ganzer Zahlen ist, den Wert -1
für eine ungerade Permutation und
ansonsten den Wert 0
.
Beispiel:
Für eine Kreisbewegung ist die Bahngeschwindigkeit v
das Kreuzprodukt
aus Winkelgeschwindigkeit w
und Ortsvektor r
. Wir haben also
v = w x r
. Hier wird eine tensorielle Schreibweise des Kreuzproduktes
mit dem Levi-Civita-Tensor eingeführt. Der Ausdruck wird sodann für die
erste Komponente zu der bekannten Definition des Kreuzproduktes vereinfacht.
(%i1) load("itensor")$ (%i2) ishow(v([],[a])= 'levi_civita([],[a,b,c])*w([b],[])*r([c],[]))$
a a b c (%t2) v = levi_civita w r b c
(%i3) ishow(subst([a=1],%))$ 1 1 b c (%t3) v = levi_civita w r b c (%i4) ishow(ev(%, levi_civita))$ 1 1 b c (%t4) v = kdelta w r 1 2 3 b c (%i5) ishow(expand(ev(%, kdelta)))$ 1 b c c b (%t5) v = kdelta kdelta w r - kdelta kdelta w r 2 3 b c 2 3 b c (%i6) ishow(contract(%))$ 1 (%t6) v = w r - r w 2 3 2 3
In diesem Beispiel wird das Spatprodukt von drei Vektoren a
, b
und
b
mit dem Levi-Civita-Tensor definiert und dann vereinfacht.
(%i1) load("itensor")$ (%i2) ishow(levi_civita([],[i,j,k])*a([i],[])*b([j],[])*c([k],[]))$ i j k (%t2) kdelta a b c 1 2 3 i j k (%i3) ishow(contract(expand(ev(%,kdelta))))$ (%t3) a b c - b a c - a c b + c a b + b c a 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 - c b a 1 2 3
Gibt eine Liste mit allen Tensoren zurück, die im Argument expr enthalten sind.
Beispiel:
(%i1) load("itensor")$ (%i2) ishow(a([i,j],[k])*b([u],[],v)+c([x,y],[])*d([],[])*e)$ k (%t2) d e c + a b x y i j u,v (%i3) ishow(listoftens(%))$ k (%t3) [a , b , c , d] i j u,v x y
Entfernt alle Werte von den Komponenten des Tensors tensor, die einen
Wert mit der Funktion components
erhalten haben.
Entfernt die Eigenschaften der Tensorverjüngung von den Tensoren
tensor_1, …, tensor_n. remcon(all)
entfernt die
Eigenschaften von der Tensorverjüngung für alle Tensoren. Das sind die
Tensoren, die in der Liste contractions
enthalten sind.
Gibt einen zum Argument expr äquivalenten Ausdruck zurück, wobei die
Summationsindizes mit den Werten aus der liste [%1, %2, ...]
umbenannt
sind. Wird das zusätzlich das Argument count angegeben, wird die
Nummerierung mit dem Wert count begonnen. Jeder Summationsindex in einem
Produkt erhält einen verschiedenen Namen. Für eine Summe wird der Zähler
für jeden Term zurückgesetzt. Auf diese Weise wirkt die Funktion
rename
wie eine Vereinfachung eines tensoriellen Ausdrucks. Hat die
Optionsvariable allsym
den Wert true
, werden die Indizes
alphabetisch nach den kovarianten oder kontravarianten Indizes geordnet,
entsprechend dem Wert der Optionsvariablen flipflag
. Hat die
Optionsvariable flipflag
den Wert true
, werden die Indizes
entsprechend der Ordnung der kovarianten Indizes geordnet. Es ist häufig der
Fall, dass das Ordnen sowohl nach den kovarianten als auch den kontravarianten
Indizes einen Ausdruck besser vereinfacht, als allein die Ordnung nach einer
der Indizes.
Beispiele:
(%i1) load("itensor")$ (%i2) allsym: true; (%o2) true (%i3) g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%4],[%3]) *ichr2([%2,%3],[u])*ichr2([%5,%6],[%1]) *ichr2([%7,r],[%2]) -g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%2],[u]) *ichr2([%3,%5],[%1])*ichr2([%4,%6],[%3]) *ichr2([%7,r],[%2])$ (%i4) expr: ishow(%)$
%4 %5 %6 %7 %3 u %1 %2 (%t4) g g ichr2 ichr2 ichr2 ichr2 %1 %4 %2 %3 %5 %6 %7 r %4 %5 %6 %7 u %1 %3 %2 - g g ichr2 ichr2 ichr2 ichr2 %1 %2 %3 %5 %4 %6 %7 r
(%i5) flipflag: true; (%o5) true (%i6) ishow(rename(expr))$ %2 %5 %6 %7 %4 u %1 %3 (%t6) g g ichr2 ichr2 ichr2 ichr2 %1 %2 %3 %4 %5 %6 %7 r %4 %5 %6 %7 u %1 %3 %2 - g g ichr2 ichr2 ichr2 ichr2 %1 %2 %3 %4 %5 %6 %7 r (%i7) flipflag: false; (%o7) false (%i8) rename(%th(2)); (%o8) 0 (%i9) ishow(rename(expr))$ %1 %2 %3 %4 %5 %6 %7 u (%t9) g g ichr2 ichr2 ichr2 ichr2 %1 %6 %2 %3 %4 r %5 %7 %1 %2 %3 %4 %6 %5 %7 u - g g ichr2 ichr2 ichr2 ichr2 %1 %3 %2 %6 %4 r %5 %7
Zeigt die Zuweisungen mit der Funktion components
an die Komponenten des
Tensors tensor. Die Funktion showcomps
kann auch die Komponenten
eines Tensors mit einer höheren Stufe als 2 zeigen.
Beispiel:
(%i1) load("ctensor")$ (%i2) load("itensor")$ (%i3) lg:matrix([sqrt(r/(r-2*m)),0,0,0],[0,r,0,0], [0,0,sin(theta)*r,0],[0,0,0,sqrt((r-2*m)/r)]);
[ r ] [ sqrt(-------) 0 0 0 ] [ r - 2 m ] [ ] [ 0 r 0 0 ] (%o3) [ ] [ 0 0 r sin(theta) 0 ] [ ] [ r - 2 m ] [ 0 0 0 sqrt(-------) ] [ r ]
(%i4) components(g([i,j],[]),lg); (%o4) done (%i5) showcomps(g([i,j],[]));
[ r ] [ sqrt(-------) 0 0 0 ] [ r - 2 m ] [ ] [ 0 r 0 0 ] (%t5) g = [ ] i j [ 0 0 r sin(theta) 0 ] [ ] [ r - 2 m ] [ 0 0 0 sqrt(-------) ] [ r ]
(%o5) false
Nächste: Tensorsymmetrien, Vorige: Funktionen und Variablen für ITENSOR, Nach oben: Funktionen und Variablen für ITENSOR [Inhalt][Index]