mathmethods_7x

advertisement
МИНОБРНАУКИ РФ
Федеральное Государственное бюджетное
учреждение высшего профессионального образования.
Кафедра: Программная инженерия
Лабораторная работа №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;
}
}
Пользовательский интерфейс:
Download