数学のブログ

フーリエ級数展開 三角関数、正弦、実数倍角

Pythonで学ぶフーリエ解析と信号処理 (神永 正博)(著)、コロナ社)の第2章(フーリエ級数展開)、章末問題2-17の解答を求めてみる。

a n = 2 2 π - π π sin a t cos n t dt
= 1 π - π π sin ( a + n ) t + sin ( a - n ) t 2 dt
= 0
b n = 1 π - π π sin a t sin n t dt
= 1 π - π π cos ( a - n ) t - cos ( a + n ) t 2 dt
= 2 2 π 0 π ( cos ( a - n ) t - cos ( a + n ) t ) dt
= 1 π [ sin ( a - n ) t a - n - sin ( a + n ) t a + n ] 0 π
= 1 π ( sin ( a - n ) π a - n - sin ( a + n ) π a + n )
= 1 π ( sin a π cos n π - cos a π sin n π a - n - sin a π cos n π - cos a π sin n π a + n )
= 1 π ( ( - 1 ) n sin a π a - n - ( - 1 ) n sin a π a + n )
= 1 π 2 n ( - 1 ) n sin a π a 2 - n 2
= 2 π n ( - 1 ) n sin a π a 2 - n 2

よって求めるフーリエ展開は、

a sin a t 2 π k = 1 n ( - 1 ) n sin a π a 2 - n 2 sin n t

コード(Python)

#!/usr/bin/env python3
import random
import numpy as np
import matplotlib.pyplot as plt

print('2-17.')


def partialsum(t, n, a):
    return 2 / np.pi * \
        sum(k * (-1) ** k * np.sin(a * np.pi) * np.sin(k * t) / (a ** 2 - k ** 2)
            for k in range(1, n + 1))


vectorized = np.vectorize(partialsum)
t = np.linspace(-np.pi, np.pi, 10000)
n = 5
for i in range(5):
    a = random.random() * 5
    print(a)
    fig = plt.figure()
    for m in range(1, n + 1):
        ax = fig.add_subplot(n, 1, m)
        ax.plot(t, np.sin(a * t))
        ax.set_ylim(-2, 2)
        ax.plot(t, vectorized(t, m, a))
    plt.savefig(f'sample7_{i}.png')
    plt.show()

入出力結果

% ./sample7.py
2-17.
4.11686011187972
1.264113176239896
4.464191894422588
0.6797740784195017
4.794822074091237
%