Ableitung von Komplex-Konjugierten
Bildung, Wissenschaft
application/zip
Habelt, Jürgen
Desktop OS auf welchem Mathematica läuft
Problematik
Mathematica leitet Ausdrücke mit komplexen Variablen und Funktionen nach der Kettenregel ab, wie im folgenden Beispiel gezeigt:
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:
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.