Skip to main content

Tensoren

In [39]:
import matplotlib.pyplot as plt
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('svg') 
plt.rcParams['figure.figsize'] = (9,6)

Tensoren kommen in allen Bereichen der Mathematik und den Naturwissenschaften vor. Das Thema ist nicht an sich schwierig - kann aber verwirrend wirken, da es so viele unterschiedliche Zugäng gibt. Wenn man in Lehrbüchern nach dem Satz "Ein Tensor ist..." sucht, findet man schnell ein halbes Dutzend verschiedener Definitionen, die auf den ersten Blick nichts miteinandern zu tun haben. Hier versuche ich, etwas Ordnung in das Chaos zu bringen.

Sammlung wenig hilfreicher Definitionen

Um das Problem zu demonstrieren, habe ich mit der deutschen Wikipediaseite zum Begriff Tensor angefangen, und die Definition von der Seite und von dort verlinkten Referenzen zusammengestellt. Ich glaube nicht, dass man da schlau draus werden kann. (Der englische Artikel ist als Einstieg hilfreicher).

Ein Tensor ist eine multilineare Abbildung, die eine bestimmte Anzahl von Vektoren auf einen Vektor abbildet und eine universelle Eigenschaft erfüllt.

Aha. Eine universelle Eigenschaft. Das hilft ja weiter, als erste Definition. (Ganz abgesehen davon, dass das Quatsch ist. Die "universelle Eigenschaft" gilt für Tensorprodukträume, nicht für einzelne Tensoren).

Tensoren sind dadurch definiert, dass sich ihre Komponenten auf bestimmte Weise transformieren.

Dadurch sind Tensoren definiert. Durch eine bestimmte Weise. Alles klar?

  • Lineare Algebra und Analytische Geometrie -- Ein Lehrbuch für Physiker und Mathematiker von Theodor Bröcker

Mmh. Die Definition erstreckt sich über zwei Seiten, die sich an eine Einführung in die Kategorientheorie anschließt. Dann wird das Tensorprodukt zwischen Vektorräume mittels eines kommutativen Diagrams über eine Universalitätseigenschaft bezügliche der Realisierbarkeit bilinear Abbildungen eingeführt. Dann wird erst mal die Existenz bewiesen.

Ein Lehrbuch für Physiker? Na gut.

  • Angewandte Tensorrechnung von Prof. Dr. rer. nat. Dr. mont. h.c. (ja, wirklich) Horst Lippmann

Ein Tensor $m$-ter Stufe ist eine lineare Abbildung der Vektor-$m$-Tupel des $n$-dimensionalen metrischen Raumes auf Skalare.

OK, schon besser. Aber was soll das mit dem "metrischen Raum"?

Tensoren als Anordnung von Zahlen

Ein Vektor ist eine Anordnung (Englisch: array) von Zahlen entlang einer Achse.

Eine Matrix ist eine Anordnung von Zahlen entlang zweier Achsen.

Ein Tensor ist eine Anordnung von Zahlen entlang $n$ Achsen. Die Zahl $n$ heißt die Stufe des Tensors.

Vektoren sind also Tensoren erster Stufe und Matrizen Tensoren zweiter Stufe. (Einzelne Zahlen nennt man auch Tensoren nullter Stufe oder Skalare).

In [38]:
# Beispiel für einen Tensor dritter Stufe in numpy

import numpy as np

T = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
Out[38]:
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

Um auf ein Element zuzugreifen, muss man $n$ Indizes angeben. Auf dem Papier schreibt man die Indizes meistens als Subskripte $T_{i_1, i_2, \dots, i_n}$, am Computer meistens in Klammern $T[i_1, i_2, \dots, i_n]$.

In [3]:
# Achtung: In einigen Computersprachen laufen die Indizes ab 0 (python, C), in anderen ab 1 (Mathematica)

print(T[0,0,0], " ", T[0,0,1], " ", T[0,1,0], "...", T[1,1,1])
1   2   3 ... 8

Die Anzahl der Enträge eines Vektors nennt man seine Dimension. Um die Form eines Tensors festzulegen, muss für jede seiner Achsen eine Dimension festlegen.

In [4]:
# Tensoren verschiedener Form (Englisch 'shape')

print("Form von T:", T.shape, "\n\n")

S = np.ones((2,2,3))

print("Tensor S:\n", S)
print("\nForm von S:", S.shape)
Form von T: (2, 2, 2) 


Tensor S:
 [[[1. 1. 1.]
  [1. 1. 1.]]

 [[1. 1. 1.]
  [1. 1. 1.]]]

Form von S: (2, 2, 3)

Operationen auf Tensoren

Die vier wichtigsten Operationen auf Tensoren sind: Skalarenmultiplikation, Addition, Tensorprodukte und Kontraktionen.

Addition und Skalarenmultiplikation

Das Produkt einer Zahl mit einem Tensor ist elementweise definiert (Skalarenmultiplikation, nicht zu verwechseln mit Skalarpodukt!). Ebenso ist die Summe zweier Tensoren gleicher Form elementweise definiert. \begin{align*} (\lambda T)_{i_1, \dots, i_n} = \lambda T_{i_1, \dots, i_n}, \qquad (U + V)_{i_1, \dots, i_n} = U_{i_1, \dots, i_n} + V_{i_1, \dots, i_n}. \end{align*} Skalarenmultiplikation und Summen funktionieren für allgemeine Tensoren also genau so, wie Sie das für Vektoren und Matrizen schon kennen.

In [40]:
2*S
Out[40]:
array([[[2., 2., 2.],
        [2., 2., 2.]],

       [[2., 2., 2.],
        [2., 2., 2.]]])
In [25]:
# Tensoren unterschiedlicher Form kann man nicht addieren.
S+T
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-141ffb34651c> in <module>
      1 # Tensoren unterschiedlicher Form kann man nicht addieren.
----> 2 S+T

ValueError: operands could not be broadcast together with shapes (2,2,3) (2,2,2) 

In anderen Worten: Die Menge der Tensoren gegebener Form bilden einen Vektorraum. Wenn die Einträge reell sind, nennt man den Vektorraum der Tensoren mit Form $(d_1, \dots, d_n)$ auch das Tensorprodukt $\mathbb{R}^{d_1} \otimes \cdots \otimes \mathbb{R}^{d_n}$. Analoges gilt für den Fall, dass die Einträge aus einem beliebgen Zahlenkörper $\mathbb{F}$ kommen. In der Quantenphysik ist der komplexe Fall $\mathbb{F}=\mathbb{C}$ besonders wichtig.

Produkte von Tensoren

Jetzt wird es interessanter.

Das Tensorprodukt zwischen Tensoren der Stufe $n$ und $m$ ist ein Tensor der Stufe $n+m$ dessen Elemente Produkte sind: \begin{align*}\tag{TP} (U\otimes V)_{i_1, \dots, i_{m+n}} = U_{i_1, \dots, i_n} V_{i_{n+1}, ..., i_{n+m}}. \end{align*}

Achtung: Das Produktsymbol "$\otimes$" wird hier verwendet, um Tensoren miteinander zu verknüpfen -- nicht, wie zuvor, Vektorräume!

Beispiele

  • Gemeinsame Wahrscheinlichkeitsverteilungen

Betrachten Sie einen Würfel dessen Wahrscheinlichkeit $i$ Augen zu zeigen $p_i$ ist. Die Wahrscheinlichkeitsverteilung wird also durch einen Tensor erster Stufe der Dimension $6$ beschrieben. Nehmen wir nun einen zweiten Würfel mit Wahrschnlichkeitsverteilung $q_j$ hinzu. Wenn man beide Würfel nacheinander wirft, ist die Wahrscheinlichkeit das Ergebnispaar $(i,j)$ zu bekommen durch die gemeinsame Verteilung $P_{i,j}$ gegeben. Die gemeinsame Verteilung ist also ein Tensor zweiter Stufe. Wennn die Würfel unabhängig voneinandern sind, dann gilt \begin{align*} P_{i, j} := p_i q_j, \end{align*} also $P=p\otimes q$.

Nicht alle gemeinsamen Verteilungen sind Produkte. Nehmen wir z.B. an, dass die beiden Würfel nicht nur die gleiche Verteilung $p=q$ haben, sondern durch geschickt angebrachte Magnete dergestalt gekoppelt sind, dass sie bei jedem gemeinsamen Wurf die gleiche Zahl zeigen. Dann ist $P_{i,j} = \delta_{i,j} p_i \neq p_i q_j$. In Tensorsprache: $P\neq p\otimes q$; probabilistisch ausgedrückt: die beiden Prozesse sind nicht unabhängig.

  • Funktionen mehrerer Argumente

Wir haben bisher Indizes betrachtet, die eine endliche Anzahl von Werten annehmen können. Man kann die Definition leicht auf unendliche Indizes verallgemeinern, oder sogar beliebige reelle Zahlen als Indizes zulassen. Dann ist ein Tensor $n$-ter Stufe einfach eine Funktion auf $\mathbb{R}^n$ und das Tensorprodukt ist \begin{align*} (f\otimes g)(x_1, \dots, x_n, x_{n+1}, \dots, x_{n+m}) = f(x_1, \dots, x_n) g(x_{n+1}, \dots, x_{n+m}) \end{align*}

