数値的なフーリエ展開の効率的な方法はあるか?

このQ&Aのポイント
  • 関数のフーリエ展開における数値的な扱いについて検討します。
  • 大きな展開項数が必要な場合でも、少ない項数で精度よく展開する方法を探します。
  • フーリエ展開の効率的な数値的な扱いについてアイデアを募集します。
回答を見る
  • ベストアンサー

関数のフーリエ展開の数値的な扱い

f(x)は |x| < a では正の有限値を持つ滑らかな関数で、 |x| > a ではゼロとします。x = a は連続につながっています。 たとえば  f(x) = cos(x) (|x|≦π/2) , 0 (|x|> π/2) のような関数です。 この関数を間隔 L > 0 で並べた関数をφ(x)とします。  φ(x) = Σ[n] f(x + nL) L が a に比べて十分に大きいような場合、すなわち 有限値を持つ山が、値がゼロである領域の谷をはさんで 飛び飛びに並んでいるような場合について考えます。 適当な基底関数{Vn(x)}で展開して  φ(x) = Σ[n] Cn Vn(x) という形にして、数値的に扱いたいのですが 三角関数系{exp(inx)}を基底にすると、かなり大きな n まで 和をとらないと精度が保てません。このような場合に、 少ない項数で精度よく展開できるような方法は 有りませんでしょうか?アイデアを頂けるとありがたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

「精度が保てない」と仰る意味がはっきりしませんが… [1] ご質問のような周期2πの周期関数f(x)の半周期分だけを取り出したものをg(x)とすると、矩形関数 B(x) = |x|<π/2のとき1、さもなくば0 を使って g(x) = f(x)B(x) とすれば良い。逆にg(x)からf(x)を作るには(Σをn=0, ±1, ±2, .... の総和として) f(x) = Σ(g(x-2nπ)) = g(x)*Σ(δ(x-2nπ)) とすれば良い。(ここで*は畳み込み(convolution)、δはディラックのデルタ関数(本当は超関数)です。)  矩形関数Bをかけ算することで切り取られる縁の持つ高周波成分がいろいろ問題になるという場合には、縁を持っている基底を使うのも一つの手です。たとえばウォルシュ・アダマール変換とか、wavelet変換の中でとんがった基底を持つ物を使うとか。しかし、その基底がf(x)とよほど相性が良い(うんと少ない項数で表せる)というのでない限り、計算量の観点から言うと、普通の(離散)フーリエ変換の方が実用的です。なにしろFFTという優れたアルゴリズムがあるんで、項数を多くしてもうんと速く計算できるから。 [2] というわけで、(お分かりなのかもしれないけれど、)普通のフーリエ変換の話。  めんどくさい定数倍とか、横軸の単位とか、細かい話は抜きでやります。(フーリエ変換の定義の仕方(流儀)によって細かい違いが出ますので。)なので、以下はご自分で計算しなおしてくださいね。  f(x) の三角関数による(普通の)フーリエ変換F(ω)は、コンボルーション定理により、 F(ω) = G(ω) (Σ(δ(x-2nπ))のフーリエ変換) であり、 (Σ(δ(x-2nπ))のフーリエ変換)= Σ(δ(ω-m)) となりますから、結局 F(ω) = Σ(G(ω)δ(ω-m)) となる。δ関数に付く係数をFmと書くことにすれば、 F(ω)= Σ(Fm δ(ω-m)) Fm = G(m) で、この係数Fmこそがフーリエ級数に他なりません。(つまり、フーリエ級数とは周期関数のフーリエ変換とほとんど同じこと。)  さて、ご質問で例として挙がっているcosine関数の半周期分を取り出すには、 g(x) = B(x)cos(ax) とすればいいですね。その三角関数による(普通の)フーリエ変換G(ω)は G(ω) = (B(ax)のフーリエ変換)*(cos(ax)のフーリエ変換) となります。で、 (B(ax)のフーリエ変換) = sinc(ω/a) (ただし、sinc(x) = (x≠0のときsin(x)/x 、x=0のとき1)) (cos(ax)のフーリエ変換) = δ(1/a)+δ(-1/a) となるから、 G(ω) = sinc((ω+1)/a)+sinc((ω-1)/a) である。  もうちょっと一般的に、ある関数h(x)があって、 g(x) = B(x)h(x) と書け、h(x)は滑らかで|x|→∞で指数関数的に0に漸近する場合を考えます。h(x)のフーリエ変換をH(ω)として G(ω) = sinc(ω/a) *H(ω) です。で、最終的に欲しいのは Fm = G(m) です。  このFをどう使うのか、応用によってはHだけ分かっていればうまく計算が進められる場合だってあります。

waamos
質問者

お礼

丁寧なご回答ありがとうございました。 > ウォルシュ・アダマール変換とか、wavelet変換 これらについて調べてみましたが、ご指摘のとおり、 基底を変えて多少メリットがあったとしても、 FFTのメリットをしのぐ程では無いようですね。 勉強になりました。

その他の回答 (2)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.3

ANo.2のstomachmanですが、ANo.1に付けられたコメントを拝見しました。  えとですね、段差のある波形をフーリエ級数で表しておいて、そのフーリエ級数を有限項で打ち切った和を作ると、元の波形がほぼ再現されるのだけれども、段差の縁に細いツノが生えます。どんなに項数を多くしてもそれが有限個である限り、ツノは(細くなるけれども)結構大きな高さを保って、決して小さくならない。この事には「ギブスの現象」という名前がついてます。  こいつを消すには、段差を滑らかな斜面で置き換えるために、元の波形に平滑化を掛けておく(たとえばガウス関数を畳み込む)必要があります。(もちろん、Ckに重みを付けてやっても同じ事です。)

  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.1

目的がよくわからないので見当はずれかもしれませんが、とにかく周期関数をスペクトルに分解したいならばFFTが文句なしに答えを出してくれます。 http://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B またウェーブレット変換という方法もありますが使ったことはありません。

waamos
質問者

補足

早速のご回答ありがとうございます。 質問の意図が自分で読んでもわかり辛いので補足をさせて下さい。 目的は、大仰に言えば固体の電子のシミュレーションです。 電子の分布関数φ(r) = Σ[k] Ck exp(ikr)と仮定して シュレディンガー方程式に代入、数値的にCkを求め、 求まったφを利用して物理量を概算します。 理想的な無限結晶(1)なら、滑らかな周期系なので 展開係数Ckは急速にゼロに収束します。Σの足し算を kが小さいうちに打ち切っても、問題が生じません。 しかし、固体の中に大きな空洞があるような場合(2)、 Σの足し算を早めに打ち切ると、まともな物理量が 出せなくなってしまいます(電子密度がマイナスになる等)。 項数を多くしていくと、漸近的にまともな値に収束していきます。 (1) … Na Cl Na Cl … … Cl Na Cl Na … (2) … Na Cl              Na Cl … … Cl Na              Cl Na … 素朴考えですが、こういう状態にぴったりの基底があればなぁ と思ったので質問させていただきました。 でも、実際に計算する事を考えると普通にFFTがベストのようですね。 ウェーブレット変換についてはまた調べてみます。

