とーけい部

現在、このブログは工事中です。

統計学 統計検定 数学

デルタ関数のフーリエ変換は「1」←ほんとかよ?

雑談

今書いてる記事のシリーズに「ハミルトン本を読もう!」っていうのがあるんですけど(2021/4/14注記:いろいろ忙しくて更新できてないです。再開のめどがたつまで非公開にしておきます)これは時系列分析の本なのでスペクトル分析のところでどうしてもフーリエ変換が必要になるため、最近フーリエ変換を勉強してます。
理工系の人ならそんなん常識やろ~wってなるかもしれませんが、ぼく文系なんで今まで触れる機会が無くて、全く知りませんでした!w すいません許してください何でもしますから!

まあ、冗談はさておき、結構面白いですねこれ。全ての周期関数(は言い過ぎだけど、病気みたいな関数を除けば)はサイン波とコサイン波の重ね合わせで表現できるっていう。これを利用することで、時系列データについてその周波数領域での考察を行うことができます。まあ決定論的なアレから確率論的なアレへの拡張は必要ですが。
で、まあこのフーリエ変換なんですが、ディラックデルタ関数(x=0でボーン!と上に跳ね、それ以外の点では0になるやつ)をフーリエ変換すると「1」という定数になる らしいです。微分方程式の講義でまあラプラス変換はやってたんで結果自体は知ってるんですけど、フーリエ変換の意味を改めて考えると、「え、ほんとか?」て思ったんで、ちょっと調べてみます。当たり前ですが、結果自体はきちんと成立します。

フーリエ変換

以下を関数f(x)の角周波数へのフーリエ変換F(ω)とよぶ。

\displaystyle{
\large{
F(\omega) = \int_{- \infty}^{\infty} f(x) e^{-i\omega x}dx
}
}

そして以下を、F(ω)のフーリエ逆変換とよぶ。

\displaystyle{
\large{
f(x) = \frac{1}{2\pi}\int_{- \infty}^{\infty} F(\omega) e^{i\omega x}d\omega
}
}

このフーリエ逆変換の式の意味:exp(iωx)が周期(角周波数)の同じサイン波とコサイン波の和であることから、異なる周期のサイン波コサイン波の重ね合わせで関数f(x)が表現されており、その重ね合わせのうち、角周波数ωに対応するサイン波コサイン波の、f(x)に対する強さがF(ω)という関数(その波にかかっている係数)で表現されていることがわかる。
F(ω)が大きければ、f(x)のうち、このωに対応しているサイン波コサイン波のパワー!がでかいってことですね。

ディラックデルタ関数

これは超関数とか呼ばれてる(超関数で調べてもよくわからなかった)関数で、まあ非常にざ~っくりと書くと、以下のような関数になっている。

\displaystyle{
\large{
\delta (x) =
\begin{cases}
\infty & (x=0) \\
0 & (x \neq 0)
\end{cases}
}
}

図で書くと、以下のような関数ですね。これは近似ですが。

pe <- function(e,x){
  a <- ifelse(-e<x&x<e,1/(2*e),0)
  return(a)
}
curve(pe(0.00001,x),xlim=c(-0.001,0.001),main="デルタ関数っぽいもの")

f:id:hasegawa-yuta289:20201220215046p:plain

確かめてみる。

以下のように、exp(iωx)×dω を、ωをめ~~~~~っちゃ細かくとって、それを全部係数「1」で足し合わせてみます。
め~~~~~っちゃ細かくとるんですけど、その振る舞いを分かりやすくするために、だんだん細かくしていきましょう。

f <- function(x){
  len <- 100
  omega <- seq(-1000,1000,length=len) #-1000~1000までをlen分割する
  d_omega <- omega[2]-omega[1]
  a <- c()
  for(i in 1:length(x)){
    a[i] <- sum( 1 * exp( 1i *omega*x[i]) * d_omega )
  }
  return(Re(a))
}
curve(f(x),xlim=c(-10,10),main="フーリエ逆変換後の関数(ω=-1000から1000までを100分割)")

ω=-1000から1000までを100分割して、exp(iωx)を全部足します。これがf(x)(に2πをカケたもの)の近似になってます。
図にすると以下。
f:id:hasegawa-yuta289:20201220215503p:plain

おいおい全然デルタ関数じゃないじゃないっすか~、本当にデルタ関数になるんですかぁ~?って感じですが、もっと細かくしていきましょうか。100分割じゃ足りなかったか。

1000分割するとこんな感じ。
f:id:hasegawa-yuta289:20201220215627p:plain

おや、だいぶ近づきましたね。

まあ、もういいですかね。飽きたでしょ。1000000分割するとこんな感じ。

f <- function(x){
  len <- 1000000
  omega <- seq(-1000,1000,length=len) #-1000~1000までをlen分割する
  d_omega <- omega[2]-omega[1]
  a <- c()
  for(i in 1:length(x)){
    a[i] <- sum( 1 * exp( 1i *omega*x[i]) * d_omega )
  }
  return(Re(a))
}
curve(f(x),xlim=c(-10,10),main="フーリエ逆変換後の関数(ω=-1000から1000までを1000000分割)")

f:id:hasegawa-yuta289:20201220215757p:plain

これはもうさすがにデルタ関数に収束するとみてもよさそうですかね?

というわけで、デルタ関数フーリエ変換するとまじで定数「1」になるっぽいことが確認できました。
周期がほんの少しずつ異なるサイン波とコサイン波を足しまくるとx=0の点で爆発してそれ以外では0になる関数(つまりデルタ関数)になるっていうのは、ちょっと面白いですね。
まあよく考えたら、どの周期のコサイン波でも x = 0のとき cos 0 = 1だから必ず1になるし、あとまあ、それ以外の点では互いに打ち消しあって0に近づくってことなんでしょうね。当たり前な気がしてきた。(おわり)