Линейный интерполяционный сплайн
Для проверки работоспособности программы требуется для функции f(x) = (x - 1)6, задав отрезок [a, b] из крайних точек, выбирая промежуточные точки с шагом ℎ = (b - a) / N, N задано, построить сплайн.
Сплайн строится путем соединения всех точек в массиве между собой отрезками:
Код:
#библиотека для параметризации функции и построения графиков
from sympy import *
#для формирования таблицы
from prettytable import PrettyTable
x = symbols('x')
y = (x - 1) ** 6 #исходная функция
a, b = 1, 2 #отрезок из крайних точек
N = 10 #число разбиений
def lin_interp(y, a, b, N):
#получение списков координат опорных точек сплайна
global xi, yi
xi, yi = [], []
h = (b - a) / N #шаг
while a < b:
xi.append(a)
yi.append(y.evalf(subs={'x':a}))
a += h
if round(a - h, 5) != b:
xi.append(b)
yi.append(y.evalf(subs={'x': b}))
#вычисление уравнений кусков линейного сплайна с привязкой к своим отрезкам
yn = {}
for i in range(N):
ai = (yi[i + 1] - yi[i]) / (xi[i + 1] - xi[i])
bi = yi[i] - ai * xi[i]
yn[xi[i], xi[i + 1]] = ai * x + bi
return yn
#вызов функции и вывод на экран
print(lin_interp(y, a, b, N))
#вывод опорных точек сплайна в виде таблицы
th = ['x', 'f(x)']
table = PrettyTable(th)
data = [[] for i in range(N + 1)]
for i in range(N + 1):
data[i].append(xi[i])
data[i].append(yi[i])
#построчное заполнение таблицы
for i in range(N + 1):
dat = data[:]
while dat:
table.add_row(dat[i][:len(th)])
dat = dat[i][len(th):]
print(table)
#построение функции и сплайна в одних осях
p = plot(y, (x, a, b), show=False)
for i, j in lin_interp(y, a, b, N):
p.extend(plot(lin_interp(y, a, b, N)[i, j], (x, i, j), line_color='r', show=False))
p.show()
Результат: