Inscription / Connexion Nouveau Sujet
Niveau école ingénieur
Partager :

Trigonalisation Gauss Matrice

Posté par
jocelyn
04-12-09 à 17:30

Bonjour !

Je voudrais trigonaliser une matrice par la méthode du pivot de Gauss pour ensuite en calculer le déterminant. Je dois le réaliser en C donc il faut que ce soit une méthode itérative donc pas de méthode "humaine".

Merci d'avance !

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 17:44

bonjour..... on a une matrice, ou un tableau B(i,j). de dimension n.

pivot : colonne B(n;i)

on a C (i,j) un nouveau tableau
si B(i,n) = 0 on ne change pas la colonne, sinon
C(i,j) = C(i,j) = B(i,j)-a.B(n,j)
où a = B(n,n)/B(i,n)  

et on a une nouvelle matrice ....
ensuite on fait cela de manière récursive en ne regardant que ce qui nous intéresse....

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 17:55

Euh je ne te suit pas trop là.

On a un tableau (matrice) B de dimension n: sa ok (parce que un tableau B(i,j) je ne comprend pas).

Ensuite le pivot je ne vois pas ce que c'est.

Si tu pouvais détailler un peu parce que là je ne comprend pas, quelles sont les bornes des boucles etc ...

Merci !

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 18:04

un exemple:



A =  matrice (3 ; 3):    en basic Dim A(3;3)

4      5    6

-1     2     5

1      3    2


je prends comme pivot la 3ème colonne pour mettre la 3ème ligne à zéro.

C =

4-6/2   5-3/2   6


-1 -5/2  2-3/2   5


1-2/2    3 -3/2  2

ça donne une matrice où il y a une ligne (presque) nulle

1       3.5     6

-3.5    0.5     5

0       0       2

ensuite on s'occupe du carré

1      3.5

-3.5    0.5


est-ce clair ?

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 18:35

Un peu plus merci.

Mais pour toi B(i,j), i est l'indice de ligne ou de colonne parce que je ne vois pas trop les relations avec la formule que tu m'as donné avant.

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 18:42

en fait ça dépend du sens où on travaille....

c'est de la programmation.

j'ai écrit à quoi peut ressembler le programme.
Il faut écrire sur papier et programmer ensuite....
ou alors bidouiller

Attention aux divisions par zéro.....
il faut envisager certains cas.

par exemple si la matrice possède des zéros mal placés.
Normalement c'est relativement facile à programmer....

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 18:52

Dans la formule que j'avais trouvé on prenait comme pivot l'élément (1,1) (le premier) et on faisait à partir de sa mais comme dans l'exemple ils utilisaient sa pour résoudre un système dans leur formule apparaissait la solution de l'équation.
Comme ici on a pas de solution je ne comprenais pas.

Avec ton exemple je ne comprend pas trop si tu ne me donnes pas les bornes de i et j pour pouvoir dérouler l'algo.

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 19:11

je donne en basic....
pour une matrice n,n

rem initialisation.
Dim A(n,n)   rem ligne colonne ? ou le contraire.
Dim B(n,n) rem matrice de transfert.


for i = n to 1

rem procédure pour éliminer les zéros de la ligne.
for k = 1 to i
for l = 1 to i

B(k,l) = .......

next l
next k


next i



j'expliquerai plus tard..... pour le reste

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 20:43

Oui je veux bien

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 21:13

rem initialisation.
Dim A(n,n)   rem ligne colonne ? ou le contraire.
Dim B(n,n) rem matrice de transfert.


for i = n to 1

   rem procédure pour éliminer les zéros de la ligne.
   for k = 1 to i
    
     if A(k,i) <> 0  ' condition pour qu'on n'ait pas de division par zéro
        
     then
        a = A(i,i)/A(k,i)
       for l = 1 to i

            B(k,l) = A(k,l)-a * A(k,i)   ' c'est là où on joue sur les lignes ou les colonnes

     next l
   end if
next k

