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;
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 :