You are on page 1of 4

Алгоритми та методи обчислень

Лабораторна робота №1
Звіт
Євтушенка Максима КІ-1

1. Варіант 3
2. Математичний апарат:
- Поліном Лагранжа:
n
( x−x 0 ) ( x−x 1 ) … ( x−x i−1 )( x−xi +1 ) …( x−x n )
Ln ( x ) =∑ y i
i=0 ( x i−x 0 ) ( x i−x 1 ) … ( xi −xi−1 ) ( x i−x i+1 ) …(x i−x n )
y i +1− y i
- Права різницева похідна: ẏ i ≈
h
i=[0 , n]
y−y
- Ліва різницева похідна: ẏ i ≈ i h i −1 i=[0 , n]
y −y
- Центральна різницева похідна: ẏ i ≈ i +12 h i−1 i=[0 , n]
y i +1+ yi −2 y i
- Друга похідна: ÿ i ≈ 2
i=[ 0 ,n ]
h
3. Код програми (Python):

from math import exp


from numpy import arange

""" f(x) = x^2 * exp(-x^2)


[a, b] = [-2, 0.5]
h = 0.1
лінійна інтерполяція

f'(x) = 2x*exp(-x^2) - 2exp(-x^2)x * x^2 = 2exp(-x^2) * (x-x^3)


f"(x) = -4x*exp(-x^2)*(x-x^3) + 2*exp(-x^2)*(1-3x^2) = 2exp(-x^2) * (2x^4 -
5x^2 + 1)
"""
xl = [-2.1, -1.9, -1.6, -0.99, -0.23, 0.4, 0.6, 0.9, 1.4]
fl = [0.05360, 0.09766, 0.19790, 0.36781, 0.05017, 0.13634, 0.25006, 0.36034,
0.27608]

a = -2.0
b = 0.5
h = 0.1

def polinom(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 func(x):
y = 0
y = x ** 2 * exp(-x ** 2)
return y

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

def interpG(x):
y = 0
y = round(fl[0] * ((x - xl[len(xl) - 1]) / (xl[0] - xl[len(xl) - 1])) +
fl[len(fl) - 1] * (
(x - xl[0]) / (xl[len(fl) - 1] - xl[0])), 8)
return y

def diff1(x):
y = 0
y = round(2 * exp(-x ** 2) * (x - x ** 3), 8)
return y

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

def diff2(x):
y = 0
y = round(2 * exp(-x ** 2) * (2 * x ** 4 - 5 * x ** 2 + 1), 8)
return y

def diff2int(x):
y = 0
y = round((func(x + h) + func(x - h) - 2 * func(x)) / (h ** 2), 8)
return y

list_2a_x = []
list_2a_y = []
list_2b = []
list_2c = []
list_3a1 = []
list_3b1 = []
list_3a2 = []
list_3b2 = []
for i in arange(a, b + h, h):
list_2a_x.append(round(i, 1))
list_2a_y.append(round(func(i), 5))
list_2b.append(interpK(i))
list_2c.append(interpG(i))
list_3a1.append(diff1(i))
list_3b1.append(diff1int(i))
list_3a2.append(diff2(i))
list_3b2.append(diff2int(i))

print('x f(y) kusk.int. glob.int. poh1


pohint1 poh2 pohint2\n')
for i in range(len(list_2a_x)):
print(list_2a_x[i], ' ' + ' ' * (6 - len(str(list_2a_x[i]))),
list_2a_y[i], ' ' + ' ' * (10 - len(str(list_2a_y[i]))),
list_2b[i], ' ' + ' ' * (10 - len(str(list_2b[i]))),
list_2c[i], ' ' + ' ' * (10 - len(str(list_2c[i]))),
list_3a1[i], ' ' + ' ' * (10 - len(str(list_3a1[i]))),
list_3b1[i], ' ' + ' ' * (10 - len(str(list_3b1[i]))),
list_3a2[i], ' ' + ' ' * (10 - len(str(list_3a2[i]))),
list_3b2[i], ' ' + ' ' * (10 - len(str(list_3b2[i]))))

4. Виконання програми:
5. Висновок:
Протягом лабораторної роботи було вивчено формули
полінома Лагранжа, числового диференціювання першого
та другого порядку. Здобуто вміння апроксимувати
функцію, використовуючи глобальну та кускову
інтерполяцію на заданих вузлах. Отримано навички
приблизного знаходження першої та другої похідних
функції. Також покращено навички програмування на
Python.

You might also like