Beispiel #1
0
        public double integrate(double a, double b, ConundrumIntegrand integrand)
        {
            double result = .0;

            // we use the non adaptive algorithm only for semi infinite interval
            if (a > 0)
            {
                // we estimate the actual boudary by testing integrand values
                double upperBoundary = 2 * a;
                while (integrand.value(upperBoundary) > precision_)
                {
                    upperBoundary *= 2.0;
                }
                // sometimes b < a because of a wrong estimation of b based on stdev
                if (b > a)
                {
                    upperBoundary = Math.Min(upperBoundary, b);
                }

                GaussKronrodNonAdaptive gaussKronrodNonAdaptive = new GaussKronrodNonAdaptive(precision_, 1000000, 1.0);
                // if the integration intervall is wide enough we use the
                // following change variable x -> a + (b-a)*(t/(a-b))^3
                upperBoundary = Math.Max(a, Math.Min(upperBoundary, hardUpperLimit_));
                if (upperBoundary > 2 * a)
                {
                    VariableChange variableChange = new VariableChange(integrand.value, a, upperBoundary, 3);
                    result = gaussKronrodNonAdaptive.value(variableChange.value, .0, 1.0);
                }
                else
                {
                    result = gaussKronrodNonAdaptive.value(integrand.value, a, upperBoundary);
                }

                // if the expected precision has not been reached we use the old algorithm
                if (!gaussKronrodNonAdaptive.integrationSuccess())
                {
                    GaussKronrodAdaptive integrator = new GaussKronrodAdaptive(precision_, 100000);
                    b      = Math.Max(a, Math.Min(b, hardUpperLimit_));
                    result = integrator.value(integrand.value, a, b);
                }
            } // if a < b we use the old algorithm
            else
            {
                b = Math.Max(a, Math.Min(b, hardUpperLimit_));
                GaussKronrodAdaptive integrator = new GaussKronrodAdaptive(precision_, 100000);
                result = integrator.value(integrand.value, a, b);
            }
            return(result);
        }
        public double integratedCovariance(int i, int j, double t, Vector x)
        {
            if (corrModel_.isTimeIndependent())
            {
                try
                {
                    // if all objects support these methods
                    // thats by far the fastest way to get the
                    // integrated covariance
                    return(corrModel_.correlation(i, j, 0.0, x)
                           * volaModel_.integratedVariance(j, i, t, x));
                    //verifier la methode integratedVariance, qui bdoit etre implémenté
                }
                catch (System.Exception)
                {
                    // okay proceed with the
                    // slow numerical integration routine
                }
            }

            try
            {
                Utils.QL_REQUIRE(x.empty() != false, () => "can not handle given x here");
            }
            catch //OK x empty
            {
            }

            double          tmp    = 0.0;
            VarProxy_Helper helper = new VarProxy_Helper(this, i, j);

            GaussKronrodAdaptive integrator = new GaussKronrodAdaptive(1e-10, 10000);

            for (int k = 0; k < 64; ++k)
            {
                tmp += integrator.value(helper.value, k * t / 64.0, (k + 1) * t / 64.0);
            }
            return(tmp);
        }