МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота №3
Тема:
«Дослідження похибки інтерполяції функцій многочленом Ньютона»
з курсу чисельні методи 1
Завдання:
Для функції заданої на рівномірній сітці в точках на інтервалі
знайти аналітичний вираз залишкового члена інтерполяційного многочлена;
обчислити йогомаксимальне значення і значення в точках ;
побудувати інтерполяційний многочлен Ньютона через розділені різниці;
обчислити похибки інтерполяції у точках і порівняти їх із значеннями залишкового члена.
N
2
4
0
Короткі теоретичні відомості
Замінюючи функцію інтерполяційним многочленом , ми припускаємо похибку , яка називається похибкою інтерполяції або, що те ж саме, залишковим членом інтерполяційної формули. Ясно, що у вузлах інтерполяції ця похибка дорівнює нулю.
Похибку інтерполяції можна подати у вигляді
,
де і залежить від x.
Звідси випливає оцінка
,
де ,
.
1. і 2. Знаходження аналітичного виразу залишкового члена інтерполяційного многочлена і обчислення його максимального значення і значення в точках за допомогою пакету Maple 12.
> /
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
> /
/
аналітичний вигляд многочлена
> /
/
його максимальне значення
> / x’
/
> /
/
Значення в точці x’
> / x’’
/
> /
/
Значення в точці x’’
> / x’’’
/
> /
/
Значення в точці x’’’
> /
3. і 4. Побудова інтерполяційого многчлена Ньютона і обчислення похибок інтерполяції в точках за допомогою мови програмування С++.
Код програми:
#include <iostream>
#include <math.h>
using namespace std;
double const pi = 3.1415926;
const int n = 4;
double f(double x);
double Gorner(double x, double A[n+1][n+2]);
void main()
{
int N = n+1;
double a = 0, b = pi/4;
double x1 = b/2.5,x2 = b/3,x3 = b/5;
//double X[n] = {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9};
//double F[n] = {0.00000,0.09983,0.19866,0.29552,0.38941,0.47942,0.56464,0.64421,0.71735,
// 0.78332};
double mat[n+1][n+2] = {0};
for (int i = 0; i < N; ++i)
{
mat[i][0] = ((b-a)*i)/n;
mat[i][1] = f(mat[i][0]);
}
for (int i =1; i < N; ++i)
{
for (int j =0; j < N-i;++j)
mat[j][i+1] = (mat[j+1][i] - mat[j][i])/(mat[j+i][0]-mat[j][0]);
}
cout << "\t\t\tRozdileni riznuci: \n";
for (int i = 2; i < N+1; ++i)
cout << mat [0][i] << "\t ";
cout << "\n\n\n";
cout << "\t\t\tMnogochlen Newtona:\n";
cout << "L(x) = " << mat[0][1];
for (int i = 2; i < n+1; ++i)
{
cout << " + (x - " << mat[i-2][0] << ") (" << mat[0][i];
}
for (int i = 2; i < N+1; ++i)
cout << ")";
cout << "\n";
cout << "\t\t Znachennja Funcii v tochkah x1, x2, x3:\n";
cout <<"L[" << x1 << "] = " << Gorner(x1,mat) << endl;
cout <<"L[" << x2 << "] = " << Gorner(x2,mat) << endl;
cout <<"L[" << x3 << "] = " << Gorner(x3,mat) << endl;
cout <<"F[" << x1 << "] = " << f(x1) << endl;
cout <<"F[" << x2 << "] = " << f(x2) << endl;
cout <<"F[" << x3 << "] = " << f(x3 )<< endl;
cout << "\n\n";
cout << "\t\t\tpohybky:\n";
cout << "R[" << x1 << "]=" << (Gorner(x1,mat)-f(x1)) << endl;
cout << "R[" << x2 << "]=" << (Gorner(x2,mat)-f(x2)) << endl;
cout << "R[" << x3 << "]=" << (Gorner(x3,mat)-f(x3)) << endl;
}
double Gorner(double x, double A[n+1][n+2])
{
double suma = A[0][n];
for (int i =n-1;i; --i)
suma = (x-A[i-1][0])*suma + A[0][i];
//suma += A[1][0];
return suma;
}
double f(double x)
{
return 3*(sin (x + pi/4));
}
Результат виконання програми:
/
Висновок:
Похибки і значення залишкового члена у точках відрізняюься точністю.