Во-первых, все эксперименты будут проводиться на следующем наборе данных (x,y) :
Код: Выделить всё
[('0.0', '0.0'),
('0.6283185307179586', '0.6427876096865393'),
('1.2566370614359172', '0.984807753012208'),
('1.8849555921538759', '0.8660254037844387'),
('2.5132741228718345', '0.3420201433256689'),
('3.141592653589793', '-0.34202014332566866'),
('3.7699111843077517', '-0.8660254037844384'),
('4.39822971502571', '-0.9848077530122081'),
('5.026548245743669', '-0.6427876096865396'),
('5.654866776461628', '-2.4492935982947064e-16')]

мы определить Дискретное преобразование Фурье

Моя реализация этой функции следующая
Код: Выделить всё
import numpy as np #consider numpy as imported from here on
def F_n(Y):
n = len(Y)
Y_hat = []
for k in range(len(Y)):
transformed_k = 1/n * sum([y_l * np.exp(-2 * np.pi * 1j* k * l/n) for l, y_l in enumerate(Y) ])
Y_hat.append(transformed_k)
return Y_hat
Код: Выделить всё
# F_n(y)
['(-1.33907057366955e-17+0j)',
'(0.14283712054380923-0.439607454395199j)',
'(-0.048591754799448425+0.06688081278992913j)',
'(-0.039133572999081954+0.028432205056635337j)',
'(-0.036913281031968816+0.01199385205986717j)',
'(-0.036397023426620205-2.0058074207055733e-17j)',
'(-0.03691328103196878-0.011993852059867215j)',
'(-0.03913357299908168-0.028432205056635646j)',
'(-0.04859175479944824-0.06688081278992904j)',
'(0.1428371205438091+0.439607454395199j)']
# np.fft.fft(y)
['(-1.1102230246251565e-16+0j)',
'(1.428371205438092-4.39607454395199j)',
'(-0.4859175479944836+0.6688081278992911j)',
'(-0.3913357299908192+0.2843220505663533j)',
'(-0.36913281031968803+0.11993852059867194j)',
'(-0.36397023426620184-1.1102230246251565e-16j)',
'(-0.36913281031968803-0.11993852059867194j)',
'(-0.3913357299908196-0.2843220505663534j)',
'(-0.4859175479944836-0.6688081278992911j)',
'(1.4283712054380922+4.39607454395199j)']

Я использую эту реализацию для теоремы
Код: Выделить всё
def trig_interpolation(Y_hat, x_range, depth=1000):
n = len(Y_hat)
get_summand = lambda c_j,l,x: c_j*np.exp(2 * np.pi * 1j * l*x)
y_intp = []
x_intp = list((i/depth)*x_range for i in range(depth))
if n%2==0:
K = n//2
for x in x_intp:
y_intp.append(sum([get_summand(c_j,l,x) for l,c_j in zip(range(-K+1,K+1), Y_hat)]))
else:
K = n//2+1
for x in x_intp:
y_intp.append(sum([get_summand(c_j,l,x) for l,c_j in zip(range(-K,K+1), Y_hat)]))
return x_intp, y_intp
x_range = max(x)-min(x)
x_intp, y_intp = trig_interpolation(np.fft.fft(y), x_range)
$$\exp(2\pi j x)$$
чтобы сделать процесс суммирования немного проще для чтения.
При запуске моего кода с коэффициентами, заданными FFT numpy, я получаю
Код: Выделить всё
plt.plot(x_intp,np.real(y_intp))
plt.plot(x,y, 'o')

Однако, точки выравниваются с помощью интерполяции с использованием БПФ numpy, я ожидаю, что кривая будет выглядеть по-другому и вести себя ближе к реальной синусоидальной кривой.
Использование моей реализации для расчета коэффициентов Фурье дает мне кривую, которая следует ожидать неправильного.

Прошу указать на мои ошибки, чтобы я мог правильно реализовать тригонометрическую интерполяцию в соответствии с представленной мной математической характеристикой.
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/790 ... erpolation