みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

数値積分 vs フーリエ変換

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

数値積分 vs フーリエ変換

投稿記事 by みけCAT » 11年前

Twitterで「フーリエ変換」を検索していると、このような式がありました。
[album]750[/album]
見るからにヤバそうな広義積分の式ですね。

そして、最近講義で台形公式による数値積分を習いました。
よし、数値積分でフーリエ変換を計算してみよう!

といっても、数値積分で無限の範囲の積分はできないので、
ある有限の区間以外は0と定義する関数しかフーリエ変換できません。

がんばって実装したコード

CODE:

sekibun_i a b h k n f
 | k>=n = (f a)*0.5+(f b)*0.5
 | otherwise = (f (a+h*k))+sekibun_i a b h (k+1) n f
-- 関数fの[a,b]でn分割した台形公式による数値積分を求める
sekibun a b n f = h*sekibun_i a b h 1 n f
                where h = (b-a)/n

-- [s,e]を積分し、fのフーリエ変換F(omega)を求める
-- reが実部、imが虚部を返す
fuuriehenkan_re s e f omega = sekibun s e 10000 (\t -> (f t)*(cos (-omega*t)))
fuuriehenkan_im s e f omega = sekibun s e 10000 (\t -> (f t)*(sin (-omega*t)))

makeplot_i s h k n f
 | k>=n = []
 | otherwise = (s+h*k,f (s+h*k)):makeplot_i s h (k+1) n f
-- [s,e]の範囲をn分割し、fのグラフを描くためのデータを作る
makeplot s e n f = makeplot_i s ((e-s)/n) 0 n f

-- [(a,b)] -> String 主にmakeplotの出力をgnuplotに入れやすい形式にする
mp2text x = foldr (\a b -> a++b) "" $ map (\a -> (show $ fst a)++" "++(show $ snd a)++"\n")x

makeplot2_i s h k n fs fe f
 | k>=n = []
 | otherwise = concat [show (s+h*k)," ",show $ fuuriehenkan_re fs fe f (s+h*k)," ",
 	show $ fuuriehenkan_im fs fe f (s+h*k),"\n",makeplot2_i s h (k+1) n fs fe f]
-- [s,e]の範囲をn分割し、fのフーリエ変換F(omega)のグラフを描くためのデータを作り、直接gnuplot形式にする
-- 実際は、fではなく(\x -> if fsghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l fuurie_henkan.hs
[1 of 1] Compiling Main             ( fuurie_henkan.hs, interpreted )
Ok, modules loaded: Main.
*Main> do writeFile "1.txt" $ makeplot2 (-10) 10 100 (-1) 1 (\t -> 1)
とすると、関数(\t -> if (-1) if (-pi) if (-1) if (-1)<t && t<1 then exp (1/(x*x-1)) else 0)
not_kaiseki.png
解析関数ではない関数
not_kaiseki.png (7.5 KiB) 閲覧数: 312 回
うーん、どんな偶関数を入れても微妙に幅が違う山が出てくるだけの気がする。気のせいだよね…。
誰かおすすめの入力関数があれば、教えていただけると嬉しいです。
添付ファイル
sin_plus_2cos.png
三角関数の和
sin_plus_2cos.png (8.28 KiB) 閲覧数: 314 回
circle.png
半円
circle.png (7.15 KiB) 閲覧数: 297 回

アバター
usao
記事: 1889
登録日時: 12年前

Re: 数値積分 vs フーリエ変換

投稿記事 by usao » 11年前

話の内容と全然関係ないのですが,
グラフタイトルの「Fuurie henkan of」がなんかかっこわるいw

アバター
みょん
記事: 16
登録日時: 12年前

RE: 数値積分 vs フーリエ変換

投稿記事 by みょん » 11年前

変な入力ならデルタ函数を使ったものはどうですか?
(y=\delta(x)に近いインパルスとかy=xとか定数函数とか…)
オフトピック
どうでもいいけどtype signatureくらい書いて欲しい…読む気が起こらない…

アバター
こじこじ
記事: 16
登録日時: 12年前

Re: 数値積分 vs フーリエ変換

投稿記事 by こじこじ » 11年前

おお、フーリエ変換ですね。

ベッセル関数とか特殊関数を試してみたらどうでしょう?

運動方程式を解くテクニックにグリーン関数法というものがあるのですが、
フーリエ変換、フーリエ逆変換を使用してます。
簡単にいうと、ある「時間」「空間」に発生したエネルギー源が
別な「時間」「空間」にどのように影響するか調べることができます。
地震の波の伝播解析でもたまに使用されます。

グリーン関数でもf(t)にどのような関数を使うかがミソになるのですが
一般的にベッセル関数が使われます。