読者です 読者をやめる 読者になる 読者になる

ギブズの現象

雑記

フーリエ級数

f(t)を実数の周期関数とする.
f(t + 2\pi) = f(t)
ここで,
a_n = \frac 1 \pi \int_{-\pi}^\pi f(t) \cos nt dt
b_n = \frac 1 \pi \int_{-\pi}^\pi f(t) \sin nt dt
で定義された数を, フーリエ係数と呼ぶ. fがある条件を満たしたら(凡人が考えつくような関数なら大丈夫), フーリエ級数f(t)に「収束」し, f(t)は次のように表すことが出来る.
f(t) = \frac{a_0}{2} + \sum_{n=1}^\infty \left(a_n \cos nt + b_n \sin nt \right)

\{a_n\}は偶関数の成分, \{b_n\}は奇関数の成分を表し, a_0は直流成分を表す. 直流成分の係数を2で割らなくてはいけないのは, 周波数0だと+0の周波数と-0の周波数として, 二回カウントしてしまうからである. この気持ち悪さは(そもそも「周期の半分で割る」というのは変である), 複素フーリエ級数では消えており, こちらのほうが直感と合うのだが, 今回はここは追わない.

まずは, 具体例でフーリエ級数の感覚をつかもう.

具体例1

次のような周期関数をフーリエ級数展開してみよう.
f(t) = 1 - \frac{|t|}{\pi} \quad (-\pi \le t < \pi), f(t) = f(t + 2\pi)
グラフにするとこんな具合だ.

定義に従い, フーリエ係数を求める. まず, a_n
a_n = \frac 1 \pi \int_{-\pi}^\pi \left(1 - \frac{|t|}{\pi} \right) \cos nt dt = \frac 2 \pi \int_0^\pi \left(1 - \frac{t}{\pi} \right) \cos nt dt = \frac 2 \pi \frac{1-cos n\pi}{n^2\pi} = \begin{cases} 0 & n: \text{even} \\ \frac{4}{n^2\pi^2} & n: \text{odd} \end{cases} (n > 0)
a_0 = \frac 1 \pi \int_{-\pi}^\pi \left(1 - \frac{|t|}{\pi} \right) dt = 1
となる(a_0a_n(n>0)の式の\cosを二次まで展開して一致することを確認されたい: 1 - \cos t \sim t^2/2は重要な感覚, そもそも直流成分は元の関数を見れば平均して1/2である). f(t)は偶関数なので, 奇関数の成分はない.
b_n = \frac 1 \pi \int_{-\pi}^\pi f(t) \sin nt dt = 0
したがって, フーリエ級数展開
f(t) = \frac 1 2 + \frac 4 {\pi^2} \left( \cos t + \frac 1 9 \cos 3t + \frac 1 {25} \cos 5t + \frac 1 {49} \cos 7t +\cdots \right)
となる.

グラフで描くと, 次のようになる. 赤の線が元の関数で, 青の関数がフーリエ級数の部分和である. まず,
f(t) \sim \frac 1 2 + \frac 4 {\pi^2} \cos t
である.

この時点ですでに, かなり良い感じに重なっている. 次に, \cos 9tまで足したところ.

もうぴったり重なってしまい, 何が何だか分からない. こんな感じに, フーリエ級数展開は元の関数を三角関数の和で近似してしまうのだ.

係数は
a_n = \frac{4}{n^2\pi^2} \quad (n = 1, 3, 5, \dots)
であった. 二乗のオーダーで係数は小さくなる.

具体例2

今度は, 次の周期関数をフーリエ級数展開しよう.
f(t) = \mathrm{sgn}(t) \quad (-\pi \le t < \pi), f(t) = f(t + 2\pi)
グラフにすると次のようになる.

フーリエ係数を求める. a_nは, f(t)が奇関数なので0.
a_n = \frac 1 \pi \int_{-\pi}^\pi \mathrm{sgn}(t) \cos nt dt = 0
b_n
b_n = \frac 1 \pi \int_{-\pi}^\pi \mathrm{sgn}(t) \sin nt dt = \frac 2 \pi \int_0^\pi \sin nt dt = \frac 2 \pi \frac{1-\cos n\pi}{n} = \begin{cases} 0 & n:\text{even} \\ \frac 4 {n\pi} & n: \text{odd} \end{cases}
と計算できる. よって,
f(t) = \frac 4 \pi \left( \sin t + \frac 1 3 \sin 3t + \frac 1 5 \sin 5t + \frac 1 7 \sin 7t + \cdots \right) = \frac 4 \pi \sum_{k=1}^\infty \frac 1 {2k-1} \sin(2k-1)t
となる. 係数は
b_n = \frac 4 {n\pi} \quad (n = 1, 3, 5, \dots)
と, 一乗のオーダーで小さくなる.


