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 !
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....
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 !
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 ?
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.
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....
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.
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
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
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 ?
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
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.
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
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.
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...
04 | 5 | 10 | 20 | 40 |
2 | 8 | 21 | 52 | 124 |
3 | 8 | 24 | 69 | 190 |
90 | 183 | 374 | 772 | 1613 |
45 | 180 | 543 | 1460 | 3692 |
5 | 55 | 290 | 1123 | 3706 |
-1 | 0 | 0 | 0 | 0 |
-19 | -13 | 0 | 0 | 1,4210854715202E-14 |
-66 | -61 | -45 | 0 | 0 |
-1523 | -1430 | -1239 | -841 | 0 |
45 | 180 | 543 | 1460 | 3692 |
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
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;
}
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 :