lab7x - Кафедра ПО

advertisement
Министерство образования науки РФ.
Высшего профессионального учреждения
Тверского государственный технический университет.
Кафедра программного обеспечения.
Методы вычислений
Лабораторная работа №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;
}
}
}
Download