Calcule determinant
Fermé
bakarim
Messages postés
32
Date d'inscription
samedi 23 août 2008
Statut
Membre
Dernière intervention
15 juillet 2009
-
22 févr. 2009 à 19:27
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 févr. 2009 à 21:44
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 févr. 2009 à 21:44
A voir également:
- Calcule determinant
- Comment on calcule une moyenne - Guide
- Calcule alimentation pc - Guide
- Calcule grossesse - Télécharger - Vie quotidienne
- Access champ calculé conditionnel - Forum Logiciels
- Excel champ calculé avec condition ✓ - Forum Excel
9 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 févr. 2009 à 19:45
22 févr. 2009 à 19:45
Salut,
Si tu ne la trouves pas pratique, tu peux également utiliser la formule de Leibniz.
https://fr.wikipedia.org/wiki/Formule_de_Leibniz#D.C3.A9terminant_d.27une_matrice_carr.C3.A9e
Il faudra que tu codes une fonction qui te donne toutes les permutations possibles.
Cdlt
Si tu ne la trouves pas pratique, tu peux également utiliser la formule de Leibniz.
https://fr.wikipedia.org/wiki/Formule_de_Leibniz#D.C3.A9terminant_d.27une_matrice_carr.C3.A9e
Il faudra que tu codes une fonction qui te donne toutes les permutations possibles.
Cdlt
bakarim
Messages postés
32
Date d'inscription
samedi 23 août 2008
Statut
Membre
Dernière intervention
15 juillet 2009
3
22 févr. 2009 à 20:02
22 févr. 2009 à 20:02
Mais la programmation d'une fonction qui return tout les permutation possible peut des quand dépasse l'ordre 5 provoquer un plantage de système.et c'est ca le problème que j'ai trouve avec la premier méthode
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 févr. 2009 à 20:10
22 févr. 2009 à 20:10
C'est plutôt que tu as dû faire une erreur dans ton code. Car si tu ne peux pas dépasser l'ordre 5, ça se saurait depuis longtemps ^^.
Et puis, tu peux ruser. Tu peux mettre un argument supplémentaire qui te retourne la ième combinaison. Cela prendra moins de place mémoire mais sera moins rapide (compromis temps/mémoire).
Et puis, tu peux ruser. Tu peux mettre un argument supplémentaire qui te retourne la ième combinaison. Cela prendra moins de place mémoire mais sera moins rapide (compromis temps/mémoire).
bakarim
Messages postés
32
Date d'inscription
samedi 23 août 2008
Statut
Membre
Dernière intervention
15 juillet 2009
3
22 févr. 2009 à 20:29
22 févr. 2009 à 20:29
Non M j'ai pas fait aucun erreur mais le problème comme vous avez dit le programme et tres lente des quand dépasse la taille 5 et par fois s'obtient un plantage de systeme
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 févr. 2009 à 21:03
22 févr. 2009 à 21:03
Tout dépend ce que t'appelles long, mais je continue de penser que l'algorithme que t'as implémenté ne doit pas être bon. Si tu veux, tu peux le poster ici, et on verra ce qu'on peut faire ;)
bakarim
Messages postés
32
Date d'inscription
samedi 23 août 2008
Statut
Membre
Dernière intervention
15 juillet 2009
3
23 févr. 2009 à 12:19
23 févr. 2009 à 12:19
voila l'algorithme que j'ai utilise mais vraiment il est tres lente des quand dépasse un certain ordre:program determinant;
uses crt;
var n, i, j: integer;
mat : array[0..20,0..20] of real;
procedure remplire;
begin
writeln('entrez les elements du matrice');
for i := 0 to n-1 do for j := 0 to n-1 do read(mat[i, j]);
end;
procedure subst(p:integer);
var t:integer;
mat0 : array[0..20, 0..20] of real;
begin
t := -1;
for i := p+1 to n-1 do
begin
if mat[i,p] <> 0 then
begin
for j := 0 to n-1 do
begin
mat0[p,j] := mat[i,j];
mat0[i,j] := mat[p,j];
end;
t := i;
i := n + 1;
end;
end;
if t <> -1 then
begin
for i := 0 to n-1 do
begin
for j := 0 to n-1 do if (i <> p)and(i <> t) then mat0[i,j] := mat[i,j];
end;
for i := 0 to n-1 do for j := 0 to n-1 do mat[i,j] := mat0[i,j];
end;
end;
function det(e :integer) : real;
begin
det := 1;
for i := 0 to n-1 do det := det * mat[i,i];
if (e mod 2 = 1) then det := det * (-1);
end;
var t, k, e : integer;
cont : boolean;
begin
writeln(' calcule du determinant ');
writeln('entrez l''ordre du matrice dont le determinant est a calculer: ');
readln(n);
remplire();
t := 0;
k := 1;
e := 0;
cont := true;
while (k < n)and(cont)do
begin
if mat[t,t] = 0 then
begin
subst(t);
inc(e);
end;
if mat[t,t] = 0 then
begin
writeln('le determinant de cette matrice est: 00');
cont := false;
end
else
begin
for j := n-1 downto t do mat[k, j] := mat[k,j] - ((mat[k, t]*mat[t, j])/mat[t, t]);
inc(k);
if (k = n)and(t < n - 1) then
begin
inc(t);
k := t + 1;
end;
end;
end;
if cont then
writeln('le determinant de cette matrice est: ', det(e):5:3);
readln;
readln;
readln;
end.
uses crt;
var n, i, j: integer;
mat : array[0..20,0..20] of real;
procedure remplire;
begin
writeln('entrez les elements du matrice');
for i := 0 to n-1 do for j := 0 to n-1 do read(mat[i, j]);
end;
procedure subst(p:integer);
var t:integer;
mat0 : array[0..20, 0..20] of real;
begin
t := -1;
for i := p+1 to n-1 do
begin
if mat[i,p] <> 0 then
begin
for j := 0 to n-1 do
begin
mat0[p,j] := mat[i,j];
mat0[i,j] := mat[p,j];
end;
t := i;
i := n + 1;
end;
end;
if t <> -1 then
begin
for i := 0 to n-1 do
begin
for j := 0 to n-1 do if (i <> p)and(i <> t) then mat0[i,j] := mat[i,j];
end;
for i := 0 to n-1 do for j := 0 to n-1 do mat[i,j] := mat0[i,j];
end;
end;
function det(e :integer) : real;
begin
det := 1;
for i := 0 to n-1 do det := det * mat[i,i];
if (e mod 2 = 1) then det := det * (-1);
end;
var t, k, e : integer;
cont : boolean;
begin
writeln(' calcule du determinant ');
writeln('entrez l''ordre du matrice dont le determinant est a calculer: ');
readln(n);
remplire();
t := 0;
k := 1;
e := 0;
cont := true;
while (k < n)and(cont)do
begin
if mat[t,t] = 0 then
begin
subst(t);
inc(e);
end;
if mat[t,t] = 0 then
begin
writeln('le determinant de cette matrice est: 00');
cont := false;
end
else
begin
for j := n-1 downto t do mat[k, j] := mat[k,j] - ((mat[k, t]*mat[t, j])/mat[t, t]);
inc(k);
if (k = n)and(t < n - 1) then
begin
inc(t);
k := t + 1;
end;
end;
end;
if cont then
writeln('le determinant de cette matrice est: ', det(e):5:3);
readln;
readln;
readln;
end.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
23 févr. 2009 à 21:29
23 févr. 2009 à 21:29
T'avais parlé de C...
bakarim
Messages postés
32
Date d'inscription
samedi 23 août 2008
Statut
Membre
Dernière intervention
15 juillet 2009
3
23 févr. 2009 à 21:34
23 févr. 2009 à 21:34
oui exactement ca c le principe que j'ai utilise
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
23 févr. 2009 à 21:44
23 févr. 2009 à 21:44
Sauf que ça aurait été mieux de voir le code C.
On pourrait non seulement voir l'algorithme mais en plus son implémentation en C ;)
Pour ma part, le pascal ce n'est pas ma tasse de thé. Et la prochaine fois que tu postes un code, n'oublie pas d'utiliser les balises "codes" (à droite du bouton souligné) pour garder l'indentation, sinon c'est illisible.
On pourrait non seulement voir l'algorithme mais en plus son implémentation en C ;)
Pour ma part, le pascal ce n'est pas ma tasse de thé. Et la prochaine fois que tu postes un code, n'oublie pas d'utiliser les balises "codes" (à droite du bouton souligné) pour garder l'indentation, sinon c'est illisible.