Министерство образования науки РФ. Высшего профессионального учреждения Тверского государственный технический университет. Кафедра программного обеспечения. Методы вычислений Лабораторная работа №7 1 вариант выполнил студент группы ПИН 1106 Александренков А.Ю. проверил Грязнов Е. Н. Виноградов С. Ю. Тверь,2012 Задание: 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) может быть любым. Практически в этом случае число выбирают так, чтобы разность была постоянной с заданной степенью точности. За начальное значение можно принимать любое табличное значение аргумента . Если таблица значений функции конечна, то число ограничено, а именно: не может быть больше числа значений функции , уменьшенного на единицу. Заметим, что при применении первой интерполяционной формулы Ньютона удобно пользоваться горизонтальной таблицей разностей, так как тогда нужные значения разностей функции находятся в соответствующей горизонтальной строке таблицы. Листинг Form using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; ClassLibrary; namespace ClassLibrary { public partial class About7 : Form { public About7() { InitializeComponent(); Text = "Alex #7"; } private void button1_Click(object sender, EventArgs e) { try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); string Расчет; //задание директории в которой располагается изначальная программа Расчет = System.Windows.Forms.Application.StartupPath.ToString(); //задание параметров запускаемой программы proc.StartInfo.FileName = Расчет + "\\7.docx"; proc.StartInfo.WorkingDirectory = Расчет + "\\7.docx"; //запуск программы proc.Start(); } catch { MessageBox.Show("Ненайден файл !"); } } private void button1_Click_1(object sender, EventArgs e) { if (OneMetod.Checked == true) { try { TextBox3.Visible = true; label1.Text = "Начальный X"; label2.Text = "Конечный X"; double x = Convert.ToDouble(TextBox3.Text); int x_1 = Convert.ToInt32(TextBox1.Text); int x_2 = Convert.ToInt32(textBox2.Text); if (x_1 < 0) { MessageBox.Show("X вышел за границу"); return; } if (x_2 > 6) { MessageBox.Show("X вышел за границу"); return; } if (x_1 > x_2) { MessageBox.Show("Начальный отрезок не может быть больше конечного"); return; } if (x > 6 && x < 0) { MessageBox.Show("x выходит за предел допустимых значений"); return; } Kusoshlin fp = new Kusoshlin(x, x_1, x_2); Ytxt.Text = fp.naiti().ToString(); } catch { MessageBox.Show("Неверный формат."); } } if (TwoMetod.Checked == true) { try { TextBox3.Visible = false; label1.Text = "Значение X"; label2.Text = "Шаг h"; double x = Convert.ToDouble(TextBox1.Text); double h = Convert.ToDouble(textBox2.Text); if (h < 0) { MessageBox.Show("Шаг не может быть отрицательным"); return; } Polinomnjutona fp2 = new Polinomnjutona(h, x); Ytxt.Text = fp2.Look().ToString(); } catch { MessageBox.Show("Неверный формат."); } } } private void KLM_CheckedChanged_1(object sender, EventArgs e) { if (OneMetod.Checked == true) { lablel3.Visible = true; TextBox3.Visible = true; label1.Text = "Начальный X"; label2.Text = "Конечный X"; } } private void PNIV_CheckedChanged_1(object sender, EventArgs e) { if (TwoMetod.Checked == true) { lablel3.Visible = false; TextBox3.Visible = false; label1.Text = "Значение X"; label2.Text = "Шаг h"; } } } } Листинг Dll using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace ClassLibrary { public class Kusoshlin { private private private private double fx1, fx2; double y; double x; int X1, X2; public Kusoshlin(double x, int X1, int X2) { this.x = x; this.X1 = X1; this.X2 = X2; } public double naiti() { switch (X1) { case 0: { fx1 = } case 1: { fx1 = } case 2: { fx1 = } case 3: { fx1 = } case 4: { fx1 = } case 5: { fx1 = } case 6: { fx1 = } } switch (X2) 0; break; 0.8415; break; 0.9093; break; 0.1411; break; -0.7568; break; -0.9589; break; -0.2794; break; { 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; } } public class Polinomnjutona { private double y, t; private double x, h; public Polinomnjutona(double h, double x) { this.x = x; this.h = h; } public double Look() { t = (x - 0) / h; y = 0 + 0.8415 * t - 0.38685 * t * (t - 1) - 0.0105 * t * (t - 1) * (t 2); return y; } } }