グラフにしてみよう. まず,
f(t) \sim \frac 4 \pi sin t
と元の関数を比べてみる.

全然だめじゃん, となる. それでも何とかして近似しようとしている青線の気持ちのはなんとなく分かる. 「俺は精一杯赤線に近づいてこんな感じだから後は頼んだ!」って聞こえてくる. 次に,
f(t) \sim \frac 4 \pi \left(sin t + \frac 1 3 \sin 3t\right)
を見てみると, 次のようになる.

ようやく, 近似しようとしているのだなぁ, という感じになる. 高周波ちゃん頑張って!と応援したくなる. でもまだまだ甘い. もういっそ, \sin 15tくらいまで足してあげると,

のようになる. \sin 15tちゃんが, 不連続なところを頑張ってやんよ!って叫んでる. 思い切って, \sin 101tの項まで足すと,

もう赤い線は見えなくなった. みんなよく頑張ったね, ヨシヨシ. フーリエ級数展開は, このようにして元の関数を一生懸命近似しようとする涙ぐましい協力愛だったのだ(謎



ところが, である. 少し拡大してみよう.

うん???

なんだこれは??? なんだか(0,1)付近で, えらくぐにゃぐにゃ曲がっている.


もっと項を増やしてみよう. \sin 401tまでとってみて, 拡大すると(横軸が小さくなってるのに注意しよう)

オーバーシュートが見える. だいたい1.175ちょい過ぎまで, 飛び出ているのが分かる.


元の関数を近似したいのに, 不連続な点では行きすぎてしまう. 行きすぎてフニャフニャしている時間は, Nを大きくすると短くなるのだが, 行き過ぎる量は実は一定値に収束する. この現象を, ギブズの現象という.

ギブズの現象

フーリエ級数展開とは, 周期関数を三角関数の無限和で表すものであった. より正確に言うと, フーリエ級数は元の関数に各点収束する.
\forall t. \lim_{N \to \infty} f_N(t) = f(t)
表したい関数が不連続関数の時はどうなるのだろう? 収束先は?

実は, 元の関数が不連続関数の時は, その点においてフーリエ級数は両端の極限の中点に収束する.
\lim_{N \to \infty} f_N(t) = \frac{f(t-0)+f(t+0)}{2} =: \lim_{h\to +0}\frac{f(t-h)+f(t+h)}{2}
これは, 先ほどの例2で言うと, 不連続点t=0において0になるということだ.
f(t) = \lim_{N\to \infty} \frac 4 \pi \sum_{k=1}^N \frac 1 {2k-1} \sin(2k-1)t
f(0) = \lim_{N\to \infty} \frac 4 \pi \sum_{k=1}^N \frac 1 {2k-1} \sin 0 = 0 = \frac{1 + (-1)} 2
これは至極当たり前のように思えるだろう*1. 今回は不連続点が原点にあり, しかも奇関数であるから\sinの成分しか無い. よってf(0)=0となる.

しかし, ギブズの現象は起こった. フーリエ級数は収束するし, 不連続だとしても中点に収束するのに, である. Nを増やしてグラフを描いていくと, なんかスパークが見えるし, 各点収束とは何だったのか, となる.


よく考えてみれば, 我々がグラフを描いてる(描かせている)時はNを「真に」無限大に取ることはできない. 例えば10であったり, 100あるいは頑張って1000まで取ってみて, 元の関数と「ぴったり」あったことを確認して満足する. しかしそれでは, 何時まで経っても元の関数にはなれていないのだ. 三角関数は連続関数だから, それらの総力を合わせて頑張ろうとしても, 不連続関数を表そうなんてのは無茶な話なのだ. 各点収束はすれど, その無茶がギブスの現象として体現してしまうのである.


おしゃべりが過ぎたようなので, きちんとギブズの現象を考えよう. 目標は,

ここの飛び出し度を測ることだ. もう少し正確に言うと, 部分和の最初の極大点を極限で飛ばせばいい. 王道に, 計算していこう.
f_N(t) = \frac 4 \pi \sum_{k=1}^N \frac 1 {2k-1} \sin (2k-1)t
まず, 微分する.
f_N'(t) = \frac 4 \pi \sum_{k=1}^N \cos (2k-1)t = \frac 4 \pi \sum_{k=1}^N \frac{\sin 2kt - \sin (2k-2) t } {2 \sin t} = \frac 2 \pi \frac {\sin 2Nt }{\sin t}
と計算できる*2. よって, t>0の最初の極点は
\sin 2Nt = 0 \quad \therefore \quad t = \frac \pi {2N}
となる. こんなにもあっさりと簡単に求まるなんて驚きである. これを部分和に代入して
f_{N}\left(\frac{\pi}{2N}\right) = \frac 4 \pi \sum_{k=1}^N \frac 1 {2k-1} \sin \frac{(2k-1)\pi}{2N} = \frac 2 \pi \sum_{k=1}^N \frac{2\pi}{2N} \frac{\sin \frac{(2k-1)\pi}{2N}}{\frac{(2k-1)\pi}{2N}}
となるが, この最後の部分の和は, 関数
\frac{\sin t}{t}
の点
t = \frac \pi {2N}, \frac {3\pi}{2N}, \dots ,\frac{(2N-1)\pi}{2N}
に於ける値に, 幅
\frac {2\pi}{2N}
を掛けたのの和となっており, これの極限を取ると面積になる:

よって
\lim_{N \to \infty} f_N\left(\frac\pi{2N}\right) = \frac 2 \pi \int_0^\pi \frac{\sin t}{t} dt
となる. ところで, 数覚を養う ー 定積分の感覚 - プログラムモグモグのこの画像を思い出そう.

そう,
\int_0^\infty \frac{\sin t}{t} dt = \frac \pi 2 = 1.57079\cdots
であったのだ*3. 更に, t \in [0,\pi]ではこの積分\pi/2よりちょっとだけ大きいくらいということが分かる. 実際この値は
\int_0^\pi \frac{\sin t}{t} dt = 1.8519 \cdots
となる. よって
\lim_{N \to \infty} f_N\left(\frac\pi{2N}\right) = \frac 2 \pi \times 1.8519 \cdots = 1.1789 \cdots
となる. 先程, およそ1.175ちょい過ぎまで飛び出ているといっていたので, 観測結果とおよそ合致している:

ギブズの定数

\int_0^\pi \frac{\sin t}{t} dt = 1.8519 \cdots
を, ウィルブラハム=ギブズ定数 (Wilbraham-Gibbs constant)という. 更に,
\frac 2 \pi \int_0^\pi \frac{\sin t}{t} dt = 1.1789 \cdots
をギブズの定数という.

先ほどの関数は
f(t) = \mathrm{sgn}(t) \quad (-\pi \le t < \pi), f(t) = f(t + 2\pi)
というものであった. もしこの関数を縦にスケール変換すると, 当然行き過ぎ量は大きくなる. よって, 重要なのは「不連続なジャンプ幅に対する行き過ぎ量の割合」ということになる. 今回はジャンプが2なので,
\frac{1.1789 - 1}{2} = 0.08949
となる. よって, ジャンプの大きさに対しておよそ9%行き過ぎるということになる. 驚くべきことに, \mathrm{sgn}(t)のスケール変換で出来る関数のみならず, あらゆる不連続関数に対してもこの量は一定であることが分かっている.



例えば, 次の関数を考えよう.
f(t) = t \quad (-\pi \le t < \pi), f(t) = f(t + 2\pi)

a_nは, f(t)が奇関数であるから0
a_n = \frac 1 \pi \int_{-\pi}^\pi t \cos nt dt = 0
b_n
b_n = \frac 1 \pi \int_{-\pi}^\pi t \sin nt dt = \frac 2 \pi \int_0^\pi t \sin nt dt = - \frac {2 \cos n\pi}{n}= - \frac {2 (-1)^n}{n}
となるので,
f(t) = 2 \left(\sin t - \frac 1 2 \sin 2t + \frac 1 3 \sin 3t - \frac 14 \sin 4t +-\cdots \right)
となる. \sin 5tまで取ると,

\sin 20tで取ると

となる. 良い感じに近似はできているが, やはりギブズの現象が起こりそうである. \sin 100tまでとると,

拡大すると

となる. やはり, 不連続点において行き過ぎが生じている(ここは下への助走で戻り過ぎといったところか).


さきほどの関数と同じかどうか確かめるために, 行き過ぎ量を計算しよう.
f_N(t) = 2 \sum_{k=1}^N \frac{-(-1)^k}{k} \sin kt
微分すると
f_N'(t) = 2 \sum_{k=1}^N {-(-1)^k} \cos kt = 2 \sum_{k=1}^N {-(-1)^k} \frac{\cos\left(k+\frac 12\right)t + \cos\left(k-\frac 12\right)t}{2\cos \frac t 2}= \frac {-(-1)^N \cos\left(N+\frac 12\right)t+\cos \frac t2}{\cos \frac t 2}
となる. もう少し計算すると,
f_N'(t) = 1 - (-1)^N \cos Nt + (-1)^N \frac{\sin Nt \sin \frac t2}{\cos \frac t2}
となるので, 極点は, Nと偶奇の一致する数kをとって
f_N'(t) = 0 \quad \therefore \quad t = \frac{k\pi}{N}
となる. 今は, t=\piに最も近い点を求めたいので,
t = \frac {(N-2)\pi}N
とする. ここにおける部分和の値は
f_N\left(\frac {(N-2)\pi}N\right) = 2 \sum_{k=1}^N \frac{-(-1)^k}{k} \sin \frac{k(N-2)\pi} N = 2 \sum_{k=1}^N \frac{\sin\frac{2k\pi}{N}}{k} = 2 \sum_{k=1}^N \frac {2\pi} {N} \frac{\sin\frac{2k\pi}{N}}{\frac{2k\pi}{N}}
となる. やはり, この項はリーマン和の形なので,
\lim_{N \to \infty} f_N\left(\frac {(N-2)\pi}N\right) = 2 \int_0^\pi \frac{\sin t}{t} dt = 3.70387\cdots
となる. よって, 行き過ぎ量をジャンプ幅に対する割合にすると,
\frac{3.70387 - \pi}{2\pi} = 0.08949
となる.

やはり, 今回もジャンプの大きさに対して9%行き過ぎるという結果を得た. これはさっきとぴったり一致する. 不連続関数のジャンプの大きさに対して必ず一定の量だけ行き過ぎるのだ. ああ, 証明はしてない. が, 直感的には一定であることは理解できるだろう. なぜなら, ギブズの現象は高周波での現象なのだ. だから不連続点の付近でxを掛けようがx^{10}を掛けようが, それらの和を掛けようが関係ないのである. よって, 凡人の思いつきそうなどんな関数の不連続な部分であっても, 上の最初の不連続関数を局所的に何倍かすれば作れてしまうので, 行き過ぎ量は全く影響を受けること無く一定となるのである*4.

行き過ぎ時間

f(t) = \mathrm{sgn}(t) \quad (-\pi \le t < \pi), f(t) = f(t + 2\pi)
この関数に話を戻そう.

この図, ふにゃふにゃの極大点がなんだか指数関数っぽい. 或いは, 綺麗に包絡線を描くことが出来る. 実際, 指数関数になるのだろうか?

部分和の微分0になる点は
t = \frac{m\pi}{2N}
であった. これを部分和に放り込むと
f_N\left(\frac{m\pi}{2N}\right) = \frac 4 \pi \sum_{k=1}^N \frac 1 {2k-1} \sin \frac{(2k-1)m\pi}{2N} = \frac 2 \pi \sum_{k=1}^N \frac{2m\pi}{2N} \frac{\sin \frac{(2k-1)m\pi}{2N}}{\frac{(2k-1)m\pi}{2N}}
となる(簡単な修正だけである). よって, この和を無限に飛ばすと積分になる.
\lim_{N \to \infty} f_N\left(\frac{m\pi}{2N}\right) = \frac 2 \pi \int_0^{m\pi} \frac{\sin t}{t} dt
これの何をすればいいのかというと, まず1を引いて,
 \frac 2 \pi \int_0^{m\pi} \frac{\sin t}{t} dt - 1
このmに対する変化を見る. ぼーっと眺めていても埒が明かないので, 具体的に計算してみることにする. ここで, 我々が興味が有るのはmが奇数の時だけなので, これだけ計算すると, i=1,3,5,\dotsの順に
0.17898,\,\, 0.0661865,\,\, 0.0402143,\,\, 0.028832,\,\, 0.0224603,\,\, 0.0183915,\,\, 0.0155693
となる.

これは指数関数になるのだろうか?答えは(残念ながら)Noなのだ. もし指数関数にしたがって小さくなっているならば, 隣り合った数字の比が一定になるはずである. しかし, 上の数列の隣り合った項の比は
0.369798,\,\, 0.607590,\,\, 0.716958,\,\, 0.779005,\,\, 0.818844,\,\, 0.846548
となり, どんどん大きくなる. よって, 指数関数ほど速くは小さくならない.

もう一度, すぐ上のグラフのふにゃふにゃを見ていただきたい. 最初は思いっきりよく小さくなるのだが, その後はずっとふにゃふにゃし続けており, 冷静になって見てみれば, これは確かに指数関数では小さくなってないなぁと思うのである.

*1:本当なら, t=-piでの値をよく考えなくてはならないだろう

*2:cos関数を足し合わせるのが苦手な読者は, cosを複素関数の指数関数の和にしてしまっても良い

*3:前の記事を書いた時に色々と調べていたら, ギブズの定数というものにたどり着き, 今回の記事を書くきっかけとなった.

*4:やはり無理があるか... 証明はまだ私がよく分かってないので, これから確認してくる