42 integratedPath =
new double[d + 1];
44 oneMExpMADtOverAlpha =
new double[d];
46 for (
int iTime = 0; iTime < d; iTime++) {
47 double dt = t[iTime + 1] - t[iTime];
48 bdt[iTime] = beta * dt;
49 double oneMExpMADt = -Math.expm1(-alpha * dt);
50 oneMExpMADtOverAlpha[iTime] = oneMExpMADt / alpha;
53 double c11 = sigma * sigma / 2.0 / alpha;
54 double c12 = c11 / alpha;
57 for (
int iTime = 0; iTime < d; iTime++) {
58 double dt = t[iTime + 1] - t[iTime];
59 double expMADt = alphadt[iTime];
60 double oneMExpMADt = -Math.expm1(-alpha * dt);
62 DenseDoubleMatrix2D covar =
new DenseDoubleMatrix2D(2, 2);
63 covar.set(0, 0, c11 * oneMExpMADt * (1.0 + expMADt));
64 covar.set(0, 1, c12 * oneMExpMADt * oneMExpMADt);
65 covar.set(1, 0, covar.get(0, 1));
66 covar.set(1, 1, c22 * (-3.0 + 2.0 * alpha * dt + 4.0 * expMADt - expMADt * expMADt));
68 double[] mu = { 0.0, 0.0 };
89 integratedPath[0] = 0.0;
90 double[] normalsCorr =
new double[2];
91 for (
int iTime = 1; iTime <= d; iTime++) {
92 normalsCorrGen[iTime - 1].nextPoint(normalsCorr);
93 path[iTime] = badt[iTime - 1] + path[iTime - 1] * alphadt[iTime - 1] + normalsCorr[0];
95 integratedPath[iTime] = integratedPath[iTime - 1] + bdt[iTime - 1]
96 + oneMExpMADtOverAlpha[iTime - 1] * (path[iTime - 1] - beta) + normalsCorr[1];
135 double[] analyticNotificationDiscounts =
new double[couponTimes.length];
136 for (
int iTime = 1; iTime < couponTimes.length; iTime++) {
137 int iTimePath = (iTime < d) ? iTime : d;
138 double dt = couponTimes[iTime] - t[iTimePath];
139 double expMADt = Math.exp(-alpha * dt);
140 double mu_2 = beta * dt + (1.0 - expMADt) / alpha * (path[iTimePath] - beta);
141 double sigma22 = c22 * (-3.0 + 2.0 * alpha * dt + 4.0 * expMADt - expMADt * expMADt);
142 analyticNotificationDiscounts[iTime] = Math.exp(-mu_2 + sigma22 / 2.0 - integratedPath[iTimePath]);
144 return analyticNotificationDiscounts;
159 double[] analyticDiscount =
new double[times.length];
160 analyticDiscount[0] = 1.0;
161 for (
int iTime = 1; iTime < times.length; iTime++) {
162 double dt = times[iTime] - times[0];
163 double expMADt = Math.exp(-alpha * dt);
164 double mu_2 = beta * dt + (1.0 - expMADt) / alpha * (x0 - beta);
165 double sigma22 = c22 * (-3.0 + 2.0 * alpha * dt + 4.0 * expMADt - expMADt * expMADt);
166 analyticDiscount[iTime] = Math.exp(-mu_2 + sigma22 / 2.0);
168 return analyticDiscount;