Das komplexe innere Produkt hat zwei verschiedene Definitionen, die durch Konventionen festgelegt werden: oder . In BLAS habe ich die Routinen cdotu, zdotu und cdotc, zdotc gefunden. Die beiden ersteren Routinen berechnen tatsächlich (ein falsches inneres Produkt!) Und die letzten beiden Routinen konjugieren den ersten Vektor im inneren Produkt. Nach jeder Definition (konjugieren Sie oder ) ist mit Konjugation! Darüber hinaus kann, wie in einem Kommentar ausgeführt, die Auswahl der Hauptwerte für mehrwertige komplexe Funktionen konventionsabhängig sein.ˉ u T v u T ˉ v u T v u v ⟨ u , v ⟩ = ¯ ⟨ v , u ⟩
Meine Frage ist: Verursacht diese Komplikation eine echte Gefahr für die Verwendung komplexer Arithmetik im wissenschaftlichen Rechnen? Dieses Problem wird von den Autoren von deal.ii hervorgehoben, die vorschlagen, komplexe Zahlen immer in Realteil und Imaginärteil aufzuteilen und nur die Realarithmetik zu verwenden. Aber ich fand den Aufteilungsansatz nie bequem. Denken Sie beispielsweise an die PML für zeitharmonische Maxwell-Gleichungen.
Es scheint, dass die Sorge um die Verwendung komplexer Zahlen in den meisten Open-Source-FEM-Softwareprogrammen außer FreeFem ++ und libmesh weit verbreitet ist. Aber selbst für die beiden Ausnahmen ist die komplexe Arithmetik weniger getestet als die reale.
Meine letzte Frage lautet: Sollen wir es einfach immer vermeiden, komplexe Zahlen zu verwenden?
quelle
Antworten:
Sie sagen, dass das Problem bei der komplexen Arithmetik darin besteht, dass es verschiedene Möglichkeiten gibt, das Skalarprodukt für komplexe Vektoren zu definieren, im Vergleich zu nur einer Möglichkeit im realen Fall. Ich denke, das eigentliche Problem mit dem komplexen Skalarprodukt ist ein anderes, das jedoch eng mit Ihrer Beobachtung zusammenhängt.
In der komplexen Arithmetik spielt die Reihenfolge der Argumente des Skalarprodukts eine Rolle, in der realen Arithmetik nicht. Viele Algorithmen sind in komplexer und reeller Arithmetik im Wesentlichen gleich, dh Sie müssen sie nur einmal schreiben und dann denselben Code für komplexe und reelle Arithmetik verwenden. (In C ++ können Sie beispielsweise Vorlagen für diesen Zweck verwenden.) Wenn Sie mit dem Schreiben Ihres Codes fertig sind, testen Sie ihn normalerweise. Um Fehler bei der Reihenfolge der Argumente in einem skalaren Produkt aufzudecken, müssen Sie Ihren Code mit einem Testfall mit komplexem Wert testen.
Oft erhalten Sie den reellen Code für einen Algorithmus kostenlos, wenn Sie einen Arbeitscode für komplexe Probleme haben. Wenn Sie Ihren Code mit einem Testfall mit komplexem Wert getestet haben, ist der Code häufig auch für reelle Zahlen korrekt. Das Verwandeln eines realwertigen Codes in einen komplexen erfordert jedoch zusätzliche Arbeit. Daher gibt es nur mehr Codes, die nur für realwertige Probleme funktionieren (und gründlich getestet werden) als für komplexwertige Probleme.
Ich würde auf folgende Weise "Ja" sagen. Wenn der Code nicht gut auf Probleme mit komplexen Werten getestet wurde, besteht eine höhere Wahrscheinlichkeit für Fehler im Code. Dies hängt jedoch von dem konkreten Code ab, den Sie betrachten. Wenn der Code gut getestet ist, gibt es kein Problem.
Wie bereits erwähnt, gibt es Probleme, die mit reellen Zahlen nicht gelöst werden können. Zum Beispiel die Berechnung von Eigenwerten unsymmetrischer Matrizen. Wir brauchen also komplexe Arithmetik.
quelle
Dieses Papier ist relevant:
Verzweigungsschnitte für elementare komplexe Funktionen oder viel Lärm um das Vorzeichenbit von Nothing.
http://people.freebsd.org/~das/kahan86branch.pdf
quelle