Danger de l'arithmétique complexe dans le calcul scientifique

11

Le produit intérieur complexe a deux définitions différentes décidées par des conventions: ou . Dans BLAS, j'ai trouvé les routines cdotu, zdotu et cdotc, zdotc. Les deux anciennes routines calculent en fait (un faux produit intérieur!) Et les deux dernières routines conjuguent le premier vecteur du produit intérieur. Aussi, par l'une ou l'autre des définitions (conjugué ou ), avec conjugaison! De plus, comme indiqué dans un commentaire, le choix des valeurs principales pour les fonctions complexes à valeurs multiples peut dépendre de la convention.u,vu¯TvuTv¯uTvuvu,v=v,u¯

Ma question est: cette complication entraîne-t-elle un véritable danger pour l'utilisation de l'arithmétique complexe dans le calcul scientifique? Ce problème est souligné par les auteurs de deal.ii qui suggèrent de toujours diviser les nombres complexes en partie réelle et partie imaginaire et d'utiliser uniquement l'arithmétique réelle. Mais je n'ai jamais trouvé que l'approche du fractionnement soit pratique. Par exemple, pensez à la PML pour les équations de Maxwell harmoniques dans le temps.

Il semble que le souci d'utiliser des nombres complexes soit répandu dans la plupart des logiciels FEM open source sauf FreeFem ++ et libmesh. Mais même pour les deux exceptions, l'arithmétique complexe est moins testée que la vraie.

Ma dernière question est la suivante: éviterons-nous toujours d'utiliser des nombres complexes?

Hui Zhang
la source
3
-1je-je
@hardmath Merci! Je l'ai ajouté dans la question.
Hui Zhang
@hardmath: "petit ensemble d'exemples de test" - dans la plupart des bibliothèques qui implémentent de manière complète des opérations d'algèbre linéaire, il y aurait probablement des dizaines ou des centaines d'endroits où les produits internes sont pris. Il faudrait des centaines de tests pour vérifier leur exactitude, ce qui prendrait probablement des mois pour être mis en œuvre correctement. Ce n'est pas impossible, bien sûr, et certaines bibliothèques l'ont fait. C'est juste beaucoup de travail et tous les auteurs de bibliothèque ne sont pas convaincus d'avoir bien fait les choses :-(
Wolfgang Bangerth
@WolfgangBangerth, peut-être pourriez-vous expliquer la décision de conception de deal.ii?
Bill Barth
3
Devons-nous toujours éviter d'utiliser des nombres complexes? Je t'en prie, non. Je crois que chaque scientifique en informatique a besoin de décompositions de valeurs propres asymétriques, par exemple.
Federico Poloni

Réponses:

2

Vous dites que le problème avec l'arithmétique complexe est qu'il existe différentes façons de définir le produit scalaire pour des vecteurs complexes, par rapport à une seule façon dans le cas réel. Je pense que le vrai problème avec le produit scalaire complexe en est un autre, qui est cependant étroitement lié à votre observation.

En arithmétique complexe, l'ordre des arguments du produit scalaire importe, tandis qu'en arithmétique réelle, ils ne le sont pas. De nombreux algorithmes sont essentiellement les mêmes en arithmétique complexe et réelle, ce qui signifie que vous n'avez qu'à les écrire une fois, puis à utiliser le même code pour une arithmétique complexe et réelle. (Par exemple, en C ++, vous pouvez utiliser des modèles à cet effet.) Lorsque vous avez terminé d'écrire votre code, vous le testez généralement. Pour découvrir des erreurs dans l'ordre des arguments dans certains produits scalaires, vous devez tester votre code avec un cas de test de valeur complexe.

Vous obtenez souvent gratuitement le code à valeur réelle d'un algorithme lorsque vous disposez d'un code de travail pour des problèmes de valeur complexes. Lorsque vous avez testé votre code avec un scénario de test à valeur complexe, le code est souvent également correct pour les nombres réels. Transformer un code à valeur réelle en code complexe nécessite cependant un travail supplémentaire. Par conséquent, il y a juste plus de codes qui fonctionnent (et sont minutieusement testés) pour les problèmes à valeur réelle que pour les problèmes à valeur complexe.

Ma question est: cette complication entraîne-t-elle un véritable danger pour l'utilisation de l'arithmétique complexe dans le calcul scientifique?

Je dirais "Oui", de la manière suivante. Lorsque le code n'est pas bien testé pour les problèmes de valeur complexe, il y a une probabilité plus élevée de bogues dans le code, mais cela dépend du code concret que vous regardez. Lorsque le code est bien testé, il n'y a pas de problème.

Ma dernière question est la suivante: éviterons-nous toujours d'utiliser des nombres complexes?

Comme déjà souligné, il y a des problèmes qui ne peuvent pas être résolus en utilisant des nombres réels. Par exemple, le calcul de valeurs propres de matrices asymétriques. Par conséquent, nous avons besoin d'une arithmétique complexe.

H. Rittich
la source
-1

Ce document est pertinent:

Coupes de branche pour les fonctions complexes élémentaires ou beaucoup de bruit sur le bit de signe de rien.

http://people.freebsd.org/~das/kahan86branch.pdf

Julian Cienfuegos
la source
5
Bienvenue chez SciComp! Peut-être pourriez-vous expliquer davantage pourquoi le document que vous liez est pertinent? Un résumé rendrait votre réponse plus précieuse et plus susceptible d'être votée positivement. Nous avons tendance à décourager les réponses qui ajoutent des liens sans contexte suffisant.
Geoff Oxberry