Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from math import *
- import pandas as pd
- from sympy import *
- def __X(_i):
- return a + _i * h
- def func(_x):
- return _x ** 3 - sin(_x)
- def L1(_i):
- return func(__X(_i)) * (sx - __X(_i + 1)) / (__X(_i) - __X(_i + 1)) \
- + func(__X(_i + 1)) * (sx - __X(_i)) / (__X(_i + 1) - __X(_i))
- def W2(_i):
- return round((sx - __X(_i)) * (sx - __X(_i+1)), 4)
- def W3(_i):
- return round((sx - __X(_i-1)) * (sx - __X(_i)) * (sx - __X(_i+1)), 6)
- def deriv_2(_i):
- value = __X(_i)
- _x = symbols('x')
- _expr = func(x)
- exp_deriv = diff(_expr, _x, 2)
- return exp_deriv.subs(_x, value)
- def deriv_3(_i):
- value = __X(_i)
- _x = symbols('x')
- _expr = func(x)
- exp_deriv = diff(_expr, _x, 3)
- return exp_deriv.subs(_x, value)
- def R1(_w2, _i):
- return abs(deriv_2(_i) * w2 / 2)
- def R2(_w3, _i):
- return abs(deriv_3(_i) * w3 / 6)
- def check(min_rem, max_rem, true_rem):
- if true_rem >= max_rem or true_rem <= min_rem:
- return false
- return true
- def L2(_i):
- return func(__X(_i-1)) * ((sx - __X(_i)) * (sx - __X(_i+1))) / ((__X(_i-1) - __X(_i)) * (__X(_i-1) - __X(_i+1))) \
- +func(__X(_i)) * ((sx - __X(_i-1)) * (sx - __X(_i + 1))) / ((__X(_i) - __X(_i-1)) * (__X(_i) - __X(_i + 1)))\
- +func(__X(_i+1)) * ((sx - __X(_i-1)) * (sx - __X(_i))) / ((__X(_i+1) - __X(_i-1)) * (__X(_i+1) - __X(_i)))
- def difference1(_x_i, _x_j):
- return (func(_x_j) - func(_x_i)) / (_x_j - _x_i)
- def difference2(_x_i, _x_j, _x_k):
- return (difference1(_x_j, _x_k) - difference1(_x_i, _x_j)) / (_x_k - _x_i)
- def N1(_i):
- return func(__X(_i)) + difference1(__X(_i), __X(_i+1)) * (sx - __X(_i))
- def N2(_i):
- return func(__X(_i-1)) + difference1(__X(_i-1), __X(_i)) * (sx - __X(_i-1)) \
- + difference2(__X(_i-1), __X(_i), __X(_i+1)) * (sx - __X(_i-1)) * (sx - __X(_i))
- # def difference1(_i, _j):
- # return (func(__X(_j)) - func(__X(_i))) / (__X(_j) - __X(_i))
- #
- #
- # def difference2(_i, _j, _k):
- # return (difference1(_j, _k) - difference1(_i, _j)) / (__X(_k) - __X(_i))
- #
- #
- # def N1(_i):
- # return func(__X(_i)) + difference1(_i, _i+1) * (sx - __X(_i))
- #
- #
- # def N2(_i):
- # return func(__X(_i-1)) + difference1(_i-1, _i) * (sx - __X(_i-1)) \
- # + difference2(_i-1, _i, _i+1) * (sx - __X(_i-1)) * (sx - __X(_i))
- # 1
- print('----------------------------------1------------------------------------')
- a = 0.6
- b = 1.1
- h = round((b - a) / 10, 2)
- d = []
- for i in range(0, 11, 1):
- x = __X(i)
- y = round(func(x), 2)
- d.append({
- 'x': x,
- 'y': y
- })
- print(pd.DataFrame(d))
- # 2
- print('----------------------------------2------------------------------------')
- sx = 0.92
- index = floor((sx - a) / h)
- lagrange1 = L1(index)
- print('Значение функции по формуле Лагранжа1: ', lagrange1)
- # 3
- print('---------------------------------3------------------------------------')
- x = symbols('x')
- expr = func(x)
- derivative_2 = diff(expr, x, 2)
- print('Функция:', expr)
- print('Вторая производная:', derivative_2)
- der2_val_1 = deriv_2(index)
- der2_val_2 = deriv_2(index+1)
- print('Минимальное значение производной:', min(der2_val_1, der2_val_2))
- print('Максимальное значение производной:', max(der2_val_1, der2_val_2))
- print('------------------------')
- w2 = W2(index)
- remainder1_1 = R1(w2, index)
- remainder1_2 = R1(w2, index+1)
- min_rem1 = min(remainder1_1, remainder1_2)
- max_rem1 = max(remainder1_1, remainder1_2)
- print('Минимальное значение остаточного члена:', min_rem1)
- print('Максимальное значение остаточного члена:', max_rem1)
- # 4
- print('----------------------------------4------------------------------------')
- true_value = func(sx)
- # print('Значение функции:', true_value)
- R1_sx = abs(lagrange1 - true_value)
- print('Значение остатка:', R1_sx)
- print(min_rem1, '<', R1_sx, '<', max_rem1, 'is', check(min_rem1, max_rem1, R1_sx))
- # 5
- print('----------------------------------5------------------------------------')
- lagrange2 = (L2(index))
- print('Значение функции по формуле Лагранжа2: ', lagrange2)
- # 6
- print('----------------------------------6------------------------------------')
- derivative_3 = diff(expr, x, 3)
- print('Третья производная:', derivative_3)
- der3_val_1 = deriv_3(index-1)
- der3_val_2 = deriv_3(index+1)
- print('Минимальное значение производной:', min(der3_val_1, der3_val_2))
- print('Максимальное значение производной:', max(der3_val_1, der3_val_2))
- print('------------------------')
- w3 = W3(index)
- remainder2_1 = R2(w3, index-1)
- remainder2_2 = R2(w3, index+1)
- min_rem2 = min(remainder2_1, remainder2_2)
- max_rem2 = max(remainder2_1, remainder2_2)
- print('Минимальное значение остаточного члена:', min_rem2)
- print('Максимальное значение остаточного члена:', max_rem2)
- R2_sx = abs(lagrange2 - true_value)
- print('Значение остатка:', R2_sx)
- print(min_rem2, '<', R2_sx, '<', max_rem2, 'is', check(min_rem2, max_rem2, R2_sx))
- # 7
- print('----------------------------------7------------------------------------')
- differ = []
- x_i, x_j, x_k = symbols('x_i, x_j, x_k')
- differ.append({
- 'f(x_i)': func(__X(index)),
- 'f(x_i, x_j)': difference1(__X(index), __X(index+1)),
- 'f(x_i, x_j, x_k)': difference2(__X(index-1), __X(index), __X(index+1))
- })
- print(pd.DataFrame(differ))
- print('------------------------')
- newton1 = N1(index)
- print('Значение функции по формуле Ньютона1:', newton1)
- newton2 = N2(index)
- print('Значение функции по формуле Ньютона2:', newton2)
- # 8
- print('----------------------------------8------------------------------------')
- print('Разность интерполяционных формул Лагранжа1 и Ньютона1:', abs(lagrange1 - newton1))
- print('Разность интерполяционных формул Лагранжа2 и Ньютона2:', abs(lagrange2 - newton2))
Add Comment
Please, Sign In to add comment