public void CubicPolynomialFunctionValueTest()
 {
     Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
     var current = f(2);
     var df = new NumericalDerivative(3, 0);
     Assert.AreEqual(38, df.EvaluateDerivative(f, 2, 1, current), 1e-8);
 }
        public void ExponentialFunctionPartialDerivativeTest()
        {
            //Test Function
            Func <double[], double> f = (x) => Math.Sin(x[0] * x[1]) + Math.Exp(-x[0] / 2) + x[1] / x[0];

            //Analytical partial dfdx
            Func <double[], double> dfdx =
                (x) => Math.Cos(x[0] * x[1]) * x[1] - Math.Exp(-x[0] / 2) / 2 - x[1] / Math.Pow(x[0], 2);

            //Analytical partial dfdy
            Func <double[], double> dfdy = (x) => Math.Cos(x[0] * x[1]) * x[0] + 1 / x[0];

            var df = new NumericalDerivative(3, 1);
            var x1 = new double[] { 3, 3 };

            Assert.AreEqual(dfdx(x1), df.EvaluatePartialDerivative(f, x1, 0, 1), 1e-8);

            Assert.AreEqual(dfdy(x1), df.EvaluatePartialDerivative(f, x1, 1, 1), 1e-8);

            var x2 = new double[] { 300, -50 };

            df.StepType = StepType.Absolute;
            Assert.AreEqual(dfdx(x2), df.EvaluatePartialDerivative(f, x2, 0, 1), 1e-5);
            Assert.AreEqual(dfdy(x2), df.EvaluatePartialDerivative(f, x2, 1, 1), 1e-2);
        }
        public void SinFirstDerivativeAtZeroTest()
        {
            Func <double, double> f = Math.Sin;
            var df = new NumericalDerivative();

            Assert.AreEqual(1, df.EvaluateDerivative(f, 0, 1), 1e-10);
        }
Example #4
0
        public double T, K, S; // Parameters needed for path

        public GeneratePath(SSVIparametrisasion ssvi)
        {
            numericalDerivative = new MathNet.Numerics.Differentiation.NumericalDerivative(); //to approximate derivaties with the finite diff method.
            this.ssvi           = ssvi;                                                       //The surface we are working with
            this.S = ssvi.S;
            this.T = ssvi.T;
        }
Example #5
0
        public static Func <double, double> Derive(Func <double, double> f, int deriveRank)
        {
            //Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
            var n  = new NumericalDerivative(5, 2);
            var df = n.CreateDerivativeFunctionHandle(f, deriveRank);

            return(df);
        }
        public void CubicPolynomialFunctionValueTest()
        {
            Func <double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
            var current             = f(2);
            var df = new NumericalDerivative(3, 0);

            Assert.AreEqual(38, df.EvaluateDerivative(f, 2, 1, current), 1e-8);
        }
Example #7
0
        static public Func <double, double> FindDerivative(Func <double, double> function)
        {
            NumericalDerivative   derivative = new NumericalDerivative();
            Func <double, double> derivativeFunction;

            derivativeFunction = derivative.CreateDerivativeFunctionHandle(function, 1);
            return(derivativeFunction);
        }
Example #8
0
        public void CubicPolynomialFunctionValueTest()
        {
            double Func(double x) => 3 * Math.Pow(x, 3) + 2 * x - 6;

            var current = Func(2);
            var df      = new NumericalDerivative(3, 0);//CentredFiniteDifferenceDerivative(3, 0);

            Assert.AreEqual(38, df.EvaluateDerivative(Func, 2, 1, current), 1e-8);
        }
Example #9
0
        public static void GetError(Double fromInterval, Double toInterval, int n)
        {
            var derivative = new NumericalDerivative((n + 2), 0);
            var M          = derivative.EvaluateDerivative(Constants.Function, Math.Abs(fromInterval), n + 1);

            var R = (M * Math.Pow(Math.Abs(fromInterval) - 0, n + 1)) / SpecialFunctions.Factorial(n + 1);

            Console.WriteLine("Kai x priklauso intervalui [{0}, {1}], tai R{2}={3}", fromInterval, toInterval, n, R);
        }
        public void RosenbrockFunctionMixedDerivativeTwoVariableSecondOrderTest()
        {
            Func <double[], double> f = x => Math.Pow(1 - x[0], 2) + 100 * Math.Pow(x[1] - Math.Pow(x[0], 2), 2);
            var df             = new NumericalDerivative();
            var x0             = new double[] { 2, 2 };
            var parameterIndex = new[] { 0, 1 };

            Assert.AreEqual(-800, df.EvaluateMixedPartialDerivative(f, x0, parameterIndex, 2));
        }
