Линейный интерполяционный сплайн
×

Линейный интерполяционный сплайн

Для проверки работоспособности программы требуется для функции 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()

Результат: