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