Anmerkungen

  • Zeigen Sie: Ein Tensor $T$ zweiter Stufe ist genau dann ein Produkt $T=v \otimes w$, wenn die Matrix $T_{ij}$ Rang eins hat.
  • Die "meisten" Tensoren haben keine Produktform. Das kann man durch Parameterzählen einsehen. Z.B. für Tensoren der Form $(d_1, d_2)$ (also $d_1 \times d_2$-Matrizen) wird ein Produkt $v\otimes w$ durch $d_1+d_2 -1$ Parameter beschrieben (Übung: Woher kommt die $-1$?), das sind viel weniger als die $d_1 d_2$ Paramter einer allgemeinen Matrix.
  • Produkttensoren heißen auch einfache Tensoren.
  • In der Quantenmechanik heißen Tensoren die keine Produktform haben verschränkt.
  • Ein Tensor der Form $(d_1, \dots, d_n)$ hat $d_1 \cdots d_n$ Paramter. Das sind exponentiell viele in $n$. Wer unvorsichtig am Computer Tensorprodukte bildet, verbraucht schnell den gesamten Speicher. Übringes: Die Rechenleistung von Quantencomputern beruht darauf, dass quantenmechanische Systeme durch sehr hochdimensionale Tensoren beschrieben werden, die klassische Computer in ihrem Speicher nicht mehr abbilden können.
  • Nach (TP) ist das Tensorprodukt ist offenbar linear in jedem Eingang:

\begin{align*} (U^{(1)}+U^{(2)})\otimes V &= U^{(1)} \otimes V +U^{(2)} \otimes V, \\ U\otimes (V^{(1)}+V^{(2)}) &= U\otimes V^{(1)} + U\otimes V^{(2)}. \end{align*}

In [26]:
# Zufälliger Tensor der Form (2,2)
A = np.random.randint(0,10,(2,2)) 
print("A: \n", A, "\n")

# Zufälliger Vektor
B = np.random.randint(0,10,2)
print("B: \n", B, "\n")

# Tensorprodukt in numpy
AB = np.multiply.outer(A,B);

print("A⊗B: \n", AB)
A: 
 [[8 6]
 [6 6]] 

B: 
 [3 8] 

A⊗B: 
 [[[24 64]
  [18 48]]

 [[18 48]
  [18 48]]]

Produktbasen

Sei $e^{(i)}$ der Vektor mit Komponenten $e^{(i)}_j = \delta_{i,j}$. Die Vektoren $\{e^{(1)}, \dots, e^{(d)}\}$ bilden eine Basis für $\mathbb{R}^d$.

Man kann leicht sehen, dass die Menge der Tensorprodukte \begin{align}\tag{*} e^{(i_1)} \otimes \dots \otimes e^{(i_n)}\qquad i_1 = 1, \dots, d_1, \quad i_2 = 1, \dots, d_2, \dots \end{align} eine Basis des Vektorraums der Tensoren der Form $(d_1, \dots, d_n)$ ist.

Für solche Produkte gibt es (leider...) sehr viele verschiedene Schreibweisen: \begin{align*} e^{(i_1)} \otimes \dots \otimes e^{(i_n)} = e^{(i_1)} \cdots e^{(i_n)} = e^{(i_1, \dots, i_n)}. \end{align*}

Übung: Statt mit der Standardbasis $e^{(1)}, \dots, e^{(d)}$ kann man mit jeder beliebigen Basis $b^{(1)}, \dots, b^{(d)}$ des $d$-dimensionalen Raumes beginnen, und daraus wie in (*) $n$-fache Tensorprodukte formen. Zeigen Sie, dass auf diese Art immer eine Basis im Raum der Tensoren $n$-ter Stufe entsteht.

In [28]:
def basisVector(i,d):
    return([1 if i==j else 0 for j in range(d)])

print("Basis für Vektoren (Stufe 1)")
for i in range(2):
    print(basisVector(i,2),"\n")
    
print("\nProduktbasis für Matrizen (Stufe 2)")
for i in range(2):
    for j in range(2): 
        print(np.multiply.outer(basisVector(i,2), basisVector(j,2)),"\n")
        
print("\nProduktbasis für Tensoren der Stufe 3")
for i in range(2):
    for j in range(2):  
        for k in range(2):  
            print(np.multiply.outer(np.multiply.outer(basisVector(i,2), basisVector(j,2)), basisVector(k,2)),"\n\n")
Basis für Vektoren (Stufe 1)
[1, 0] 

[0, 1] 


Produktbasis für Matrizen (Stufe 2)
[[1 0]
 [0 0]] 

[[0 1]
 [0 0]] 

[[0 0]
 [1 0]] 

[[0 0]
 [0 1]] 


Produktbasis für Tensoren der Stufe 3
[[[1 0]
  [0 0]]

 [[0 0]
  [0 0]]] 


[[[0 1]
  [0 0]]

 [[0 0]
  [0 0]]] 


[[[0 0]
  [1 0]]

 [[0 0]
  [0 0]]] 


[[[0 0]
  [0 1]]

 [[0 0]
  [0 0]]] 


[[[0 0]
  [0 0]]

 [[1 0]
  [0 0]]] 


[[[0 0]
  [0 0]]

 [[0 1]
  [0 0]]] 


[[[0 0]
  [0 0]]

 [[0 0]
  [1 0]]] 


