Je recherche une solution explicite rapide (oserais-je dire optimale?) Au problème réel linéaire 3x3, , A ∈ R 3 × 3 , b ∈ R 3 .
La matrice est générale, mais proche de la matrice d'identité avec un numéro de condition proche de 1. Parce que b sont en fait des mesures de capteur avec environ 5 chiffres de précision, cela ne me dérange pas de perdre plusieurs chiffres en raison de problèmes numériques.
Bien sûr, il n'est pas difficile de trouver une solution explicite basée sur un certain nombre de méthodes, mais s'il y a quelque chose qui s'est révélé optimal en termes de nombre de FLOPS, ce serait idéal (après tout, tout le problème rentrera probablement dans les registres FP!).
(Oui, cette routine est souvent appelée . Je me suis déjà débarrassé des fruits bas et c'est la prochaine dans ma liste de profilage ...)
Réponses:
Vous ne pouvez pas battre une formule explicite. Vous pouvez écrire les formules de la solution sur une feuille de papier. Laissez le compilateur optimiser les choses pour vous. Toute autre méthode aura presque inévitablement des instructions ou des boucles (par exemple, pour les méthodes itératives) qui rendront votre code plus lent que tout code en ligne droite.x = A- 1b
if
for
la source
La matrice étant si proche de l'identité, les séries Neumann suivantes convergeront très rapidement:
Selon la précision requise, il pourrait même être suffisant de tronquer après 2 termes:
Cela pourrait être légèrement plus rapide qu'une formule directe (comme suggéré dans la réponse de Wolfgang Bangerth), mais avec beaucoup moins de précision.
Vous pouvez obtenir plus de précision avec 3 termes:
mais si vous écrivez la formule entrée par entrée pour , vous regardez une quantité comparable d'opérations en virgule flottante comme formule inverse directe de matrice 3x3 (vous n'avez pas à faire une division cependant, ce qui aide un peu).( 3 I- 3 A + A2) b
la source
Les FLOPS comptent sur la base des suggestions ci-dessus:
LU, pas de pivotement:
Élimination gaussienne avec substitution arrière, sans pivot:
La règle de Cramer via l'expansion du cofacteur
Inverse explicite puis multipliez:
Preuve de concepts MATLAB:
Règle de Cramer via l'extension Cofactor :
LU (pas de pivotement) et substitution arrière:
Inverse explicite puis multipliez:
Élimination gaussienne:
Remarque: n'hésitez pas à ajouter vos propres méthodes et décomptes à ce message.
la source
Probablement la règle de Cramer. Si vous pouvez éviter le pivotement, peut-être la factorisation LU; c'est une matrice 3x3, donc dérouler les boucles manuellement serait facile. Tout le reste impliquera probablement une ramification, et je doute qu'une méthode de sous-espace de Krylov converge assez souvent en 1 ou 2 itérations pour que cela en vaille la peine.
la source