Orthogonalisation de Gram-Schmidt

Choisissez l'écartement des colonnes, puis lisez les deux grilles : elles donnent l'angle entre chaque paire de vecteurs que les deux versions renvoient.

Chargement de la simulation interactive...

Le Gram-Schmidt classique renvoie deux vecteurs écartés de 60° 🖖

Cliquez sur ε = 10⁻⁸, classique. Dans la grille classique, deux cellules affichent 60,00°, la paire q₂ et q₃ dans les deux coins, et chaque autre angle des deux grilles affiche 90,00°. Le produit scalaire sous-jacent est 0,5000 : un demi, à une unité près sur la dernière décimale d'un double.

La matrice compte trois colonnes. Chacune d'elles est le vecteur (1, 0, 0, 0) doté d'un unique 10⁻⁸ glissé dans un emplacement différent. Peter Läuchli l'a utilisée en 1961 et elle porte son nom depuis. Les colonnes qui se répètent presque sont le cas épineux de tout ajustement par les moindres carrés, et elles apparaissent chaque fois que deux de vos mesures sont pratiquement confondues.

Le Gram-Schmidt modifié reçoit ces trois mêmes colonnes et chaque angle qu'il renvoie mesure 90,00°, pour le même nombre de multiplications.

Reculez l'écartement d'un cran, à 10⁻⁷, et cette cellule affiche 89,24°. Un simple clic du curseur fait la différence entre une erreur de trois quarts de degré et une erreur de trente.

Les deux versions lisent un nombre différemment 🖖

Réglez l'animation sur la colonne 3 et cliquez sur Classique, puis sur Modifié. La ligne Ce que q₂ retire de la colonne 3 passe de 0 à 7,0711 × 10⁻⁹. Avec trois colonnes, c'est le seul coefficient que les deux algorithmes calculent différemment. L'élément diagonal situé en dessous, ainsi que chaque angle de la grille, en découlent.

L'algorithme classique évalue ce coefficient par q₂ᵀa₃, sur la colonne qui lui a été fournie. L'algorithme modifié évalue q₂ᵀv, sur ce qu'il reste de la colonne une fois la part de q₁ retirée. Sur le papier, ces deux nombres sont égaux. En effet, v ne diffère de a₃ que par un multiple de q₁, et q₂ est orthogonal à q₁. En arithmétique, q₂ n'est pas tout à fait orthogonal à q₁. La colonne a₃ garde une portion de 7,0711 × 10⁻⁹ d'elle-même pointant vers q₂. L'algorithme classique ne regarde jamais par là. Le vecteur q₃ la conserve donc, et c'est ce qui donne ces 60°.

Faites glisser le curseur de 10⁻¹ à 10⁻⁸. Regardez les deux courbes se séparer dans le panneau inférieur. Ajustée sur 113 points à travers cet intervalle, la perte d'orthogonalité de l'algorithme classique augmente selon κ1,98 sur ces trois colonnes. Celle de l'algorithme modifié évolue selon κ0,98. Le panneau refait l'ajustement quel que soit le nombre de colonnes que vous choisissez. Ces deux exposants varient donc à mesure que vous élargissez la matrice. Une simple soustraction réordonnée vaut une puissance entière du nombre de conditionnement.

La base est ruinée et la factorisation est exacte 🖖

La dernière ligne du tableau des résultats est ‖A − QR‖ / ‖A‖. À ε = 10⁻⁸ avec l'algorithme classique, elle indique 0. Multipliez le Q dégradé par le R produit à ses côtés. La matrice d'origine réapparaît, coefficient par coefficient, sans aucun reste.

En balayant chaque état accessible par les commandes (quatre nombres de colonnes, dix séparations et les deux algorithmes), ce résidu relatif ne dépasse jamais 5,5511 × 10⁻¹⁷. L'écart entre 1 et le double suivant est de 2,2204 × 10⁻¹⁶. Le résidu se maintient donc à un quart d'unité en dernière position.

L'algorithme de Gram-Schmidt a bien écrit A comme le produit des vecteurs qu'il a renvoyés par les coefficients qu'il a mémorisés. Ce qu'il a cessé de faire, c'est de renvoyer des vecteurs orthogonaux entre eux. Savoir laquelle de ces deux propriétés vous est nécessaire dépend de votre propre code. Projeter un vecteur avec Qᵀb s'appuie sur celle qui a fait défaut. Reconstruire A à partir de Q et R repose sur celle qui a tenu bon.

