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.
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?
la source
Réponses:
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.
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.
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.
la source
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
la source