/// <summary>
 /// Создание квадратурной формулы
 /// </summary>
 /// <param name="n">Количество точек</param>
 /// <param name="a">Левая граница</param>
 /// <param name="b">Правая граница</param>
 /// <param name="function">Функция</param>
 /// <param name="weights">Функция, возвращающая k-ый момент весовой функции</param>
 /// <param name="method">Ньютон-Котес (равноотстоящие узлы) или Гаусс</param>
 /// <param name="type">Простая либо составная квадратурная формула</param>
 /// <param name="parts">Количество участков разбиения составной квадратурной формулы</param>
 public QuadratureFormulas(int n, double a, double b, Function function, WeightFunction weights, QFMethod method, QFType type, int parts = 10)
 {
     this.left     = a;
     this.right    = b;
     this.weights  = weights;
     this.N        = n;
     this.function = function;
     this.type     = type;
     this.method   = method;
     this.parts    = parts;
     SetPolynomialSolver((x, left, right) => Poly.RootsFinding(x, left, right, 1000, 1E-15));
     SetSystemSolver(Infrastructure.GaussSolve);
 }
示例#2
0
        public static double NewtonRaphsonMethod(double[] polynomial, double a, double b, double epsilon, int maxIteration)
        {
            int    i          = 0;
            var    derivative = Derivative(polynomial);
            double f0         = Poly.Evaluate(polynomial, a);
            double x          = a;

            while (Math.Abs(Poly.Evaluate(polynomial, x)) > epsilon)
            {
                x -= f0 / Poly.Evaluate(derivative, x);
                f0 = Poly.Evaluate(polynomial, x);
                i++;
                if (i >= maxIteration)
                {
                    return(double.NaN);
                }
            }
            return(x);
        }
示例#3
0
        public static double BisectionMethod(double[] polynomial, double a, double b, double epsilon)
        {
            double x1 = a;
            double x2 = b;
            double fb = Poly.Evaluate(polynomial, b);

            while (Math.Abs(x2 - x1) > epsilon)
            {
                double midpt = 0.5 * (x1 + x2);
                if (fb * Poly.Evaluate(polynomial, midpt) > 0)
                {
                    x2 = midpt;
                }
                else
                {
                    x1 = midpt;
                }
            }
            return(x2 - (x2 - x1) * Poly.Evaluate(polynomial, x2) / (Poly.Evaluate(polynomial, x2) - Poly.Evaluate(polynomial, x1)));
        }