92 public static double cdf(
int nu,
double x,
double y,
double rho) {
94 throw new IllegalArgumentException(
"nu < 1");
95 if (Math.abs(rho) > 1.)
96 throw new IllegalArgumentException(
"|rho| > 1");
112 final double eps = 1.0e-15;
113 final double tpi = 2. * Math.PI;
114 double hrk, krh, bvt, snu;
115 double gmph, gmpk, xnkh, xnhk, qhrk, hkn, hpk, hkrn;
116 double btnckh, btnchk, btpdkh, btpdhk;
118 if (1. - rho <= eps) {
119 x = Math.min(dh, dk);
122 if (rho + 1. <= eps) {
128 final double ors = (1. - rho) * (1. + rho);
131 if (Math.abs(hrk) + ors > 0.) {
132 xnhk = hrk * hrk / (hrk * hrk + ors * (nu + dk * dk));
133 xnkh = krh * krh / (krh * krh + ors * (nu + dh * dh));
139 if (dh - rho * dk > 0.)
141 else if (dh - rho * dk < 0.)
145 if (dk - rho * dh > 0.)
147 else if (dk - rho * dh < 0.)
152 bvt = Math.atan2(Math.sqrt(ors), -rho) / tpi;
153 gmph = dh / Math.sqrt(16. * (nu + dh * dh));
154 gmpk = dk / Math.sqrt(16. * (nu + dk * dk));
155 btnckh = 2. * Math.atan2(Math.sqrt(xnkh), Math.sqrt(1. - xnkh)) / Math.PI;
156 btpdkh = 2. * Math.sqrt(xnkh * (1. - xnkh)) / Math.PI;
157 btnchk = 2. * Math.atan2(Math.sqrt(xnhk), Math.sqrt(1. - xnhk)) / Math.PI;
158 btpdhk = 2. * Math.sqrt(xnhk * (1. - xnhk)) / Math.PI;
159 for (j = 1; j <= nu / 2; ++j) {
160 bvt = bvt + gmph * (1. + ks * btnckh);
161 bvt = bvt + gmpk * (1. + hs * btnchk);
162 btnckh = btnckh + btpdkh;
163 btpdkh = 2 * j * btpdkh * (1. - xnkh) / (2 * j + 1);
164 btnchk = btnchk + btpdhk;
165 btpdhk = 2 * j * btpdhk * (1. - xnhk) / (2 * j + 1);
166 gmph = gmph * (j - 0.5) / (j * (1. + dh * dh / nu));
167 gmpk = gmpk * (j - 0.5) / (j * (1. + dk * dk / nu));
171 qhrk = Math.sqrt(dh * dh + dk * dk - 2. * rho * dh * dk + nu * ors);
172 hkrn = dh * dk + rho * nu;
175 bvt = Math.atan2(-Math.sqrt(nu) * (hkn * qhrk + hpk * hkrn), hkn * hkrn - nu * hpk * qhrk) / tpi;
176 if (bvt < -10. * eps)
178 gmph = dh / (tpi * Math.sqrt(nu) * (1. + dh * dh / nu));
179 gmpk = dk / (tpi * Math.sqrt(nu) * (1. + dk * dk / nu));
180 btnckh = Math.sqrt(xnkh);
182 btnchk = Math.sqrt(xnhk);
184 for (j = 1; j <= (nu - 1) / 2; ++j) {
185 bvt = bvt + gmph * (1. + ks * btnckh);
186 bvt = bvt + gmpk * (1. + hs * btnchk);
187 btpdkh = (2 * j - 1) * btpdkh * (1. - xnkh) / (2 * j);
188 btnckh = btnckh + btpdkh;
189 btpdhk = (2 * j - 1) * btpdhk * (1. - xnhk) / (2 * j);
190 btnchk = btnchk + btpdhk;
191 gmph = gmph * j / ((j + 0.5) * (1. + dh * dh / nu));
192 gmpk = gmpk * j / ((j + 0.5) * (1. + dk * dk / nu));