Разложение в ряд Фурье функции, заданной таблично
Есть функция, которая задана таблично:
X 0 1 2 3 4 5 6 7
Y 0 1 2 2 5 4 3 0
Нужно её разложить в ряд Фурье и построить график.
Я решил это следующим образом:
Затем принялся за реализацию на Python. Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
# Табличные данные
X = np.array([0, 1, 2, 3, 4, 5, 6, 7])
Y = np.array([0, 1, 2, 2, 5, 4, 3, 0])
# Строим сплайновую интерполяцию
from scipy.interpolate import CubicSpline
cspline = CubicSpline(X, Y)
# Разложение в ряд Фурье
L = X[-1] - X[0]
N = 5
k = np.arange(0, N + 1)
def integrate_cos(x, k):
return np.cos(2 * np.pi * x * k / L) * cspline(x)
def integrate_sin(x, k):
return np.sin(2 * np.pi * x * k / L) * cspline(x)
a0 = (2 / L) * quad(cspline, 0, L)[0]
ak = (2 / L) * np.array([quad(integrate_cos, 0, L, args=(ki,))[0] for ki in k])
bk = (2 / L) * np.array([quad(integrate_sin, 0, L, args=(ki,))[0] for ki in k])
# Сумма ряда Фурье
def fourier_series(x):
series = a0 + np.sum(ak.reshape(-1, 1) * np.cos(2 * np.pi * x * k.reshape(-1, 1) / L) + bk.reshape(-1, 1) * np.sin(2 * np.pi * x * k.reshape(-1, 1) / L), axis=0)
return series.flatten()
# Создаем данные для построения графика
x_values = np.linspace(X[0], X[-1], 1000)
y_interp = cspline(x_values)
y_fourier = fourier_series(x_values)
# Построение графика
plt.plot(x_values, y_interp, 'r', label='Интерполированная функция')
plt.plot(x_values, y_fourier, 'b--', label='Сумма ряда Фурье (N=5)')
plt.scatter(X, Y, color='black', label='Табличные данные')
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('График интерполированной функции и ряда Фурье')
plt.grid(True)
plt.show()
По итогу мне выдаёт такой график:
Такой вопрос. Почему эти графики не совпадают, я уже 4 час бьюсь и просто-напросто не могу распознать ошибку. Пожалуйста, помогите.
Источник: Stack Overflow на русском