Example #11
0
        /// <summary>
        /// Evaluating Bucketed Delta
        /// </summary>
        /// <returns>The bucketed delta</returns>
        public Decimal GetBucketedDelta1(decimal forwardRate)
        {
            //var realFunction = new RealFunction(BucketedDeltaTargetFunction);
            var rate      = forwardRate;
            var dRate     = Decimal.ToDouble(rate);
            var numerical = new NumericalDerivative();
            var delta     = (Decimal)numerical.EvaluateDerivative(BucketedDeltaTargetFunction, dRate, 1);

            return(delta / 10000);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="td"></param>
        /// <param name="cd"></param>
        /// <param name="skinFactor"></param>
        /// <returns></returns>
        public static double PwdRDerivative(double td, double cd, double skinFactor)
        {
            Condition.Requires(td, nameof(td)).IsGreaterOrEqual(0.0);
            Condition.Requires(cd, nameof(cd)).IsGreaterOrEqual(0.0);

            var nd = new NumericalDerivative();
            var d  = nd.EvaluateDerivative(c => PwdR(c, cd, skinFactor), td, 1);

            return(d * td);
        }
Example #13
0
        /// <summary>
        /// Evaluating Bucketed Delta
        /// </summary>
        /// <returns>The bucketed delta</returns>
        protected virtual Decimal EvaluateBucketedDelta1()
        {
            var solution            = new NumericalDerivative();
            Func <double, double> f = BucketedDeltaTargetFunction;
            var rate  = FloatingIndex;
            var dRate = Decimal.ToDouble(rate);
            var delta = (Decimal)solution.EvaluateDerivative(f, dRate, 1);

            return(delta / BasisPoint);
        }
Example #14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="td"></param>
        /// <param name="Ld"></param>
        /// <returns></returns>
        public static double PwDbLinearSealingFaultDerivative(double td, double Ld)
        {
            Condition.Requires(td, nameof(td)).IsGreaterOrEqual(0.0);
            Condition.Requires(Ld, nameof(Ld)).IsGreaterThan(0.0);

            var nd = new NumericalDerivative();
            var d  = nd.EvaluateDerivative(c => PwDbLinearSealingFault(c, Ld), td, 1);

            return(d * td);
        }
        public void RosenbrockFunctionMixedDerivativeOneVariableSecondOrderTest()
        {
            Func <double[], double> f = x => Math.Pow(1 - x[0], 2) + 100 * Math.Pow(x[1] - Math.Pow(x[0], 2), 2);
            var df             = new NumericalDerivative();
            var x0             = new double[] { 2, 2 };
            var parameterindex = new int[] { 0, 0 };

            Assert.AreEqual(1602, df.EvaluatePartialDerivative(f, x0, 0, 1), 1e-6);
            Assert.AreEqual(4002, df.EvaluateMixedPartialDerivative(f, x0, parameterindex, 2));
        }
Example #16
0
        /// <summary>
        /// PTA derivative: dP * time
        /// </summary>
        /// <param name="time">elapsed time, hours</param>
        /// <param name="q">flow rate at surface, [STB/D]</param>
        /// <returns></returns>
        public double PressureDropDerivative(double time, double q)
        {
            var nd = new NumericalDerivative();

            if (time > 0.01)
            {
                nd.StepType = StepType.Relative;
                nd.Epsilon  = 1e-6;
            }

            var dP = nd.EvaluateDerivative(x => PressureDrop(x, q), time, 1);

            return(dP * time);
        }
Example #17
0
        public double CountIntegralForCore(int kindOfCore)
        {
            Func <double, double> core;
            NumericalDerivative   derivative       = new NumericalDerivative(10, 5);
            Func <double, double> fourthDerivative = derivative.CreateDerivativeFunctionHandle(Func, 4); //CountDerivative(func, 4);
            Func <double, double> thirdDerivative  = derivative.CreateDerivativeFunctionHandle(Func, 3); //CountDerivative(func, 3);
            Func <double, double> secondDerivative = derivative.CreateDerivativeFunctionHandle(Func, 2); //CountDerivative(func, 2);

            //Console.WriteLine("fourthDerivative = " + fourthDerivative(1.57));
            //Console.WriteLine("thirdDerivative = " + thirdDerivative(1.57));
            //Console.WriteLine("secondDerivative = " + secondDerivative(1.57));
            if (kindOfCore == 1)
            {
                core = (x) => { return(fourthDerivative(x) - ((Math.Pow(thirdDerivative(x), 2)) / (secondDerivative(x + 0.00001)))); }
            }
            ;
            else
            {
                core = (x) => { return(fourthDerivative(x)); }
            };

            // Console.WriteLine("core = " + core(1));
            Func <double, double> underIntegralFunc = (x) => { return(Math.Pow(Math.Abs((core(x))), 0.25)); };
            double integralValue = CountIntegral(LeftLimit, RightLimit, underIntegralFunc, Precision);

            return(integralValue);
        }

        //public double Factorial(double number)
        //{
        //    double res = 1;
        //    double n = number;
        //    while (n != 1)
        //    {
        //        res *= n;
        //        n--;
        //    }
        //    return res;
        //}

        //public double ErrorCount(double integralValue, int parametersAmount, double r)
        //{
        //    double error = 0;

        //    // double integralValue = CountIntegral();
        //    error = ((Math.Pow(integralValue, parametersAmount)) / (Math.Pow(2, parametersAmount) * Factorial(parametersAmount) * Math.Pow(r, parametersAmount)));
        //    return error;
        //}
    }
        public void VectorFunctionMixedPartialDerivativeTest()
        {
            Func <double[], double>[] f =
            {
                (x) => Math.Pow(x[0], 2) - 3 * x[1],
                (x) => x[1] * x[1] + 2 * x[0] * x[1]
            };

            var x0 = new double[] { 2, 2 };

            var df = new NumericalDerivative();

            Assert.AreEqual(new double[] { 0, 2 }, df.EvaluateMixedPartialDerivative(f, x0, new int[] { 0, 1 }, 2));
            Assert.AreEqual(new double[] { 0, 2 }, df.EvaluateMixedPartialDerivative(f, x0, new int[] { 1, 0 }, 2));
        }
        public void CreateDerivativeFunctionHandleTest()
        {
            Func <double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
            var nd = new NumericalDerivative(5, 2);
            var df = nd.CreateDerivativeFunctionHandle(f, 3);

            Assert.AreEqual(18, df(0));

            // Test new function with same nd class
            Func <double, double> f2 = x => 2 * Math.Pow(x, 3) + 2 * x - 6;
            var df2 = nd.CreateDerivativeFunctionHandle(f2, 3);

            Assert.AreEqual(12, df2(0));

            // Original delegate not changed
            Assert.AreEqual(18, df(0));
        }
        public void CreateDerivativeFunctionHandleTest()
        {
            Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
            var nd = new NumericalDerivative(5, 2);
            var df = nd.CreateDerivativeFunctionHandle(f, 3);

            Assert.AreEqual(18, df(0));

            // Test new function with same nd class
            Func<double, double> f2 = x => 2 * Math.Pow(x, 3) + 2 * x - 6;
            var df2 = nd.CreateDerivativeFunctionHandle(f2, 3);

            Assert.AreEqual(12, df2(0));

            // Original delegate not changed
            Assert.AreEqual(18, df(0));
        }
        public void VectorFunction1PartialDerivativeTest()
        {
            Func <double[], double>[] f =
            {
                (x) => Math.Pow(x[0], 2) - 3 * x[1],
                (x) => x[1] * x[1] + 2 * x[0] * x[1]
            };

            var x0 = new double[] { 2, 2 };
            var g  = new double[] { 4, 4 };

            var df = new NumericalDerivative();

            Assert.AreEqual(g, df.EvaluatePartialDerivative(f, x0, 0, 1));
            Assert.AreEqual(new double[] { 2, 0 }, df.EvaluatePartialDerivative(f, x0, 0, 2));
            Assert.AreEqual(new double[] { -3, 8 }, df.EvaluatePartialDerivative(f, x0, 1, 1));
        }
