のこぎり波のフーリエ級数¶
$-\pi<x<\pi$で$f(x)=x$と定め、それを$2\pi$周期で拡張した 関数を考えます。そのフーリエ級数は
$$ f(x)\sim \frac{a_0}{2} +\sum_{k=1}^{\infty}a_k\cos(kx) +\sum_{k=1}^{\infty}b_k\sin(kx). $$
Egisonで係数を与える積分を記号的に計算し、級数の最初の数項を 組み立てます。
原始関数の記号計算¶
係数は次の積分で与えられます。
$$ a_k=\frac1\pi\int_{-\pi}^{\pi}x\cos(kx)\,dx, \qquad b_k=\frac1\pi\int_{-\pi}^{\pi}x\sin(kx)\,dx. $$
部分積分により、$x\cos(kx)$と$x\sin(kx)$の原始関数を明示的に 求められます。ここではその公式を直接定義し、このNotebookが 追加の積分ライブラリに依存しないようにします。
declare symbol x, n : MathValue
def f (x : MathValue) : MathValue := x
def cosinePrimitive (k : MathValue) : MathValue :=
x * sin (k * x) / k + cos (k * x) / k^2
def sinePrimitive (k : MathValue) : MathValue :=
(- x) * cos (k * x) / k + sin (k * x) / k^2
sinePrimitive n
フーリエ係数¶
のこぎり波は奇関数なので、余弦係数はすべて0です。正弦係数は $b_k=2(-1)^{k+1}/k$となります。
def cosineCoefficients : [MathValue] :=
map
(\k ->
let primitive := cosinePrimitive k
in (substitute [(x, π)] primitive - substitute [(x, - π)] primitive) / π)
nats
def sineCoefficients : [MathValue] :=
map
(\k ->
let primitive := sinePrimitive k
in (substitute [(x, π)] primitive - substitute [(x, - π)] primitive) / π)
nats
take 10 cosineCoefficients
take 10 sineCoefficients
フーリエ級数の再構成¶
各$b_k$に$\sin(kx)$を掛けると、フーリエ級数の各項が順に得られます。
def fourierTerms : [MathValue] :=
map (\(k, b) -> b * sin (k * x)) (zip nats sineCoefficients)
take 10 fourierTerms
したがって、
$$ x=2\sum_{k=1}^{\infty}\frac{(-1)^{k+1}}{k}\sin(kx) \qquad(-\pi<x<\pi). $$
関数の偶奇性と係数の計算を別々のセルにすることで、余弦項が 一つも残らない理由が明確になります。