[[[0 0]
  [0 0]]

 [[0 0]
  [0 1]]] 


Brak-Ket-Notation

In der Quantenmechanik nutzt man die Dirac oder Bra-Ket-Notation für Vektoren: \begin{align*} e^{(i)} = |e^{(i)}\rangle. \end{align*} Wenn (zumindest dem Autor...) klar ist, auf welche Basis sich der Index bezieht, läßt man das Symbol für die Basis oft einfach weg: \begin{align*} e^{(i)} = |e^{(i)}\rangle = |i\rangle. \end{align*} Es ergeben sich noch mehr Schreibweisen für Tensorprodukte: \begin{align*} e^{(i_1)} \otimes \cdots \otimes e^{(i_n)} = |e^{(i_1)}\rangle \otimes \dots \otimes |e^{(i_n)}\rangle = |e^{(i_1)}\rangle \cdots |e^{(i_n)}\rangle = |i_1\rangle \cdots |i_n\rangle = |i_1, \dots, i_n\rangle = |i_1 \cdots i_n\rangle = \dots \end{align*}

Trivial Bemerkung: Da die Produkte $|i_1 \cdots i_n\rangle$ eine Basis bilden, kann man den Raum der Tensoren $n$-ter Stufe auch als Linearkombination der $|i_1 \cdots i_n\rangle$ definieren. Diese Sichtweise passt gut zu den Konventionen der Quantenmechanik. Dort werden Vektorräume oft als Raum der Linearkombinationen (auch: Superpositionen) einer Basis eingeführt -- zum Beispiel der Hilbertraum eines Spin-$l$-Systems als \begin{align*} \mathcal{H}_{l} = \left\{ \sum_m c_m |m\rangle \,\Big|\, m \in -l, \dots , l \right\}. % \simeq % \mathbb{C}^{2l + 1}. \end{align*} Konsequenterweise definiert man dann das Tensorprodukt zweier Hilberträume $\mathcal{H}_A = \{ \sum_i \alpha_i |i\rangle \}$, $\mathcal{H}_B = \{ \sum_j \beta_i |j\rangle \}$, als \begin{align*} \mathcal{H}_A \otimes \mathcal{H}_B = \left\{ \sum_{ij} c_{ij} |i, j \rangle \right\} \end{align*} wobei man für \begin{align*} |\alpha\rangle = \sum_i \alpha_i |i\rangle, \qquad |\beta\rangle = \sum_j \beta_j |j\rangle \end{align*} fordert, dass \begin{align}\tag{*} |\alpha\rangle\otimes|\beta\rangle = \sum_{ij} \alpha_i \beta_j |ij\rangle. \end{align}

Ich betone, dass das keine neue Definition ist, sondern nur eine andere Schreibweise für die zuvor eingeführten Konzepte. Wenn man die "kets" mit ihren Koeffizientenvektoren bezüglich der definierenden Basen der jeweiligen Hilberträume gleichsetzt, dann ist (*) nichts als

\begin{align*} (\alpha\otimes \beta)_{ij} = \alpha_i \beta_j, \end{align*}

also die Definition des Tensorprodukts (TP).

Ausblick: Basisfreie Definitionen

Anmerkung für Liebhaber der Mathematik: Man kann ein Tensorprodukt auch zwischen Vektorräumen $V, W$ definieren, in denen keine Basis ausgezeichnet ist. Dafür gibt es verschiedenen Herangehensweisen:

  1. Man führt einfach irgendeine Basis ein, definiert das Tensorprodukt wie oben beschrieben, und zeigt am Ende, dass das Resultat nicht von der Basis abhängt.
  2. Man definiert $V\otimes W$ als Dualraum des Vektorraums der bilinearen Funktionale auf $V$ und $W$. Dazu später mehr.
  3. Man definiert $V\otimes W$ in zwei Schritten. Zunächst führt man den Vektorraum $G$ aller Linearkombinationen von Objekten der Form $v\otimes w, v\in V, w\in W$ ein, wobei "$\otimes$" hier nur ein Symbol ist. Der Name $G$ steht für "gigantisch" - Sie sehen gleich, warum. In $G$ definiert man den Unterraum $R$ aller Linearkombinationen der Form $v\otimes (w^{(1)} + w^{(2)}) - v\otimes w^{(1)} - v\otimes w^{(2)}, v\otimes (\lambda w) - \lambda (v\otimes w)$ und analog. Das Tensorprodukt $V\otimes W$ ist dann der Quotientenvektorraum $G/R$. Sie mögen als Übung gerne die Details ergänzen und zeigen, dass man das gleiche Ergebnis erhält wie bei den anderen Ansätzen. Der Vorteil der Konstruktion ist, dass sie manifest basisunabhängig ist. Der Nachteil ist, dass man Kopfschmerzen bekommt und dass, selbst wenn $V$ und $W$ und daher $V\otimes W$ endlichdimensional sind, man zwischenzeitlich mit $G$ einen überabzählbar-undendlich-dimensionalen Raum konstruiert hat, nur um dann, mit $R$, die allermeisten Dimensionen wieder herauszudividieren. Eine konzeptionelle Achterbahnfahrt!

