malt-wr
yield.c File Reference
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
Include dependency graph for yield.c:

Go to the source code of this file.

Macros

#define DEBUG   0
 
#define FUNC(x)   ((*func)(x))
 
#define EPS   1.0e-6
 
#define JMAX   20
 
#define IM   714025
 
#define IA   4096
 
#define IC   54773
 
#define SHUFFLE_LENGTH   98
 

Functions

static double trapzd (double(*func)(double), double a, double b, int n)
 
static double qsimp (double(*func)(double), double a, double b)
 
double normal (double x)
 
static double multinormal (double x)
 
static int factorial (int n)
 
static int double_factorial (int n)
 
static long int power2 (int n)
 
static double multicoeff (int n)
 
double area (double leftmargin, double rightmargin)
 
double multiarea (double r, int dim)
 
double uniform_deviate (long *idum)
 
static double gauss_deviate (long *idum)
 

Variables

static dimensions
 

Macro Definition Documentation

#define DEBUG   0

Definition at line 5 of file yield.c.

#define EPS   1.0e-6

Definition at line 33 of file yield.c.

#define FUNC (   x)    ((*func)(x))

Definition at line 9 of file yield.c.

#define IA   4096

Definition at line 144 of file yield.c.

#define IC   54773

Definition at line 145 of file yield.c.

#define IM   714025

Definition at line 143 of file yield.c.

#define JMAX   20

Definition at line 34 of file yield.c.

#define SHUFFLE_LENGTH   98

Definition at line 147 of file yield.c.

Function Documentation

double area ( double  leftmargin,
double  rightmargin 
)

Definition at line 123 of file yield.c.

124 {
125  return qsimp(normal, 0, leftmargin) + qsimp(normal, 0, rightmargin);
126 }
static double qsimp(double(*func)(double), double a, double b)
Definition: yield.c:36
double normal(double x)
Definition: yield.c:56
static int double_factorial ( int  n)
static

Definition at line 91 of file yield.c.

92 {
93  if(n<=1)
94  return 1;
95  else
96  return n*factorial(n-2);
97 }
static int factorial(int n)
Definition: yield.c:83
static int factorial ( int  n)
static

Definition at line 83 of file yield.c.

84 {
85  if(n<=1)
86  return 1;
87  else
88  return n*factorial(n-1);
89 }
static int factorial(int n)
Definition: yield.c:83
static double gauss_deviate ( long *  idum)
static

Definition at line 190 of file yield.c.

195 {
196  static int iset=0;
197  static double gset;
198 
199  double fac, r, v1, v2;
200 
201  if(iset == 0) {
202  do {
203  /* pick two uniform numbers in the square extending
204  from -1.0 to +1.0 in each direction */
205  v1 = 2.0*uniform_deviate(idum) - 1.0;
206  v2 = 2.0*uniform_deviate(idum) - 1.0;
207  r = v1*v1 + v2*v2;
208  } while(r>=1.0);
209 
210  /* Now make the Box-Muller transformation to get two
211  normal deviates. Return one and save the other for
212  next time */
213  fac = sqrt(-2.0*log(r)/r);
214 
215  gset = v1*fac;
216  iset = 1;
217  return v2*fac;
218  }
219  else {
220  iset = 0;
221  return gset;
222  }
223 
224 }
double uniform_deviate(long *idum)
Definition: yield.c:150
double multiarea ( double  r,
int  dim 
)

Definition at line 129 of file yield.c.

130 {
131  double coeff, integral;
132 
133  dimensions = dim;
134  integral=qsimp(multinormal, 0, r);
135  coeff = multicoeff(dim);
136 
137  return integral*coeff;
138 }
static double multinormal(double x)
Definition: yield.c:68
static dimensions
Definition: yield.c:66
static double multicoeff(int n)
Definition: yield.c:109
int dim
Definition: points.c:11
static double qsimp(double(*func)(double), double a, double b)
Definition: yield.c:36
static double multicoeff ( int  n)
static

Definition at line 109 of file yield.c.

