МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота №3
Тема:
«Інтерполяція функцій»
Завдання:
Для функції, заданої таблично, побудувати інтерполяційний многочлен Ньютона через розділені різниці і обчислити її значення у точках , , .
Функція С
0,0
0,00000
0,5
1,71828
0,1
0,22140
0,6
2,32011
0,2
0,49182
0,7
3,05519
0,3
0,82211
0,8
3,95303
0,4
1,22554
0,9
5,04964
Точки інтерполяції
№
8
0,087
0,441
0,777
Короткі теоретичні відомості:
Найпростіша задача наближення функції полягає у наступному. В дискретні моменти часу спостерігаються (відомі) значення функції ; необхідно знайти її значення при інших .
За означенням розділена різниця нульового порядку від функції по одному вузлу збігається з значенням функції . Розділені різниці першого порядку визначаються рівністю: ,
різниці другого порядку рівністю:
і т.д. Розділені різниці -го порядку визначаються через різниці порядку за формулою:
.
Лема. Справджується рівність
.
Якщо інтерполяційний многочлен для функції , то його значення у вузлах збігається із значенням функції , а отже, збігаються і розділені різниці, тому інтерполяційний многочлен для функції можна записати у вигляді:
(1)
Такий запис інтерполяційного многочлена називають інтерполяційним многочленом у формі Ньютона, а формулу (1) – інтерполяційною формулою Ньютона. Якщо відомі розділені різниці (таблиця розділених різниць), то многочлен Ньютона зручно обчислювати за схемою Горнера:
(2)
Неважко помітити, що коли покласти , то . Це рекурентне співвідношення легко програмується.
Код програми:
#include <iostream.h>
#define k 10
const double X[k] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
const double F[k] = {0.00000, 0.22140, 0.49182, 0.82211, 1.22554,
1.71828, 2.32011, 3.05519, 3.95303, 5.04964};
const double x1 = 0.087,
x2 = 0.441,
x3 = 0.777;
double Rozd_Rizn[k];
void Calc_Rozd_Rizn();
double Calc_Func(double);
void main()
{
cout<<" x\t F(x)\n";
for(int i = 0; i < k; i++)
cout<<X[i]<<"\t"<<F[i]<<endl;
cout<<"x1 = "<<x1<<endl
<<"x2 = "<<x2<<endl
<<"x3 = "<<x3<<endl;
Calc_Rozd_Rizn();
//for(i = 0; i < k; i++)
// cout<<Rozd_Rizn[i]<<endl;
cout<<endl;
cout<<"f(x1) = "<<Calc_Func(x1)<<endl
<<"f(x2) = "<<Calc_Func(x2)<<endl
<<"f(x3) = "<<Calc_Func(x3)<<endl;
}
void Calc_Rozd_Rizn()
{
for(int i = 0; i < k; i++)
{
Rozd_Rizn[i] = 0;
for(int j = 0; j < i + 1; j++)
{
double temp = 1;
for(int l = 0; l < i + 1; l++)
if(l != j) temp = temp * (X[j] - X[l]);
Rozd_Rizn[i] += F[j] / temp;
}
}
}
double Calc_Func(double x)
{
double Ln = 0;
for(int i = 1; i < k + 1; i++)
Ln = (x - X[k - i]) * Ln + Rozd_Rizn[k - i];
return Ln;
}
Результат виконання програми:
/
Висновок:
В процесі виконання даної лабораторної роботи я побудував інтерполяційний многочлен Ньютона через розділені різниці для функції, заданої таблично. Так чином побудувавши многочлен Ньютона я мав змогу приблизно обчислювати значення функції в будь-якій точці на інтервалі, і обчислив значення функції в точках , , .