rem on reboucle pour remettre B(i,j) dans A(i,j)

  for k = 1 to n   ' jusque n, c'est mieux....
        for l = 1 to n
           A(k,l)= B(k,l)
     next l
   next k


next i


voila à quoi ça peut ressembler

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 21:33

Ok merci, mais sa parait bizare car a = A(i,i)/A(k,i) et après tu fais a *A(k,i) du coup a = A(i,i) à chaque fois. C'est normal ?

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 04-12-09 à 21:40

oui....

c'est là qu'il faut regarder, j'ai pas testé....c'est peut-être A(i,l) au lieu de A(k,i)

il y a un bug à régler...en reprenant le principe du dessin de tout à l'heure avec la matrice 3x3
peut-être modifier le a

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 04-12-09 à 23:59

Et oui c'est bien pour sa que j'ai créer ce post, pour trouver a.

Sauf que dans ton dessin a la deuxième colonne 3-3/2 ne font pas 0.

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 09:21

voila un code qui fonctionne:

For i = n To 1 Step -1

            REM procédure pour éliminer les zéros de la ....
            For k = 1 To i
                If w(k, i) <> 0 Then  ' condition pour qu'on n'ait pas de division par zéro

                    For l = 1 To i - 1 'on veut éliminer w(i,l)
                        a = w(i, l) / w(i, k)
                        B(k, l) = w(k, l) - a * w(i, k)   ' c'est là où on joue sur les lignes ou les colonnes
                    Next l
                End If
            Next k

            REM on reboucle pour remettre B(i,j) dans A(i,j)

            For k = 1 To n  
                For l = 1 To n
                    w(k, l) = B(k, l)
                Next l
            Next k

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 05-12-09 à 12:44

Merci beaucoup  pour le temps que tu m'accordes mais malheureusement ton code n'est pas bon.

Le dénominateur du a s'élimine toujours sur la ligne d'après.

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 13:18

avec ce code:

