МИНОБРНАУКИ РФ Федеральное Государственное бюджетное учреждение высшего профессионального образования. Кафедра: Программная инженерия Лабораторная работа №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. Входным параметром программы должно быть произвольное значение аргумента, расположенное между левой и правой границей сетки интерполяции, выходными данными – рассчитанное значение функции для этого аргумента. Теория: Кусочно-линейная функция — функция, определённая на множестве вещественных чисел, линейная на каждом из интервалов, составляющих область определения. Пусть заданы — точки смены формул. Как и все кусочно-заданные функции, кусочно-линейную функцию обычно задают на каждом из интервалов отдельной формулой. Записывают это в виде: Если к тому же выполнены условия согласования при , то кусочно-линейная функция будет непрерывной. Непрерывная кусочно-линейная функция называется также линейным сплайном. Интерполяционные формулы Ньютона — формулы вычислительной математики, применяющиеся для полиномиального интерполирования. Если узлы интерполяции равноотстоящие и упорядочены по величине, так что , то есть многочлен можно записать в форме Ньютона. , то интерполяционный Интерполяционные полиномы в форме Ньютона удобно использовать, если точка интерполирования находится вблизи начала (прямая формула Ньютона) или конца таблицы (обратная формула Ньютона). В случае равноудаленных центров интерполяции, находящихся на единичном расстоянии друг от друга, справедлива формула: где — обобщенные на область действительных чисел биномиальные коэффициенты. Код программы: Основная часть: public partial class Form1 : Form { public Form1() { InitializeComponent(); y1.Visible = false; label2.Visible = false; label8.Visible = false; y2.Visible = false; label9.Visible = false; label10.Visible = false; } private void button1_Click(object sender, EventArgs e) { try { double x = Convert.ToDouble(textBox1.Text); double h = 213862146124124;//чтобы избежать ошибок... if (x > 6 || x < 0) { MessageBox.Show("x выходит из интервала!!!"); return; } Newton_Picewise c = new Newton_Picewise(x,h); y1.Text = c.Piecewise().ToString(); y1.Visible = true; label2.Visible = true; label9.Visible = true; } catch(Exception exp) { MessageBox.Show("ОШИБКА!!!"+exp.Message); } } private void button2_Click(object sender, EventArgs e) { try { // Значение x double x = double.Parse(textBox1.Text); if (x > 6 || x < 0) { MessageBox.Show("x выходит из интервала!!!"); return; } // Точность exp double h = double.Parse(textBox4.Text); if (h < 0) { MessageBox.Show("ОШИБКА!!!h должен быть положителен!!!"); return; } Newton_Picewise c = new Newton_Picewise(x,h); y2.Text = c.Newton().ToString(); y2.Visible = true; label8.Visible = true; label10.Visible = true; } catch(Exception exp) { MessageBox.Show("ОШИБКА!!!"+exp.Message); } } private void Form1_Load(object sender, EventArgs e) { } } Класс, отвечающий за решение интеграла разными методами: class Newton_Picewise { private double f1, f2,t,h; private double y; private double x; public Newton_Picewise(double x,double h) { this.x = x; this.h = h; } //Кусочно-линейный метод public double Piecewise() { int X1 = Convert.ToInt32(x); int X2 = 6; if (x == 6) { X1 = 5; } } switch (X1) { case 0: { f1 = 0; break; } case 1: { f1 = 0.8415; break; } case 2: { f1 = 0.9093; break; } case 3: { f1 = 0.1411; break; } case 4: { f1 = -0.7568; break; } case 5: { f1 = -0.9589; break; } case 6: { f1 = -0.2794; break; } } switch (X2) { case 0: { f2 = 0; break; } case 1: { f2 = 0.8415; break; } case 2: { f2 = 0.9093; break; } case 3: { f2 = 0.1411; break; } case 4: { f2 = -0.7568; break; } case 5: { f2 = -0.9589; break; } case 6: { f2 = -0.2794; break; } } y = f1 + (x - X1) * (f2 - f1) / (X2 - X1); return y; } //полином Ньютона public double Newton() { t = (x - 0) / h; y = 0 + 0.8415 * t - 0.38685 * t * (t - 1) - 0.0105 * t * (t - 1) * (t - 2); return y; } } Пользовательский интерфейс: