You are on page 1of 5

Звіт

З лабораторної роботи №1 ІНТЕРПОЛЯЦІЯ ДАНИХ. ІНТЕРПОЛЯЦІЙНИЙ ПОЛІНОМ ЛАГРАНЖА.


ЧИСЕЛЬНЕ ДИФЕРЕНЦІЮВАННЯ.
Студента 1 курсу ФРЕКСу КІ
Марцевого Микити Сергійовича
Варіант № 5

1) Задача:
Задана таблиця значень функції в 9-ти
вузлових точках:
x -0.1 0.21 0.63 0.82 0.9 1.29 1.54 1.76 2.13

-0.98502 -0.93425 -0.43687 -0.08268 0.08338 0.96236 1.50848 1.91667 2.33607


f ( x)
1. Побудувати таблицю значень функції
а) безпосередньо за формулою;
б) застосовуючи кубічну апроксимацію;
в) за допомогою апроксимації поліномом Лагранжа, побудованим за
всіма наявними вузлами.
2. Застосовуючи квадратичну апроксимацію функції f ( x ) та формули
чисельного диференціювання,
побудувати таблиці значень функції
' ''
f ( x ) та f ( x ) , з кроком . Порівняти з таблицями значень цих функцій,
одержаних безпосереднім диференціюванням.

2) Математичний апарат:
Інтерполяційний многочлен Лагранжа.
3) Код(Python):
import math
from numpy import arange

""" f(x) = x*sin(x) − cos(x)


[a, b] = [0, 2]
h = 0.08
квадратична інтерполяція

f'(x) = 2*math.sin(x)+x*math.cos(x)
f"(x) = 3*math.cos(x)-x*math.sin(x)
"""

xl = [-0.1, 0.21, 0.63, 0.82, 0.9, 1.29, 1.54, 1.76, 2.13]


fl = [-0.98502, -0.93425, -0.43687, -0.08268, 0.08338, 0.96236, 1.50848, 1.91667,
2.33607]

a = 0
b = 2
h = 0.08

list_x = []
list_y = []
list_kusk_int = []
list_glob_int = []
list_diff1 = []
list_diff1_int = []
list_diff2 = []
list_diff2_int = []

def lagranzh(x, lx, ly, n):


ln1 = 1
ln = 0
for i in range(len(ly)):
for j in range(len(lx)):
if j != i:
ln1 = ln1 * (x - lx[j]) / (lx[i] - lx[j])
ln = ln + ly[i] * ln1
ln1 = 1
return ln

def function(x):
y = 0
y = x*math.sin(x)-math.cos(x)
return y

def kusk_int(x):
y = 0
for i in range(0,len(xl),2):
if x >= xl[i] and x <= xl[i+2]:
y = round(fl[i]*((x - xl[i+1])*(x-xl[i+2]) / ((xl[i] - xl[i+1])*(xl[i]-
xl[i+2]))) + fl[i+1]*((x - xl[i])*(x-xl[i+2]) / ((xl[i+1] - xl[i])*(xl[i+1]-
xl[i+2]))) + fl[i+2]*((x - xl[i])*(x-xl[i+1]) / ((xl[i+2] - xl[i])*(xl[i+2]-
xl[i+1]))), 6)
break
return y

def diff1(x):
y = 0
y = round(2*math.sin(x)+x*math.cos(x), 6)
return y

def diff1_int(x):
y = 0
if x == a:
y = round((function(a+h) - function(a)) / h, 6)
return y
if x == b:
y = round((function(b) - function(b - h)) / h, 6)
return y
for i in arange(a, b + h, h):
if x == i:
y = round((function(i + h) - function(i - h)) / (2 * h), 6)
return y

def diff2(x):
y = 0
y = round(3*math.cos(x)-x*math.sin(x), 6)
return y

def diff2_int(x):
y = 0
y = round((function(x + h) + function(x - h) - 2 * function(x)) / (h ** 2), 6)
return y

for i in arange(a, b + h, h):


list_x.append(round(i, 1))
list_y.append(round(function(i), 6))
list_kusk_int.append(kusk_int(i))
list_glob_int.append(round(lagranzh(i,xl,fl,2),6))
list_diff1.append(diff1(i))
list_diff1_int.append(diff1_int(i))
list_diff2.append(diff2(i))
list_diff2_int.append(diff2_int(i))

print(' x f(y) kusk.int. glob.int. diff1 diffint1 dif2


diffint2')
for i in range(len(list_x)):
print(list_x[i], ' ' + ' ' * (4 - len(str(list_x[i]))),
list_y[i], ' ' + ' ' * (7 - len(str(list_y[i]))),
list_kusk_int[i], ' ' + ' ' * (7 - len(str(list_kusk_int[i]))),
list_glob_int[i], ' ' + ' ' * (7 - len(str(list_glob_int[i]))),
list_diff1[i], ' ' + ' ' * (7 - len(str(list_diff1[i]))),
list_diff1_int[i], ' ' + ' ' * (7 - len(str(list_diff1_int[i]))),
list_diff2[i], ' ' + ' ' * (7 - len(str(list_diff2[i]))),
list_diff2_int[i], ' ' + ' ' * (7 - len(str(list_diff2_int[i]))))
4) Приклади роботи:

5) Висновок

На цій лабораторній роботі було написано і застосовано алгоритм


інтерполяції для побудови поліноміального наближення функції; також
вивчено методи числового диференціювання функції однієї змінної.
Завданням було апроксимувати функцію поліномом Лагранжа другого
степеню, використовуючи глобальну та кускову інтерполяції на заданих
вузлах , а також за формулами числового диференціювання наближено
знайти першу та другу похідні функції .

You might also like