Im folgenden soll eine Erweiterung der Mathematica Anwendung Quantum Algebra vorgestellt werden.

Die ergänzte Anwendung Quantum Algebra finden Sie hier.


Problemstellung

Bei meiner Beschäftigung mit der Quantenphysik studiere ich auch das Buch "Student Friendly Quantum Field Theory" von Robert D. Klauber. Hierbei ergab sich die Frage bzw. die Idee, ob nicht einige der darin aufgeführten Rechnungen durch Mathematica erleichtert werden könnten.

Als Mathematica Paket zur Unterstützung der Rechungen schien mir Quantum Algebra geeignet - zumindest ansatzweise. Aber einige der mathematischen Symbole, die im Buch Verwendung fanden, wurden von Quantum Algebra nicht unterstützt. Quantum Algebra mußte also erweitert werden. Als Ergebnis ergab sich eine erweiterte Anwendung. Diese Erweiterung und was sie leistet soll im folgenden vorgestellt werden.

Im Wesentlichen handelt es sich dabei um Summations-, Integrations- und Ableitungssymbole, die schon im Basispaket vorhandene Operatornotation und die Unterstützung von Matrizen. Alle werden durch entsprechende Regeln zur Vereinfachung und Umformung unterstützt - so, wie man es eigentlich auch manuell machen würde.


Notationen

In der Erweiterung von Quantum Algebra finden eine Reihe von Notationen Anwendung, die die Lesbarkeit von Ausdrücken verbessern sollen. Sie ergänzen die Notationen, die schon im Basispaket vorhanden sind. Dies trägt auch dem Dokumentationsbedürfnis Rechnung.

Notationen des Basispakets:

  • Operatornotation
  • Superdagger
  • Centerdot

Zusätzliche Notationen

  • Integral
  • Summennotation
  • Partielle Ableitung
  • Small Circle

Übersicht

 

