public void FitsAtArbitraryPointsWithMaple(double t, double x, double maxAbsoluteError)
        {
            IInterpolation interpolation = new NevillePolynomialInterpolation(_t, _x);

            Assert.AreEqual(x, interpolation.Interpolate(t), maxAbsoluteError, "Interpolation at {0}", t);

            double interpolatedValue;
            double secondDerivative;
            interpolation.Differentiate(t, out interpolatedValue, out secondDerivative);
            Assert.AreEqual(x, interpolatedValue, maxAbsoluteError, "Interpolation as by-product of differentiation at {0}", t);
        }
Esempio n. 2
0
        public void FitsAtArbitraryPointsWithMaple(double t, double x, double maxAbsoluteError)
        {
            IInterpolation interpolation = new NevillePolynomialInterpolation(_t, _x);

            Assert.AreEqual(x, interpolation.Interpolate(t), maxAbsoluteError, "Interpolation at {0}", t);

            double interpolatedValue;
            double secondDerivative;

            interpolation.Differentiate(t, out interpolatedValue, out secondDerivative);
            Assert.AreEqual(x, interpolatedValue, maxAbsoluteError, "Interpolation as by-product of differentiation at {0}", t);
        }
Esempio n. 3
0
        public void FitsAtSamplePoints()
        {
            IInterpolation interpolation = new NevillePolynomialInterpolation(_t, _x);

            for (int i = 0; i < _x.Length; i++)
            {
                Assert.AreEqual(_x[i], interpolation.Interpolate(_t[i]), "A Exact Point " + i);

                double interpolatedValue;
                double secondDerivative;
                interpolation.Differentiate(_t[i], out interpolatedValue, out secondDerivative);
                Assert.AreEqual(_x[i], interpolatedValue, "B Exact Point " + i);
            }
        }
        public void FitsAtSamplePoints()
        {
            IInterpolation interpolation = new NevillePolynomialInterpolation(_t, _x);

            for (int i = 0; i < _x.Length; i++)
            {
                Assert.AreEqual(_x[i], interpolation.Interpolate(_t[i]), "A Exact Point " + i);

                double interpolatedValue;
                double secondDerivative;
                interpolation.Differentiate(_t[i], out interpolatedValue, out secondDerivative);
                Assert.AreEqual(_x[i], interpolatedValue, "B Exact Point " + i);
            }
        }
        public void FitsAtArbitraryPointsWithMaple(
            [Values(0.1, 0.4, 1.1, 3.2, 4.5, 10.0, -10.0)] double t,
            [Values(.57225, 1.884, 3.0314166666666666667, 1.034666666666666667, 6.28125, 277.5, -1010.8333333333333333)] double x,
            [Values(1e-15, 1e-15, 1e-15, 1e-15, 1e-15, 1e-15, 1e-12)] double maxAbsoluteError)
        {
            IInterpolation interpolation  = new NevillePolynomialInterpolation(_t, _x);

            Assert.AreEqual(x, interpolation.Interpolate(t), maxAbsoluteError, "Interpolation at {0}", t);

            double interpolatedValue;
            double secondDerivative;
            interpolation.Differentiate(t, out interpolatedValue, out secondDerivative);
            Assert.AreEqual(x, interpolatedValue, maxAbsoluteError, "Interpolation as by-product of differentiation at {0}", t);
        }
