25package umontreal.ssj.probdist;
27import umontreal.ssj.util.*;
28import umontreal.ssj.functions.MathFunction;
46 public Function(
int n,
double u) {
51 public double evaluate(
double x) {
58 private static double lower_Marsaglia(
int n,
double x) {
61 double p0 = (2.00012 + (.247105 - (.0649821 - (.0347962 - (.011672 - .00168691 * x) * x) * x) * x) * x);
62 p0 *= Math.exp(-1.2337141 / x) / Math.sqrt(x);
63 return p0 >= 0 ? p0 : 0;
66 private static double diffcdf(
int n,
double x,
double EPS) {
67 return (
cdf(n, x + EPS) -
cdf(n, x - EPS)) / (2.0 * EPS);
81 public double cdf(
double x) {
85 public double barF(
double x) {
97 public static double density(
int n,
double x) {
99 throw new IllegalArgumentException(
"n <= 0");
101 return density_N_1(x);
103 if (x >= XBIG || x <= 0.0)
105 final double EPS = 1.0 / 64.0;
106 final double D1 = diffcdf(n, x, EPS);
107 final double D2 = diffcdf(n, x, 2.0 * EPS);
108 double res = D1 + (D1 - D2) / 3.0;
109 return res >= 0. ? res : 0.;
113 private static double[] F2AD =
new double[103];
114 private static double[] CoAD =
new double[103];
118 F2AD[1] = 1.7315E-10;
119 F2AD[2] = 2.80781E-5;
120 F2AD[3] = 1.40856E-3;
121 F2AD[4] = 9.58772E-3;
122 F2AD[5] = 2.960552E-2;
123 F2AD[6] = 6.185146E-2;
124 F2AD[7] = 1.0357152E-1;
125 F2AD[8] = 1.5127241E-1;
126 F2AD[9] = 2.0190317E-1;
127 F2AD[10] = 2.5318023E-1;
128 F2AD[11] = 3.0354278E-1;
129 F2AD[12] = 3.5200015E-1;
130 F2AD[13] = 3.9797537E-1;
131 F2AD[14] = 4.4117692E-1;
132 F2AD[15] = 4.8150305E-1;
133 F2AD[16] = 5.1897375E-1;
134 F2AD[17] = 5.5368396E-1;
135 F2AD[18] = 5.8577199E-1;
136 F2AD[19] = 6.1539864E-1;
137 F2AD[20] = 6.4273362E-1;
138 F2AD[21] = 6.6794694E-1;
139 F2AD[22] = 6.9120359E-1;
140 F2AD[23] = 7.126605E-1;
141 F2AD[24] = 7.3246483E-1;
142 F2AD[25] = 7.507533E-1;
143 F2AD[26] = 7.6765207E-1;
144 F2AD[27] = 7.8327703E-1;
145 F2AD[28] = 7.9773426E-1;
146 F2AD[29] = 8.1112067E-1;
147 F2AD[30] = 8.2352466E-1;
148 F2AD[31] = 8.3502676E-1;
149 F2AD[32] = 8.4570037E-1;
150 F2AD[33] = 8.5561231E-1;
151 F2AD[34] = 8.6482346E-1;
152 F2AD[35] = 8.7338931E-1;
153 F2AD[36] = 8.8136046E-1;
154 F2AD[37] = 8.8878306E-1;
155 F2AD[38] = 8.9569925E-1;
156 F2AD[39] = 9.0214757E-1;
157 F2AD[40] = 9.081653E-1;
158 F2AD[41] = 9.1378043E-1;
159 F2AD[42] = 9.1902284E-1;
160 F2AD[43] = 9.2392345E-1;
161 F2AD[44] = 9.2850516E-1;
162 F2AD[45] = 9.3279084E-1;
163 F2AD[46] = 9.3680149E-1;
164 F2AD[47] = 9.4055647E-1;
165 F2AD[48] = 9.440736E-1;
166 F2AD[49] = 9.4736933E-1;
167 F2AD[50] = 9.5045883E-1;
168 F2AD[51] = 9.5335611E-1;
169 F2AD[52] = 9.5607414E-1;
170 F2AD[53] = 9.586249E-1;
171 F2AD[54] = 9.6101951E-1;
172 F2AD[55] = 9.6326825E-1;
173 F2AD[56] = 9.6538067E-1;
174 F2AD[57] = 9.6736563E-1;
175 F2AD[58] = 9.6923135E-1;
176 F2AD[59] = 9.7098548E-1;
177 F2AD[60] = 9.7263514E-1;
178 F2AD[61] = 9.7418694E-1;
179 F2AD[62] = 9.7564704E-1;
180 F2AD[63] = 9.7702119E-1;
181 F2AD[64] = 9.7831473E-1;
182 F2AD[65] = 9.7953267E-1;
183 F2AD[66] = 9.8067966E-1;
184 F2AD[67] = 9.8176005E-1;
185 F2AD[68] = 9.827779E-1;
186 F2AD[69] = 9.8373702E-1;
187 F2AD[70] = 9.8464096E-1;
188 F2AD[71] = 9.8549304E-1;
189 F2AD[72] = 9.8629637E-1;
190 F2AD[73] = 9.8705386E-1;
191 F2AD[74] = 9.8776824E-1;
192 F2AD[75] = 9.8844206E-1;
193 F2AD[76] = 9.8907773E-1;
194 F2AD[77] = 9.8967747E-1;
195 F2AD[78] = 9.9024341E-1;
196 F2AD[79] = 9.9077752E-1;
197 F2AD[80] = 9.9128164E-1;
198 F2AD[81] = 9.9175753E-1;
199 F2AD[82] = 9.9220682E-1;
200 F2AD[83] = 9.9263105E-1;
201 F2AD[84] = 9.9303165E-1;
202 F2AD[85] = 9.9340998E-1;
203 F2AD[86] = 9.9376733E-1;
204 F2AD[87] = 9.9410488E-1;
205 F2AD[88] = 9.9442377E-1;
206 F2AD[89] = 9.9472506E-1;
207 F2AD[90] = 9.9500974E-1;
208 F2AD[91] = 9.9527876E-1;
209 F2AD[92] = 9.95533E-1;
210 F2AD[93] = 9.9577329E-1;
211 F2AD[94] = 9.9600042E-1;
212 F2AD[95] = 9.9621513E-1;
213 F2AD[96] = 9.964181E-1;
215 F2AD[98] = 9.9679145E-1;
216 F2AD[99] = 9.9696303E-1;
217 F2AD[100] = 9.9712528E-1;
218 F2AD[101] = 9.9727872E-1;
219 F2AD[102] = 9.9742384E-1;
237 CoAD[16] = 3.54804E-2;
240 CoAD[19] = 2.61949E-2;
243 CoAD[22] = 1.59865E-2;
246 CoAD[25] = 8.2464E-3;
249 CoAD[28] = 1.32272E-3;
252 CoAD[31] = -3.95248E-3;
254 CoAD[33] = -6.892E-3;
255 CoAD[34] = -8.10208E-3;
257 CoAD[36] = -9.552E-3;
258 CoAD[37] = -1.04605E-2;
260 CoAD[39] = -1.175E-2;
261 CoAD[40] = -1.20216E-2;
263 CoAD[42] = -1.253E-2;
264 CoAD[43] = -1.27076E-2;
266 CoAD[45] = -1.267E-2;
267 CoAD[46] = -1.22015E-2;
269 CoAD[48] = -1.186E-2;
270 CoAD[49] = -1.17218E-2;
272 CoAD[51] = -1.113E-2;
273 CoAD[52] = -1.08459E-2;
276 CoAD[55] = -9.5252E-3;
279 CoAD[58] = -8.8004E-3;
281 CoAD[60] = -8.336E-3;
282 CoAD[61] = -8.10512E-3;
285 CoAD[64] = -7.55064E-3;
288 CoAD[67] = -6.834E-3;
291 CoAD[70] = -6.11008E-3;
293 CoAD[72] = -5.673E-3;
294 CoAD[73] = -5.35008E-3;
296 CoAD[75] = -4.786E-3;
297 CoAD[76] = -4.59144E-3;
300 CoAD[79] = -4.07696E-3;
303 CoAD[82] = -3.74656E-3;
306 CoAD[85] = -3.20064E-3;
309 CoAD[88] = -2.78136E-3;
312 CoAD[91] = -2.56208E-3;
315 CoAD[94] = -2.13536E-3;
316 CoAD[95] = -2.083E-3;
321 CoAD[100] = -1.71104E-3;
322 CoAD[101] = -1.741E-3;
343 public static double cdf(
int n,
double x) {
345 throw new IllegalArgumentException(
" n <= 0");
353 return lower_Marsaglia(n, x);
354 return 1.0 -
barF(n, x);
361 public static double barF(
int n,
double x) {
363 throw new IllegalArgumentException(
"n <= 0");
376 q = (0.23945 * Math.pow(nd, -0.9379) - 0.1201 * Math.pow(nd, -0.96) - 1.0002816) * x
377 - 1.437 * Math.pow(nd, -0.9379) + 1.441 * Math.pow(nd, -0.96) - 0.0633101;
378 return Math.pow(x, -0.48897) * Math.exp(q);
382 return 1.0 -
cdf(n, x);
384 final double H = 0.05;
385 final int i = (int) (1 + x / H);
390 res = (F2AD[i - 2] - 2.0 * F2AD[i - 1] + F2AD[i]) * q * (q + 1.0) / 2.0 + (F2AD[i] - F2AD[i - 1]) * q + F2AD[i];
393 res += (CoAD[i] * (q + 1.0) - CoAD[i - 1] * q) / n;
409 throw new IllegalArgumentException(
"n <= 0");
410 if (u < 0.0 || u > 1.0)
411 throw new IllegalArgumentException(
"u must be in [0,1]");
413 return inverse_N_1(u);
415 return Double.POSITIVE_INFINITY;
418 Function f =
new Function(n, u);
426 return getClass().getSimpleName() +
" : n = " + n;
static double cdf(int n, double x)
Computes the Anderson–Darling distribution function at.
String toString()
Returns a String containing information about the current distribution.
double barF(double x)
Returns the complementary distribution function.
double density(double x)
Returns , the density evaluated at .
static double density(int n, double x)
Computes the density of the Anderson–Darling distribution with parameter .
double inverseF(double u)
Returns the inverse distribution function .
AndersonDarlingDistQuick(int n)
Constructs an Anderson–Darling distribution for a sample of size .
static double inverseF(int n, double u)
Computes the inverse of the Anderson–Darling distribution with parameter .
static double barF(int n, double x)
Computes the complementary distribution function with parameter .
double cdf(double x)
Returns the distribution function .
AndersonDarlingDist(int n)
Constructs an Anderson–Darling distribution for a sample of size .
This class provides numerical methods to solve non-linear equations.
static double brentDekker(double a, double b, MathFunction f, double tol)
Computes a root of the function in f using the Brent-Dekker method.
This interface should be implemented by classes which represent univariate mathematical functions.