Esempio n. 1
0
        public static IEnumerable <Node> GetApproximatedPlotDataPoints(IFunction fun, Interval interval, int nodeCount,
                                                                       ApproximationCriterium mode, out Polynomial approx)
        {
            var nodes = new List <Node>();

            nodes.MakeNodes(interval, nodeCount);

            var approximatingPolynomial = new Polynomial();

            if (mode is ApproximationByPolynomialLevel)
            {
                var level = ((ApproximationByPolynomialLevel)mode).Level;
                fun.EnableWeight        = false;
                approximatingPolynomial = mode.UseCotes
                    ? GetApproxPolynomial(fun, level, NewNewtonCotes)
                    : GetApproxPolynomial(fun, level, LaguerreIntegration);
            }
            else
            {
                var i     = 1;
                var eps   = ((ApproximationByAccuracy)mode).Accuracy;
                var cache = new Dictionary <double, Polynomial>();
                Func <IFunction, int, double> integratorFunc;
                if (mode.UseCotes)
                {
                    integratorFunc = NewNewtonCotes;
                }
                else
                {
                    integratorFunc = LaguerreIntegration;
                }
                while (i++ < 20)
                {
                    approximatingPolynomial = GetApproxPolynomial(fun, i, integratorFunc);
                    var error = GetError(fun, approximatingPolynomial);
                    if (error <= eps)
                    {
                        break;
                    }
                    cache.Add(error, new Polynomial {
                        Coefficients = approximatingPolynomial.Coefficients
                    });
                }
                if (i == 21)
                {
                    approximatingPolynomial = cache.OrderBy(x => x.Key).First().Value; //choose lowest error
                }
            }

            approx = approximatingPolynomial;
            foreach (var t in nodes)
            {
                t.Y = approx.GetValue(t.X);
            }
            return(nodes);
        }