示例#1
0
        /// <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));
        }
示例#2
0
        /// <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();
 }
示例#6
0
        /// <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);
            }
示例#8
0
 /// <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));
 }