Example #22
0
        public Func <double, double> CountCoreFunc(Func <double, double> func, int kindOfCore)
        {
            NumericalDerivative   derivative       = new NumericalDerivative(6, 3);
            Func <double, double> fourthDerivative = derivative.CreateDerivativeFunctionHandle(func, 4); //CountDerivative(func, 4);
            Func <double, double> thirdDerivative  = derivative.CreateDerivativeFunctionHandle(func, 3); //CountDerivative(func, 3);
            Func <double, double> secondDerivative = derivative.CreateDerivativeFunctionHandle(func, 2); //CountDerivative(func, 2);

            switch (kindOfCore)
            {
            case 1: { return((x) => { return (fourthDerivative(x) - Math.Pow(thirdDerivative(x), 2) / (secondDerivative(x))); }); }

            case 2: { return((x) => { return fourthDerivative(x); }); };

            default: break;
            }
            return(null);
        }
Example #23
0
        private Vector3 getNormalNumeric(Vector3 r)
        {
            List <DefinedCommonFunction> derivativesU = new List <DefinedCommonFunction>();
            List <DefinedCommonFunction> derivativesV = new List <DefinedCommonFunction>();
            NumericalDerivative          derivative   = new NumericalDerivative();

            derivativesU.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.X.Invoke, 0, 1), "null"));
            derivativesV.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.X.Invoke, 1, 1), "null"));
            derivativesU.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.Y.Invoke, 0, 1), "null"));
            derivativesV.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.Y.Invoke, 1, 1), "null"));
            derivativesU.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.Z.Invoke, 0, 1), "null"));
            derivativesV.Add(new DefinedCommonFunction(derivative.CreatePartialDerivativeFunctionHandle(r.Z.Invoke, 1, 1), "null"));

            Vector3 v1 = new Vector3(derivativesU);
            Vector3 v2 = new Vector3(derivativesV);

            var normalNotNormalized = (v1 ^ v2);
            var len = new OneVarFunction(Math.Sqrt, normalNotNormalized * normalNotNormalized, null);

            return(normalNotNormalized / len);
        }
 public void CubicPolynomialThirdDerivativeAtAnyValTest()
 {
     Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
     var df = new NumericalDerivative(5, 2);
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
     df.Center = 0;
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
     df.Center = 1;
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
     df.Center = 2;
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
     df.Center = 3;
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
     df.Center = 4;
     Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
     Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
 }
        public void ExponentialFunctionPartialDerivativeCurrentValueTest()
        {
            //Test Function
            Func <double[], double> f = (x) => Math.Sin(x[0] * x[1]) + Math.Exp(-x[0] / 2) + x[1] / x[0];

            //Analytical partial dfdx
            Func <double[], double> dfdx =
                (x) => Math.Cos(x[0] * x[1]) * x[1] - Math.Exp(-x[0] / 2) / 2 - x[1] / Math.Pow(x[0], 2);

            //Analytical partial dfdy
            Func <double[], double> dfdy = (x) => Math.Cos(x[0] * x[1]) * x[0] + 1 / x[0];

            // Current value
            var x1      = new double[] { 3, 3 };
            var current = f(x1);

            var df = new NumericalDerivative(5, 2);

            Assert.AreEqual(dfdx(x1), df.EvaluatePartialDerivative(f, x1, 0, 1, current), 1e-8);

            Assert.AreEqual(dfdy(x1), df.EvaluatePartialDerivative(f, x1, 1, 1, current), 1e-8);
        }
        public void CubicPolynomialThirdDerivativeAtAnyValTest()
        {
            Func <double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
            var df = new NumericalDerivative(5, 2);

            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
            df.Center = 0;
            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
            df.Center = 1;
            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
            df.Center = 2;
            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
            df.Center = 3;
            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
            df.Center = 4;
            Assert.AreEqual(18, df.EvaluateDerivative(f, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(f, 10, 3));
        }
        /// <summary>
        /// Evaluating the vector of Bucketed Delta
        /// </summary>
        /// <returns>The vector of bucketed delta</returns>
        protected override Decimal[] EvaluateBucketedDeltaVector()
        {
            Func <double, double> f           = BucketedDeltaTargetFunction;
            var           df                  = new NumericalDerivative();
            var           bucketedRates       = EvaluatedBucketedRates();
            var           bucketedDeltaVector = new decimal[bucketedRates.Length];
            const Decimal cDefault            = 0.0m;

            if (bucketedRates.Length == 0 && bucketedRates[0] == cDefault)
            {
                bucketedDeltaVector[0] = cDefault;
            }
            else
            {
                for (var index = bucketedRates.Length - 1; index >= 0; index--)
                {
                    var rate  = bucketedRates[index];
                    var dRate = Decimal.ToDouble(rate);
                    var temp  = (Decimal)df.EvaluateDerivative(f, dRate, 1);
                    bucketedDeltaVector[index] = temp / BasisPoint;
                }
            }
            return(bucketedDeltaVector);
        }
Example #28
0
        public void CubicPolynomialThirdDerivativeAtAnyValTest()
        {
            double Func(double x) => 3 * Math.Pow(x, 3) + 2 * x - 6;

            var df = new NumericalDerivative(5, 2);//CentredFiniteDifferenceDerivative(5, 2)

            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
            df.Center = 0;
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
            df.Center = 1;
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
            df.Center = 2;
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
            df.Center = 3;
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
            df.Center = 4;
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 0, 3));
            Assert.AreEqual(18, df.EvaluateDerivative(Func, 10, 3));
        }
Example #29
0
        /// <summary>
        /// Bootstraps the specified priceable assets.
        /// </summary>
        /// <param name="priceableAssets">The priceable assets.</param>
        /// <param name="baseZeroCurve">The base Zero Curve</param>
        /// <param name="algorithmHolder">The algorithmHolder</param>
        /// <returns></returns>
        public TermPoint[] Bootstrap(List <IPriceableRateAssetController> priceableAssets,
                                     IRateCurve baseZeroCurve, PricingStructureAlgorithmsHolder algorithmHolder)
        {
            var      items    = new SortedDictionary <DateTime, Pair <string, decimal> >();
            DateTime baseDate = baseZeroCurve.GetBaseDate();

            items.Add(baseDate, new Pair <string, decimal>(null, 1m));
            bool         firstTime         = true;
            const double compoundingPeriod = 0.25;
            IPriceableRateAssetController previousAsset = null;
            IEnumerable <TermPoint>       basePillars   = baseZeroCurve.GetTermCurve().point;
            IDayCounter dayCounter = null;

            foreach (IPriceableRateAssetController priceableAsset in priceableAssets)
            {
                List <DateTime> assetDates;
                if (priceableAsset is PriceableSwapRateAsset swap)
                {
                    dayCounter = DayCounterHelper.Parse(swap.DayCountFraction.Value);
                    assetDates = swap.AdjustedPeriodDates;
                }
                else
                {
                    PriceableDeposit deposit = priceableAsset as PriceableDeposit;
                    if (deposit == null)
                    {
                        throw new ArgumentException(
                                  $"PriceableAsset must be a PriceableSwapRateAsset or PriceableDeposit, '{priceableAsset.GetType()}' is not implemented.");
                    }
                    dayCounter = DayCounterHelper.Parse(deposit.Deposit.dayCountFraction.Value);
                    assetDates = new List <DateTime> {
                        deposit.AdjustedStartDate, deposit.GetRiskMaturityDate()
                    };
                }
                DateTime maturityDate = priceableAsset.GetRiskMaturityDate();
                if (items.Keys.Contains(maturityDate))
                {
                    throw new ArgumentException(
                              $"Duplicate priceable asset on '{maturityDate:yyyy-MM-dd}'", nameof(priceableAssets));
                }
                //The min and max values to use with the solver.
                const int xmin     = -1;
                const int xmax     = 1;
                var       accuracy = 10 ^ -12;
                if (firstTime)
                {
                    firstTime = false;
                    // Solve to find the quarterly compounded zero rate spread
                    var solverFunctions
                        = new NewtonRaphsonSolverFunctions(priceableAsset, null, algorithmHolder, baseZeroCurve,
                                                           baseDate, items, compoundingPeriod, ZeroRateSpreads, dayCounter, assetDates);
                    var solver       = new Newton();
                    var initialGuess = (double)priceableAsset.MarketQuote.value;
                    //var solution = new CenteredFiniteDifferenceDerivative();
                    Func <double, double> f           = solverFunctions.ShortEndTargetFunction;
                    var    derivativeOfTargetFunction = new NumericalDerivative().CreateDerivativeFunctionHandle(f, 1);
                    double zeroRateSpread             = solver.Solve(f, derivativeOfTargetFunction, accuracy, initialGuess, xmin, xmax);
                    // add first point
                    DateTime startDate = assetDates.First();
                    decimal  df        = (decimal)GetAdjustedDiscountFactor(baseDate, startDate, dayCounter, zeroRateSpread, baseZeroCurve);
                    if (startDate != baseDate)
                    {
                        items.Add(startDate, new Pair <string, decimal>(null, df));
                    }
                    ZeroRateSpreads.Add(maturityDate, zeroRateSpread);
                    // add extra points
                    IEnumerable <TermPoint> extraPoints = basePillars.Where(b => (DateTime)b.term.Items[0] > startDate && (DateTime)b.term.Items[0] < maturityDate);
                    // Extrapolate the preceding extra points
                    foreach (TermPoint extraPoint in extraPoints)
                    {
                        DateTime date = (DateTime)extraPoint.term.Items[0];
                        df = (decimal)GetAdjustedDiscountFactor(baseDate, date, dayCounter, zeroRateSpread, baseZeroCurve);
                        items.Add(date, new Pair <string, decimal>(extraPoint.id, df));
                    }
                    // add final point
                    df = (decimal)GetAdjustedDiscountFactor(baseDate, maturityDate, dayCounter, zeroRateSpread, baseZeroCurve);
                    items.Add(maturityDate, new Pair <string, decimal>(priceableAsset.Id, df));
                }
                else
                {
                    items.Add(maturityDate, new Pair <string, decimal>(priceableAsset.Id, 0));
                    ZeroRateSpreads.Add(maturityDate, (double)priceableAsset.MarketQuote.value);
                    // Solve to find the quarterly compounded zero rate spread
                    var solverFunctions
                        = new NewtonRaphsonSolverFunctions(priceableAsset, previousAsset, algorithmHolder, baseZeroCurve,
                                                           baseDate, items, compoundingPeriod, ZeroRateSpreads, dayCounter, assetDates);
                    Func <double, double> f           = solverFunctions.LongEndTargetFunction;
                    var    solver                     = new Newton();
                    var    initialGuess               = (double)priceableAsset.MarketQuote.value;
                    var    derivativeOfTargetFunction = new NumericalDerivative().CreateDerivativeFunctionHandle(f, 1);
                    double zeroRateSpread             = solver.Solve(f, derivativeOfTargetFunction, accuracy, initialGuess, xmin, xmax);
                    // Update discount factor value
                    decimal df = (decimal)GetAdjustedDiscountFactor(baseDate, maturityDate, dayCounter, zeroRateSpread, baseZeroCurve);
                    items[maturityDate].Second    = df;
                    ZeroRateSpreads[maturityDate] = zeroRateSpread;
                    solverFunctions.UpdateDiscountFactors(baseDate);
                }
                previousAsset = priceableAsset;
            }
            // Extrapolate the following extra points
            IEnumerable <TermPoint>         finalPoints         = basePillars.Where(b => (DateTime)b.term.Items[0] > items.Last().Key);
            KeyValuePair <DateTime, double> zeroRateSpreadFinal = ZeroRateSpreads.Last();

            foreach (TermPoint extraPoint in finalPoints)
            {
                DateTime date = (DateTime)extraPoint.term.Items[0];
                decimal  df   = (decimal)GetAdjustedDiscountFactor(baseDate, date, dayCounter, zeroRateSpreadFinal.Value, baseZeroCurve);
                items.Add(date, new Pair <string, decimal>(extraPoint.id, df));
            }
            return(TermPointsFactory.Create(items));
        }
