Problematik

Mathematica leitet Ausdrücke mit komplexen Variablen und Funktionen nach der Kettenregel ab, wie im folgenden Beispiel gezeigt:

D [ ψ [ x , t ] , t ] Conjugate ´ [ ψ [ x , t ] ] ψ ( 0 , 1 ) [ x , t ]

Dabei ist unklar, was die Ableitung der Conjugate Funktion überhaupt bedeuten soll.

Bei Anwendungen der Quantenmechanik hat man dagegen häufig die Wellenfunktion Ψ, die zwar komplexwertig ist, aber von reellen Parametern wie der Zeit t oder dem Ort x abhängt.

Für diesen Anwendungsfall würde folgendes Ergebnis Sinn machen:

Conjugate [ ψ ( 0 , 1 ) [ x , t ] ]

Zielstellung

Meine Zielstellung war nun die Schaffung einer eigenen Funktion d  (als Ersatz für D) mit folgenden Eigenschaften:

  • sie soll die selben Parameter wie D unterstützen
  • bei Conjugate - Ausdrücken tritt die oben aufgeführte Regel in Kraft, d.h. Ableitungen von Konjugierten werden zur Konjugierten der Ableitung des Parameters der Konjugierten
  • dazu führt d eine Ausdrucksanalyse durch und wendet die aufgeführte Regel an

Programm und Funktionsweise

Das unter aufgeführte Programm läuft unter Mathematica 7+.

Programmcode

(* Substitute of the built in function D *)
d[ex_,vars__] := Module[{res,lis = {}, prepareVars}, 
    SetAttributes[expSubstitute, HoldRest]; 
    SetAttributes[replaceConjugate, HoldRest]; 
    prepareVars[vars2_] := Module[{}, 
        If[
            Depth[vars2] <= 2, 
            vars2, 
            Map[#[[1]]&, vars2] 
        ] 
    ]; 
    res = expSubstitute[ex, {Sequence[prepareVars[{vars}]]}, replaceConjugate, lis]; (* transformation *) 
    res = D[res,vars]; (* perform the derivation *) 
    res = expSubstitute[res, {vars}, replacePlaceHolder, lis]; (* back transformation *) 
    res 
]

(* Common Substitution Function *)
expSubstitute[exp_, {vars__}, getReplacement_:Function[{ex, lis, vars}, ex], lis_, level_ : 0] := Module[{return, i}, If[ AtomQ[exp], Return exp; ]; return = Level[exp, 1, Heads -> True]; For[ i = 2, i <= Length[return], i = i + 1, If[ !AtomQ[return[[i]]], return[[i]] = expSubstitute[return[[i]], {vars}, getReplacement, lis, level + 1]; ]; ]; return = getReplacement[return, lis, {vars}]; return = Apply[First[return], Drop[return, 1]]; return ]
(* Replacement of Conjugate with Placeholder *)
replaceConjugate[x_, lis_, {vars__}] := Module[{}, If[ SameQ[x[[1]], Conjugate], AppendTo[lis, x[[2]]]; {\[Psi][Length[lis]], vars}, x ] ]
(* Replacement of Placeholder back to Original Expression *)
replacePlaceHolder[x_, lis_, {vars__}] := Module[{head, n1, m1, pat1 = Derivative[n__][\[Psi][m_]], pat2 = \[Psi][m_]}, head=x[[1]]; Which[ Count[{head}, pat1] > 0, n1 = head /. pat1 -> n; m1 = head /. pat1 -> m; {Conjugate, D[lis[[m1]], vars]}, Count[{head}, pat2] > 0, m1 = head /. pat2 -> m; {Conjugate, lis[[m1]]}, True, x ] ]

Aufbau und Wirkungsweise

Dieser Mathematica Modul besteht aus 4 Funktionen:

d die eigentliche Ableitungsfunktion
expSubstitute analysiert einen Ausdruck und führt eine Substitution durch
replaceConjugate ersetzt Conjugate Ausdrücke in einem Ausdruck durch einen Platzhalter
replacePlaceHolder ersetzt den erzeugten Platzhalter wieder zurück

 

Im Wesentlichen funktioniert die Funktion d nun wie folgt:

  • zuerst werden alle Conjugate - Funktionen durch Platzhalter ersetzt
  • dazu wird expSubstitute mit der Parameterfunktion replaceConjugate aufgerufen
  • danach wird die eingebaute Funktion D angewendet
  • zuletzt wird expSubstitute mit der Parameterfunktion replacePlaceHolder aufgerufen
  • dadurch wir der Platzhalter wieder zurück in Conjugate - Ausdrücke übersetzt
  • Ableitungen des Platzhalters werden nun zu Conjugierten der Ableitungen der Argumente der Conjugierten

Download

Den kompletten Modul mit den 4 Funktionen können Sie hier laden. Außerdem zeigt die Notebook Preview ein paar Anwendungsbeispiele der neuen Funktion d.