Министерство образования и науки РФ Высшего профессионального учреждения Тверской государственный технический университет Кафедра : «Программное обеспечение» Лабораторная работа № 7 по курсу «Методы вычислений» Выполнил: Студент второго курса Группа ПИН-1106 Кузнецов Д.А.. Проверил: Виноградов С.Ю. Тверь 2012 Задание 1. Напишите программу, реализующую интерполяцию функции кусочно-линейным методом. 2. Напишите программу, реализующую интерполяцию функции полиномом Ньютона (по вариантам: 1 вариант – полином Ньютона для интерполирования вперед, 2 вариант – полином Ньютона для интерполирования назад). Замечания по реализации: 1. В качестве интерполяционной сетки использовать следующую таблицу: х 0 1 2 3 4 F(x) 0 0,8415 0,9093 0,1411 -0,7568 5 -0,9589 6 -0,2794 2. Входным параметром программы должно быть произвольное значение аргумента, расположенное между левой и правой границей сетки интерполяции, выходными данными – рассчитанное значение функции для этого аргумента. Теория. Лине́йная интерполя́ция — интерполяция алгебраическим двучленом P1(x) = ax + b функции f, заданной в двух точках x0 и x1 отрезка [a, b]. В случае, если заданы значения в нескольких точках, функция заменяется кусочно-линейной функцией. Геометрическая интерпретация Геометрически это означает замену графика функции точки и . Уравнение такой прямой имеет вид: отсюда для Это и есть формула линейной интерполяции, при этом где — погрешность формулы: Справедлива оценка прямой, проходящей через Интерполяционный полином Ньютона имеет вид: . (2) Легко видеть, что полином (2) полностью удовлетворяет требованиям поставленной задачи. Действительно, во-первых, степень полинома и Заметим, что при не выше , , во-вторых, . формула (2) превращается в ряд Тейлора для функции : . Для практического использования интерполяционную формулу Ньютона (2) обычно записывают в несколько преобразованном виде. Для этого введём новую переменную по формуле ; тогда получим: , где (3) представляет собой число шагов, необходимых для достижения точки исходя из точки Ньютона. , . Это и есть окончательный вид интерполяционной формулы Формулу (3) выгодно использовать для интерполирования функции окрестности начального значения , где в мало по абсолютной величине. Если дана неограниченная таблица значений функции , то число в интерполяционной формуле (3) может быть любым. Практически в этом случае число выбирают так, чтобы разность начальное значение была постоянной с заданной степенью точности. За можно принимать любое табличное значение аргумента Если таблица значений функции конечна, то число может быть больше числа значений функции . ограничено, а именно: , уменьшенного на единицу. Заметим, что при применении первой интерполяционной формулы Ньютона удобно пользоваться горизонтальной таблицей разностей, так как тогда нужные значения разностей функции находятся в соответствующей горизонтальной строке таблицы. не Реализация using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace Lab7 { class Methods { /// <summary> /// Кусочно-линейный метод /// </summary> /// <param name="x">значение аргумента</param> /// <returns>значение функции в этой точке</returns> public static double KusLin(double x,double[,]web) { double y=0; int k = 0; k = Other_tools.index(x, web); y = (web[k + 1, 1] - web[k, 1]) / (web[k + 1, 0] - web[k, 0]) * (x - web[k, 0]) + web[k, 1]; return y; } /// <summary> /// Интерполяция методом Ньютона /// </summary> /// <param name="x">Значение аргумента</param> /// <param name="web">Сетка функции</param> /// <returns>Значение функции</returns> public static double Newton(double x, double[,] web) { /* double y = web[0, 1]; int k = 0; k = Other_tools.index(x, web); double h = 0.0001;//шаг чтоль? double t =(x- web[k,0])/h; double tt=t; int n = web.GetLength(0); //n не может быть больше кол-ва значений в таблице уменьшенном на единицу for (int i = 1; i < n; i++) { double a1 = tt / Other_tools.fact(i); double a2 = Other_tools.razn(web, i); y += a1 * a2; // y += tt/Other_tools.fact(i)*Other_tools.razn(web,i); tt = tt*(t - i); */ double h = 1; double t = x/h; double y; y = 0 + 0.8415 * t - 0.35985 * t * (t - 1) - 0.263783 * t * (t -1) * (t 2); return y; } } /// <summary> /// Вспомогательные функции /// </summary> public static class Other_tools { public static int index(double x,double[,]web) { int k = 0; //Определение интервала for (int i = 1; i < web.GetLength(0); i++) { if (x > web[i, 0] && x < web[web.GetLength(0) - 1, 0]) k++; } return k; } /// <summary> /// Найти конечную разность любого порядка /// </summary> /// <param name="y1">Значение y</param> /// <param name="y2">второе значение y</param> /// <param name="n">Порядок</param> /// <returns>Конечная разность</returns> public static double razn(double [,]web, int n) { double d_y=0; for (int i = 0; i < n; i++) { double tmp = web[n - i, 1]; // d_y+=Math.Pow(-1,i)*Other_tools.bin_coeff(i,n)*web[n-i-1,1]; d_y += Math.Pow(-1, i) * Other_tools.bin_coeff(i, n) * tmp; } return d_y; } /// <summary> /// Вычислить факториал /// </summary> /// <param name="n">Степень факториала</param> /// <returns>Значение</returns> public static int fact(int n) { int k = 1; for (int i = 1; i <= n; i++) k *= i; return k; } /// <summary> /// Биноминальный коэффициент /// </summary> /// <param name="n"></param> /// <returns></returns> public static double bin_coeff(int n,int k) { double ff = fact(n) / (fact(k) * fact(Math.Abs( n - k))); return ff; } } }