otchet_laba_7x - Кафедра ПО

advertisement
Министерство образования и науки РФ
Высшего профессионального учреждения
Тверской государственный технический университет
Кафедра : «Программное обеспечение»
Лабораторная работа № 7 по курсу «Методы вычислений»
Выполнил: Студент второго курса
Группа ПИН-1106
Кузнецов Д.А..
Проверил: Виноградов С.Ю.
Тверь 2012
Задание
1. Напишите программу, реализующую интерполяцию функции кусочно-линейным методом.
2. Напишите программу, реализующую интерполяцию функции полиномом Ньютона (по вариантам: 1
вариант – полином Ньютона для интерполирования вперед, 2 вариант – полином Ньютона для
интерполирования назад).
Замечания по реализации:
1. В качестве интерполяционной сетки использовать следующую таблицу:
х
0
1
2
3
4
F(x)
0
0,8415
0,9093
0,1411
-0,7568
5
-0,9589
6
-0,2794
2. Входным параметром программы должно быть произвольное значение аргумента, расположенное
между левой и правой границей сетки интерполяции, выходными данными – рассчитанное значение
функции для этого аргумента.
Теория.
Лине́йная интерполя́ция — интерполяция алгебраическим двучленом P1(x) = ax + b функции f, заданной в
двух точках x0 и x1 отрезка [a, b]. В случае, если заданы значения в нескольких точках, функция заменяется
кусочно-линейной функцией.
Геометрическая интерпретация
Геометрически это означает замену графика функции
точки
и
.
Уравнение такой прямой имеет вид:
отсюда для
Это и есть формула линейной интерполяции, при этом
где
— погрешность формулы:
Справедлива оценка
прямой, проходящей через
Интерполяционный полином Ньютона имеет вид:
.
(2)
Легко видеть, что полином (2) полностью удовлетворяет требованиям поставленной
задачи. Действительно, во-первых, степень полинома
и
Заметим, что при
не выше
,
, во-вторых,
.
формула (2) превращается в ряд Тейлора для функции
:
.
Для практического использования интерполяционную формулу Ньютона (2) обычно
записывают в несколько преобразованном виде. Для этого введём новую переменную
по формуле
; тогда получим:
,
где
(3)
представляет собой число шагов, необходимых для достижения точки
исходя из точки
Ньютона.
,
. Это и есть окончательный вид интерполяционной формулы
Формулу (3) выгодно использовать для интерполирования функции
окрестности начального значения
, где
в
мало по абсолютной величине.
Если дана неограниченная таблица значений функции , то число в интерполяционной формуле (3) может быть любым. Практически в этом случае число выбирают так, чтобы разность
начальное значение
была постоянной с заданной степенью точности. За
можно принимать любое табличное значение аргумента
Если таблица значений функции конечна, то число
может быть больше числа значений функции
.
ограничено, а именно:
, уменьшенного на единицу.
Заметим, что при применении первой интерполяционной формулы Ньютона удобно
пользоваться горизонтальной таблицей разностей, так как тогда нужные значения
разностей функции находятся в соответствующей горизонтальной строке таблицы.
не
Реализация
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace Lab7
{
class Methods
{
/// <summary>
/// Кусочно-линейный метод
/// </summary>
/// <param name="x">значение аргумента</param>
/// <returns>значение функции в этой точке</returns>
public static double KusLin(double x,double[,]web)
{
double y=0;
int k = 0;
k = Other_tools.index(x, web);
y = (web[k + 1, 1] - web[k, 1]) / (web[k + 1, 0] - web[k, 0]) * (x - web[k,
0]) + web[k, 1];
return y;
}
/// <summary>
/// Интерполяция методом Ньютона
/// </summary>
/// <param name="x">Значение аргумента</param>
/// <param name="web">Сетка функции</param>
/// <returns>Значение функции</returns>
public static double Newton(double x, double[,] web)
{
/*
double y = web[0, 1];
int k = 0;
k = Other_tools.index(x, web);
double h = 0.0001;//шаг чтоль?
double t =(x- web[k,0])/h;
double tt=t;
int n = web.GetLength(0);
//n не может быть больше кол-ва значений в таблице уменьшенном на единицу
for (int i = 1; i < n; i++)
{
double a1 = tt / Other_tools.fact(i);
double a2 = Other_tools.razn(web, i);
y += a1 * a2;
// y += tt/Other_tools.fact(i)*Other_tools.razn(web,i);
tt = tt*(t - i);
*/
double h = 1;
double t = x/h;
double y;
y = 0 + 0.8415 * t - 0.35985 * t * (t - 1) - 0.263783 * t * (t -1) * (t 2);
return y;
}
}
/// <summary>
/// Вспомогательные функции
/// </summary>
public static class Other_tools
{
public static int index(double x,double[,]web)
{
int k = 0;
//Определение интервала
for (int i = 1; i < web.GetLength(0); i++)
{
if (x > web[i, 0] && x < web[web.GetLength(0) - 1, 0])
k++;
}
return k;
}
/// <summary>
/// Найти конечную разность любого порядка
/// </summary>
/// <param name="y1">Значение y</param>
/// <param name="y2">второе значение y</param>
/// <param name="n">Порядок</param>
/// <returns>Конечная разность</returns>
public static double razn(double [,]web, int n)
{
double d_y=0;
for (int i = 0; i < n; i++)
{
double tmp = web[n - i, 1];
// d_y+=Math.Pow(-1,i)*Other_tools.bin_coeff(i,n)*web[n-i-1,1];
d_y += Math.Pow(-1, i) * Other_tools.bin_coeff(i, n) * tmp;
}
return d_y;
}
/// <summary>
/// Вычислить факториал
/// </summary>
/// <param name="n">Степень факториала</param>
/// <returns>Значение</returns>
public static int fact(int n)
{
int k = 1;
for (int i = 1; i <= n; i++)
k *= i;
return k;
}
/// <summary>
/// Биноминальный коэффициент
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static double bin_coeff(int n,int k)
{
double ff = fact(n) / (fact(k) * fact(Math.Abs( n - k)));
return ff;
}
}
}
Download