matrice de départ (j'ai ajouté un ligne supplémentaire en bas) quand j'ai testé...
le problème c'est qu'il détruit une ligne...

045102040

2
82152124

3
82469190

90
1833747721613

45
18054314603692

5
5529011233706


matrice d'arrivée:
-10000
-19-13001,4210854715202E-14
-66-61-4500
-1523-1430-1239-8410
4518054314603692

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 13:50

Normalement, maintenant, ça y est:

 \array{\hline 04&5&10&20&40\\ \hline 2&8&21&52&124\\ \hline 3&8&24&69&190\\ \hline 90&183&374&772&1613\\ \hline 45&180&543&1460&3692\\ \hline } donne :

\array {\hline -163,329284239802&0&0&0&0\\
 \\ \hline
 \\ -7626,96083385881&-1673,73319158659&0&0&0\\
 \\ \hline
 \\ -12013,1860854355&-4458,70421623698&-1340,79918014904&0&0\\
 \\ \hline
 \\ -28818,5444444444&-14034,3169398907&-6582,60160427807&-2598,1670984456&0\\
 \\ \hline
 \\  +45&180&543&1460&3692\\
 \\ }
 \\

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 13:54

et voila le code vérifié...

REM initialisation.
        'Dim A(n, n)   REM ligne colonne ? ou le contraire.
        Dim B(n, n) REM matrice de transfert.

        For k = 1 To n   ' on charge B()
            For l = 1 To n
                B(k, l) = w(k, l)
            Next l
        Next k


        For i = n To 1 Step -1
            REM procédure pour éliminer
            For k = 1 To i
                If w(k, i) <> 0 Then  ' condition pour qu'on n'ait pas de division par zéro

                    For l = 1 To i - 1                           'on veut éliminer w(i,l)
                        a = w(i, l) / w(k, l)                    ' ligne importante.
                        B(k, l) = w(k, l) - a * w(i, l)         ' c'est là où on joue sur les lignes ou les colonnes
                    Next l
                End If
            Next k

            REM on reboucle pour remettre B(i,j) dans A(i,j)

            For k = 1 To n   ' jusque n, c'est mieux....
                For l = 1 To n
                    w(k, l) = B(k, l)
                Next l
            Next k

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 05-12-09 à 15:26

Bon c'est bizare chez moi sa ne marche pas, je vais regarder de plus près.

Merci beaucoup !!

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 05-12-09 à 15:47

Et w c'est quoi ?

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 15:51

w() c'est A()...
la matrice qu'on injecte.

j'ai eu un conflit de variables....

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 05-12-09 à 16:13

Voila mon code mais sa ne marche pas. Je ne sais pas pourquoi.


int main ()
{
    int n=3;
    int a,i,j,k,l;
int A[3][3]={4,5,6,-1,2,5,1,3,2}  ;
int B[n][n]  ;


for(i=0;i<n;i=i+1)
{
                  for(j=0;j<n;j=j+1)
                  {
                                    printf("%d\t",A[i][j]);
                  }
                  printf("\n");
}

  for (k=0;k<n;k=k+1)
  {
        for (l=0;l<n;l=l+1)
        {
           B[k][l]= A[k][l];
         }
        printf("\n");
  }
      printf("\n\n\n");
      
    printf("\n\n");

for (i=n-1;i>=0;i=i-1)
{

  
   for (k=0;k<i;k=k+1)
   {
    
     if (A[k][i] != 0 )
     {
       for (l=0;l<i-1;l=l+1)
       {
                           a = A[i][l]/A[k][l];
                           B[k][l] = A[k][l]-a * A[i][l];
                           printf("oui : %d\t",B[k][l]);

        }
        printf("\n");
      }
}



  /*for (k=0;k<n;k=k+1)
  {
        for (l=0;l<n;l=l+1)
        {
           A[k][l]= B[k][l];
           printf("%d\t",A[k][l]);
         }
        printf("\n");
  }
  printf("\n\n\n");
*/

}

system("PAUSE");
return 0;
}

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 16:35

c'est du C+ ?

0456
125
132


j'ai ça:
-4,03200
-24-10,50
132

Posté par
jocelyn
re : Trigonalisation Gauss Matrice 05-12-09 à 17:11

C'est du C, tu as sa avec ton code?

Posté par
esta-fette
re : Trigonalisation Gauss Matrice 05-12-09 à 17:19

oui....


je remets TOUT la SUB... (j'ai branché ça dans un autre programme pour coller des tableaux dans TEX ou dans l'ile ou autre)..



Sub matrice()

        Dim a, n, k, i, l
        n = 0
        a = 1
        n = nblignes
        l = 0
        Dim cc As New tcarre
        Dim w(30, 30)
        For Each cc In folio.GroupBox1.Controls
            w(cc.xcol, cc.y) = Val(cc.Text)
        Next
        Call CreeTableauVide()
        REM initialisation.
        'Dim A(n, n)   REM ligne colonne ? ou le contraire.
        Dim B(n, n) REM matrice de transfert.
        For k = 1 To n   ' jusque n, c'est mieux....
            For l = 1 To n
                B(k, l) = w(k, l)
            Next l
        Next k

        For i = n To 1 Step -1

            REM procédure pour éliminer les zéros de la ligne.
            For k = 1 To i
                If w(k, i) <> 0 Then  ' condition pour qu'on n'ait pas de division par zéro

                    For l = 1 To i - 1 'on veut éliminer w(i,l)
                        a = w(i, l) / w(k, l)
                        B(k, l) = w(k, l) - a * w(i, l)   ' c'est là où on joue sur les lignes ou les colonnes
                    Next l
                End If
            Next k

            REM on reboucle pour remettre B(i,j) dans A(i,j)

            For k = 1 To n   ' jusque n, c'est mieux....
                For l = 1 To n
                    w(k, l) = B(k, l)
                Next l
            Next k


        Next i
        For Each cc In folio.GroupBox1.Controls
            cc.Text = w(cc.xcol, cc.y)
        Next
    End Sub



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !