Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
/
ЛАБОРАТОРНА РОБОТА № 6
з дисципліни:
"Чисельні методи"
на тему:
«Інтерполяційна схема Ейткена»
Львів – 2018
ЛАБОРАТОРНА РОБОТА № 6
Тема роботи:
Інтерполяційна схема Ейткена.
Мета роботи:
Засвоїти теоретичний матеріалі методи апроксимації функцій, набути практичні навики знаходження наближених значень функцій.
Теоретичні відомості:
Схема Ейткена
На практиці зустрічаються випадки, коли потрібно мати значення інтерполяційного багаточлена Лагранжа в деякій точці х, а не загальний його вигляд. Тоді зручно користуватись інтерполяційною схемою Ейткена.
Обчислювальний алгоритм має такий вигляд:
причому
– інтерполяційний багаточлен Лагранжа за вузлами хо,х,...,хп. Кожен із отримують з та шляхом перехресного множення та ділення. Із застосуванням схеми Ейткена поступово можна залучати щораз нові значення вузлів хк доти, поки обчислення не засвідчать, що точність уже не зростає.
Варіант 24:
Користуючись таблицею значень cos(x), xє[0.75k, 0.8k] з певним кроком. Знайти наближене значення cos(x) при x=0.775, де k-списковий номер студента. Результати обчислень подати таблично. Похибку обчислити порівнянням з стандартним значенням косинуса. Порівняти з похибкою методу. Дослідити залежність кількості точок у схемі Ейткена (кроку обчислень) та точності результату. Провести не менше 8 реалізацій.
Код програми:
#include <Windows.h>
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
double sta, fin, x, h;
cout << "ЛАБОРАТОРНА РОБОТА №6" << endl;
cout << "Введіть початок інтервалу: ";
cin >> sta;
cout << "Введіть кінець інтервалу: ";
cin >> fin;
x = 0.775;
double val_cos = cos(x);
for (int l = 0; l < 11; l++) {
h = 0.01 + 0.003*l;
int n; // кількість елементів масиву
n = 1.5 + ((fin - sta) / h);
double* arr_x = new double[n], *arr_cos = new double[n], *arr_xk_x = new double[n];
double** arr_L; // матриця значень
arr_L = new double*[n - 1];
for (int i = 0; i < n - 1; i++)
arr_L[i] = new double[n - 1];
for (int i = 0; i < n; i++) { //ініціалізація початкових значень
arr_x[i] = sta + h*i;
arr_cos[i] = cos(arr_x[i]);
arr_xk_x[i] = arr_x[i] - x;
}
for (int j = 0; j < n - 1; j++) { //заповнення матриці Ейткена
int position = 0;
for (int i = j; i < n - 1; i++) {
if (j == 0) {
arr_L[i][j] = (arr_cos[i] * arr_xk_x[i + 1] - arr_cos[i + 1] * arr_xk_x[i]) / h;
}
else {
arr_L[i][j] = (arr_L[i - 1][j - 1] * arr_xk_x[i + 1] - arr_L[i][j - 1] * arr_xk_x[position]) / (arr_x[i + 1] - arr_x[position]);
position++;
}
}
}
cout<<endl<<"Крок : "<< h<<endl;
cout<<"Кількість елементів : "<< n<<endl;
cout<<"Обчислене значення : "<< arr_L[n - 2][n - 2] <<endl;
cout<<"Істинне значення : "<< val_cos <<endl;
cout<<"Похибка : "<<fabs(arr_L[n - 2][n - 2] - val_cos)<<endl;
}
system("pause>>void");
return 0;
}
Результат:
/ /
Графік:
/
Висновок:
В результаті виконання цієї лабораторної роботи я вивчила інтерполяційну схему Ейткена, провела залежність точності від кроку обчислення. З графіка видно, що чим менший крок, тим меншою є і абсолютна похибка обчислень. Також обчислила значення косинуса у точці 0,775 cos(0.775) = 0.7144210341.