Загрузка данных
import math
import numpy as np
from prettytable import PrettyTable
# Ввод значений x
x_list = input("Введите значения x через пробел: ").split()
# Создание таблиц
tableP1 = PrettyTable()
tableP1.field_names = ["x", "y(x)", "P1(x)", "|y(x)-P1(x)|", "q"]
tableP2 = PrettyTable()
tableP2.field_names = ["x", "y(x)", "P2(x)", "|y(x)-P2(x)|", "t"]
tableL = PrettyTable()
tableL.field_names = ["x", "y(x)", "L(x)", "|y(x)-L(x)|"]
tableDifP1 = PrettyTable()
tableDifP1.field_names = ["x", "y'(x)", "P1'(x)", "x0~", "|y'(x)-P1'(x)|", "q"]
tableDifP2 = PrettyTable()
tableDifP2.field_names = ["x", "y'(x)", "P2'(x)", "xn~", "|y'(x)-P2'(x)|", "t"]
# Узлы интерполяции
x_table = np.array([1.35, 1.37, 1.39, 1.41, 1.43, 1.45])
# Параметры сетки
h = 0.02
x0 = 1.35
xn = 1.45
# ------------------------------------------------------------
# Вспомогательные функции
# ------------------------------------------------------------
def toFixed(numObj, digits=6):
return f"{numObj:.{digits}f}"
def f(x):
"""Исходная функция"""
return 10.3 * math.sin(x) - math.exp((6 * x + 5) / 11)
def df(x):
"""Точная производная"""
return (103 * math.cos(x) / 10) - (6 * math.exp((6 * x + 5) / 11) / 11)
def closest_value_left(x):
"""
Возвращает ближайший узел.
Если x находится ровно между двумя узлами,
выбирается левый узел.
"""
diff = [round(abs(x - i), 12) for i in x_table]
min_diff = min(diff)
# Все индексы с минимальным расстоянием
indices = [i for i, d in enumerate(diff) if abs(d - min_diff) < 1e-12]
# Берём первый индекс (левый узел)
return x_table[indices[0]]
def closest_value_right(x):
"""
Возвращает ближайший узел.
Если x находится ровно между двумя узлами,
выбирается правый узел.
"""
diff = [round(abs(x - i), 12) for i in x_table]
min_diff = min(diff)
# Все индексы с минимальным расстоянием
indices = [i for i, d in enumerate(diff) if abs(d - min_diff) < 1e-12]
# Берём последний индекс (правый узел)
return x_table[indices[-1]]
# ============================================================
# Первая интерполяционная формула Ньютона
# ============================================================
print("----------------------------Первая интерполяционная формула Ньютона-------------------")
for x in x_list:
x = float(x)
q = (x - x0) / h
y = f(x)
P1 = (
6.75987976
+ q * 0.00701428
+ q * (q - 1) / 2 * (-0.00443293)
+ q * (q - 1) * (q - 2) / 6 * (-0.00001997)
+ q * (q - 1) * (q - 2) * (q - 3) / 24 * 0.00000157
+ q * (q - 1) * (q - 2) * (q - 3) * (q - 4) / 120 * 0.00000001
)
tableP1.add_row([
toFixed(x),
toFixed(y, 8),
toFixed(P1, 8),
toFixed(abs(y - P1), 8),
toFixed(q, 4)
])
print(tableP1)
# ============================================================
# Вторая интерполяционная формула Ньютона
# ============================================================
print("----------------------------Вторая интерполяционная формула Ньютона------------------")
for x in x_list:
x = float(x)
t = (x - xn) / h
y = f(x)
P2 = (
6.75043004
+ t * (-0.01083095)
+ t * (t + 1) / 2 * (-0.00448811)
+ t * (t + 1) * (t + 2) / 6 * (-0.00001682)
+ t * (t + 1) * (t + 2) * (t + 3) / 24 * 0.00000158
+ t * (t + 1) * (t + 2) * (t + 3) * (t + 4) / 120 * 0.00000001
)
tableP2.add_row([
toFixed(x),
toFixed(y, 8),
toFixed(P2, 8),
toFixed(abs(y - P2), 8),
toFixed(t, 4)
])
print(tableP2)
# ============================================================
# Интерполяционная формула Лагранжа
# ============================================================
print("---------------------------Интерполяционная формула Лагранжа-------------------------")
for x in x_list:
x = float(x)
y = f(x)
L = (
-17603853.55176730 * (x - 1.37) * (x - 1.39) * (x - 1.41) * (x - 1.43) * (x - 1.45)
+ 88110599.50940073 * (x - 1.35) * (x - 1.39) * (x - 1.41) * (x - 1.43) * (x - 1.45)
- 176288421.60911840 * (x - 1.35) * (x - 1.37) * (x - 1.41) * (x - 1.43) * (x - 1.45)
+ 176239683.29994464 * (x - 1.35) * (x - 1.37) * (x - 1.39) * (x - 1.43) * (x - 1.45)
- 88037252.53834365 * (x - 1.35) * (x - 1.37) * (x - 1.39) * (x - 1.41) * (x - 1.45)
+ 17579244.90311123 * (x - 1.35) * (x - 1.37) * (x - 1.39) * (x - 1.41) * (x - 1.43)
)
tableL.add_row([
toFixed(x),
toFixed(y, 8),
toFixed(L, 8),
toFixed(abs(y - L), 8)
])
print(tableL)
# ============================================================
# Численное дифференцирование, основанное на 1ИФН
# x0~ — ближайший узел, при равенстве выбирается левый
# ============================================================
print("-------------------------Численное дифференцирование, основанное на 1ИФН----------------")
for x in x_list:
x = float(x)
closest_value_1 = closest_value_left(x)
q = (x - closest_value_1) / h
Dify = df(x)
DifP1 = (1 / h) * (
0.00701428
+ (2 * q - 1) / 2 * (-0.00443293)
+ (3 * q**2 - 6 * q + 2) / 6 * (-0.00001997)
+ (4 * q**3 - 18 * q**2 + 22 * q - 6) / 24 * 0.00000157
+ (5 * q**4 - 40 * q**3 + 105 * q**2 - 100 * q + 24) / 120 * 0.00000001
)
tableDifP1.add_row([
toFixed(x),
toFixed(Dify, 8),
toFixed(DifP1, 8),
toFixed(closest_value_1),
toFixed(abs(Dify - DifP1), 8),
toFixed(q, 4)
])
print(tableDifP1)
# ============================================================
# Численное дифференцирование, основанное на 2ИФН
# xn~ — ближайший узел, при равенстве выбирается правый
# ============================================================
print("-------------------------Численное дифференцирование, основанное на 2ИФН---------------")
for x in x_list:
x = float(x)
closest_value_2 = closest_value_right(x)
t = (x - closest_value_2) / h
Dify = df(x)
DifP2 = (1 / h) * (
-0.01083095
+ (2 * t + 1) / 2 * (-0.00448811)
+ (3 * t**2 + 6 * t + 2) / 6 * (-0.00001682)
+ (4 * t**3 + 18 * t**2 + 22 * t + 6) / 24 * 0.00000158
+ (5 * t**4 + 40 * t**3 + 105 * t**2 + 100 * t + 24) / 120 * 0.00000001
)
tableDifP2.add_row([
toFixed(x),
toFixed(Dify, 8),
toFixed(DifP2, 8),
toFixed(closest_value_2),
toFixed(abs(Dify - DifP2), 8),
toFixed(t, 4)
])
print(tableDifP2)