Problème entièrement résolu

  1. Là où le Gram-Schmidt classique perd son angle droit 8 étapes

    L'outil affiche trois colonnes espacées de 10⁻⁸ et la réponse du Gram-Schmidt classique pour elles. Exécutez l'algorithme à la main, trouvez l'unique arrondi qui lui coûte trente degrés, puis indiquez jusqu'où chaque version peut être poussée avant de cesser d'être utile.

    Ouvrez ce problème dans l'outil

    1. Chaque colonne est le vecteur (1, 0, 0, 0) avec un seul ε glissé dans un emplacement différent. AᵀA est la matrice 3 × 3 remplie de un, plus ε²I. Ses valeurs propres sont 3 + ε² une fois et ε² deux fois. Les valeurs singulières sont donc √(3 + ε²) et ε, et le conditionnement est exact plutôt qu'estimé. La première ligne du tableau affiche 1,7321 × 10⁸.

    2. ‖a₁‖² vaut 1 + ε², et ε² vaut 10⁻¹⁶. Un double stocke 1, et le nombre suivant qu'il peut représenter se trouve 2,2204 × 10⁻¹⁶ plus loin. Tout ce qui est inférieur à la moitié de cet écart, soit 1,1102 × 10⁻¹⁶, disparaît lorsqu'on l'ajoute à 1. Dix puissance moins seize se situe en dessous. La racine carrée vaut 1. Diviser par celle-ci ne change rien, et q₁ ressort comme la colonne elle-même, avec le ε² rayé des registres. Chaque autre arrondi dans ce problème coûte une unité sur la dernière décimale. Celui-ci coûte trente degrés.

    3. Passons à la colonne 2. Les deux versions s'accordent ici puisqu'il n'y a qu'un seul vecteur derrière. Le coefficient de projection est q₁ᵀa₂ = 1. Soustraire cette valeur laisse (0, −ε, ε, 0), dont la longueur est ε√2 = 1,4142 × 10⁻⁸. La colonne 2 est arrivée avec une longueur de 1 pour autant qu'un double puisse en juger, et tout sauf 1,4142 × 10⁻⁸ était déjà couvert par q₁.

    4. Colonne 3, version classique. Le coefficient sur q₁ est encore 1. Le coefficient sur q₂ est q₂ᵀa₃. Comme q₂ vit entièrement dans les positions 2 et 3 tandis que a₃ garde son ε dans la position 4, ce produit scalaire vaut 0. C'est ce qu'indique la ligne Ce que q₂ retire à la colonne 3. Soustraire q₁ seul laisse (0, −ε, 0, ε), de longueur ε√2 là encore. La ligne Ce qu'il reste de la colonne 3 affiche donc également 1,4142 × 10⁻⁸.

    5. Les vecteurs q₂ et q₃ ont tous deux été construits en retirant q₁ d'une colonne qui partage son 1 initial. Ils portent donc tous les deux −1/√2 dans la position 2 et n'ont rien d'autre en commun. Leur produit scalaire est un demi. L'outil imprime 0,5000 et 60,00°, et la valeur qu'il stocke est 0,4999999999999999, à une unité près du demi donné par l'algèbre, car ±1/√2 n'est pas une fraction binaire. C'est la taille d'erreur dont cette arithmétique est capable. Ce ne sont pas les trente degrés. La ligne de perte classique indique 0,7071, ce qui correspond à √(2 × 0,5²) : le même demi compté une fois dans chaque coin de QᵀQ.

    6. La version modifiée, sur la même colonne. Une fois la part de q₁ retirée, le reste est (0, −ε, 0, ε), et cette version mesure par rapport à ce reste plutôt qu'à a₃. Le produit scalaire avec q₂ donne ε/√2 = 7,0711 × 10⁻⁹, et non zéro. Retirez cela et ce qui reste est (0, −ε/2, −ε/2, ε), de longueur ε√(3/2) = 1,2247 × 10⁻⁸. q₂ᵀq₃ sort à 1,1102 × 10⁻¹⁶ au lieu d'un demi. La ligne de perte modifiée affiche 1,1547 × 10⁻⁸. Tout ce qui y reste est ce que q₁ n'a pas pu enlever : la soustraction laisse −ε² couché le long de q₁, et diviser par un reste long de seulement ε√2 retransforme cela en ε/√2.

    7. Le même argument vaut pour chaque nombre de colonnes proposé par l'outil. Le Gram-Schmidt classique construit chaque q ultérieur en retirant q₁ d'une colonne qui partage son 1 initial. Chaque paire entre eux ressort donc à 60° : (n − 1)(n − 2)/2 paires, avec une perte d'orthogonalité égale à la racine carrée de la moitié de ce compte. Avec deux colonnes, il n'y a pas de telles paires. Ce qui reste est l'inclinaison de taille ε que les deux versions partagent.

    8. La ligne ajustée du mode classique atteint une perte de 1 à κ = 2,35 × 10⁸, ce qui explique pourquoi la courbe classique est déjà plate à l'extrémité droite du panneau. Le mode modifié obtient une borne mesurée plutôt qu'extrapolée. Sa propre courbe s'infléchit au-delà de 10⁻⁸ et une ligne ajustée prolongée si loin serait réfutée par le panneau en dessous. Sur les 724 points du balayage, sa perte n'a jamais dépassé 1,25 epsilon machine fois κ, et cette borne n'atteint 1 qu'à κ = 3,60 × 10¹⁵. L'inverse de l'epsilon machine est 4,50 × 10¹⁵.

    Réponse

    Les trente degrés sortent d'une seule ligne. Le mode classique lit q₂ᵀa₃ = 0 là où le mode modifié lit q₂ᵀv₃ = 7,0711 × 10⁻⁹, et sur le papier, ces deux nombres sont identiques.

    La séparation de 10⁻⁸ est le premier cran où ε² disparaît de 1 + ε², puisque √(moitié de l'epsilon machine) vaut 1,0537 × 10⁻⁸. De là vers le bas, la cellule affiche 60,00° peu importe jusqu'où vous glissez. Un cran en arrière, à 10⁻⁷, elle indique 89,24° et le mode classique a déjà perdu 1,88 × 10⁻² d'orthogonalité. L'effondrement commence bien avant que le curseur n'atteigne le cran qui le rend net.

    Åke Björck a publié l'analyse de la version modifiée en 1967, et ce réordonnancement est devenu la norme depuis. Les deux méthodes exécutent le même nombre de multiplications. À cet écartement, la perte d'orthogonalité entre elles diffère d'un facteur de 6,1 × 10⁷. Le mode modifié conserve ses angles droits jusqu'à peu près au point où un double cesse de pouvoir distinguer les colonnes du tout ; le mode classique les abandonne sept ordres de grandeur plus tôt.

Références (5)