Вы находитесь на странице: 1из 15

Министерство науки и высшего образования Российской Федерации

ФГАОУ ВО «Севастопольский государственный университет»


Институт радиоэлектроники и информационной безопасности

Кафедра «Радиоэлектроника и телекоммуникации»

ОТЧЁТ
по контрольной работе №3
«Программная реализация алгоритмов интерполяции»
по дисциплине
«Программирование»

Выполнил: студент гр. РС/с-19-1-о


Зуев О. Д.
Вариант: M6N8
Защитил с оценкой: ______
Принял: ст. пр. Дурманов М.А.

Севастополь
2020
СОДЕРЖАНИЕ

1. Описание контрольной работы 3


1.1. Цель работы 3
1.2. Текст индивидуального задания 3
1.3. Теоретические сведения 4
2. Выполнение контрольной работы 10
2.3. Математическое обоснование задачи 10
2.3. Структурная схема алгоритма работы программы 11
2.4. Текст программы 12
2.5. Таблица переменных 14
2.6. Результаты выполнения программы 14
Выводы 15

2
1.ОПИСАНИЕ КОНТРОЛЬНОЙ РАБОТЫ
1.1. Цель работы
Изучить численные методы интерполяции функций, заданных таблично.
Получить практические навыки составления программ на языке C/C++,
реализующих алгоритмы интерполяции.
1.2. Текст индивидуального задания
Составить структурную схему алгоритма и написать на языке C/C++
программу вычисления значения табулированной функции, используя метод
линейной интерполяции и две формулы нелинейной интерполяции.
Результаты вычисления следует выводить на дисплей в формате с
плавающей точкой.
Исходные данные для выполнения задания выбираются из таблицы 1.1
(x0 = 0.68).
Таблица 1.1 — Исходные данные для выполнения задания (N)

1.3. Теоретические сведения


На практике многие характеристики измеряют по точкам и получают
табличные значения функции yi = f(xi). По таблице легко определить
значения функции, если значение аргумента равно одному из табличных
значений xi. Если же значение аргумента не попадает в точки таблицы, а
находится между ними, то для вычисления значения функции необходимо
описать её каким-либо образом между дискретными точками таблицы.
Одним из методов описания функции между известными точками таблицы
является интерполяция функции.

3
1.3.1. Линейная интерполяция

При линейной интерполяции предполагается, что зависимость yi = f(xi)


на каждом участке между дискретными точками таблицы является линейной.
Такое предположение допустимо при монотонном характере функции
yi = f(xi) на анализируемых участках, и позволяет выполнять приближенные
расчеты.
Для получения интерполяционного значения функции при заданном
значении аргумента, через две соседние точки зависимости yi = f(xi) проводят
прямую линию (рисунок 3.1), которая может быть описана выражением
y i +1− y i
y− yi = ( x−x i ) ,
xi +1−x i

откуда получаем
y i +1− y i
y= yi − ( x−x i ) (1.1)
xi +1−x i

Подставляя в формулу (1.1) заданное значение аргумента x 0 ( x i ≤ x 0 ≤ x i+1 )


определяем искомое значение функции
y i +1− y i
y 0= yi − ( x−x i ) (1.2)
xi +1−x i

Рисунок 1.1 — Определение значения табулированной


функции методом линейной интерполяции

4
Рисунок 1.2 — Фрагмент алгоритма поиска заданного интервала
табулированной функции

При написании программы, реализующей алгоритм метода линейной


интерполяции, рекомендуется применить автоматизированный поиск
интервала характеристики yi = f(xi), на котором выполняется расчет. Пример
фрагмента алгоритма поиска заданного интервала табулированной функции
изображен на рисунке 1.2.
Погрешность вычисления значения функции методом линейной
интерполяции может быть недостаточной в некоторых случаях, поскольку
интерполирующий отрезок прямой линии не совпадает с реальной кривой,
описывающей интерполируемую функцию. Для увеличения точности
вычислений значений табличной функции применяют методы нелинейной
интерполяции, использующие интерполяционные формулы нелинейных
функций и полиномов. Нелинейные функции способны более точно описать
поведение табулированной функции на заданном интервале. Как правило,

5
используют интерполяционные полиномы второго или третьего порядка,
однако для увеличения точности вычислений иногда используют полиномы
более высокого порядка.
1.3.2. Интерполяционная формула Бесселя

Симметричная интерполяционная формула Бесселя использует четыре


табличных значения функции
1 x−x i 1 x −xi x−x i
2 (
y= ( yi + y i +1 ) + ( y i+1− yi )
h )
− +
2 4h h ( )
−1 ( y i+2− y i +1− y i + y i−1 ) ,

где h  xi+1  x — шаг табулирования функции.


Интерполяционная формула Бесселя предназначена для
вычислений значений табулированной функции в середине интервала,
который окружен как минимум двумя точками с каждой стороны
интерполируемого интервала (рисунок 1.3) таким образом, чтобы
выполнялись условия:
x 0−x i
0,25 ≤ ≤ 0,75 ;
h

x i< x0 < x i+ 1 .

Рисунок 1.3 — Интервал применения функции Бесселя

6
1.3.3. Первая интерполяционная формула Ньютона

Первая интерполяционная формула Ньютона использует как минимум


три табличных значения функции:
x−x i 1 x−x i x−x i
y= yi + ( y i+1 − y i ) + ( −1) ( y i+2−2 y i+1 + y i )
h 2 h h
Первая интерполяционная формула Ньютона применяется для
вычислений значений табулированной функции в начале таблицы, в точках,
близких к xi (рисунок 1.4) таким образом, чтобы выполнялись условия:
x0 −xi
≤0,3 ;
h
x i ≤ x 0 ≤ x i+1