110 {
111  int s, odd;
112 
113  s=(n-1)/2;
114  odd=(n-1)%2;
115 
116  if(odd)
117  return 1.0/(power2(s)*factorial(s));
118  else
119  return sqrt(2/M_PI)/double_factorial(2*s-1);
120 }
static int factorial(int n)
Definition: yield.c:83
static int double_factorial(int n)
Definition: yield.c:91
static long int power2(int n)
Definition: yield.c:99
static double multinormal ( double  x)
static

Definition at line 68 of file yield.c.

69 {
70  int i;
71  double mx, y;
72 
73  y=-x*x/2;
74  mx=1.0;
75  for(i=0;i<dimensions-1; i++)
76  mx*=x;
77  y=mx*exp(y);
78 
79  return y;
80 }
static dimensions
Definition: yield.c:66
double normal ( double  x)

Definition at line 56 of file yield.c.

57 {
58  double y;
59 
60  y=-x*x/2;
61  y=exp(y)/sqrt(2*M_PI);
62  return (double) y;
63 }
static long int power2 ( int  n)
static

Definition at line 99 of file yield.c.

100 {
101  long int ny=1;
102 
103  while(n--)
104  ny*=2;
105 
106  return ny;
107 }
static double qsimp ( double(*)(double)  func,
double  a,
double  b 
)
static

Definition at line 36 of file yield.c.

37 {
38  int j;
39  double s,st,ost,os;
40 
41  ost = os = -1.0e30;
42  for (j=1;j<=JMAX;j++) {
43  st=trapzd(func,a,b,j);
44  s=(4.0*st-ost)/3.0;
45  if (fabs(s-os) < EPS*fabs(os)) return s;
46  os=s;
47  ost=st;
48  }
49  nrerror("Too many steps in routine QSIMP");
50 }
#define JMAX
Definition: yield.c:34
void nrerror(char *error_text)
Definition: lineread.c:7
static double trapzd(double(*func)(double), double a, double b, int n)
Definition: yield.c:11
#define EPS
Definition: yield.c:33
static double trapzd ( double(*)(double)  func,
double  a,
double  b,
int  n 
)
static

Definition at line 11 of file yield.c.

12 {
13  double x,tnm,sum,del;
14  static double s;
15  static int it;
16  int j;
17 
18  if (n == 1) {
19  it=1;
20  return (s=0.5*(b-a)*(FUNC(a)+FUNC(b)));
21  } else {
22  tnm=it;
23  del=(b-a)/tnm;
24  x=a+0.5*del;
25  for (sum=0.0,j=1;j<=it;j++,x+=del) sum += FUNC(x);
26  it *= 2;
27  s=0.5*(s+(b-a)*sum/tnm);
28  return s;
29  }
30 }
#define FUNC(x)
Definition: yield.c:9
double uniform_deviate ( long *  idum)

Definition at line 150 of file yield.c.

156 {
157 
158  static long iy, shuff_tab[SHUFFLE_LENGTH];
159  static int iff=0;
160 
161  int j;
162 
163  if((*idum < 0) || (iff==0)) {
164  iff = 1;
165  if((*idum = (IC-(*idum)) % IM) < 0)
166  *idum = - (*idum);
167 
168  /* initialize the shuffle table */
169  for(j=1; j<=SHUFFLE_LENGTH-1; j++) {
170  *idum = (IA*(unsigned long)(*idum)+IC) % IM;
171  shuff_tab[j] = (*idum);
172  }
173  *idum = (IA*(unsigned long)(*idum)+IC) % IM;
174  iy = (*idum);
175  }
176  j = 1 + (SHUFFLE_LENGTH-1)*iy/IM;
177 
178  if((j>SHUFFLE_LENGTH-1) || (j<0))
179  nrerror("Error in random number generator uniform_deviate.");
180 
181  iy = shuff_tab[j];
182 
183  *idum = (IA*(unsigned long)(*idum)+IC) % IM;
184  shuff_tab[j] = *idum;
185 
186  return (double) iy/ IM;
187 }
#define SHUFFLE_LENGTH
Definition: yield.c:147
#define IM
Definition: yield.c:143
#define IC
Definition: yield.c:145
void nrerror(char *error_text)
Definition: lineread.c:7
#define IA
Definition: yield.c:144

Variable Documentation

dimensions
static

Definition at line 66 of file yield.c.