Name Beispielnotation FullForm - Vereinfachter oder voller Ausdruck
Operator
d ^ p 1 , p 2 , p 3 r ,
Operator[d, "H", List[QASimplescript[p, 1, False], QASimplescript[p, 2, False], QASimplescript[p, 3, False]], List[r]]
SuperDagger
d ^ p 1 , p 2 , p 3 r ,
Hermitian[Operator[d, List[QASimplescript[p, 1, False], QASimplescript[p, 2, False], QASimplescript[p, 3, False]], List[r]]
CenterDot
d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1
NonCommutativeMultiply[Operator[d,"H",List[QASimplescript[p, 1, False], QASimplescript[p, 2, False], QASimplescript[p, 3, False]], List[1]], Operator[d, List[QASimplescript[p, 1, False], QASimplescript[p, 2, False], QASimplescript[p, 3, False]], List[1]]]
QAIntegrate
P i_ := V P i 3 x
QAIntegrate[QASimplescript[p, i, False], V, 3, x]
QASum
p r = 1 2 ( sqrt [ m / ( V p 0 ) ] d ^ p 1 , p 2 , p 3 r , v r Exp [ + exp ] )
QASum[Operator[d, "H", List[QASimplescript[p, 1, False], QASimplescript[p, 2, False], QASimplescript[p, 3, False]], List[r]],p]
QAD
D x i ( Ψ // Evaluate )
QAD[\[psi] // Evaluate, QASimplescript[x, i, False]]
SmallCircle
ma1 ma2
 SmallCircle[ma1, ma2]

 


Syntax und Semantik

Im folgenden sollen die Notationen, ihre zugehörigen FullForm Konstrukte und die Semantik dargestellt werden.

  1. Operator
    1. Full Form Syntax
      Ein Operator hat die folgende Full Form Darstellung: Operator[Name, "H", { Untere Indizes }, { Obere Indizes }]
      Die Listen der oberen und unteren Indizes können auch leer sein, der Indikator für einen adjungierten Operator "H" kann fehlen.
    2. Beispielnotation
      Siehe Notationen, Operator, Beispielnotation
    3. Semantik
      Name kennzeichnet den Namen des Operators, "H" kennzeichnet den zugehörigen adjungierten Operator, die beiden Listen enthalten die unteren und oberen Indizes der Notation. In der Ergänzung von Quantum Algebra wird häufig Gebrauch gemacht von der Konvention, dass die unteren Indizes Wellenzahl- oder Impulsvariable enthalten in Subscript - Darstellung. Der 3er - Impuls würde dann etwa aus den Indizes p1, p2, p3 bestehen und durch p0 als Energie zum 4er - Impuls ergänzt.
  2. Hermitian
    1. Full Form Syntax
      Die Hermitian Funktion ermittelt zu einem Operator, Operatorausdruck oder einer Operatormatrix den adjungierten Operator:
      op2 = Hermitian[op1];
    2. Beispielnotation
      Das Superdagger Symbol an einem Ausdruck kann entweder einen adjungierten Operator kennzeichnen oder die Adjungierung eines kompletten Ausdrucks veranlassen, siehe z.B. Klein - Gordon - Gleichung a.
    3. Semantik
      Ein adjungierter Operator ist ein Spiegeloperator für einen dualen Raum (siehe Literatur zur Quantenmechanik).
  3. NonCommutativeMultiply
    1. Full Form Syntax
      Operatoren in der Quantenmechanik sind i.A. nichtkommutativ. Ihre Multiplikation benötigt demzufolge ein extra Symbol:
      NonCommutativeMultiply[op1, op2] oder op1 ** op2 oder Verwendung des abkürzenden Symbols CenterDot.
    2. Beispielnotation
      Siehe z.B. Notationen, CenterDot.
    3. Semantik
      Die nichtkommutative multiplikative Verknüpfung.
  4. QAIntegrate
    1. Full Form Syntax
      QAIntegrate[Integrand, Area, Dim, Var(s)]
    2. Beispielnotation
      Siehe z.B. Notationen, QAIntegrate.
    3. Semantik
      Es handelt sich hier um ein Integral über einen i.A. mehrdimensionalen Bereich Area. Dim ist die Dimension und Var eine Integrationsvariable. Es können auch mehrere angegeben werden, wobei die zugehörige Notation maximal 2 unterstützt. Der Bereich kann entweder endlich sein - ein Symbol (z.B. V) wird angegeben - oder unendlich - hier wird das Unendlichkeitssymbol angegeben.
  5. QASum
    1. Full Form Syntax
      Die Syntax ist ähnlich wie bei der Integration, wobei auf Bereich und Dimension verzichtet wird. Letztlich wird immer von -Unendlich bis +Unendlich summiert und die Dimensionalität wird als 3 angenommen.
      QASum[Expression, Var(s)]
    2. Beispielnotation
      Siehe z.B. Notationen, QASum.
    3. Semantik
      Es handelt sich hier um eine Summation über einen Ausdruck, die 3-dimensionale Variable Var läuft über alle ganzzahligen Werte. Es können auch 2 davon angegeben werden oder es wird entsprechend vereinfacht.
  6. QAD
    1. Full Form Syntax
      QAD[Quexp, Var]
    2. Beispielnotation
      Siehe z.B. Notationen, QAD
    3. Semantik
      Es handelt sich hier um eine Ableitung von Quantenausdrücken Quexp nach Variablen Var.

Implementierung

Die Regeln, nach denen Rechungen und Vereinfachungen vorgenommen werden, können in unterschiedliche Kategorien eingeteilt werden:

  1. Automatische Regeln
    Diese werden nach der Initialisierung automatisch angewendet und führen in der Regel zu einer Vereinfachung des Ausdrucks.
  2. "Ersetzungsregeln"
    Es gibt vordefinierte und frei definierbare (anwendungsspezifische) Ersetzungsregeln. Ein Satz solcher Regeln wird im Allgemeinen unter einem Namen zusamengefasst. Der Grund dafür, dass sie nicht automatisch ausgeführt werden ist, dass der Nutzen in der Regel situationsbedingt ist. So kann es gewünscht sein, dass Summen zusammengefasst werden oder auch aufgeteilt werden, weil das eine oder andere zu einer Vereinfachung führt.

    contracted = p c ^ p 1 , p 2 , p 3 1 + p d ^ p 1 , p 2 , p 3 2 // QAReplace ["SumContract"] p ( c ^ p 1 , p 2 , p 3 1 + d ^ p 1 , p 2 , p 3 2 ) contracted // QAReplace ["SumExpand"] p c ^ p 1 , p 2 , p 3 1 + p d ^ p 1 , p 2 , p 3 2

  3. Annahmen
    Die Mathematica Funktion Simplify kann Vereinfachungen unter Zugrundelegung von bestimmten Annahmen durchführen. Um das handhabbarer zu machen, können Sätze von Annahmen unter einem Namen zusammengefasst werden. Unter diesem Namen können sie dann auch referenziert werden.
    Beispiel: exp // QASimplify["Dirac"]
    Der Ausdruck exp wird hier vereinfacht unter Zugrundelegung der Annahmen mit dem Namen "Dirac".
    Annahmen sind i.d.R. anwendungsspezifisch.

Unit Tests

Die Quantum Algebra Ergänzung wird begleitet von einer Serie von Unit Tests. Sie sollen gewährleisten, dass bei Änderungen der Code lauffähig bleibt.

Gleichzeitig kann man mit ihrer Hilfe nachverfolgen, welche Regeln zu welchen Vereinfachungen führen.

(* Combine product of Integrations *)
Test[
    QAIntegrate[Subscript[x, 1], V, 3, x] QAIntegrate[Subscript[y, 2], V, 3, y],
    QAIntegrate[Subscript[x, 1] Subscript[y, 2], V, 3, x, y],
    TestID->"Integrate-20181213-P3R4W5"
]

(* Apply DiracDelta in Integrate about 2 integration ranges *)
Test[
    QAIntegrate[
        Subscript[x, 1] Subscript[y, 2] * 
        DiracDelta[Subscript[x, 1] - Subscript[y, 1], Subscript[x, 2] - Subscript[y, 2], Subscript[x, 3] - Subscript[y, 3]], 
        V, 3, x, y],
    QAIntegrate[Subscript[x, 1] Subscript[x, 2], V, 3, x],
    TestID->"Integrate-20181213-N8K6H2"
]

(* Integrate about Exponential resolved to DiracDelta *)
Test[
    QAIntegrate[
        Power[E, I (Subscript[k, 1] (Subscript[x, 1] - Subscript[y, 1]) + Subscript[k, 2] (Subscript[x, 2] - Subscript[y, 2]))], 
        Infinity, 2, k],
    DiracDelta[Subscript[x, 1] - Subscript[y, 1], Subscript[x, 2] - Subscript[y, 2]] 4 Pi^2,
    TestID->"Integrate-20181216-P1R1T9"
]

(* Test of Name Ordering Rule, op1 ** op2 are in reverse order *)
Test[
    (op1 = Operator[q, "H", { Subscript[k, 1], Subscript[k, 2] }, {}];
    op2 = Operator[p, "H", { Subscript[l, 1], Subscript[l, 2] }, {}];
    (op1 ** op2) /. { DefineNameOrderingRule[False, 2] }),
    op2 ** op1,
    TestID->"NameOrdering-20181226-X4S4F9"
]

(* Derivation of an Operator Product *)
Test[
    QAD[Operator[a, { Subscript[x, 1] }, {}] ** Operator[b, { Subscript[x, 1] }, { s }], Subscript[x, 1]],

    QAD[Operator[a, { Subscript[x, 1] }, {}], Subscript[x, 1]] ** Operator[b, { Subscript[x, 1] }, { s }] + 
        Operator[a, { Subscript[x, 1] }, {}] ** QAD[Operator[b, { Subscript[x, 1] }, { s }], Subscript[x, 1]],

    TestID->"Derivation-20181217-L0J8L0"
]


Beispielanwendungen

Die Beispielanwendungen sind in Form von Notebooks gegeben. Vorläufig gibt es folgende:

  • Ein Notebook zur Klein - Gordon - Gleichung
  • Ein Notebook zur Dirac - Gleichung

Neben lokalen Regeln enthalten sie eine Reihe von Rechnungen, die z.B. Hamilton - Operator, 3er - Impuls und Ladung definieren und auswerten.

Klein - Gordon - Gleichung

In allen Fällen werden die freien Felder, die die Feldgleichungen lösen, vorgegeben.

  1. Der Kommutator der Felder führt bei Anwendung der Kommutationsrelationen für die Koeffizienten der Felder auf die Kommutationsrelationen der Felder selbst.

    (* Define the wave function solutions *) ΦC := ( 1 / Sqrt [ 2 ( 2 Pi ) ^ 3 k 0 ] a ^ k 1 , k 2 , k 3 Exp [ - exp ] ) 3 k + ( 1 / Sqrt [ 2 ( 2 Pi ) ^ 3 k 0 ] b ^ k 1 , k 2 , k 3 Exp [ exp ] ) 3 k ; phi = ΦC // QASimplify [ ] ; phicross = ( ΦC // QASimplify [ ] ) ; (* Define the time derivative of wave function solution *) phicrossdot = ( ( ? x 0 phicross ) /. { k "->" k1 , x "->" y } ) /. { y 0 "->" x 0 } ; (* Evaluate the Commutator *) QAEvaluate1 [ phi phicrossdot - phicrossdot phi ] DiracDelta [ x 1 - y 1 , x 2 - y 2 , x 3 - y 3 ] 1 ^

  2. Der Hamiltonoperator als von den Feldern abhängender Ausdruck führt auf einen Ausdruck in den Koeffizienten der Felder (Erzeugungs- und Vernichtungsoperatoren).

    Φ := k ( 1 / Sqrt [ 2 V k 0 ] a ^ k 1 , k 2 , k 3 Exp [ exp ] ) + k ( 1 / Sqrt [ 2 V k 0 ] b ^ k 1 , k 2 , k 3 Exp [ exp ] ) H 1 := ( D x 0 ( Φ // Evaluate ) ) ( D x 0 ( ( Φ // QASimplify [ ] ) // Evaluate ) /. { k k 1 } ) H 2 := i = 1 3 ( ( D x i ( Φ // QASimplify [ ] // Evaluate ) ) ( D x i ( Φ // Evaluate ) /. { k k 1 } ) ) H 3 := ( μ 2 ( Φ // QASimplify [ ] ) ( Φ /. { k k 1 } ) ) // QASimplify [ ] H 1 := V H 1 3 x H 2 := V H 2 3 x H 3 := V H 3 3 x hamiltonian = QAEvaluate 2 [ H 1 + H 2 + H 3 ] 1 ^ k k 0 + k a ^ k 1 , k 2 , k 3 a ^ k 1 , k 2 , k 3 k 0 + k b ^ k 1 , k 2 , k 3 b ^ k 1 , k 2 , k 3 k 0

  3. Gleiches gilt für den Ausdruck des 3er - Impulses.

    P i_ := ( D x 0 ( Φ // Evaluate ) ) ( D x i ( ( Φ // QASimplify [ ] ) // Evaluate ) //. { k k 1 } ) + ( D x 0 ( ( Φ // QASimplify [ ] ) // Evaluate ) ) ( D x i ( Φ // Evaluate ) //. { k k 1 } ) P i_ := V P i 3 x Map [ ( P #1 // QAEvaluate2 ) & , { 1 , 2 , 3 } ] { k a ^ k 1 , k 2 , k 3 a ^ k 1 , k 2 , k 3 k 1 k b ^ k 1 , k 2 , k 3 b ^ k 1 , k 2 , k 3 k 1 k a ^ k 1 , k 2 , k 3 a ^ k 1 , k 2 , k 3 k 2 k b ^ k 1 , k 2 , k 3 b ^ k 1 , k 2 , k 3 k 2 , k a ^ k 1 , k 2 , k 3 a ^ k 1 , k 2 , k 3 k 3 k b ^ k 1 , k 2 , k 3 b ^ k 1 , k 2 , k 3 k 3 }

  4. Gleiches gilt auch für den Ausdruck für die Ladung, der sich aus einer Kontinuitätsgleichung ergibt.

    J i_ := ( ( D x i ( Φ // Evaluate ) ) ( ( Φ // QASimplify [ ] ) //. { k k 1 } ) ( D x i ( ( Φ // QASimplify [ ] ) // Evaluate ) ) ( Φ //. { k k 1 } ) ) J i_ := V J i 3 x QAEvaluate2 [ J 0 ] k a ^ k 1 , k 2 , k 3 a ^ k 1 , k 2 , k 3 k b ^ k 1 , k 2 , k 3 b ^ k 1 , k 2 , k 3


Beispielanwendungen - Fortsetzung

Dirac - Gleichung

Die freien Felder, die die Feldgleichungen lösen, werden wiederum vorgegeben:

Ψ := p r = 1 2 ( Sqrt [ m / ( V p 0 ) ] c ^ p 1 , p 2 , p 3 r u r Exp [ exp ] ) + p r = 1 2 ( Sqrt [ m / ( V p 0 ) ] d ^ p 1 , p 2 , p 3 r , v r Exp [ + exp ] ) Ψ_ ¯ := ( Hermitian [ Ψ ] γ 0 ) // QASimplify [ ]

  1. Der Hamiltonoperator wird definiert und ausgewertet

    H := ( Ψ ¯ // QASimplify[] ) i = 1 3 ( γ i ( D x i ( Ψ // Evaluate ) /. p p 1 ) ) + m ( Ψ ¯ // QASimplify[] ) ( Ψ /. p p 1 ) H := V H 3 x H // QAEvaluate2 // Timing { 154.141 , 2 1 ^ p p 0 + p c ^ p 1 , p 2 , p 3 1 , c ^ p 1 , p 2 , p 3 1 p 0 + p c ^ p 1 , p 2 , p 3 2 , c ^ p 1 , p 2 , p 3 2 p 0 + p d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1 p 0 + p d ^ p 1 , p 2 , p 3 2 , d ^ p 1 , p 2 , p 3 2 p 0 }

  2. Der 3er - Impuls wird definiert und ausgewertet

    P i_ := ( Ψ ¯ // QASimplify [ ] ) ( γ 0 ( D x i ( Ψ // Evaluate ) /. p p1 ) ) P i_ := V P i 3 x Map [ ( P i // QAEvaluate2 ) & , { 1 , 2 , 3 } ] // Timing { 116.688 , { p c ^ p 1 , p 2 , p 3 1 , c ^ p 1 , p 2 , p 3 1 p 1 p c ^ p 1 , p 2 , p 3 2 , c ^ p 1 , p 2 , p 3 2 p 1 p d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1 p 1 p d ^ p 1 , p 2 , p 3 2 , d ^ p 1 , p 2 , p 3 2 p 1 , p c ^ p 1 , p 2 , p 3 1 , c ^ p 1 , p 2 , p 3 1 p 2 p c ^ p 1 , p 2 , p 3 2 , c ^ p 1 , p 2 , p 3 2 p 2 p d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1 p 2 p d ^ p 1 , p 2 , p 3 2 , d ^ p 1 , p 2 , p 3 2 p 2 , p c ^ p 1 , p 2 , p 3 1 , c ^ p 1 , p 2 , p 3 1 p 3 p c ^ p 1 , p 2 , p 3 2 , c ^ p 1 , p 2 , p 3 2 p 3 p d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1 p 3 p d ^ p 1 , p 2 , p 3 2 , d ^ p 1 , p 2 , p 3 2 p 3 } }

  3. Der 4er - Strom wird definiert und die Ladung ausgewertet (ohne multiplikative Ladungskonstante)

    J i : = ( Ψ QASimplify [ ] ) ( γ i ( Ψ /. p p 1 ) ) J i : = v J i 3 x QAEvaluate2 [ J 0 ] // Timing { 41.5313 , 2 1 ^ p 1 + p c ^ p 1 , p 2 , p 3 1 , c ^ p 1 , p 2 , p 3 1 + p c ^ p 1 , p 2 , p 3 2 , c ^ p 1 , p 2 , p 3 2 p d ^ p 1 , p 2 , p 3 1 , d ^ p 1 , p 2 , p 3 1 p d ^ p 1 , p 2 , p 3 2 , d ^ p 1 , p 2 , p 3 2 }