Esempio n. 6
0
        public void FitsAtArbitraryPointsWithMaple(
            [Values(0.1, 0.4, 1.1, 3.2, 4.5, 10.0, -10.0)] double t,
            [Values(.57225, 1.884, 3.0314166666666666667, 1.034666666666666667, 6.28125, 277.5, -1010.8333333333333333)] double x,
            [Values(1e-15, 1e-15, 1e-15, 1e-15, 1e-15, 1e-15, 1e-12)] double maxAbsoluteError)
        {
            IInterpolation interpolation = new NevillePolynomialInterpolation(_t, _x);

            Assert.AreEqual(x, interpolation.Interpolate(t), maxAbsoluteError, "Interpolation at {0}", t);

            double interpolatedValue;
            double secondDerivative;

            interpolation.Differentiate(t, out interpolatedValue, out secondDerivative);
            Assert.AreEqual(x, interpolatedValue, maxAbsoluteError, "Interpolation as by-product of differentiation at {0}", t);
        }
        private DenseVector GradOfEvaluatingValueRidder(Func <DenseVector, double> inputFunction,
                                                        DenseVector dvCurrentParametersPoint,
                                                        DenseVector dvPreviousParametersIncrement, out DenseVector dvNewParametersIncrement, double maxRelativeError = 0.005d)
        {
            DenseVector dvCurrentParametersIncrement = dvPreviousParametersIncrement.Copy() * 2.0d;
            Func <DenseVector, double> theFunction   = inputFunction;
            double maxRelPartialDerivAboveMin        = 1000.0d;

            for (int i = 0; i < dvCurrentParametersIncrement.Count; i++)
            {
                if (Math.Abs(dvCurrentParametersIncrement[i]) / dvParametersScale[i] < 1.0e-2)
                {
                    dvCurrentParametersIncrement[i] = dvParametersScale[i] * 1.0e-2;
                }
                else if (Math.Abs(dvCurrentParametersIncrement[i]) / dvParametersScale[i] > 1.0e+2)
                {
                    dvCurrentParametersIncrement[i] = dvParametersScale[i];
                }
            }



            DenseVector grad = DenseVector.Create(dvCurrentParametersPoint.Count, (index) =>
            {
                DenseVector dvPartialParametersIncrement = DenseVector.Create(dvCurrentParametersIncrement.Count,
                                                                              (i => (i == index) ? (dvCurrentParametersIncrement[i]) : (0.0d)));
                return((theFunction(dvCurrentParametersPoint + dvPartialParametersIncrement) -
                        theFunction(dvCurrentParametersPoint - dvPartialParametersIncrement)) / (2.0d * dvPartialParametersIncrement.Sum()));
            });

            DenseVector gradHalfed = DenseVector.Create(dvCurrentParametersPoint.Count, (index) =>
            {
                DenseVector dvPartialParametersIncrementHalfed = DenseVector.Create(dvCurrentParametersIncrement.Count,
                                                                                    (i => (i == index) ? (dvCurrentParametersIncrement[i] / 2.0d) : (0.0d)));
                return((theFunction(dvCurrentParametersPoint + dvPartialParametersIncrementHalfed) -
                        theFunction(dvCurrentParametersPoint - dvPartialParametersIncrementHalfed)) / (2.0d * dvPartialParametersIncrementHalfed.Sum()));
            });

            double relativeError = (grad - gradHalfed).Abs() / grad.Abs();

            for (int varIndex = 0; varIndex < dvCurrentParametersIncrement.Count; varIndex++)
            {
                double partialRelativeError = relativeError;
                double currentVarIncrement  = dvCurrentParametersIncrement[varIndex];

                List <Tuple <double, double, int> > lTplRelErrAndPartDeriv = new List <Tuple <double, double, int> >();

                DenseVector dvPartialParametersIncrement = DenseVector.Create(dvCurrentParametersIncrement.Count,
                                                                              (i => (i == varIndex) ? (dvCurrentParametersIncrement[i]) : (0.0d)));
                List <DenseVector> dvParametersPointsToDetermineDerivative = new List <DenseVector>();
                dvParametersPointsToDetermineDerivative.Add(dvCurrentParametersPoint - dvPartialParametersIncrement);
                dvParametersPointsToDetermineDerivative.Add(dvCurrentParametersPoint + dvPartialParametersIncrement);
                NevillePolynomialInterpolation interpolator = new NevillePolynomialInterpolation(
                    dvParametersPointsToDetermineDerivative.ConvertAll <double>(dv => dv[varIndex]).ToArray(),
                    dvParametersPointsToDetermineDerivative.ConvertAll <double>(dv => theFunction(dv)).ToArray());

                double prevPartialDeriv = interpolator.Differentiate(dvCurrentParametersPoint[varIndex]);

                int iNumberOfPointsBetween = 0;

                while (partialRelativeError > maxRelativeError)
                {
                    iNumberOfPointsBetween += 2;

                    List <DenseVector> dvCurrParametersPoints = new List <DenseVector>();
                    dvCurrParametersPoints.InsertRange(0, dvParametersPointsToDetermineDerivative);
                    for (int i = 1; i <= iNumberOfPointsBetween; i++)
                    {
                        dvCurrParametersPoints.Add(dvParametersPointsToDetermineDerivative[0] +
                                                   (dvParametersPointsToDetermineDerivative[1] -
                                                    dvParametersPointsToDetermineDerivative[0]) / (i + 1));
                    }
                    dvCurrParametersPoints.Sort(
                        (dv1, dv2) => (dv1[varIndex] < dv2[varIndex]) ? (-1) : (1));
                    NevillePolynomialInterpolation currInterpolator = new NevillePolynomialInterpolation(
                        dvCurrParametersPoints.ConvertAll <double>(dv => dv[varIndex]).ToArray(),
                        dvCurrParametersPoints.ConvertAll <double>(dv => theFunction(dv)).ToArray());

                    double currPartialDeriv = currInterpolator.Differentiate(dvCurrentParametersPoint[varIndex]);



                    #region // OBSOLETE
                    //currentVarIncrement = currentVarIncrement / 2.0d;
                    //if (Math.Abs(currentVarIncrement) / dvParametersScale[varIndex] < 1.0e-20)
                    //{
                    //    currentVarIncrement = currentVarIncrement * 2.0d;
                    //    break;
                    //}
                    //else if (Math.Abs(currentVarIncrement) / dvParametersScale[varIndex] > 1.0e+20)
                    //{
                    //    currentVarIncrement = currentVarIncrement / 2.0d;
                    //    break;
                    //}

                    //DenseVector gradPartial = DenseVector.Create(dvCurrentParametersPoint.Count, new Func<int, double>((index) =>
                    //{
                    //    if (index != varIndex) return 0.0d;
                    //    DenseVector dvPartialParametersIncrement = DenseVector.Create(dvCurrentParametersIncrement.Count,
                    //        (i => (i == index) ? (currentVarIncrement) : (0.0d)));

                    //    return (theFunction(dvCurrentParametersPoint + dvPartialParametersIncrement) -
                    //                           theFunction(dvCurrentParametersPoint)) / currentVarIncrement;
                    //}));
                    //
                    //DenseVector gradPartialHalfed = DenseVector.Create(dvCurrentParametersPoint.Count, new Func<int, double>((index) =>
                    //{
                    //    if (index != varIndex) return 0.0d;
                    //    DenseVector dvPartialParametersIncrement = DenseVector.Create(dvCurrentParametersIncrement.Count,
                    //        (i => (i == index) ? (currentVarIncrement / 2.0d) : (0.0d)));

                    //    return (theFunction(dvCurrentParametersPoint + dvPartialParametersIncrement) -
                    //                           theFunction(dvCurrentParametersPoint)) / (currentVarIncrement / 2.0d);
                    //}));

                    //double gradPartialModule = gradPartial.Abs();
                    //double gradPartialHalfedModule = gradPartialHalfed.Abs();
                    //if ((gradPartialModule == 0.0d) || (gradPartialHalfedModule == 0.0d))
                    //{
                    //    currentVarIncrement = currentVarIncrement * 2.0d;
                    //    break;
                    //}

                    // (gradPartial - gradPartialHalfed).Abs() / gradPartial.Abs();
                    #endregion // OBSOLETE

                    partialRelativeError = Math.Abs((currPartialDeriv - prevPartialDeriv) / prevPartialDeriv);
                    prevPartialDeriv     = currPartialDeriv;
                    dvCurrentParametersIncrement[varIndex] = currentVarIncrement / (iNumberOfPointsBetween + 2);


                    lTplRelErrAndPartDeriv.Add(new Tuple <double, double, int>(partialRelativeError, currPartialDeriv, iNumberOfPointsBetween));
                    if (partialRelativeError / lTplRelErrAndPartDeriv.Min(tpl => tpl.Item1) > maxRelPartialDerivAboveMin)
                    {
                        prevPartialDeriv = lTplRelErrAndPartDeriv.Min(tpl => tpl.Item2);
                        dvCurrentParametersIncrement[varIndex] = currentVarIncrement / (lTplRelErrAndPartDeriv.Min(tpl => tpl.Item3) + 2);
                        break;
                    }

                    if (SelfWorker != null)
                    {
                        if (SelfWorker.CancellationPending)
                        {
                            break;
                        }
                    }
                }
                grad[varIndex] = prevPartialDeriv;
            }



            #region // OBSOLETE
            //grad = DenseVector.Create(dvCurrentParametersPoint.Count, new Func<int, double>((index) =>
            //{
            //    DenseVector dvPartialParametersIncrement = DenseVector.Create(dvCurrentParametersIncrement.Count,
            //        (i => (i == index) ? (dvCurrentParametersIncrement[i]) : (0.0d)));
            //    return (theFunction(dvCurrentParametersPoint + dvPartialParametersIncrement) -
            //                           theFunction(dvCurrentParametersPoint - dvPartialParametersIncrement)) / (2.0d*dvPartialParametersIncrement.Sum());
            //}));
            #endregion // OBSOLETE

            dvNewParametersIncrement = DenseVector.OfEnumerable(dvCurrentParametersIncrement);
            dvNewParametersIncrement = (grad / grad.Abs()) * dvNewParametersIncrement.Abs();

            return(grad);
        }