Aufzählung von Elementen einer Produktbasis

Wir betrachten den wichtigen Spezialfall $d_1 = \dots = d_n = d$. Die Elemente $e^{(i_1)}\otimes \dots \otimes e^{(i_n)}$ einer Produktbasis werden durch $n$ Indizes $(i_1, \dots, i_n)$ bezeichnet. Insgesamt enthält sie also $d^n$ Elemente. Wenn man die Indizes jeweils von $0$ bis $d-1$ laufen läßt, dann ist $(i_1, \dots, i_n)$ die $d$-adyische Darstellung einer ganzen Zahl zwischen $0$ und $d^n-1$. Auf diese Art kann man einen Tensor der Form $(d, d, \dots)$ als Vektor der Dimension $d^n$ schreiben. Man nennt diesen Prozess Vektorisierung oder flattening.

In [30]:
S.flatten()
Out[30]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

Kontraktionen

Erinnern Sie sich, dass die Spur (Englisch: trace) einer Matrix die Summer der Diagonalelemente ist: \begin{align*} \mathrm{tr} M = \sum_i M_{i,i}. \end{align*} Ebenso kann man bei Tensoren höherer Stufe zwei Indizes gleicher Dimension gleichsetzen und aufsummieren. Das nennt man eine Kontraktion (auch: Verjüngung). Es ergibt sich ein Tensor, dessen Stufe um zwei verringert ist.

Beispiele

  • Betrachten Sie zwei Vektoren $u, v$. Ihr Tensorprodukt $u\otimes v$ ist ein Tensor zweiter Stufe mit Komponenten $u_i v_j$. Die Kontraktion $\sum_i u_i v_i$ ist einfach das euklidische Skalarprodukt.

  • Betrachten Sie zwei Matrizen $A, B$. Das Tensorprodukt $A\otimes B$ ist ein Tensor vierter Stufe mit Komponenten $(A\otimes B)_{i, j, k, l} = A_{i, j} B_{k,l}$. Kontrahiert man die mittleren beiden Indizes erhält man \begin{align*} \sum_{j} A_{i,j} B_{j,l} = (AB)_{i,l}, \end{align*} also das Matrixprodukt von $A$ und $B$. Kontrahiert man zusätzlich die beiden verbleibenden Indizes ergibt sich \begin{align*} \sum_{i,j} A_{i,j} B_{j,i} = \mathrm{tr} A B. \end{align*}

Graphische Notation

Für Tensoren hoher Stufe gibt es viele Möglichkeiten, Indizes zu kontrahieren. Um den Überblick zu behalten, hat sich eine graphische Notation eingebürgert:

  • Für jeden Tensor malt man ein Kästchen.
  • Für jeden Index erhält das Kästchen ein "Bein"
  • Kontrahierte Indizes werden verbunden

So kann man graphisch Beweise führen.

  • TBD: Zyklische Invarianz

Kroneckerprodukte

Betrachte eine $d\times d$-Matrix $M$. Sie definiert eine lineare Abbildung die einen Vektor $x$ der Dimension $d$ auf $\sum_j M_{ij} x_j$ abbildet.

Sei nun $T$ ein Tensor der $n$-ten Stufe, dessen Achsen jeweils die Dimension $d$ haben. Man kann nun $M$ mit jedem der $n$ Indizes kontrahieren.

TBD: Bild.

Auf diese Art entstehen $n$ lineare Abbildungen. Sei $M^{(k)}$ die Abbildung, bei der $M$ mit dem $k$-ten Index kontrahiert wird.

Allgemeiner: Wähle $n$ Matrizen $A, B, C, ...$. Das Tensorprodukt $A\otimes B\otimes C \otimes \dots$ definiert eine lineare Abbildung auf Tensoren der Stufe $n$ auf offensichtliche Art:

TBD: Bild

Die erste Konstruktion ist tatsächlich ein Spezialfall: \begin{align*} M^{(1)} &= M \otimes \mathbb{1} \otimes \mathbb{1}\otimes \dots \otimes \mathbb{1}, \\ M^{(2)} &= \mathbb{1} \otimes M \otimes \mathbb{1} \otimes \dots \otimes \mathbb{1}, \\ \vdots &= \vdots \end{align*} oder, allgemein, \begin{align*} M^{(k)} &= \mathbb{1}^{\otimes (k-1)} \otimes M \otimes \mathbb{1}^{\otimes (n-k-1)}. \end{align*}

Beispiel

  • Wir betrachten einen Münzwurf: $p_0$ ist die Wahrscheinlichkeit von "Kopf" und $p_1$ die von "Zahl". Die physikalische Aktion "drehe die Münze um" wird mathematisch durch die Matrix \begin{align*} M = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \end{align*} beschrieben. Die Wahrscheinlichkeitsverteilung des Prozesses "werfe die Münze und drehe sie dann" ist also $\sum_{j} M_{i,j} p_j$. Betrachte nun $n$ Münzen, mit gemeinsamer Verteilung $P_{i_1, \dots, i_n}$. Die Abbildung $M^{(k)}$ beschreibt also einfach die Aktion "$k$-te Münze Umdrehen". In der Praxis haben Tensorproduktkonstruktionen häufig eine intuitive Interpretation, die den Umgang mit diesen Objekten erleichtert.

Das Kroneckerprodukt

Man kann die lineare Abbilldung bezüglich einer Produktbasis als $d^n \times d^n$-Matrix darstellen: \begin{align*} {K^{(i_1, \dots, i_n)}}_{(j_1, \dots, j_n)} = A_{i_1, j_1} B_{i_2, j_2} C_{i_3, j_3} \dots. \end{align*} Die resultierende Matrix heißt das Kroneckerprodukt der $A, B, C, \dots$.

Beispiel
  • Betrachte die "Pauli-$z$-Matrix" \begin{align*} \sigma_z= \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \end{align*} In der quantenmechanischen Theorie der "Kopplung zweier Spin-$1/2$-Systeme" spielt die $z$-Komponente des Gesamtdrehimpuls \begin{align*} L_z:=\frac{\hbar}{2} (\sigma_z\otimes\mathbb{1} + \mathbb{1}\otimes\sigma_z) \end{align*} eine wichtige Rolle. Bezüglich der Produktbasis ist $L_z$ also als die Summe von zwei Kroneckerprodukten dargestellt.
In [36]:
sigmaz = np.array(
    [[1,  0],
     [0, -1]]
)

# Das Kroneckeckerprodukt ist numpy.kron()

np.kron(sigmaz,np.eye(2))
Out[36]:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0., -1., -0.],
       [ 0.,  0., -0., -1.]])
In [37]:
.5*(
    np.kron(sigmaz,np.eye(2))
    +
    np.kron(np.eye(2),sigmaz)
)
Out[37]:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0., -1.]])
  • Eine Hadamard-Matrix ist eine Matrix mit Einträgen $\pm 1$, deren Spalten orthogonal aufeinander stehen. Zeigen Sie: Das Kroneckerprodukt von zwei Hadamard-Matrizen ist wieder eine Hadamard-Matrix
In [32]:
# Eine Hadamard-Matrix

H = np.array(
    [[1,  1],
     [1, -1]]
)

np.kron(H, H)
Out[32]:
array([[ 1,  1,  1,  1],
       [ 1, -1,  1, -1],
       [ 1,  1, -1, -1],
       [ 1, -1, -1,  1]])

In der Quanteninformation verwendet man die graphische Notation für Quantenschaltkreise, die die Funktion eines Quantencomputers beschreiben.

Geometrische Bedeutung von Tensoren

Bisher haben wir Tensoren lediglich als Anordnung von Zahlen interpretiert. Meist haben sie jedoch darüber hinaus eine geometrische Bedeutung. Um das zu erklären, schauen wir uns zunächst den Fall von Vektoren an, der Ihnen geläufiger sein wird.

Beispiel

Also sehr konkretes Beispiel betrachten wir eine Windturbine. Wir sind an der Drehzahl $\omega$ interessiert, die sich einstellt, wenn Wind mit Geschwindigkeitsvektor $\vec v$ auf die trifft. Nehmen wir an, dass die Turbine fest verschraubt ist und sich nicht nach der Windrichtung ausrichten kann. Dann ist es plausibel, dass es einen Vektor $\vec w$ gibt, so dass \begin{align*} \omega = (\vec w, \vec v). \end{align*}

Eine wichtige Realisierung ist nun, dass $\vec v$ und $\vec w$ zwar beide durch 2-dimensionale Vektoren beschrieben werden, mathematische aber komplett unterschiedliche Aufgaben haben:

  • Der Vektor $\vec v$ beschreibt eine "gerichtete Länge"
  • Der Vektor $\vec w$ beschreibt eine Funktion die gerichtete Längen auf Zahlen abbildet.

Die Unterscheidung ist nicht nur mathematische Pendanterie, sondern hat handfeste Auswirkungen darauf, wie man mit den Größen rechnet. Nehmen wir z.B. an, dass wir zunächst das Imperialen System verwenden, die Windgeschwindigkeit also in Füßen pro Sekunde angeben (wir leben demnach in den USA oder in Zimbabwe). Endlich sind wir zur Besinnung gekommen, und wechseln zu $m/s$. Dazu müssen wir die Einträge von $\vec v$ mit $0.305$ multiplizieren. Um weiterhin die gleiche Winkelgeschwindigkeit zu erhalten, muss dann $\vec w$ durch $0.305$ geteilt werden.

