Gefahr komplexer Arithmetik im wissenschaftlichen Rechnen

11

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 u,vu¯TvuTv¯uTvuvu,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?

Hui Zhang
quelle
3
Weiß jemand wirklich die Wurzel von ist und was ist ? Es scheint, dass ein Softwareentwickler eine kleine Reihe von Testbeispielen in seine Regressionssuite aufnehmen sollte, um zu verhindern, dass inkonsistente Konjugationen in eine lange Kette komplexer arithmetischer Berechnungen einbezogen werden. i - i1ii
Hardmath
@hardmath Danke! Ich habe es in die Frage aufgenommen.
Hui Zhang
@hardmath: "kleine Menge von Testbeispielen" - In den meisten Bibliotheken, die lineare Algebraoperationen umfassend implementieren, gibt es wahrscheinlich Dutzende oder Hunderte von Stellen, an denen innere Produkte verwendet werden. Es würde Hunderte von Tests erfordern, um ihre Richtigkeit zu überprüfen. Die korrekte Implementierung würde wahrscheinlich Monate dauern. Das ist natürlich nicht unmöglich, und einige Bibliotheken haben das getan. Es ist nur eine Menge Arbeit und nicht alle Bibliotheksautoren sind zuversichtlich, dass sie es richtig gemacht haben :-(
Wolfgang Bangerth
@ WolfgangBangerth, vielleicht könntest du die Designentscheidung für deal.ii erklären?
Bill Barth
3
Sollen wir es einfach immer vermeiden, komplexe Zahlen zu verwenden? Bitte nicht. Ich glaube, jeder Computerwissenschaftler braucht zum Beispiel unsymmetrische Eigenwertzerlegungen.
Federico Poloni

Antworten:

2

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.

Meine Frage ist: Verursacht diese Komplikation eine echte Gefahr für die Verwendung komplexer Arithmetik im wissenschaftlichen Rechnen?

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.

Meine letzte Frage lautet: Sollen wir es einfach immer vermeiden, komplexe Zahlen zu verwenden?

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.

H. Rittich
quelle
-1

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

Julian Cienfuegos
quelle
5
Willkommen bei SciComp! Vielleicht könnten Sie mehr darüber erklären, warum das von Ihnen verlinkte Papier relevant ist? Eine Zusammenfassung würde Ihre Antwort wertvoller machen und mit größerer Wahrscheinlichkeit positiv bewertet werden. Wir neigen dazu, Antworten zu entmutigen, die Links ohne ausreichenden Kontext hinzufügen.
Geoff Oxberry