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); }