TD/TP — Algèbre II 4 : Factorisation en MATLAB

🔊 Écouter la source audio

Séance de TP (salle machine) — le professeur intervient peu et l’enregistrement est dominé par le bruit de la salle ; le contenu ci-dessous est reconstruit à partir de l’énoncé, du code MATLAB et des « Rappels théoriques ». Les rares passages oraux fiables sont regroupés plus bas.

Support écrit de référence : Rappels théoriques.pdf — chapitre 1, § 1.1 (p. 2-4).


Énoncé — TD 3 (Partie 2) : Factorisation

Énoncé : Énoncé TD 3.pdf — code MATLAB de la session : LUClassique.m, LUPivotPartiel.m, permu_ligne.m, inferior.m, superior.m, Substi.m, launch.m.

  • ⚠️ Discrepance de noms : le matériel est rangé dans le dossier « TD - 4 », mais le PDF de l’énoncé s’intitule « TD 3 » (Énoncé TD 3.pdf). Le contenu correspond bien à cette session (factorisation ).

Exercice 1. On considère les matrices suivantes :

On vous demande de :

  • calculer la factorisation classique des matrices , et ;
  • calculer la factorisation avec pivotage partiel des matrices et ;
  • calculer la factorisation avec pivotage complet de la matrice .

Exercice 2. Créer une fonction Matlab function [L,U] = LUClassique(A,n) donnant la factorisation classique. INPUT (ordre ) ; OUTPUT triangulaire inférieure, triangulaire supérieure telle que . INFO : affiche un message d’erreur si un des pivots est nul. Tester sur , , ; comparer avec les résultats à la main.

Exercice 3. Créer function [L,U,P] = LUPivotPartiel(A,n) (). On implémentera d’abord function A = permu_ligne(A,l1,l2) (permute deux lignes). Tester sur , , .

Exercices supplémentaires

Exercice 4. Créer function [L,U,P,Q] = LUPivotComplet(A,n) telle que . Tester sur .

Exercice 5. Créer trois fonctions Matlab donnant la solution d’un système carré via factorisation : (a) classique, (b) avec pivotage partiel, (c) avec pivotage complet. Systèmes de test :

🎓 syllabus : Rappels théoriques ch. 1 § 1.1 (p. 2-4) — « Factorisation » (p. 2-3), « Pivotage partiel » et « Pivotage complet » (p. 3), formule (p. 3) et résolution par , , (p. 4).


Code MATLAB de la séance

LUClassique.m — fourni complet

Signature fournie : function [L,U]=LUClassique(A) (⚠️ l’énoncé demande LUClassique(A,n)). Elle calcule colonne par colonne en mettant à jour sur place : à l’étape , on stocke la colonne de , on recopie la ligne dans , puis on soustrait au bloc restant.

for k = 1 : n - 1
    for i = k:n
        L(i , k) = A(i ,k)/A(k , k);
        for j = k : n
            if A(k , k) == 0
                error("Le pivot est nul")
            end
            U(k , j) = A(k , j);
            if i ~= k && j ~= k
                A(i , j) = A(i , j) - L(i , k)*U(k , j);
            end
        end
    end
% Pas 3 : poser u_nn = a_nn et l_nn = 1
U(n,n) = A(n , n) ;
L(n , n) = 1;
end

🎓 syllabus : Rappels théoriques ch. 1 § « Factorisation LU » (p. 2-3) — « , , » ; « Les sont appelés pivots et l’algorithme suppose qu’ils sont non nuls ».

  • ⚠️ À vérifier dans le fichier fourni (constat, sans conclure) : le test if A(k,k)==0 est placé après la division L(i,k)=A(i,k)/A(k,k) — un pivot nul serait donc utilisé avant d’être testé. Le « Pas 3 » (U(n,n), L(n,n)) comme le end du for k semblent à l’intérieur de la boucle k. C’est l’état du fichier provisoire, à confirmer avec le prof.

LUPivotPartiel.m — à compléter

Squelette à remplir (les parties ... votre code ici ...). Le schéma attendu suit le syllabus :

for k=1:n-1
    % choisir un indice s dans {k,...,n} tel que |a(k)_sk| = max_l |a(k)_lk|
    ... votre code ici ...
    % permuter les lignes l et s dans A(k) et dans L
    ... votre code ici ...
    % mettre a jour P, la matrice de permutation
    ... votre code ici ...
    % mettre a jour L, U et A
    ... votre code ici ...
end
  • À implémenter : choisir tel que ; permuter la ligne avec la ligne dans et dans ; accumuler ; puis effectuer la mise à jour habituelle.
  • On utilise d’abord la fonction permu_ligne (voir ci-dessous).

🎓 syllabus : Rappels théoriques ch. 1 § « Pivotage partiel » (p. 3) — on choisit maximisant sur , puis on permute la ligne avec la ligne dans et dans .

permu_ligne.m — à compléter

Squelette function A=permu_ligne(A,l1,l2) à remplir (... votre code ici ...) : renvoie avec les lignes et permutées.

inferior.m, superior.m, Substi.m — helpers fournis

  • inferior(M) / superior(M) : testent si est triangulaire inférieure / supérieure (parcours while, affichage d’un message).
  • Substi(A,b) : résout pour triangulaire — substitution régressive si est supérieure, progressive si elle est inférieure ; error(...) sinon.
