Inscription / Connexion Nouveau Sujet
Niveau logiciels
Partager :

opérations sur les matrices

Posté par
hajerboug
30-12-10 à 22:06

bonsoir,
j'essaie de faire un 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;

Posté par
hajerboug
operations sur les matrices 30-12-10 à 22:09

bonsoir,
j'essaie de faire un 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;

*** message déplacé ***
* Océane > le multi-post n'est pas toléré sur le forum ! *



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

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 !