/// <summary> /// Показать информацию о интерполяции указанной функции методами класса полиномов /// </summary> /// <param name="f"></param> /// <param name="c">Массив абцисс узлов интерполяции</param> /// <param name="a">Начало отрезка с узлами</param> /// <param name="b">Конец отрезка с узлами</param> /// <param name="p">Степень числителя у рациональной функции</param> /// <param name="q">Степень знаменателя у рациональной функции</param> /// <param name="bq">Старший коэффициент знаменателя рациональной функции</param> public static void PolynomTestShow(Func <double, double> f, double[] c, double a = 0, double b = 0, int p = 1, int q = -1, double bq = 1) { if (a == 0 && b == 0) { a = c[0]; b = c[c.Length - 1]; } if (q == -1) { q = c.Length - 1 - p; } Point[] P = Point.Points(f, c); Console.WriteLine("Набор узлов интерполяции:"); Point.Show(P); Polynom l = Polynom.Lag(P);//l.Show(); Polynom n = Polynom.Neu(P); Func <double, double> cu = Polynom.CubeSpline(P); Func <double, double> r = Polynom.R(P, p, q, bq); Console.WriteLine("Погрешности в равномерной норме:"); Console.WriteLine("У полинома Лагранжа {0}", FuncMethods.RealFuncMethods.NormDistanceС(f, l.Value, a, b)); Console.WriteLine("У полинома Ньютона {0}", FuncMethods.RealFuncMethods.NormDistanceС(f, n.Value, a, b)); Console.WriteLine("У рациональной функции {0}", FuncMethods.RealFuncMethods.NormDistanceС(f, r, a, b)); Console.WriteLine("У кубического сплайна {0}", FuncMethods.RealFuncMethods.NormDistanceС(f, cu, a, b)); Console.WriteLine(); Console.WriteLine("Погрешности в интегральной норме:"); Console.WriteLine("У полинома Лагранжа {0}", FuncMethods.RealFuncMethods.NormDistance(f, l.Value, a, b)); Console.WriteLine("У полинома Ньютона {0}", FuncMethods.RealFuncMethods.NormDistance(f, n.Value, a, b)); Console.WriteLine("У рациональной функции {0}", FuncMethods.RealFuncMethods.NormDistance(f, r, a, b)); Console.WriteLine("У кубического сплайна {0}", FuncMethods.RealFuncMethods.NormDistance(f, cu, a, b)); }
/// <summary> /// Оценить погрешность интерполяционного полинома (Лагранжа) в точке при константе /// </summary> /// <param name="f">Интерполируемая функция</param> /// <param name="n">Стень полинома</param> /// <param name="a">Начало отрезка интерполирования</param> /// <param name="b">Конец отрезка интерполяции</param> /// <param name="x">Точка, в которой оценивается погрешность</param> /// <param name="Mn">Константа в погрешности</param> public static void LagEstimateErr(Func <double, double> f, int n, double a, double b, double x, double Mn = 0) { if (Mn <= 0) { double[] y = Point.PointsX(f, n, a, b); double q = Expendator.Min(y); double y1 = Math.Min(q, x); q = Expendator.Max(y); double y2 = Math.Max(q, x); //double e = y1 + (y2 - y1) / 2;//середина отрезка //Mn = Math.Abs(f(e)); Mn = FuncMethods.RealFuncMethods.NormC(f, y1, y2); } Polynom p = new Polynom(f, n, a, b); Console.WriteLine("Узлы интерполяции: "); Point.Show(Point.Points(f, n, a, b)); Console.WriteLine("Полученный полином: "); p.Show(); Console.WriteLine($"Значение полинома в точке {x} = {p.Value(x)}"); Console.WriteLine($"Значение функции в точке {x} = {f(x)}"); double t = Math.Abs(p.Value(x) - f(x)); Console.WriteLine($"Абсолютная величина погрешности в точке {x} = {t}"); Console.WriteLine($"Оценка погрешности при Mn = {Mn}: {t} <= {wn(f, n, a, b, x, Mn)}"); }
/// <summary> /// Генерация сеточной функции по точкам от действительной функции /// </summary> /// <param name="f">Действительная функция</param> /// <param name="n">Число точек</param> /// <param name="a">Начало отрезка интерполяции</param> /// <param name="b">Конец отрезка интерполяции</param> public NetFunc(Func <double, double> f, int n, double a, double b) { Point[] P = Point.Points(f, n, a, b); this.Knots = new List <Point>(); for (int i = 0; i < P.Length; i++) { this.Knots.Add(P[i]); } }
/// <summary> /// Генерация сеточной функции по действительной фунции и набору абцисс /// </summary> /// <param name="f"></param> /// <param name="c"></param> public NetFunc(Func <double, double> f, double[] c) { Point[] P = Point.Points(f, c); this.Knots = new List <Point>(); for (int i = 0; i < P.Length; i++) { this.Knots.Add(P[i]); } this.Refresh(); }
/// <summary> /// Генерация сеточной функции по массиву точек, расположенному в файле /// </summary> /// <param name="fs"></param> public NetFunc(StreamReader fs) { Point[] P = Point.Points(fs); this.Knots = new List <Point>(); for (int i = 0; i < P.Length; i++) { this.Knots.Add(P[i]); } this.Refresh(); }
/// <summary> /// Интерполяционный полином функции f с n+1 узлами интерполяции (значит, n-й степени) на отрезке от a до b /// </summary> /// <param name="f">Интерполируемая функция</param> /// <param name="n">Степень полинома</param> /// <param name="a">Начало отрезна интерполирования</param> /// <param name="b">Конец отрезка интерполирования</param> public Polynom(Func <double, double> f, int n, double a, double b) { Polynom p = new Polynom(Point.Points(f, n, a, b)); this.degree = p.degree; this.coef = new double[(int)(p.degree + 1)]; for (int k = 0; k <= this.degree; k++) { this.coef[k] = p.coef[k]; } }
/// <summary> /// Интерполяционная рациональная функция этой сеточной функции /// </summary> public Func <double, double> RatFunc(int p, int q) { if (this.R != null) { return(this.R); } Point[] P = Point.Points(this.Knots); Func <double, double> Pol = Polynom.R(P, p, q); this.R = Pol; return(Pol); }
/// <summary> /// Оценка погрешности метода /// </summary> /// <param name="f"></param> /// <param name="n"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="x"></param> /// <param name="Mn"></param> /// <returns></returns> private static double wn(Func <double, double> f, int n, double a, double b, double x, double Mn) { Point[] p = Point.Points(f, n, a, b); return(wn(p, x, Mn)); }