Разложение в ряд Фурье функции, заданной таблично

Рейтинг: 0Ответов: 1Опубликовано: 10.06.2023

Есть функция, которая задана таблично:

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 час бьюсь и просто-напросто не могу распознать ошибку. Пожалуйста, помогите.

Ответы

▲ 3Принят
  1. Индекс k должен начинаться с единицы. Вместо нулевых значений a0.

  2. Коэффициент при a0 должен быть 1 / L.

введите сюда описание изображения

P.S. Сплайн не совсем корректно построен. Производная на концах терпит разрыв. Поэтому ряд Фурье на концах сильно отличается от сплайна. Это вопрос к методичке, не к вам.