generated at
Houdini数学 : フーリエ級数の可視化

はじめに
関数 f(x) = x をsinやcosの足し合わせで表現する、フーリエ級数展開をHoudini上で可視化してみました。


フーリエ級数
関数 f(x) が周期 2 \piで同じ形を繰り返す場合、
f(x)sin波とcos波を足し合わせる形として表すことができます(フーリエ級数展開)
>f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))

■簡単なフーリエ級数の可視化
以下のような関数 f(x)を考えます。
>f(x) = \begin{cases} x & (0 \leqq x \leqq 2 \pi) \\ 0 & (それ以外) \end{cases}

■フーリエ級数展開
f(x) のフーリエ級数展開は以下のような数式で表すことができます。(※式の導出は長くなるので、後半に書きます)
>f(x) = \pi - 2 \cdot \sum_{k=1}^\infty (\frac{sin(kx)}{k})
今回は上記の式をHoudini上で実装し、可視化したいと思います。

■フーリエ級数の近似計算
Houdini上では、無限大(\infty)を扱うことができません。
そこで、フーリエ級数展開式の\inftyを 整数 Nに置き換えます。
>f(x) = \pi - \sum_{k=1}^N (\frac{2 \cdot sin(kx)}{k})
>
> = \pi - \frac{2 \cdot sin(x)}{1} - \frac{2 \cdot sin(2x)}{2} - \frac{2 \cdot sin(3x)}{3}- \cdots - \frac{2 \cdot sin((N-1) \cdot x)}{N-1} - \frac{2 \cdot sin(N \cdot x)}{N}
>
整数 Nを大きくすることで、本来のフーリエ級数に近い値が求まります。


Houdiniを利用したフーリエ級数の実装
■STEP1: ラインを作る
Lineノードを使用して、X軸プラス方向、長さ 2 \piのラインを作ります。
なめらかな曲線にしたいので、Pointsを多めにとっています。
パラメータ
Direction{1, 0, 0}
Length$PI * 2
Points1000


■STEP2: 式の計算
今回のフーリエ級数は以下のような数式でした。
>f(x) = \pi - \sum_{k=1}^N (\frac{2 \cdot sin(kx)}{k})

これをAttributeWrangle上にて実装すると、以下のようになります。
フーリエ級数を計算し、ポイントのY座標に計算値を設定しています。
AttributeWrangle(c)
int N = chi("n"); float a0 = 2 * $PI; float sum = a0 / 2.0; for (int i = 0; i <= N; i++) { sum += -2.0 * sin(i * @P.x) / i; } @P.y = sum;

■結果
N = 1, 4, 100, 1000 の4パターンを載せてみました。
Nを増やすと 直線 y = x に近づくことが分かります。


【式の導出】f(x) = x のフーリエ級数展開
今回、以下の関数f(x)のフーリエ級数を導出したいと思います。
>f(x) = \begin{cases} x & (0 \leqq x \leqq 2 \pi) \\ 0 & (それ以外) \end{cases}

■必要な数学の知識
三角関数
不定積分・定積分・部分積分

■フーリエ級数
フーリエ級数は以下で計算することができます。
>f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))
>a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
>b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot sin (kx) dx

[* ■STEP1 : a_0を計算してみる]
a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dxk = 0を代入します。

>a_0 = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (0) dx
>
> = \frac{1}{\pi} \int_0^{2 \pi} x dx
>
> = \frac{1}{\pi} \left[ \frac{1}{2} x^2 \right]^{2 \pi}_0
>
> = \frac{1}{\pi}(2 \pi ^ 2 - 0)
>
> = 2 \pi
計算結果) a_0 = 2 \pi

[* ■STEP2 : a_kを計算してみる]
a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx を計算する前に、不定積分 \int x \cdot cos (kx) dx を計算します。

>\int x \cdot cos (kx) dx
> = x \cdot \frac{1}{k}sin (kx) - \int \frac{1}{k} sin (kx) dx \ \ \ (部分積分)
> = x \cdot \frac{1}{k}sin (kx) + \frac{1}{k^2} cos (kx) + C

式を整理すると以下のようになります。(積分定数Cは省いています)
>\int x \cdot cos (kx) dx = \frac{1}{k} \cdot x \cdot sin (kx) + \frac{1}{k^2} cos (kx)

これを a_kに代入します。
>a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
> = \frac{1}{\pi} \left[ \frac{1}{k} \cdot x \cdot sin (kx) + \frac{1}{k^2} cos (kx) \right]_0^{2 \pi}
> = 0
計算結果) a_k = 0

[* ■STEP3 : b_kを計算してみる]
b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot sin (kx) dx を計算する前に、不定積分 \int x \cdot sin (kx) dx を計算します。

>\int x \cdot sin (kx) dx
> = -x \cdot \{ \frac{1}{k} cos (kx) \} - \int \{- \frac{1}{k} cos (kx) dx \} \ \ \ (部分積分)
> = -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx) + C

式を整理すると以下のようになります。(積分定数Cは省いています)
>\int x \cdot sin (kx) dx = -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx)

これを b_kに代入します。
>b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
> = \frac{1}{\pi} \left[ -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx) \right]_0^{2 \pi}
>
> = -\frac{1}{\pi} \cdot \frac{1}{k} \cdot 2 \pi \cdot cos (2 \pi k)
>
> = -\frac{1}{\pi} \cdot \frac{1}{k} \cdot 2 \pi
>
> = -\frac{2}{k}
計算結果) b_k = -\frac{2}{k}

■STEP4 : フーリエ級数展開を計算してみる
計算した a_0, a_k, b_kの値をフーリエ級数展開の式に代入し、フーリエ級数展開を計算してみます。
>a_0 = 2 \pi, a_k = 0, b_k = -\frac{2}{k}

>f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))
> = \frac{2 \pi }{2} + \sum_{k=1}^\infty (0 \cdot cos (kx) - \frac{2}{k} \cdot sin(kx))
> = \pi + \sum_{k=1}^\infty (-\frac{2}{k} \cdot sin(kx))

計算結果)
f(x)のフーリエ級数展開は以下のようになります。
>f(x) = \pi - \sum_{k=1}^\infty (\frac{2}{k} \cdot sin(kx))

関連