МИНОБРНАУКИ РФ Федеральное Государственное бюджетное учреждение высшего профессионального образования. Кафедра: Программная инженерия Лабораторная работа №7 Вариант №2 Выполнил студент 2 курса ПИН-1206 Волнухин Виктор Проверил: Грязнов Евгений Николаевич Тверь 2013 Задание. 1. Напишите программу, реализующую интерполяцию функции кусочно-линейным методом. 2. Напишите программу, реализующую интерполяцию функции полиномом Ньютона (по вариантам: 1 вариант – полином Ньютона для интерполирования вперед, 2 вариант – полином Ньютона для интерполирования назад). Замечания по реализации: 1. В качестве интерполяционной сетки использовать следующую таблицу: х 0 1 2 3 4 5 F(x) 0 0,8415 0,9093 0,1411 -0,7568 -0,9589 6 -0,2794 2. Входным параметром программы должно быть произвольное значение аргумента, расположенное между левой и правой границей сетки интерполяции, выходными данными – рассчитанное значение функции для этого аргумента. Теория: Лине́йная интерполя́ция — интерполяция алгебраическим двучленом P1(x) = ax + b функции f, заданной в двух точках x0 и x1 отрезка [a, b]. В случае, если заданы значения в нескольких точках, функция заменяется кусочно-линейной функцией. Геометрическая интерпретация Геометрически это означает замену графика функции прямой, проходящей через точки и . Уравнение такой прямой имеет вид: отсюда для Это и есть формула линейной интерполяции, при этом где — погрешность формулы: Справедлива оценка Интерполяционный полином Ньютона имеет вид: . Легко видеть, что полином (2) полностью удовлетворяет требованиям поставленной задачи. Действительно, во-первых, степень полинома выше , во-вторых, и Заметим, что при функции : , . формула (2) превращается в ряд Тейлора для . (2) не Для практического использования интерполяционную формулу Ньютона (2) обычно записывают в несколько преобразованном виде. Для этого введём новую переменную , по формуле ; тогда получим: (3) где представляет собой число шагов, необходимых для достижения точки , исходя из точки . Это и есть окончательный вид интерполяционной формулы Ньютона. Формулу (3) выгодно использовать для интерполирования функции в окрестности начального значения абсолютной величине. , где мало по Если дана неограниченная таблица значений функции , то число в интерполяционной формуле (3) может быть любым. Практически в этом случае число выбирают так, чтобы разность была постоянной с заданной степенью точности. За начальное значение можно принимать любое табличное значение аргумента . Если таблица значений функции конечна, то число ограничено, а именно: не может быть больше числа значений функции , уменьшенного на единицу. Заметим, что при применении первой интерполяционной формулы Ньютона удобно пользоваться горизонтальной таблицей разностей, так как тогда нужные значения разностей функции находятся в соответствующей горизонтальной строке таблицы. Код программы: Основная часть: private void button1_Click(object sender, EventArgs e) { try { // Значение x double x = Convert.ToDouble(ValueX.Text); // Начало отрезка int X1 = Convert.ToInt16(ValueX1.Text); // Конец отрезка int X2 = Convert.ToInt16(ValueX2.Text); if (X1 > X2) { MessageBox.Show("Начальный отрезок не может быть больше конечного", "Ошибка!"); return; } if (x > 6 && x < 0) { MessageBox.Show("x выходит за предел допустимых значений", "Ошибка!"); return; } piecewise_linear f = new piecewise_linear(x, X1, X2); ValueY1.Text = f.Find().ToString(); } catch { MessageBox.Show("Неверный формат.", "Ошибка!"); } try { // Значение x double x = Convert.ToDouble(Xvalue.Text); // Точность exp double h = Convert.ToDouble(ValueExp.Text); if (h < 0) { MessageBox.Show("Шаг не может быть отрицательным", "Ошибка!"); return; } Polinom_of_Newton f = new Polinom_of_Newton(h, x); ValueY2.Text = f.Find().ToString(); } catch { MessageBox.Show("Неверный формат.", "Ошибка!"); } } Класс, отвечающий за кусочно-линейный метод: class piecewise_linear { private double fx1, fx2; private double y; private double x; private int X1, X2; public piecewise_linear(double x, int X1, int X2) { this.x = x; this.X1 = X1; this.X2 = X2; } /// <summary> /// метод реализации интерполяции функции /// </summary> /// <returns>Значение функции в точке x</returns> public double Find() { switch (X1) { case 0: { fx1 = 0; break; } case 1: { fx1 = 0.8415; break; } case 2: { fx1 = 0.9093; break; } case 3: { fx1 = 0.1411; break; } case 4: { fx1 = -0.7568; break; } case 5: { fx1 = -0.9589; break; } case 6: { fx1 = -0.2794; break; } } switch (X2) { case 0: { fx2 = 0; break; } case 1: { fx2 = 0.8415; break; } case 2: { fx1 = 0.9093; break; } case 3: { fx2 = 0.1411; break; } case 4: { fx2 = -0.7568; break; } case 5: { fx2 = -0.9589; break; } case 6: { fx2 = -0.2794; break; } } y = fx1 + (x - X1) * (fx2 - fx1) / (X2 - X1); return y; } Класс, отвечающий за полином Ньютона: /// <summary> /// Класс интерполяции функции с помощью полинома Ньютона (1 Вариант) /// </summary> class Polinom_of_Newton { private double y, t; private double x, h; public Polinom_of_Newton(double h, double x) { this.x = x; this.h = h; } /// <summary> /// метод реализации интерполяции функции /// </summary> /// <returns>Значение функции в точке x</returns> public double Find() { t = (x - 0) / h; y = 0 + 0.8415 * t - 0.38685 * t * (t - 1) - 0.0105 * t * (t - 1) * (t - 2); return y; } } Пользовательский интерфейс: Оглавление Задание. .................................................................................................................................................... 2 Теория: ........................................................................................................................................3 Код программы: .........................................................................................................................5 Пользовательский интерфейс: ..................................................................................................8