Рисунок 1.4 — Интервал применения первой интерполяционной


формулы Ньютона
1.3.4. Вторая интерполяционная формула Ньютона

Вторая интерполяционная формула Ньютона также использует минимум


три табличных значения функции:
x−x i 1 x−x i x−x i
y= yi + ( y i− y i−1 ) + ( +1) ( y i−2 y i−1+ y i−2 )
h 2 h h
Данная формула применяется для вычислений значений табулированной
функции в конце таблицы, в точках, близких к xi (рисунок 1.5) таким
образом,
чтобы выполнялись условия:
xi −x0
≤0,3 ;
h
x i−1< x 0 < x i

Рисунок 1.5 — Интервал применения второй интерполяционной


7
формулы Ньютона
1.3.5. Первая интерполяционная формула Гаусса

Первая интерполяционная формула Гаусса использует для вычислений


минимум три табличных значения функции:
x−x i 1 x−x i x−x i
y= yi + ( y i+1 − y i ) + ( +1) ( y i +1−2 yi + y i−1 )
h 2 h h
Первая интерполяционная формула Гаусса применяется при
интерполировании в середине интервала, в точках, близких к xi (рисунок 1.6)
таким образом, чтобы выполнялись условия:
x0 −xi
≤0,3 ;
h
x i ≤ x 0< xi +1

Рисунок 1.7 — Интервал применения первой интерполяционной


формулы Гаусса
1.3.6. Вторая интерполяционная формула Гаусса

Вторая интерполяционная формула Гаусса использует минимум три


табличных значения функции:

Вторая интерполяционная формула Гаусса применяется при


интерполировании в середине интервала, в точках, близких к xi (рисунок
1.7) таким образом, чтобы выполнялись условия:

8
Рисунок 1.7 — Интервал применения второй интерполяционной
формулы Гаусса
1.3.7. Интерполяционная формула Стирлинга
Минимум три табличных значения функции использует
интерполяционная формула Стирлинга:

Интерполяционная формула Стирлинга предназначена для вычислений


значений табулированной функции в середине интервала (рисунок 1.8) таким
образом, чтобы выполнялись условия:

Рисунок 3.8 — Интервал применения интерполяционной


формулы Стирлинга

9
2.ВЫПОЛНЕНИЕ КОНТРОЛЬНОЙ РАБОТЫ
2.1. Математическое обоснование задачи

Рисунок 2.1 – Математическое обоснование в Mathcad

10
2.2. Структурная схема алгоритма работы программы
Структурная схема алгоритма решения задачи представлена на рис. 2.1.

Начало

Ввод
Float х0

for(i=0,j=0;;i++,j++)

(x[i]<=x0)&&(x0<=x[i+1])

break

d=fabs(x0-x[i])/h;

Вычисление
функции и
методом
Гауса 2 и
Стирлинга

y0=L(x0)
y0=Gaus2()
y0=Stirling()

Ввыод у0

Конец

Рисунок 2.2 —Схема алгоритма решения задачи

11
2.4. Текст программы

#include <iostream>
#include<iomanip>
#include <math.h>
#include <locale>
using namespace std;
double h = 0.1; //шаг переменной x
// Прототипы функций
double L (float x0); //линейная
double Gaus2 (); //метод Гаусса 2
double Stirling (); //метод Стирлинга

double y[11]={0,3.244,8.591,17,32,56,95,161,268,445,737};
double x[11]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0};
double d;
int i,j;

int main (){


setlocale (LC_ALL, "Russian");
double x0,y0;
cout << "Введите начальный аргумент: "<<endl;
cin >> x0;
for(i=0,j=0;i<11;i++,j++)
if((x[i]<=x0)&&(x0<=x[i+1])) break;
d = (x0-x[i])/h;
y0 = L(x0);
cout << " Корень методом интерполяции: " << y0 << endl << endl;
y0 = Gaus2();
cout << " Корень методом Гаусса: " << y0 << endl;

12
y0 = Stirling();
cout << " Корень методом Стирлинга: " << y0 << endl;
}
double L (float x0){ //Линейная
return (y[j]+((y[j+1]-y[j])/(x[i+1]-x[i]))*(x0-x[i]));
}
double Gaus2 (){ //Гаусс
return (y[j]+(d*(y[j]-y[j-1])) +
0.5*(d+1)*(d)*(y[j+1]-2*y[j]+y[i-1]));
}
double Stirling (){ //Стирлинг
return (y[j]+(d/2)*(y[j+1]-y[j-1]) +
0.5*pow(d,2)*(y[j+1]-2*y[j]+y[j-1]));
}

13
2.5. Таблица переменных
В программе использованы переменные, представленные в таблице 2.1.
Таблица 2.1 — Используемые переменные
Переменная Тип Значение
x double Значение х
y double Значение у
d double Вспомогательная переменная
h сonst double Шаг изменения х
i, j int Индексы массивов
x0 double Значение х, при котором нужно найти
значение функции
y0 double Искомое значение функции

2.6. Результаты выполнения программы


Результаты выполнения программы представлены на рисунке 2.3.

Рисунок 2.3 —Результат выполнения программы

14
ВЫВОДЫ
В ходе выполнения задания контрольной работы были изучены методы
интерполяции функций, заданных таблично, в частности метод Гаусса и
Стирлинга, а также исследована эффективность их применения. Получены
практические навыки составления программ на языке C/C++, реализующих
алгоритмы интерполяции.
При работе программы ошибок не обнаружено, примерное значение,
полученное графически с помощью программы Mathcad, совпало со
значением, полученным с помощью написанной программы.

15