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
Bonjour,
je veux réaliser un programme on langage c qui peut calculer le déterminant d'une matrice entrer par l'utilisateur.j'ai essaye de programmer ce ci on utilisons juste la formule recurente de déterminant mais je pense que cette méthode n'est pas tres pratique.
Est ce que quelqu'un peut m'aider pour trouver une méthode tres pratique et aussi plus vite.
Merci d'avance.

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
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
0
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
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
0
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
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).
0
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
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
0

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
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 ;)
0
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
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.
0
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
T'avais parlé de C...
0
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
oui exactement ca c le principe que j'ai utilise
0
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
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.
0