TheBoussinesqModel  3.2.1
 All Data Structures Files Functions Variables Typedefs Macros Pages
probability.c
Go to the documentation of this file.
1 #include "turtle.h"
2 #include "t_probability.h"
3 #include "t_random.h" /* line added by Emanuele Cordano on 1 September 2009 */
4 #define PI 3.141592654
5 /*From the Numerical Recipes Second Ediction pag.287*/
6 double expdev(long *idum)
7 {
8 float dum;
9 do{
10  dum=ran3(idum);
11 }while(dum==0.0);
12 return -log(dum);
13 }
14 
15 /*From the Numerical Recipes Second Ediction pag.294*/
16 double poisdev(float xm, long *idum)
17 {
18 static float sq,alxm,G,oldm=-(1.0);
19 float em,t,y;
20 
21 if(xm<12.0){
22  if(xm!=oldm){
23  oldm=xm;
24  G=exp(-xm);
25  }
26  em=-1;
27  t=1.0;
28  do{
29  ++em;
30  t*=ran3(idum);
31  }while(t>G);
32 }else{
33  if(xm!=oldm){
34  oldm=xm;
35  sq=sqrt(2.0*xm);
36  alxm=log(xm);
37  G=xm*alxm-gammln(xm+1.0);
38  }
39  do{
40  do{
41  y=tan(PI*ran3(idum));
42  em=sq*y+xm;
43  }while(em<0.0);
44  em=floor(em);
45  t=0.9*(1.0+y*y)*exp(em*alxm-gammln(em+1.0)-G);
46  }while(ran3(idum)>t);
47 }
48 return em;
49 }
50 /*from the Numerical Recepis*/
51 /* RETURNS AS A FLOATING POINT NUMBER AN INTEGER VALUE THAT IS
52 A RANDOM DEVIATE DRAWN FROM A BINOMIAL DISTRIBUTION OF n
53 TRIALS EACH OF PROBABILITY PP - see Numerical Rec. */
54 /*--------------------------------------------------------------*/
55 float bnldev(float pp, int n, long *idum)
56 {
57 
58 long j;
59 long nold=(-1);
60 float am, em,G,angle,p,bnl,sq,t,y;
61 static float pold=(-1.0),pc,plog,pclog,en,oldg;
62 
63 p=(pp<=0.5 ? pp : 1.0-pp);
64 am=n*p;
65 if(n<25){
66  bnl=0.0;
67  for(j=1;j<=n;j++)
68  if(ran3(idum)<p) ++bnl;
69 }else if (am<1.0){
70  G=exp(-am);
71  t=1.0;
72  for(j=0;j<=n;j++){
73  t *=ran3(idum);
74  if(t<G) break;
75  }
76  bnl=(j<=n ? j : n);
77 }else{
78  if(n!=nold){
79  en=n;
80  oldg=gammln(en+1.0);
81  nold=n;
82  }if (p!=pold){
83  pc=1.0-p;
84  plog=log(p);
85  pclog=log(pc);
86  pold=p;
87  }
88  sq=sqrt(2.0*am*pc);
89  do{
90  do{
91  angle=PI*ran3(idum);
92  y=tan(angle);
93  em=sq*y+am;
94  } while(em < 0.0 || em>= (en+1.0));
95  em=floor(em);
96  t=1.2*sq*(1.0+y*y)*exp(oldg-gammln(em+1.0)-gammln(en-em+1.0)+em*plog+(en-em)*pclog);
97  }while(ran3(idum)>t);
98  bnl=em;
99 }
100 if(p!=pp) bnl=n-bnl;
101 return bnl;
102 }
103 /*From the Numerical recepis pag.214:
104  Returns the value ln[gamma(xx)] for x>0*/
105 float gammln(float xx)
106 {
107 double x,y,tmp,ser;
108 static double cof[6]={76.18009172947146,-86.50532032941677,24.01409824083091,-1.231739572450155,
109  0.1208650973866179e-2,-0.5395239384953e-5};
110 long j;
111 y=x=xx;
112 tmp=x+5.5;
113 tmp-=(x+0.5)*log(tmp);
114 ser=1.000000000190015;
115 for(j=0;j<=5;j++)ser+=cof[j]/++y;
116 return -tmp+log(2.5066282746310005*ser/x);
117 }
118 
119 /* ... Double precision variables matrices' mean estimating function
120  V rappresenta i novalues*/
122 {
123 short segna;
124 long i,j,k,NN;
125 double mm=0;
126 NN=m->nrh*m->nch;
127 for(i=1;i<=m->nrh;i++){
128 for(j=1;j<m->nch;j++){
129  segna=0;
130  for(k=1;k<=V->nh;k++){
131  if(m->co[i][j]==V->co[k])segna=1;
132  }
133  if(segna==0)mm+=m->co[i][j];
134 }
135 }
136 mm/=(double)NN;
137 return mm;
138 }
139 
140 /* ... Double precision variables matrices' variance estimating function
141  V rappresenta i novalues*/
143 {
144 short segna;
145 long i,j,k;
146 double mm=0,mn=0,mx;
147 mx=(m->nch*m->nrh);
148 for(i=1;i<=m->nrh;i++){
149 for(j=1;j<=m->nch;j++) {
150  segna=0;
151  for(k=1;k<=V->nh;k++){
152  if(m->co[i][j]==V->co[k])segna=1;
153  }
154  if(segna==0){
155  mn+=m->co[i][j]*m->co[i][j];
156  mm+=m->co[i][j];
157  }
158 }
159 }
160 mm/=mx;
161 return mn/(mx-1)-mx*mm*mm/(mx-1);
162 }