Also: Unter Wechsel des Bezugssystems werden Vektoren-die-gerichtete-Längen beschreiben und Vektoren-die-lineare-Funktionen-beschreiben gegenläufig transformiert!

Geometrische Vektoren

Um das präziser ausdrücken zu können, brauchen wir neue Begriffe.

Machen Sie sich dazu klar, dass der Wind schon geblasen hat, ehe wir Maßbänder und Füße und Meter oder auch nur die reellen Zahlen erfunden hatten. Man kann also zwischen der "gerichteten Größe an sich" und ihrer Darstellung als "numerischen Vektor" unterscheiden.

Erinnern Sie sich dazu an die mathematische Begriffsbildung aus der linearen Algebra:

  • Ein Vektorraum ist eine Menge $V$ auf der Addition und Skalarenmultiplikation definiert sind und die üblichen Eigenschaften erfüllen.
  • Ein geometrischer Vektor ist ein Element eines Vektorraums.
  • Eine Basis ist eine Menge $\{ e^{(i)} \}_i \subset V$ so dass jeder geometrische Vektor $v$ als eindeutige Linearkombiantion \begin{align*} v = \sum_i c_i e^{(i)} \end{align*} mit Entwicklungskoeffizienten $c_i$ dargestellt werden kann. Wir nennen die Liste der Entwicklungskoeffizienten $c_i$ einen numerischen Vektor.
  • Ein geometrischer Kovektor $\alpha$ ist eine lineare Abbildung von $V$ in die Skalare. Linearität heißt natürlich $\alpha(v_1 + \lambda v_2) = \alpha(v_1) + \lambda \alpha(v_2)$.
  • Ein geometrischer Kovektor ist durch seine Werte $d_i := \alpha(e^{(i)})$ auf einer Basis definiert: \begin{align*} \alpha(v) = \alpha\Big(\sum_i c_i e^{(i)}\Big) = \sum_i c_i \alpha (e^{(i)}) = \sum_i c_i d_i. \end{align*}

Die "Anordnung von Zahlen" mit denen wir bisher gearbeitet haben, sind also numerische Vektoren, die einen geometrischen Vektor oder einen geometrischen Kovektor (oder vielleicht ein ganz anderes Objekt) darstellen können.

Insbesondere hängt die Darstellung von der Basiswahl ab! Für konkrete Rechnungen ist es wichtig, festzuhalten, wie sich die Darstellung unter einem Basiswechsel ändert.

Betrachte dazu eine andere Basis $\{ f^{(i)} \}_i$ von $V$.

Jedes Element der alten Basis kann in der neuen Basis entwickelt werden -- und umgekehrt. Es gibt also zwei Sätze von Entwicklungskoeffizienten $A_{i,j}$ und $B_{i,j}$ so dass \begin{align*} f^{(i)} = \sum_{j} A_{i,j} e^{(j)} \qquad e^{(j)} = \sum_{j} B_{i,j} f^{(j)}. \end{align*} Durch Einsetzen der zweiten Gleichung in die erste, sieht man, dass $B=A^{-1}$: \begin{align*} f^{(i)} = \sum_{j} A_{i,j} e^{(j)} = \sum_{ij} A_{i,j} B_{j,k} f^{(k)} \qquad \Rightarrow \qquad \sum_{j} A_{i,j} B_{j,k} = \delta_{i,k} \qquad \Rightarrow \qquad A B = \mathbb{1}. \end{align*}

Die Werte $d_i'=\alpha(f^{(i)})$ die den Kovektor bezüglich der neuen Basis darstellen ergeben sich direkt aus den alten durch Matrixmultiplikation mit $A$: \begin{align*} d_i' = \alpha(f^{(i)}) = \alpha\Big( \sum_{j} A_{i,j} e^{(j)} \Big) = \sum_{j} A_{i,j} \alpha( e^{(j)}) = \sum_j A_{i,j} d_j. \end{align*} Man nennt dies eine kovariante Transformation.

Für die Koeffizienten $c_i$ erhält man: \begin{align*} v = \sum_i c_i e^{(i)} = \sum_{ij} c_i (A^{-1})_{i,j} f^{(j)} = \sum_j c_j' f^{(j)} \qquad \Rightarrow \qquad c_j' = \sum_i c_i (A^{-1})_{i,j} = \sum_i (A^{-T})_{j,i} c_i, \end{align*} wobei $A^{-T}$ die Transponierte der Inversen von $A$ ist. Dies ist eine kontravariante Transformation.

Konsistenzcheck: \begin{align*} \sum_i c_i' d_i' = \sum_{i,j,k} c_j (A^{-1})_{j,i} A_{i,k} c_k = \sum_{j,k} c_j \delta_{j,k} c_k = \sum_j c_j d_j. \end{align*} Mit diesen Transformationsgesetzen ist die Kontraktion zwischen einem sich kovariant und einem sich kontravariant transformierenden numerischen Vektor also von der Basiswahl unabhängig. (Das wussten wir schon vorher, da die Kontraktion ja einfach nur $\alpha(v)$ in Koordinaten ausrechnent, und $\alpha$ und $v$ koordinatenunabhängig sind -- trotzdem gut zu sehen, dass alles aufgeht).