Example #30
0
 public static double GetNthOrderDerivativeValueAt0(int n)
     {
     var derivative = new NumericalDerivative(6, 0);
     return derivative.EvaluateDerivative(Constants.Function, 0, n);
     }
        public void ExponentialFunctionPartialDerivativeTest()
        {
            //Test Function
            Func<double[], double> f = (x) => Math.Sin(x[0] * x[1]) + Math.Exp(-x[0] / 2) + x[1] / x[0];

            //Analytical partial dfdx
            Func<double[], double> dfdx =
                (x) => Math.Cos(x[0] * x[1]) * x[1] - Math.Exp(-x[0] / 2) / 2 - x[1] / Math.Pow(x[0], 2);

            //Analytical partial dfdy
            Func<double[], double> dfdy = (x) => Math.Cos(x[0] * x[1]) * x[0] + 1 / x[0];

            var df = new NumericalDerivative(3, 1);
            var x1 = new double[] { 3, 3 };
            Assert.AreEqual(dfdx(x1), df.EvaluatePartialDerivative(f, x1, 0, 1), 1e-8);

            Assert.AreEqual(dfdy(x1), df.EvaluatePartialDerivative(f, x1, 1, 1), 1e-8);

            var x2 = new double[] { 300, -50 };
            df.StepType = StepType.Absolute;
            Assert.AreEqual(dfdx(x2), df.EvaluatePartialDerivative(f, x2, 0, 1), 1e-5);
            Assert.AreEqual(dfdy(x2), df.EvaluatePartialDerivative(f, x2, 1, 1), 1e-2);
        }
 public void RosenbrockFunctionMixedDerivativeOneVariableSecondOrderTest()
 {
     Func<double[], double> f = x => Math.Pow(1 - x[0], 2) + 100 * Math.Pow(x[1] - Math.Pow(x[0], 2), 2);
     var df = new NumericalDerivative();
     var x0 = new double[] { 2, 2 };
     var parameterindex = new int[] { 0, 0 };
     Assert.AreEqual(1602, df.EvaluatePartialDerivative(f, x0, 0, 1), 1e-6);
     Assert.AreEqual(4002, df.EvaluateMixedPartialDerivative(f, x0, parameterindex, 2));
 }
        public void RosenbrockFunctionMixedDerivativeTwoVariableSecondOrderTest()
        {
            Func<double[], double> f = x => Math.Pow(1 - x[0], 2) + 100 * Math.Pow(x[1] - Math.Pow(x[0], 2), 2);
            var df = new NumericalDerivative();
            var x0 = new double[] { 2, 2 };
            var parameterIndex = new[] { 0, 1 };

            Assert.AreEqual(-800, df.EvaluateMixedPartialDerivative(f, x0, parameterIndex, 2));
        }
 public void SinFirstDerivativeAtZeroTest()
 {
     Func<double, double> f = Math.Sin;
     var df = new NumericalDerivative();
     Assert.AreEqual(1, df.EvaluateDerivative(f, 0, 1), 1e-10);
 }
        public void VectorFunction1PartialDerivativeTest()
        {
            Func<double[], double>[] f =
            {
                (x) => Math.Pow(x[0],2) - 3*x[1],
                (x) => x[1]*x[1] + 2*x[0]*x[1]
            };

            var x0 = new double[] { 2, 2 };
            var g = new double[] { 4, 4 };

            var df = new NumericalDerivative();
            Assert.AreEqual(g, df.EvaluatePartialDerivative(f, x0, 0, 1));
            Assert.AreEqual(new double[] { 2, 0 }, df.EvaluatePartialDerivative(f, x0, 0, 2));
            Assert.AreEqual(new double[] { -3, 8 }, df.EvaluatePartialDerivative(f, x0, 1, 1));
        }
        public void VectorFunctionMixedPartialDerivativeTest()
        {
            Func<double[], double>[] f =
            {
                (x) => Math.Pow(x[0],2) - 3*x[1],
                (x) => x[1]*x[1] + 2*x[0]*x[1]
            };

            var x0 = new double[] { 2, 2 };

            var df = new NumericalDerivative();
            Assert.AreEqual(new double[] { 0, 2 }, df.EvaluateMixedPartialDerivative(f, x0, new int[] { 0, 1 }, 2));
            Assert.AreEqual(new double[] { 0, 2 }, df.EvaluateMixedPartialDerivative(f, x0, new int[] { 1, 0 }, 2));
        }
        public void ExponentialFunctionPartialDerivativeCurrentValueTest()
        {
            //Test Function
            Func<double[], double> f = (x) => Math.Sin(x[0] * x[1]) + Math.Exp(-x[0] / 2) + x[1] / x[0];

            //Analytical partial dfdx
            Func<double[], double> dfdx =
                (x) => Math.Cos(x[0] * x[1]) * x[1] - Math.Exp(-x[0] / 2) / 2 - x[1] / Math.Pow(x[0], 2);

            //Analytical partial dfdy
            Func<double[], double> dfdy = (x) => Math.Cos(x[0] * x[1]) * x[0] + 1 / x[0];

            // Current value
            var x1 = new double[] { 3, 3 };
            var current = f(x1);

            var df = new NumericalDerivative(5, 2);
            Assert.AreEqual(dfdx(x1), df.EvaluatePartialDerivative(f, x1, 0, 1, current), 1e-8);

            Assert.AreEqual(dfdy(x1), df.EvaluatePartialDerivative(f, x1, 1, 1, current), 1e-8);
        }