関連するQ&A

  • フーリエ展開について

    図のような周期関数f(x)を考え、これをフーリエ展開せよ。 さらに、時刻t=0でu(x,0)=f(x)であるとして、時刻tでの波形u(x,t)を求めよ。ただしu(x,t)は右向きの進行波として進むとし、分散関係はωとする。 この問題で、f(x)=∑[(A_k)coskx+B(_k)sinkx) (k=2πn/L, n=0,1,2,・・・) A_0=(∫[0→L}f(x)dx)/L A_k=(2∫[0→L]f(x)coskxdx)/L B_k=(2∫[0→L}f(x)sinkxdx)/L というフーリエ展開の式を利用しています。 解説にはf(x)を代入して積分を実行すれば、A_0=ab/L , A_k=4bsin(ka/2)/Lk , B_k=0と導かれています。 f(x)の式が問題には書かれていませんが、f(x)はどのような式になるのでしょうか。 f(x)を代入してとありますが、f(x)の式が全くわからないため、積分を実行できませんし、なぜこのような結果が導かれるのかもわかりません。 どのようにしてこの結論が導かれているのかが分かる方がいらっしゃいましたら教えていただけないでしょうか。 よろしくお願いします。

  • フーリエ級数展開

    こんにちは。フーリエ級数展開の問題について質問があります。 f(x)=x(-l<x<l) をフーリエ級数展開せよ という問題なんですが、奇関数だからan=0だからbnのみ求めますが、私がこの問題を解くとbn=2l/nπ{1-(-1)^n}となりました。 しかし教科書の答を見るとbn=(-1)^(n+1)*2l/nπでした。 これは教科書の答のミスでしょうか?私の計算のミスでしょうか? 教えてください。

  • フーリエ級数について

     こんにちは。フーリエ級数展開について質問です。質問は以下の二つです。よろしくお願いします。 (1) 式(*)を使って任意の連続なf(x,y)に収束させる事ができるのでしょうか。ただし、f(x,y)は f(x-nω,y-nω)=f(x,y) を満たすような関数です。 nは自然数、ωはf(x,y)の基本周波数である。 f(x,y)=A_0+Σ(n=1→n=∞) { A_n sin(nωxcos(θ_n)-nωysin(θ_n)+a_n)+B_n sin(nωxsin(θ_n)+nωycos(θ_n)+b_n) }・・・(*) (*)のシグマの中は A_n sin(nωx+a_n)+B_n sin(nωy+b_n) ・・・(*') をθ_n回転させた物です。(*')だけでは回転したものは描けなさそうに思えたので。一応すべてのnに関して互いに直交しているとは思います。 (2) 普通、フーリエ級数展開と言えばsinとcosの足しあわせですが、なぜこれで全ての連続な周期関数に収束させる事ができるといえるのでしょうか。つまり、sinとcosで描けない周期関数は存在しないとどのように保証するのでしょうか。 質問の背景------------------------------------------------------  (1)ようは二変数のフーリエ級数展開をしたいのですが、その展開式がわからないので考えました。その結果(*)を思いつくにいたりましたが、これでいいのか不安なので質問しました。  (2)に関しては興味本位の質問です。最近線形代数の授業が始まりだし、一時独立や基底などを少しやりましたが、関数は無限次元のベクトルと言えるので、その基底の数も無限ですよね?有限次元のベクトル空間ならば次元と一次独立なベクトルの数を合わせることで基底だといえますが、無限ならそうはいえないと思うのです。したがって三角関数だけでは描けない関数ベクトルが存在する可能性があるように思います。  (2)の答えがわかれば(1)の答えも自分で考える事ができるかもしれないのですが・・・。  参考になりそうなサイトの紹介だけでも大変うれしいです。よろしくお願いします。

  • フーリエ級数展開の問題

    次の関数をフーリエ級数展開せよ。 f(x)=1 (0<x<L/2) -1(L/2<x<L) という問題についての質問です。 これは奇関数と考えてan=0となって bn=2/(L/2)∫sin(nπx/(L/2))dx 積分区間は(0≦x≦L/2) として求めればいいですか? この考えがあっているか教えてください。違ったら、どうするのか教えてください。 ちなみに問題には正弦級数に展開、余弦級数に展開などの指定はありませんでした。

  • フーリエ変換の問題(複素フーリエ級数)

    フーリエ変換の問題(複素フーリエ級数) 次の-L≦X≦Lで定義された関数f(x)を f(X+2nL)=f(x)により -∞<x<∞に拡張した周期関数の複素フーリエ級数展開を求めよ f(x)=0(-L≦X<0), 1(0≦X<L) ここで教えていただいたのですが、 恥ずかしながらあまり理解できなかったため、再度質問します 複素フーリエ係数が cn==∫【-L→L】f(x)*exp(-i n x)/2πdx この公式より cn=∫【-L→0】0*exp(-i n x)/2πdx +∫【0→L】1* exp(-i n x)dx コレであっていますか? なんだか単純なような・・・ 回答お願いします

  • フーリエ級数展開について

    f(x)= -π-x (-π<x<-π/2),x (-π/2<x≦π/2),π-x (π/2<x≦π) をフーリエ級数に展開する問題で、 グラフにかくとf(x)は奇関数になるから フーリエ係数a_0やa_nは0になりますか? また、b_nは整数mを使って、偶数2mの時 0、奇数2m-1の時 4(-1)^(m+1)/π(2m-1)^2になりますか? お願いします!

  • フーリエ変換の問題(複素フーリエ級数)

    フーリエ変換の問題(複素フーリエ級数) 次の-L≦X≦Lで定義された関数f(x)を f(X+2nL)=f(x)により -∞<x<∞に拡張した周期関数の複素フーリエ級数展開を求めよ f(x)=0(-L≦X<0), 1(0≦X<L) この問題が解けないので、どなたか教えてほしいです。 f(x)=xのようなかんじだったらとけるのですが、この問題のような形式だと、詰まってしまいます・・・

  • フーリエ級数について

    次の問題を解いてください。 f(x)を区間-π≦x≦πで連続かつf(-π)=f(π)をみたし、その導関数f'(x)が区分的に連続な関数とする。f(x)が、 F(x)=a_0/2+Σ[n=1,∞](a_n cos(nx)+b_n sin(nx)) とフーリエ級数に展開されるとき、以下の問いに答えよ。 (1)f'(x)をフーリエ級数に展開したときの展開係数をa_n,b_nを用いて表せ。 (2)(1)式の右辺をxで微分し(フーリエ級数の項別微分)、これを(1)と比較せよ。 くわしくお願いします。

  • フーリエ級数展開の問題

    フーリエ級数展開の問題 cを実数の定数とし、fは周期関数2πの関数で区間[-π,π)において f(x)= (c-2)(x+π/2) :-π<=x<0 (2c-3)(x-π/2):0<=x<π であるとする。この時のフーリエ級数展開 a_(0)/2+Σ[n=1,∞]{a_(n)cos(nx) + b_(n)sin(nx)} について各問に答えよ (1)関数fが偶関数になるような定数cの値を求め、その時のフーリエ係数a_(1)の値を求めよ。 切片が同じで、傾きが逆になればいいので、 (c-2)=-(2c-3)と式を立てて c=5/3 a_(n)=1/π∫[-π,π]f(x)cos(nx) dx -π<=x<0の時と、0<=x<πの時とを分けて積分 a_(n)=1/π{∫[-π,0](-x/3-π/6)cos(nx) dx + ∫[0,π](x/3-π/6)cos(nx) dx} n=1の時を求めればいいだけなのでn=1を代入して a_(1)=1/π{∫[-π,0](-x/3-π/6)cos(x) dx + ∫[0,π](x/3x-π/6)cos(x) dx} 式の∫[-π,0](-x/3-π/6)cos(x) dx の部分を計算 部分積分で計算し、 ∫[-π,0](-x/3-π/6)cos(x) dx=[(-x/3-π/6)sin(x)-cos(x)/3][-π,0] =-1/3-1/3==-2/3 ∫[0,π](x/3-π/6)cos(x) dx の部分を同じく計算 ∫[0,π](x/3-π/6)cos(x) dx=2/3 よって a_(1)=1/π{-2/3+2/3}=0 となってしまいました。0となり不安です間違っている気がすごくします。これで合っているんでしょうか? あと、この次の小問(2)で (2)関数fが奇関数になるような定数cの値を求め、その時のフーリエ係数b_(1)の値を求めよ。 という問題があるのですが、これはcの求め方からして分かりません。 存在しない気すらします。どのように求めればいいんでしょうか?

  • フーリエ級数展開の問題

    フーリエ級数展開の問題 このフーリエ級数展開の問題が分かりません. アドバイスいただけたら幸いです f(x)= a0/2+ Σ(k=1→∞) ( ak*coskx + bk*sinkx) でa0,bk,akは実数です (a)次の関数をフーリエ級数展開せよ g(x ) = ( π - x ) ( 0 < x < 2π ) = 0 x=0 (b) (a)の結果より、(1)(2)を証明せよ (1) (1/2π)*∫(0→2π) f(x)* ( π - x ) dx =Σ(k=1→∞) (bk/k) (2) (1/2π)*∫(0→2π) f(x+t)* ( π - x ) dx =Σ(k=1→∞) (bk*coskt - ak*sinkt) /k (c) (b)の結果より、次の値を求めよ Σ(k=1→∞) ( (-1)^n) / n^2