Determinant d'une matrice
Fermé
hajerboug
-
Modifié par irongege le 30/12/2010 à 21:49
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 31 déc. 2010 à 20:15
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 31 déc. 2010 à 20:15
7 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
29 déc. 2010 à 00:46
29 déc. 2010 à 00:46
Dans det_aux, tu as mis : if (i<>1) then au lieu de if (i<>l) then
De plus tu vas jusqu'à N sur j, or tu devrais t'arrêter à l comme pour i.
Je ne sais pas si c'est suffisant, néanmoins quelques conseils supplémentaires :
Utilises result dans les fonctions plutôt que le nom de la fonction.
Exemple : result:=x; au lieu de determinant:=x;
De plus je pense que tu aurais intérêt à faire de det_aux une fonction plutôt qu'une procédure (et la renommer) : function matricePriveDe(m:matrice; l,c:integer):matrice;
Comme ça ton calcul principal est plus clair :
result := result + expo(i)*m[i,1]*determinant( matricePriveDe(m,i,1), l-1);
De plus tu vas jusqu'à N sur j, or tu devrais t'arrêter à l comme pour i.
Je ne sais pas si c'est suffisant, néanmoins quelques conseils supplémentaires :
Utilises result dans les fonctions plutôt que le nom de la fonction.
Exemple : result:=x; au lieu de determinant:=x;
De plus je pense que tu aurais intérêt à faire de det_aux une fonction plutôt qu'une procédure (et la renommer) : function matricePriveDe(m:matrice; l,c:integer):matrice;
Comme ça ton calcul principal est plus clair :
result := result + expo(i)*m[i,1]*determinant( matricePriveDe(m,i,1), l-1);
bonsoir,
J'ai essayé de faire ce que vous m'avez dit mais dommage ça ne marche pas aussi surtout le cas où la taille de la matrice est supérieur à 2!!!!!!
Merci beaucoup pour tes conseils, mais a propos de la fonction pascal d'après ce que je cannais pascal ne peut pas me rendre une matrice, c'est pour cela que j'ai fait une procédure(par contre en C on peut la faire normalement).
Vous ne pouvez pas encore m' aidé car si je n'arrive pas à résoudre le problème du déterminant, toutes les valeurs qui viennent après seront fausses(parce qu'elles ont un rapport avec le déterminant).
merci.
J'ai essayé de faire ce que vous m'avez dit mais dommage ça ne marche pas aussi surtout le cas où la taille de la matrice est supérieur à 2!!!!!!
Merci beaucoup pour tes conseils, mais a propos de la fonction pascal d'après ce que je cannais pascal ne peut pas me rendre une matrice, c'est pour cela que j'ai fait une procédure(par contre en C on peut la faire normalement).
Vous ne pouvez pas encore m' aidé car si je n'arrive pas à résoudre le problème du déterminant, toutes les valeurs qui viennent après seront fausses(parce qu'elles ont un rapport avec le déterminant).
merci.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
29 déc. 2010 à 21:34
29 déc. 2010 à 21:34
Tout dépend comment est fait ton type matrice...
Voici ce que j'ai fais en utilisanr à peu près le même algorithme que toi.
Mais je ne savais pas ce qu'était ton type matrice, alors j'ai fais le mien...
Voici ce que j'ai fais en utilisanr à peu près le même algorithme que toi.
Mais je ne savais pas ce qu'était ton type matrice, alors j'ai fais le mien...
PROGRAM Determinants; const NMAX = 20; type matrice = record tableau : array[1..NMAX,1..NMAX] of real; nbLignes : byte; nbColonnes : byte; end; function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; var l,c:byte; begin result.nbLignes:=m.nbLignes-1; result.nbColonnes:=m.nbColonnes-1; for l:=1 to ligne-1 do begin for c:=1 to colonne-1 do result.tableau[l,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l,c-1]:=m.tableau[l,c]; end; for l:=ligne+1 to m.nbLignes do begin for c:=1 to colonne-1 do result.tableau[l-1,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l-1,c-1]:=m.tableau[l,c]; end; end; procedure afficher(m:matrice); var l,c:byte; begin for l:=1 to m.nbLignes do begin for c:=1 to m.nbColonnes do write(m.tableau[l,c]:0:2,chr(9)); writeln; end; writeln; end; function determinant(m:matrice):real; // calcul sur la première ligne var c:byte; r:real; begin if m.nbLignes=1 then exit(m.tableau[1,1]); result:=0; for c:=1 to m.nbLignes do begin if m.tableau[1,c]=0 then r:=0 else r:=m.tableau[1,c]*determinant(matricePriveDe(m,1,c)); if odd(c) then result:=result-r else result:=result+r; end; end; VAR m:matrice; BEGIN m.nbLignes:=3; m.nbColonnes:=3; m.tableau[1,1]:=4; m.tableau[1,2]:=3; m.tableau[1,3]:=1; // 4 3 1 m.tableau[2,1]:=5; m.tableau[2,2]:=2; m.tableau[2,3]:=7; // 5 2 7 m.tableau[3,1]:=8; m.tableau[3,2]:=0; m.tableau[3,3]:=2; // 8 0 2 afficher(m); writeln(determinant(m):0:3); // 138.000 readln; END.
voici mon type matrice:
const nb_max=10
Type matrice = array [1..nb_max,1..nb_max] of real;
..
..
..
J'ai pas pu utiliser la fonction:
function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; car pascal ne peut pas me rendre une matrice,, vous ne pouvez pas me transformer cette fonction en procédure??
pour que je puisse l'utiliser!!!
j' attend votre réponse.
merci d'avance
const nb_max=10
Type matrice = array [1..nb_max,1..nb_max] of real;
..
..
..
J'ai pas pu utiliser la fonction:
function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; car pascal ne peut pas me rendre une matrice,, vous ne pouvez pas me transformer cette fonction en procédure??
pour que je puisse l'utiliser!!!
j' attend votre réponse.
merci d'avance
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 déc. 2010 à 13:26
30 déc. 2010 à 13:26
Il est possible de mettre ton type matrice en résultat d'une fonction (d'ailleurs je ne connais aucun type qui ne peut pas être passé en retour d'une fonction)
J'ai adapté mon code à ton type matrice ce qui donne :
J'ai adapté mon code à ton type matrice ce qui donne :
PROGRAM Determinants; const nb_max = 10; type matrice = array [1..nb_max,1..nb_max] of real; function matricePriveDe(m:matrice; nbLigne,nbColonne,ligne,colonne:byte):matrice; var l,c:byte; begin for l:=1 to ligne-1 do begin for c:=1 to colonne-1 do result[l,c]:=m[l,c]; for c:=colonne+1 to nbColonne do result[l,c-1]:=m[l,c]; end; for l:=ligne+1 to nbLigne do begin for c:=1 to colonne-1 do result[l-1,c]:=m[l,c]; for c:=colonne+1 to nbColonne do result[l-1,c-1]:=m[l,c]; end; end; procedure afficher(m:matrice; nbLignes,nbColonnes:byte); var l,c:byte; begin for l:=1 to nbLignes do begin for c:=1 to nbColonnes do write(m[l,c]:0:2,chr(9)); writeln; end; writeln; end; function determinant(m:matrice; nbLC:byte):real; // calcul sur la première ligne var c:byte; r:real; begin if nbLC=1 then exit(m[1,1]); result:=0; for c:=1 to nbLC do begin if m[1,c]=0 then r:=0 else r:=m[1,c]*determinant(matricePriveDe(m,nbLC,nbLC,1,c),nbLC-1); if odd(c) then result:=result-r else result:=result+r; end; end; VAR m:matrice; BEGIN m[1,1]:=4; m[1,2]:=3; m[1,3]:=1; // 4 3 1 m[2,1]:=5; m[2,2]:=2; m[2,3]:=7; // 5 2 7 m[3,1]:=8; m[3,2]:=0; m[3,3]:=2; // 8 0 2 afficher(m,3,3); writeln(determinant(m,3):0:3); // 138.000 readln; END.
bonjour,,
Merci beaucoup.
J'ai essayé ce que vous avez fait, j'ai pas dit que ça ne marche pas sans tester.
J'ai fait et j'ai exécuté le programme et voici l'erreur qui s'affiche:
ERROR 34: INVALID FUNCTION RESULT TYPE.
(car en pascal le type MATRICE peut pas être en retour d'une fonction c'est pour cela j'aimerai bien remplacé la fonction: matricePriveDe avec une procédure pour que je puisse exécuté le programme )
J'attend votre reponse et merci.
Merci beaucoup.
J'ai essayé ce que vous avez fait, j'ai pas dit que ça ne marche pas sans tester.
J'ai fait et j'ai exécuté le programme et voici l'erreur qui s'affiche:
ERROR 34: INVALID FUNCTION RESULT TYPE.
(car en pascal le type MATRICE peut pas être en retour d'une fonction c'est pour cela j'aimerai bien remplacé la fonction: matricePriveDe avec une procédure pour que je puisse exécuté le programme )
J'attend votre reponse et merci.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 déc. 2010 à 14:18
30 déc. 2010 à 14:18
En Pascal on peut le faire, j'ai testé le code avec Dev-Pascal et ça marche très bien, c'est juste Turbo Pascal qui fait un petit caprice voilà tout ^^
Alors avec une procédure ça donnerait :
Alors avec une procédure ça donnerait :
procedure matricePriveDe(m:matrice; nbLigne,nbColonne,ligne,colonne:byte; var mpd:matrice); var l,c:byte; begin for l:=1 to ligne-1 do begin for c:=1 to colonne-1 do mpd[l,c]:=m[l,c]; for c:=colonne+1 to nbColonne do mpd[l,c-1]:=m[l,c]; end; for l:=ligne+1 to nbLigne do begin for c:=1 to colonne-1 do mpd[l-1,c]:=m[l,c]; for c:=colonne+1 to nbColonne do mpd[l-1,c-1]:=m[l,c]; end; end; function determinant(m:matrice; nbLC:byte):real; // calcul sur la première ligne var c:byte; r:real; var mpd:matrice; begin //... else begin matricePriveDe(m,nbLC,nbLC,1,c,mpd); r:=m[1,c]*determinant(mpd,nbLC-1); end; //... end;
bonsoir,merci d'abord pour la réponse je vais essayer avec DEVpascal.
j'ai fait le même programme avec delphi7 pour la simulation des réseaux ouverts de filles d'attentes,pour calculer les arrivées (lambda=A(I-M)puissance (-1))
(tel que:A(vecteur),I:matrice identité et M:matrice de routage).
Je suis obligé de faire des opération sur les matrices:
1:différence entre les 2 matrices(I-P)
2:l'inverse du résultat(inverse(I-P))
3:produit de A * le résultat(A*inverse(I-P))
4:le résultat final du produit c'est lambda.
Mais le problème c'est que les valeurs que j'ai obtenues (qui sont affichées lorsque j'exécute le programme)sont fausses par rapport aux celles que j'ai calculées manuellement.
j'ai vérifié les étapes pas à pas mais je n'arrive pas à connaitre où il y a l'erreur.
Voici le code que j'ai réalisé si vous pouvez m'aidé à trouver l'erreur pour que lambda soit correcte.
Merci j'attend votre réponse.
j'ai fait le même programme avec delphi7 pour la simulation des réseaux ouverts de filles d'attentes,pour calculer les arrivées (lambda=A(I-M)puissance (-1))
(tel que:A(vecteur),I:matrice identité et M:matrice de routage).
Je suis obligé de faire des opération sur les matrices:
1:différence entre les 2 matrices(I-P)
2:l'inverse du résultat(inverse(I-P))
3:produit de A * le résultat(A*inverse(I-P))
4:le résultat final du produit c'est lambda.
Mais le problème c'est que les valeurs que j'ai obtenues (qui sont affichées lorsque j'exécute le programme)sont fausses par rapport aux celles que j'ai calculées manuellement.
j'ai vérifié les étapes pas à pas mais je n'arrive pas à connaitre où il y a l'erreur.
Voici le code que j'ai réalisé si vous pouvez m'aidé à trouver l'erreur pour que lambda soit correcte.
const NMAX = 20; type tab=array[1..nmax]of real; type matrice = record tableau : array[1..NMAX,1..NMAX] of real; nbLignes : byte; nbColonnes : byte; end; les opérations: function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; var l,c:byte; begin result.nbLignes:=m.nbLignes-1; result.nbColonnes:=m.nbColonnes-1; for l:=1 to ligne-1 do begin for c:=1 to colonne-1 do result.tableau[l,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l,c-1]:=m.tableau[l,c]; end; for l:=ligne+1 to m.nbLignes do begin for c:=1 to colonne-1 do result.tableau[l-1,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l-1,c-1]:=m.tableau[l,c]; end; end; function determinant(m:matrice):real; // calcul sur la première ligne var c:byte; r:real; begin if m.nbLignes=1 then begin result:=m.tableau[1,1]; exit; end; result:=0; for c:=1 to m.nbLignes do begin if m.tableau[1,c]=0 then r:=0 else r:=m.tableau[1,c]*determinant(matricePriveDe(m,1,c)); if not odd(c) then result:=result-r else result:=result+r; end; end; function expo(n:integer):integer; begin if (n mod 2=0) then expo:=1 else expo:=-1 ; end; procedure coffacteur(ma:matrice;var mb:matrice;l:integer); var i,j : integer; var m2:matrice; begin if l=1 then begin mb.tableau[1,1]:=1; end else begin for i:=1 to l do begin for j:=1to l do begin m2:=matricePriveDe(m,i,j); mb.tableau[i,j]:=expo(i+j)*determinant(m2); end; end; end; end; procedure transp_mat(ma:matrice;var mb:matrice); var i,j:integer; begin for i:=1 to N do begin for j:=1 to N do begin mb.tableau[j,i]:=ma.tableau[i,j]; end; end; end; procedure multi_R(a:real;ma:matrice; var mb:matrice); var i,j:integer; begin for i:=1 to N do begin for j:=1 to N do begin mb.tableau[i,j]:=ma.tableau[i,j]*a; end; end; end; procedure inverse(ma:matrice;var mb:matrice;l:integer); var m1,m2:matrice; d:real; begin if determinant(ma)<> 0 then begin d:=(1/determinant(ma)); writeln ('1/d = ',d); coffacteur(ma,m1,l); transp_mat(m1,m2); multi_R(d,m2,mb); end; end; procedure produimat (t:tab; M:matrice;N:integer; var r:tab); var i,j,k:integer; begin for i:=1 to N do begin r[i]:=0; for j:=1 to N do r[i]:=r[i]+t[j]*M.tableau[j,i]; end; end; procedure init_identite (var m:matrice;n:integer); var i,j:integer; begin for i:=1 to n do for j:=1 to n do if i=j then m.tableau[i,j]:=1 else m.tableau[i,j]:=0; end; procedure difmat(m1,m2:matrice;var m3:matrice); var i,j: integer; begin for i:=1 to N do for j:=1 to N do m3.tableau[i,j]:=m1.tableau[i,j]-m2.tableau[i,j]; end; procedure calcullambda (t:tab; M:matrice); var i:integer; I_P:matrice; begin init_identite(mat_I,n); difmat(mat_I,M,I_P); I_P.nbLignes:=m.nbLignes; I_P.nbColonnes:=m.nbColonnes; mat_inv.nbLignes:=m.nbLignes; mat_inv.nbColonnes:=m.nbColonnes; inverse(I_P,mat_inv,N); produimat (t,mat_inv,N,lambda); affichlambda (lambda,N); end;
Merci j'attend votre réponse.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 30/12/2010 à 23:37
Modifié par KX le 30/12/2010 à 23:37
Si A est un vecteur colonne, la multiplication A*B impose que B soit un vecteur ligne, or (I-P)^(-1) est une matrice carrée ce qui pose un "petit" problème.
Par contre, on pourrait avoir (I-P)^-1*A ce qui donnerait toujours une "division" par (I-P) mais dans ce cas lambda serait un vecteur colonne... est-ce ce que l'on doit obtenir ?
Par contre, on pourrait avoir (I-P)^-1*A ce qui donnerait toujours une "division" par (I-P) mais dans ce cas lambda serait un vecteur colonne... est-ce ce que l'on doit obtenir ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 déc. 2010 à 22:04
30 déc. 2010 à 22:04
Je regarderais plus un détail le reste du code demain si ça ne résout pas ton problème, mais tu as modifié mon code de façon erronée :
Tu as écrit :
Alors que moi j'avait écrit :
Tu as écrit :
if not odd(c) then result:=result-r else result:=result+r;
Alors que moi j'avait écrit :
if odd(c) then result:=result-r else result:=result+r;
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 déc. 2010 à 22:40
30 déc. 2010 à 22:40
Autant pour moi, je me suis fait avoir par mon exemple (j'obtient +138.0 avec ou sans le not)
Effectivement c'est logique, on a un + quand c est impair (car 1 est impair), et - sinon.
Dans ce cas il est plus propre d'écrire :
Je vais chercher le problème avec le reste du code, je te dirais ça demain.
Effectivement c'est logique, on a un + quand c est impair (car 1 est impair), et - sinon.
Dans ce cas il est plus propre d'écrire :
if odd(c) then result:=result+r else result:=result-r;
Je vais chercher le problème avec le reste du code, je te dirais ça demain.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 31/12/2010 à 16:11
Modifié par KX le 31/12/2010 à 16:11
Je n'ai pas repris ton code car je trouve que tu fais beaucoup plus de fonctions que tu n'en as besoin !
J'ai donc repris tes 4 points et fais une fonction pour chacun des ces 4 points.
Faire des fonctions intermédiaires n'est pas utile ici puisque tes 3 premiers points définissent déjà les fonctions intermédiaires de la quatrième.
De plus, pour être cohérent, j'ai modifié ton type tab en un type vecteur qui contient la taille réelle de celui-ci (comme le type matrice). Ça évite d'avoir à se promener avec des paramètres de tailles dans les fonctions alors qu'ils sont inhérents non pas au calcul mais aux données !
Remarque : je n'ai pas effectué de tests, je te laisse le soin de regarder ce que ça donne...
La confiance n'exclut pas le contrôle
J'ai donc repris tes 4 points et fais une fonction pour chacun des ces 4 points.
Faire des fonctions intermédiaires n'est pas utile ici puisque tes 3 premiers points définissent déjà les fonctions intermédiaires de la quatrième.
De plus, pour être cohérent, j'ai modifié ton type tab en un type vecteur qui contient la taille réelle de celui-ci (comme le type matrice). Ça évite d'avoir à se promener avec des paramètres de tailles dans les fonctions alors qu'ils sont inhérents non pas au calcul mais aux données !
Remarque : je n'ai pas effectué de tests, je te laisse le soin de regarder ce que ça donne...
PROGRAM Determinants; //--------------------------------------------- const NMAX = 20; type vecteur = record tableau : array[1..NMAX] of real; nbLignes : byte; end; type matrice = record tableau : array[1..NMAX,1..NMAX] of real; nbLignes : byte; nbColonnes : byte; end; //--------------------------------------------- function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; var l,c:byte; begin result.nbLignes:=m.nbLignes-1; result.nbColonnes:=m.nbColonnes-1; for l:=1 to ligne-1 do begin for c:=1 to colonne-1 do result.tableau[l,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l,c-1]:=m.tableau[l,c]; end; for l:=ligne+1 to m.nbLignes do begin for c:=1 to colonne-1 do result.tableau[l-1,c]:=m.tableau[l,c]; for c:=colonne+1 to m.nbColonnes do result.tableau[l-1,c-1]:=m.tableau[l,c]; end; end; //--------------------------------------------- function determinant(m:matrice):real; var c:byte; r:real; begin if m.nbLignes=1 then begin result:=m.tableau[1,1]; exit; end; result:=0; for c:=1 to m.nbLignes do begin if m.tableau[1,c]=0 then r:=0 else r:=m.tableau[1,c]*determinant(matricePriveDe(m,1,c)); if odd(c) then result:=result+r else result:=result-r; end; end; //--------------------------------------------- function difference(m:matrice):matrice; // calcul de (I-M) var l,c:byte; begin result.nbLignes:=m.nbLignes; result.nbColonnes:=m.nbColonnes; for l:=1 to m.nbLignes do for c:=1 to m.nbColonnes do if l=c then result.tableau[l,c]:=1-m.tableau[l,c] else result.tableau[l,c]:=-m.tableau[l,c]; end; //--------------------------------------------- function inverse(m:matrice):matrice; // méthode des cofacteurs var l,c:byte; r,d:real; begin d:=determinant(m); if d=0 then begin writeln('matrice non inversible'); halt; end; result.nbLignes:=m.nbColonnes; result.nbColonnes:=m.nbLignes; for l:=1 to m.nbLignes do for c:=1 to m.nbColonnes do begin r:=determinant(matricePriveDe(m,l,c)); // cofacteur if odd(l+c) then result.tableau[c,l]:=-r/d // on transpose directement else result.tableau[c,l]:= r/d; // sans oublier la division end; end; //--------------------------------------------- function multiplier(m:matrice;v:vecteur):vecteur; // m*v var l,c:byte; r:real; begin if m.nbColonnes<>v.nbLignes then begin writeln('multiplication incompatible'); halt; end; result.nbLignes:=v.nbLignes; for l:=1 to m.nbLignes do begin r:=0; for c:=1 to m.nbColonnes do r:=r+m.tableau[l,c]*v.tableau[c]; result.tableau[l]:=r; end; end; //--------------------------------------------- function lambda(m:matrice;v:vecteur):vecteur; begin result:=multiplier(inverse(difference(m)),v); end; //--------------------------------------------- BEGIN END.
La confiance n'exclut pas le contrôle
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
31 déc. 2010 à 15:10
31 déc. 2010 à 15:10
Ce n'est pas un programme en soit, il manque la première ligne program nomDuProgramme;
Je n'ai pas mis le code des fonctions matricePriveDe et determinant, et je n'ai pas mis le begin end.
Je n'ai pas mis le code des fonctions matricePriveDe et determinant, et je n'ai pas mis le begin end.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
31 déc. 2010 à 16:08
31 déc. 2010 à 16:08
En mettant les deux fonctions matricePriveDe et Determinant, as-tu pensé à enlever les deux lignes suivantes :
Je n'ai pas Delphi pour tester, mais pour l'avoir utilisé il y a quelques années je ne pense pas que ça vienne d'un bug de Delphi (contrairement à TP7) donc comme ça marche chez moi sur Dev-Pascal, ça doit marcher chez toi sur Delphi ^^
function matricePriveDe(m:matrice; ligne,colonne:byte):matrice; function determinant(m:matrice):real;
Je n'ai pas Delphi pour tester, mais pour l'avoir utilisé il y a quelques années je ne pense pas que ça vienne d'un bug de Delphi (contrairement à TP7) donc comme ça marche chez moi sur Dev-Pascal, ça doit marcher chez toi sur Delphi ^^
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
31 déc. 2010 à 16:12
31 déc. 2010 à 16:12
J'ai modifié mon post de cette nuit, il contient tout le code maintenant...
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
31 déc. 2010 à 18:41
31 déc. 2010 à 18:41
Resource file icon file not found : tu as surement dû vouloir faire un nouveau projet ou je ne sais pas trop quoi dont je ne me sers jamais...
Si tu fais un "New Source File (Ctrl+U)" et que tu colles exactement ce que j'ai mis dans Dev-Pascal et que tu enregistres ça dans un fichier .pas, ça marche (c'est ce que je fais)
Il est possible qu'il ne t'affiche que des 0.00 car les valeurs sont trop petites.
En effet ma fonction d'affichage (que je n'avais pas remise d'ailleurs) tronquait les valeurs à 2 chiffres après la virgule, donc 0.002 est tronquée en 0.00
De mon côté j'ai fait quelques tests, et je trouve à la main les même résultats que le programme pour déterminant, différence, inverse, et multiplier (je n'ai pas fait lambda mais ça se déduit des précédents)
Si tu fais un "New Source File (Ctrl+U)" et que tu colles exactement ce que j'ai mis dans Dev-Pascal et que tu enregistres ça dans un fichier .pas, ça marche (c'est ce que je fais)
Il est possible qu'il ne t'affiche que des 0.00 car les valeurs sont trop petites.
En effet ma fonction d'affichage (que je n'avais pas remise d'ailleurs) tronquait les valeurs à 2 chiffres après la virgule, donc 0.002 est tronquée en 0.00
De mon côté j'ai fait quelques tests, et je trouve à la main les même résultats que le programme pour déterminant, différence, inverse, et multiplier (je n'ai pas fait lambda mais ça se déduit des précédents)
//--------------------------------------------- const NCAV = 4; // nombre de chiffres après la virgule procedure afficher(m:matrice); var l,c:byte; begin for l:=1 to m.nbLignes do begin for c:=1 to m.nbColonnes do write(m.tableau[l,c]:0:NCAV,chr(9)); writeln; end; writeln; end; procedure afficher(v:vecteur); var l:byte; begin for l:=1 to v.nbLignes do writeln(v.tableau[l]:0:NCAV); writeln; end; var m:matrice; v:vecteur; BEGIN m.nbLignes:=3; m.nbColonnes:=3; m.tableau[1,1]:=6; m.tableau[1,2]:=2; m.tableau[1,3]:=5; m.tableau[2,1]:=7; m.tableau[2,2]:=1; m.tableau[2,3]:=0; m.tableau[3,1]:=4; m.tableau[3,2]:=8; m.tableau[3,3]:=3; afficher(m); // OK v.nbLignes:=3; v.tableau[1]:=5; v.tableau[2]:=2; v.tableau[3]:=4; afficher(v); // OK writeln(determinant(m):0:NCAV,chr(10)); // 236 : OK afficher(difference(m)); // [-5 -2 -5 -7 0 0 -4 -5 -2] : OK afficher(inverse(m)); // [3 34 -5 -21 -2 35 52 -40 -8]/236 : OK afficher(multiplier(m,v)); // [54 37 48] : OK afficher(lambda(m,v)); // [-0.2857 -0.1984 -0.63] readln; END.
hajerboug
Messages postés
7
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
19 mai 2016
31 déc. 2010 à 20:14
31 déc. 2010 à 20:14
Est ce que je peux vous envoyer mon code source sous une forme confidentielle(par exemple votre mail, si cela ne vous dérange pas ), car j'ai pas envie qu'il soit copié si je le mets sur le forum en totalité. Car je n'arrive pas à me débarrasser des messages d'erreurs.
Je m'excuse d'abuser de votre gentillesse.
Merci
Je m'excuse d'abuser de votre gentillesse.
Merci
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 31/12/2010 à 20:15
Modifié par KX le 31/12/2010 à 20:15
Par Message Privé comme tout à l'heure, personne n'y a accès à part moi...
Mais utilises les balises de code (à côté de gras, italique et souligné)
Mais utilises les balises de code (à côté de gras, italique et souligné)