55 public Function(
int n,
double u) {
60 public double evaluate(
double x) {
76 public double cdf(
double x) {
80 public double barF(
double x) {
88 private static double dclem(
int n,
double x,
double EPS) {
89 return (
cdf(n, x + EPS) -
cdf(n, x - EPS)) / (2.0 * EPS);
92 protected static double density_N_1(
double x) {
93 final double AD_X0 = 0.38629436111989062;
94 final double AD_X1 = 37.816242111357;
95 if (x <= AD_X0 || x >= AD_X1)
98 final double t = Math.exp(-x - 1.0);
99 return 2.0 * t / Math.sqrt(1.0 - 4.0 * t);
106 public static double density(
int n,
double x) {
108 throw new IllegalArgumentException(
"n <= 0");
110 return density_N_1(x);
112 if (x >= XBIG || x <= 0.0)
114 final double EPS = 1.0 / 64.0;
115 final double D1 = dclem(n, x, EPS);
116 final double D2 = dclem(n, x, 2.0 * EPS);
117 double res = D1 + (D1 - D2) / 3.0;
118 return res >= 0. ? res : 0.;
121 protected static double cdf_N_1(
double x) {
123 final double AD_X0 = 0.38629436111989062;
124 final double AD_X1 = 37.816242111357;
130 return Math.sqrt(1.0 - 4.0 * Math.exp(-x - 1.0));
133 private static double ADf(
double z,
int j) {
134 final double T = (4.0 * j + 1.0) * (4.0 * j + 1.0) * 1.23370055013617 / z;
138 double f, fnew, a, b, c, r;
140 a = 2.22144146907918 * Math.exp(-T) / Math.sqrt(T);
143 b = 3.93740248643060 * 2. * NormalDistQuick.barF01(Math.sqrt(2 * T));
146 for (i = 1; i < 200; i++) {
147 c = ((i - .5 - T) * b + T * a) / i;
150 r *= z / (8 * i + 8);
151 if (Math.abs(r) < 1e-40 || Math.abs(c) < 1.e-40)
161 private static double ADinf(
double z) {
168 for (j = 1; j < 100; j++) {
170 adnew = ad + (4 * j + 1) * r * ADf(z, j);
179 private static double adinf(
double z) {
181 return Math.exp(-1.2337141 / z) / Math.sqrt(z)
182 * (2.00012 + (.247105 - (.0649821 - (.0347962 - (.011672 - .00168691 * z) * z) * z) * z) * z);
184 return Math.exp(-Math.exp(1.0776 - (2.30695 - (.43424 - (.082433 - (.008056 - .0003146 * z) * z) * z) * z) * z));
188 private static double AD(
int n,
double z,
boolean isFastADinf) {
201 v = (-130.2137 + (745.2337 - (1705.091 - (1950.646 - (1116.360 - 255.7844 * x) * x) * x) * x) * x) / n;
204 final double C = .01265 + .1757 / n;
207 v = Math.sqrt(v) * (1. - v) * (49 * v - 102);
208 return x + v * (.0037 / (n * n) + .00078 / n + .00006) / n;
210 v = (x - C) / (.8 - C);
211 v = -.00022633 + (6.54034 - (14.6538 - (14.458 - (8.259 - 1.91864 * v) * v) * v) * v) * v;
212 return x + v * (.04213 + .01365 / n) / n;
223 public static double cdf(
int n,
double x) {
225 throw new IllegalArgumentException(
"n <= 0");
232 final double RES = AD(n, x,
true);
238 protected static double barF_N_1(
double x) {
239 if (x <= 3.8629436111989E-1)
246 q = 1.0 - 4.0 * Math.exp(-x - 1.0);
247 return 1.0 - Math.sqrt(q);
249 q = 4.0 * Math.exp(-x - 1.0);
250 return 0.5 * q * (1.0 + 0.25 * q * (1.0 + 0.5 * q * (1.0 + 0.125 * q * (5.0 + 3.5 * q))));
257 public static double barF(
int n,
double x) {
259 throw new IllegalArgumentException(
"n <= 0");
262 return 1.0 -
cdf(n, x);
265 protected static double inverse_N_1(
double u) {
266 final double AD_X0 = 0.38629436111989062;
269 final double AD_X1 = 37.816242111357;
272 return AD_X0 - Math.log1p(-u * u);
281 throw new IllegalArgumentException(
"n <= 0");
282 if (u < 0.0 || u > 1.0)
283 throw new IllegalArgumentException(
"u must be in [0,1]");
285 return inverse_N_1(u);
287 return Double.POSITIVE_INFINITY;
290 Function f =
new Function(n, u);
306 throw new IllegalArgumentException(
"n < 1");
309 supportA = 0.38629436111989062;
310 supportB = 37.816242111357;
321 double[] retour = { n };
329 return getClass().getSimpleName() +
" : n = " + n;