Esempio n. 1
0
        public virtual GaussianQuadratureData generate(int n)
        {
            ArgChecker.isTrue(n > 0);
            double[] x   = new double[n];
            double[] w   = new double[n];
            bool     odd = n % 2 != 0;
            int      m   = (n + 1) / 2 - (odd ? 1 : 0);

            Pair <DoubleFunction1D, DoubleFunction1D>[] polynomials = HERMITE.getPolynomialsAndFirstDerivative(n);
            Pair <DoubleFunction1D, DoubleFunction1D>   pair        = polynomials[n];
            DoubleFunction1D function   = pair.First;
            DoubleFunction1D derivative = pair.Second;
            double           root       = 0;

            for (int i = 0; i < m; i++)
            {
                root = getInitialRootGuess(root, i, n, x);
                root = ROOT_FINDER.getRoot(function, derivative, root).Value;
                double dp = derivative.applyAsDouble(root);
                x[i]         = -root;
                x[n - 1 - i] = root;
                w[i]         = 2.0 / (dp * dp);
                w[n - 1 - i] = w[i];
            }
            if (odd)
            {
                double dp = derivative.applyAsDouble(0.0);
                w[m] = 2.0 / dp / dp;
            }
            return(new GaussianQuadratureData(x, w));
        }
Esempio n. 2
0
        /// <summary>
        /// {@inheritDoc}
        /// </summary>
        public virtual GaussianQuadratureData generate(int n)
        {
            ArgChecker.isTrue(n > 0, "n > 0");
            Pair <DoubleFunction1D, DoubleFunction1D>[] polynomials = JACOBI.getPolynomialsAndFirstDerivative(n, _alpha, _beta);
            Pair <DoubleFunction1D, DoubleFunction1D>   pair        = polynomials[n];
            DoubleFunction1D previous   = polynomials[n - 1].First;
            DoubleFunction1D function   = pair.First;
            DoubleFunction1D derivative = pair.Second;

            double[] x    = new double[n];
            double[] w    = new double[n];
            double   root = 0;

            for (int i = 0; i < n; i++)
            {
                double d = 2 * n + _c;
                root = getInitialRootGuess(root, i, n, x);
                root = ROOT_FINDER.getRoot(function, derivative, root).Value;
                x[i] = root;
                w[i] = GAMMA_FUNCTION.applyAsDouble(_alpha + n) * GAMMA_FUNCTION.applyAsDouble(_beta + n) / CombinatoricsUtils.factorialDouble(n) / GAMMA_FUNCTION.applyAsDouble(n + _c + 1) * d * Math.Pow(2, _c) / (derivative.applyAsDouble(root) * previous.applyAsDouble(root));
            }
            return(new GaussianQuadratureData(x, w));
        }
Esempio n. 3
0
        /// <summary>
        /// {@inheritDoc}
        /// </summary>
        public virtual GaussianQuadratureData generate(int n)
        {
            ArgChecker.isTrue(n > 0);
            int mid = (n + 1) / 2;

            double[] x = new double[n];
            double[] w = new double[n];
            Pair <DoubleFunction1D, DoubleFunction1D>[] polynomials = LEGENDRE.getPolynomialsAndFirstDerivative(n);
            Pair <DoubleFunction1D, DoubleFunction1D>   pair        = polynomials[n];
            DoubleFunction1D function   = pair.First;
            DoubleFunction1D derivative = pair.Second;

            for (int i = 0; i < mid; i++)
            {
                double root = ROOT_FINDER.getRoot(function, derivative, getInitialRootGuess(i, n)).Value;
                x[i]         = -root;
                x[n - i - 1] = root;
                double dp = derivative.applyAsDouble(root);
                w[i]         = 2 / ((1 - root * root) * dp * dp);
                w[n - i - 1] = w[i];
            }
            return(new GaussianQuadratureData(x, w));
        }
        //-------------------------------------------------------------------------
        private InterpolatedNodalCurve fitSwap(int curveIndex, BasicFixedLeg swap, InterpolatedNodalCurve curve, double swapRate)
        {
            int    nPayments = swap.NumPayments;
            int    nNodes    = curve.ParameterCount;
            double t1        = curveIndex == 0 ? 0.0 : curve.XValues.get(curveIndex - 1);
            double t2        = curveIndex == nNodes - 1 ? double.PositiveInfinity : curve.XValues.get(curveIndex + 1);
            double temp      = 0;
            double temp2     = 0;
            int    i1        = 0;
            int    i2        = nPayments;

            double[] paymentAmounts = new double[nPayments];
            for (int i = 0; i < nPayments; i++)
            {
                double t = swap.getPaymentTime(i);
                paymentAmounts[i] = swap.getPaymentAmounts(i, swapRate);
                if (t <= t1)
                {
                    double df = Math.Exp(-curve.yValue(t) * t);
                    temp  += paymentAmounts[i] * df;
                    temp2 += paymentAmounts[i] * t *df *curve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);

                    i1++;
                }
                else if (t >= t2)
                {
                    double df = Math.Exp(-curve.yValue(t) * t);
                    temp  += paymentAmounts[i] * df;
                    temp2 -= paymentAmounts[i] * t *df *curve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);

                    i2--;
                }
            }
            double cachedValues = temp;
            double cachedSense  = temp2;
            int    index1       = i1;
            int    index2       = i2;

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: java.util.function.Function<double, double> func = new java.util.function.Function<double, double>()
            System.Func <double, double> func = (double?x) =>
            {
                InterpolatedNodalCurve tempCurve = curve.withParameter(curveIndex, x);
                double sum = 1.0 - cachedValues; // Floating leg at par
                for (int i = index1; i < index2; i++)
                {
                    double t = swap.getPaymentTime(i);
                    sum -= paymentAmounts[i] * Math.Exp(-tempCurve.yValue(t) * t);
                }
                return(sum);
            };

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: java.util.function.Function<double, double> grad = new java.util.function.Function<double, double>()
            System.Func <double, double> grad = (double?x) =>
            {
                InterpolatedNodalCurve tempCurve = curve.withParameter(curveIndex, x);
                double sum = cachedSense;
                for (int i = index1; i < index2; i++)
                {
                    double t = swap.getPaymentTime(i);
                    sum += swap.getPaymentAmounts(i, swapRate) * t * Math.Exp(-tempCurve.yValue(t) * t) * tempCurve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);
                }
                return(sum);
            };

            double guess = curve.getParameter(curveIndex);

            if (guess == 0.0 && func(guess) == 0.0)
            {
                return(curve);
            }
            double[] bracket = guess > 0d ? BRACKETER.getBracketedPoints(func, 0.8 * guess, 1.25 * guess, double.NegativeInfinity, double.PositiveInfinity) : BRACKETER.getBracketedPoints(func, 1.25 * guess, 0.8 * guess, double.NegativeInfinity, double.PositiveInfinity);
            double   r       = rootFinder.getRoot(func, grad, bracket[0], bracket[1]).Value;

            return(curve.withParameter(curveIndex, r));
        }