実フーリエ係数an,bnをC言語を使って求める問題について質問です。
実フーリエ係数an,bnをC言語を使って求める問題について質問です。
自分の考え方のどこが違うのか指摘していただけたら幸いです。
係数を求める式は、
an = 1/π ∫[0..2π]f(x)cos(nx)dx ...1式
bn = 1/π ∫[0..2π]f(x)cos(nx)dx ...2式
まず、1式のanについて考えます。
扱うデータ数をN、データとデータの間隔をΔxとし、上のanの式を離散化すると、
an = 1/π シグマ[x=0..N-1]f(x)cos(n*2π*x/N)Δx ...3式
ここで、f(x)=cosx, N=4, Δx=π/2, f(0)=1,f(1)=0,f(2)=-1,f(3)=0
を与えると3式は以下のようになる。
an = (1/π)*(π/2) シグマ[x=0..3]f(x)cos(n*2π*x/4)
= 1/2 シグマ[x=0..3]f(x)cos(n*π*x/2) ...4式
同様に
bn = 1/2 シグマ[x=0..3]f(x)sin(n*π*x/2) ...5式
4,5式を用いて、実フーリエ係数an,bnを求めるプログラムを作成する。
(今回は表示はanのみとする)
-----------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#define PI 3.1414926434897//円周率
int main(){
int i,j;
int num=4;//データ数
double an[4],bn[4];//フーリエ実係数an,bn
double data[4]={1,0,-1,0};//扱うデータ
//初期化
for(i=0; i<num;i++){
an[i]=0;
bn[i]=0;
}
//フーリエ変換
for(i=0; i<num; i++){
for(j=0; j<num; j++){
an[i] += data[j]*cos((2*PI*i*j)/num);
bn[i] += data[j]*sin((2*PI*i*j)/num);
}
an[i] /= 2;
bn[i] /= 2;
}
//実フーリエ係数anを表示
for(i=0; i<num; i++){
printf("a[%d]%lf\n",i,an[i]);
}
return 0;
}
-----------------------------------------------------------------------------
実行結果は、以下のようにanを表示します。
a[0]0.000000
a[1]1.000000
a[2]0.000000
a[3]1.000000
フーリエ級数の考え方から、ある関数F(x)は、
F(x) = a0/2 + シグマ[n=1~∞](ancos(nx) + bnsin(nx)) ...6式
のようにcosとsinの波の合成で表すことができます。
今回は関数f(x)=cosx(データ数4)に対してフーリエ変換を行ったため、cosxの成分だけが残る。
つまりn=1のときのA1が1となり、他の成分A0,A2,A3は0になると思うのですが、実行結果のa[3]の出力も1となってしまっています。
どこに原因があるのか分からなくて困っているのでアドバイスよろしくお願いします。