if (testSup == true)      % substitution régressive
    x(N) = b(N)/A(N,N);
    for i = N-1:-1:1
        s = 0;
        for j = i+1:N
            s = s + A(i,j)*x(j);
        end
        x(i) = (b(i)-s)/A(i,i);
    end
elseif (testInf == true)  % substitution progressive
    x(1) = b(1)/A(1,1);
    for i = 2:N
        s = 0;
        for j = 1:i
            s = s + A(i,j)*x(j);
        end
        x(i) = (b(i)-s)/A(i,i);
    end
else
    error("Votre matrice n'est pas triangulaire")
end

🎓 syllabus : Rappels théoriques ch. 1 § 1.1 (p. 2) — triangulaire inférieure → substitution progressive () ; triangulaire supérieure → substitution régressive ().

  • ⚠️ À vérifier dans le fichier fourni : dans la branche progressive, la somme interne va de j = 1:i (elle inclut donc , pas encore calculé) ; à confirmer avec le prof.

launch.m — script de test

Script de vérification : il factorise puis contrôle L*U contre , et (section pivotage) contrôle L*U - P*A contre zéro.

B=[2 1 0 0; 4 -2 1 0; 0 4 0 1; 0 0 4 7];
[L,U] = LUClassique(B);
disp(L*U);      % vérification, doit être égal à B
...
[L,U,P] = LUPivotPartiel(A);
disp(L*U - P*A);   % doit être nul puisque PA = LU

Remarques orales du professeur (fragments fiables)

Le professeur n’intervient que ponctuellement ; seules les phrases suivantes sont exploitables.

  • But de la séance / travail de groupe — [00:01:13] : « Vous allez devoir dans le travail de groupe utiliser la factorisation LU avec pivotage partiel et sans pivotage. Donc vous devez faire en sorte que, pour le travail de groupe, vos codes soient opérationnels. Pour l’implémentation, basez-vous sur les rappels qu’il y a sur le campus. »
  • Construction de — [00:00:45] : « il y avait juste l’aspect algorithmique pour [celle] avec le pivotage, où on n’a pas spécialement expliqué comment construire la matrice au fur et à mesure des itérations. Mais… quand on [écrivait] la matrice tout à la fin, à chaque fois, on prenait la matrice identité et on appliquait sur le résultat précédent. »
  • Exercice 5 (résolution ) — [00:02:01] : « C’est plutôt l’exercice 5 que je trouvais intéressant : à partir de la factorisation LU que vous avez trouvée, résoudre différents systèmes linéaires via la factorisation LU. »
  • Pivot nul division par zéro — [00:44:11] : « si jamais tu as un pivot qui est nul, tu dois lui dire : « Attention, il y a un pivot nul, on arrête tout ce qui se passe. » Il faut mettre un message [d’erreur] et sortir [de l’algorithme]. » ; [00:50:07] : « dès que vous avez un pivot nul, vous sortez de votre boucle et vous envoyez un message et vous dites que la factorisation n’est pas possible. »
  • — [00:43:15] : « Un , c’est quelque chose qui n’est pas représentatif… typiquement une opération qui n’a pas de [sens] » (résultat d’une division par zéro).
  • break vs flag — [01:01:21] : « Je vous conseille [d’]utiliser un flag, parce que si vous mettez break, il va sortir uniquement de la première boucle for… vous mettez un flag. »
  • Maximum en valeur absolue / fonction max — [01:33:23] : « Vous avez deux possibilités : soit vous faites un code qui calcule le maximum d’un vecteur… soit vous pouvez utiliser la fonction max de MATLAB. » ; [01:34:19] : « Vous mettez max([1, 2, 3]), il va vous donner . Ça ne vous arrange pas. » — « ce qui vous intéresse, c’est où est le ? » → [M, I] = max(...).

Points clés

  • But du TP : implémenter (classique et pivotage partiel), la permutation de lignes, puis résoudre par , .
  • Factorisation : normée (), remplie colonne par colonne → étapes ; , , .
  • Pivot nul (sans pivotage) ⟹ division par zéro ( / ) : afficher un message d’erreur et arrêter.
  • Pivotage partiel : tel que ; permuter et ; sortir d’une double boucle par un flag, pas par un break.
  • MATLAB : max seul donne la valeur ; [M,I]=max(...) donne aussi l’indice (la ligne à permuter).
  • Vérification : L*U == A (classique) et L*U - P*A == 0 (pivotage) — voir launch.m.

Doutes / à vérifier

  • ⚠️ Audio peu informatif : séance en salle machine, l’enregistrement est dominé par les conversations des étudiants ; seules les phrases citées ci-dessus sont fiables.
  • ⚠️ Notes - Facto LU.pdf (dossier « TD - 4 ») est manuscrit : l’OCR est illisible → non utilisé comme source.
  • ⚠️ Identité du professeur non confirmée dans l’audio ; on reprend la mention des TD précédents (« nouveau titulaire, remplace M. Wreckin »).
  • ⚠️ Points de code à confirmer : dans LUClassique.m, le test if A(k,k)==0 est placé après la division, et le « Pas 3 » semble dans la boucle k ; dans Substi.m, la somme progressive va jusqu’à j=i. Ce sont des constats sur les fichiers fournis, pas des conclusions.