
lab9 / report_lab9
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра математического обеспечения и применения ЭВМ
отчет
по практической работе № 9
по дисциплине «Вычислительная математика»
Тема: САМОСТОЯТЕЛЬНАЯ РАЗРАБОТКА ПРОГРАММЫ НА ОДНОМ ИЗ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Студент гр. 7777 |
|
|
Преподаватель |
|
|
Санкт-Петербург
2018
Цель работы.
Используя интерполяционную схему Эйткена, либо интерполяционную формулу Ньютона, вычислить значение в точке x функции.
Основные теоретические положения.
Пусть известны
значения некоторой функции
в
различных точках
,
которые обозначим следующим образом:
.
Указанные
значения могут быть получены путём
экспериментальных измерений или найдены
с помощью достаточно сложных вычислений.
В задаче интерполяции функции
,
как было сказано ранее, решается проблема
приближенного восстановления значения
функции в произвольной точке x. Для
этого строится алгебраический многочлен
степени n, который в точках
принимает заданные значения, т. е.
.
(1)
Следует заметить, что если точка x
расположена вне минимального отрезка,
содержащего все узлы интерполяции
,
то замену функции
на
также называют экстраполяцией.
В общем случае доказано, что существует единственный интерполяционный многочлен n-й степени, удовлетворяющий условиям (1):
, (2)
где
(3)
Интерполяционный многочлен, представленный в виде (2), называется интерполяционным многочленом Лагранжа, а функции (3) – лагранжевыми коэффициентами.
Для оценки
погрешности интерполяции (в частности,
и экстраполяции) в текущей точке
(
– отрезок, содержащий все узлы интерполяции
и точку
)
можно использовать соотношение
, (4)
где
;
– (n+1)-я производная интерполируемой
функции в некоторой точке
;
.
Оценить
максимальную погрешность интерполяции
на всем отрезке
можно с помощью соотношения
. (5)
Использование
оценок погрешностей (4) и (5) предполагает
ограниченность
-й
производной интерполируемой функции
на отрезке
,
т. е.
.
На практике вместо общей формы записи (5) часто используются другие формы записи интерполяционного многочлена, более удобные для применения в конкретных ситуациях.
Интерполяционный многочлен Ньютона для неравноотстоящих узлов интерполяции имеет вид:
…
…, (6)
где
– разделённая разность
-го
порядка.
Вычисление разделённых разностей производится по соотношениям
,
...................................................
.
При использовании интерполяционного многочлена Ньютона (6) изменение степени n требует только добавить или отбросить соответствующее число стандартных слагаемых, что удобно на практике. В то же время, непосредственное использование интерполяционного многочлена Лагранжа (2) требует строить его заново при изменении n.
В том случае,
если требуется найти лишь численное
значение интерполяционного многочлена
,
а не его представление, может быть
использована итерационно-интерполяционная
схема Эйткена.
Пусть
- интерполяционный многочлен, определяемый
парами
,
,
,
... так, что
.
Интерполяционные многочлены возрастающих степеней получают последовательно следующим образом:
,
,
...….....................................................
,
...….....................................................
.
...….....................................................
Этот процесс можно закончить, когда у значений двух интерполяционных многочленов последовательных степеней совпадает требуемое количество знаков.
Постановка задачи.
Исходные
данные:
,
значения функции в точках приведены
табл.1.
Таблица 1 – Значения функции в точках.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Порядок выполнения, следующий:
-
Составить программы-функции для вычисления значения функции в точке
методом интерполяции.
-
Составить головную программу, содержащую обращение к вычислительным процедурам и осуществляющую печать результатов.
-
Результаты работы оформить в виде краткого отчёта, содержащего характеристику используемого метода вычислений, его точности и полученное значение функции.
Выполнение работы.
Были составлены функции для вычисления методом Ньютона и методом Эйткина. Также была написана головная программа, содержащая обращение к вычислительным процедурам и выводящую результат. Коды данных функций приведены в приложении A.
Были проведены вычисления по программе методами Эйткена и Ньютона:
Выводы.
Были написаны
функции для вычисления значения функции
в точке
c
помощью метода Ньютона и метода Эйткина.
В результате работы были вычислены
значения функции в точке
методом Ньютона
и методом Эйткина
.
Оба метода дали очень точные и близкие
значения, совпадающие до 11 знака после
запятой. Таким образом можно сделать
вывод ,что оба метода обладают хорошей
точностью вычисления. Так же с помощью
метода Ньютона был построен интерполяционный
многочлен, и по нему было вычислено
значение функции в точке
.
Метод Эйткина произвёл вычисление
значения функции прямым вычислением.
Для данной работы эффективнее использовать
метод Эйткина для вычисления результата.
ПРИЛОЖЕНИЕ А
КОД РОГРОАММЫ
#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;
const double X[] = { 0.1096, 1.1240, 1.3096, 2.4160, 3.6336, 4.6504, 5.0360, 5.3056,5.5000, 5.8064 };
const double Y[] = { -4.8652, 0.2038, 0.3613,-0.0606, -0.3440, 2.7259, 15.9677, 24.9477, 32.8147, 39.3750, 51.3433 };
double Eitken(int a, int b, double x){
const int n = 11;
if (b - a > n) exit(0);
if ((b - a) == 1){
return (1 / (X[b] - X[a])*((x - X[a])* Y[b] - (x - X[b])* Y[a]));
}else{
return (1 / (X[b] - X[a])*((x - X[a])*Eitken(a + 1, b, x) - (x - X[b])*Eitken(a, b - 1, x)));
}
return 0;
}
double int_Newton(double x){
const int n = 11;
double a, b;
int i, j, k;
double f[n][n];
for (i = 0; i < n; i++)
f[i][0] = (Y[i + 1] - Y[i]) / (X[i + 1] - X[i]);
for (j = 1; j < n; j++)
for (i = 0; i < (n - j ); i++)
f[i][j] = (f[i + 1][j-1] - f[i][j-1]) / (X[j + i + 1] - X[i]);
b = Y[0];
for (i = 1; i <= n; i++){
a = 1;
for (k = i; k > 0; k--)
a *= (x - X[k - 1]);
b+= f[0][i - 1] * a;
}
return (b);
}
int main(){
setlocale(LC_ALL, "Russian");
double x = 2.6816;
cout << "по Эйткину y = " << fixed << setprecision(15) <<Eitken(0,11,x)<<endl;
cout << "по Ньютону y = " << fixed << setprecision(15) << int_Newton(x) << endl;
}