Anmerkungen:

  • Geometrische Kovektoren heißen auch lineare Funktionale oder Dualvektoren. Die Menge aller geometrischen Kovektoren bilden selbst einen Vektorraum, den Dualraum $V^*$.
  • Da geometrische Kovektoren einen Vektorraum bilden, sind sie selbst, nun, geometrische Vektoren. Wenn $\alpha\in V^*$, dann definiert $v\in V$ ein lineares Funktional, das durch $v(\alpha)= \alpha(v)$ definiert ist. Tatsächlich gilt (zumindest in endlichen Dimensionen), dass alle Funktionale auf geometrischen Kovektoren so entstehen, also dass $V=(V^*)^*$.
  • Sie haben die Ausdrücke "geometrische" und "numerische" Vektoren noch nie gehört? Nun, das liegt daran, dass beide Konzepte gemeinhin einfach nur "Vektor" heißen. Zur Klarheit trägt das nicht bei. In seinem sehr empfehlenswerten Lehrbuch "Vektoranalysis" macht sich der Autor (und Mathematiker) Jänich über die verworrene Begriffsbildung der Physik lustig, die er als "Ein Vektor ist ein Vektor der sich wie ein Vektor transformiert" zusammenfasst. Wir können das nun entwirren: Physiker wollen sagen "Ein numerischer Vektor stellt einen geometrischen Vektor dar, wenn der numerische Vektor sich kontravariant transformiert".

Zurück zu Tensoren

OK, jetzt wissen wir, dass numerische Vektoren (mindestens) zwei verschiedene geometrische Objekte darstellen können. Welche basisunabhängig definierten Objekte können mit Tensoren in Verbindung gebracht werden?

Wir sehen uns einige Beispiele an.

Multilineare Abbildungen

Eine wichtige verallgemeinerung von geometrischen Kovektoren sind multilineare Abbildung.

Eine multilineare Abbildung $L$ der Stufe $n$ auf dem $d$-dimensionalen Raum bildet Vektoren $\vec v_1, \dots, \vec v_n$ auf eine Zahl $L(\vec v_1, \dots, \vec v_n)$ ab und ist linear in jedem Eingang: \begin{align*} L(\vec v_1 + \vec w_1, \vec v_2, \dots, \vec v_n) = L(\vec v_1 , \vec v_2, \dots, \vec v_n) + L(\vec w_1 , \vec v_2, \dots, \vec v_n), \qquad L(\vec v_1, \vec v_2 + \vec w_2, \dots, \vec v_n) = L(\vec v_1 , \vec v_2, \dots, \vec v_n) + L(\vec v_1 , \vec w_2, \dots, \vec v_n), \qquad \dots \qquad \end{align*}

Beispiele: Ein inneres Produkt $\vec v_1, \vec v_2 \mapsto (\vec v_1, \vec v_2)$ ist eine Multilinearform der Stufe $n=2$ (auch: Bilinearform). Die Determinante ist eine Multilinearform, die auf $n$ Vektoren der Dimension $d=n$ agiert.

Eine Multilinearform $n$-ter Stufe auf dem $d$-dimensionalen Raum kann man durch einen Tensor $n$-ter Stufe mit Form $(d, \dots, d)$ charakterisieren. Das geht so: Sei $e^{(i)}$ der $i$-te Basisvektor, also $(e^{(i)}_j = \delta_{ij}$. Dann gilt unter Ausnutzung von Multilinearität: \begin{align*} L(\vec v_1, \dots, \vec v_n) = L\left( \sum_{i_1=1}^d (v_1)_{i_1} e^{(i_1)}, \dots, \sum_{i_n=1}^d (v_n)_{i_n} e^{(i_n)}, \right) = \sum_{i_1, \dots, i_n=1}^d (v_1)_{i_1} \dots (v_n)_{i_n} \, L( e^{(i_1)}, \dots, e^{(i_n)}. \end{align*} Der Tensor mit Komponenten $L( e^{(i_1)}, \dots, e^{(i_n)})$ beschreibt also die Wirkung von $L$ auf beliebigen Argumenten.

Für das euklische innere Produkt gilt \begin{align*} (e^{(i, e^{(j) = \delta_{i,j}, \end{align*} für das Minkowski-Produkt der Relativitätstheorie: \begin{align*} (e^{(i, e^{(j) = \left\{ \begin{array}{ll} -1\quad& i=j=0,\\ 1\quad& 1 \leq i=j \leq 3 \end{array} \right., \end{align*} und für die Determinanten ist $\det(e_{i_1}, \dots, e_{i_n}) = \epsilon_{i_1, \dots, i_n}$ das Levi-Civita-Symbol.