xinxang | Si tu parles du mien vivi ça marche très bien (testé, approuvé, démontré )
Ca vient d'un de mes projet de DESS ingé maths sur la simulation de tirage de variables aléatoires suivant plein de lois.
Pour ceux que ça intéresse voilà ttes les lois que j'avais implantées :
Code :
- uses math;
- type tableau=array of double;
- ........
- procedure uniform(var x:tableau;taille:integer;a:double=0;b:double=1);
- var i:integer;
- begin
- for i:= 0 to taille-1 do x[i]:=(b-a)*random+a;
- end;
- procedure binomiale(var x:tableau;taille:integer;n:integer=10;p:double=0.5);
- var i,j:integer;
- begin
- for i:=0 to taille-1 do
- begin x[i]:=0;
- for j:=1 to n do
- if random<p then x[i]:=x[i]+1;
- end;
- end;
- procedure exponentielle(var x:tableau;taille:integer;lambda:double=1);
- var i:integer;
- u:double;
- begin
- for i:=0 to taille-1 do
- begin u:=random;
- x[i]:=-ln(u)/lambda;
- end;
- end;
- procedure ppoisson(var x:tableau;taille:integer;lambda:double=1);
- var i:integer;
- a,u:double;
- begin
- a:=exp(-lambda);
- for i:=0 to taille-1 do
- begin x[i]:=0;
- u:=random;
- while u>a do
- begin u:=u*random;
- x[i]:=x[i]+1;
- end;
- end;
- end;
- procedure geometrique(var x:tableau;taille:integer;p:double=0.5);
- var i:integer;
- u:double;
- begin
- for i:=0 to taille-1 do
- begin x[i]:=0;
- repeat u:=random;
- x[i]:=x[i]+1;
- until u<=p;
- end;
- end;
- procedure normale(var x:tableau;taille:integer;m:double=0;s:double=1);
- var i:integer;
- u,v:double;
- begin
- for i:=0 to taille-1 do
- begin u:=random;
- v:=random;
- x[i]:=sqrt(-2*ln(u))*cos(2*Pi*v);
- x[i]:=s*x[i]+m;
- end;
- end;
- procedure chi2(var x:tableau;taille:integer;n:integer=5);
- var u:tableau;
- i,j:integer;
- begin
- setlength(u,n);
- for i:=0 to taille-1 do
- begin x[i]:=0;
- normale(u,n);
- for j:=0 to n-1 do x[i]:=x[i]+sqr(u[j]);
- end;
- end;
- procedure student(var x:tableau;taille:integer;n:integer=5);
- var i,j:integer;
- u:tableau;
- temp:double;
- begin
- setlength(u,n+1);
- for i:=0 to taille-1 do
- begin temp:=0;
- normale(u,n+1);
- for j:=0 to n-1 do temp:=temp+sqr(u[j]);
- x[i]:=u[n]/sqrt(temp);
- end;
- end;
- procedure fischer(var x:tableau;taille:integer;n1:integer=5;n2:integer=10);
- var i,j:integer;
- u,v:tableau;
- tmp1,tmp2:double;
- begin
- setlength(u,n1);
- setlength(v,n2);
- for i:=0 to taille-1 do
- begin normale(u,n1);
- normale(v,n2);
- tmp1:=0;tmp2:=0;
- for j:=0 to n1-1 do tmp1:=tmp1+sqr(u[j]);
- for j:=0 to n2-1 do tmp2:=tmp2+sqr(v[j]);
- x[i]:=(n2/n1)*(tmp1/tmp2);
- end;
- end;
- procedure DeNFaces(var x:tableau;taille:integer;n:integer=6);
- var i:integer;
- begin
- for i:=0 to taille-1 do
- x[i]:=random(n)+1;
- end;
- procedure cauchy(var x:tableau;taille:integer;a:double=1);
- var i:integer;
- begin
- for i:=0 to taille-1 do
- x[i]:=a*tan(Pi*(random-0.5));
- end;
- procedure LogNormale(var x:tableau;taille:integer;m:double=0;s:double=1);
- var i:integer;
- begin
- normale(x,taille,m,s);
- for i:=0 to taille-1 do
- x[i]:=exp(x[i]);
- end;
- procedure pareto(var x:tableau;taille:integer;r:double=2;lambda:double=1);
- var i:integer;
- begin
- exponentielle(x,taille,lambda);
- for i:=0 to taille-1 do
- x[i]:=r*exp(x[i]);
- end;
- procedure weibull(var x:tableau;taille:integer;a:double=2;lambda:double=1);
- var i:integer;
- begin
- exponentielle(x,taille,lambda);
- for i:=0 to taille-1 do
- x[i]:=exp(1/a*ln(x[i]));
- end;
|
Message édité par xinxang le 04-11-2003 à 12:42:20
|