1,最小2乗法 |
2,フーリエ変換 |
最小2乗法とは、ある測定結果とそれ時近似した関数との差の2乗を
最小にするようにその関数を決める方法です。
では、(xi,yi)という測定結果から
y=ax+b
という直線で近似できるものとします。このとき測定結果からのずれは
この式を連立するとaとbが求まり、近似式が完成します。
今回の例は1次関数ですしたが、n次の場合は(n+1)個の変数を用意して
(n+1)次連立方程式を解くことで求まります。
ある関数f(x)が周期性を持っていると考えられるとき、それを
フーリエ変換するとsin,cos関数を重ね合わせたもの近似できます。
たとえばある関数が
X(t)=X(t+T)
という周期Tの関数のとき、X(t)は隅関数XeとXoに分解できます。
ここで、X(t)は周期Tの関数です。これから、T→∞とすると
1/T→df , n/T→fで積分できます。今の式にCnを代入し、T→∞とすると
この式の前者をFourier変換、後者を逆Fourier変換といいます。
ここまでが数学的な話でしたが、実験では離散的な数値になってしまいます。
dt間隔でサンプリングした場合、1/2dt以上の周波数は測定不能です。
また、測定中に1周期が終わらないような長い周期も観測できません。
測定回数がN個のとき、1ステップは 1/NΔt ごとになります。
いま、Xr=X(kt) , Xk=X(r/NT)とすると
前者をFourier変換,後者を逆Fourier変換といいます。
この変換は離散的フーリエ変換 DFT(Distance Fourier Transform)
といいます。また計算を工夫して高速にしたものを
高速フーリエ変換 FFT(Fast Fourier Transform)といいます。
以下のプログラムは、フーリエ変換/逆フーリエ変換を行うプログラムで
C言語(正確にはVisual C++ Ver4.0)でかかれています。
引数はBOOL型でFALSEでフーリエ変換、TRUEで逆フーリエ変換を行います。
データはあらかじめxとy配列に格納しておきます。
そしてこの関数を実行すると変換されたデータがx,y配列に格納されます。
ちなみにxは実数、yは虚数を格納し、Nはデータの個数です。
#define N 128 double x[N],y[N];//データを格納する配列 void CFourierView::tra(BOOL flag) { double s[N],c[N],q; int i,j; q=-2*PI/N;if(flag){q=-q;} for (i=0; i<N; i++){ c[i]=s[i]=0; for (j=0; j<N; j++){ c[i]+=x[j]*cos(q*i*j)-y[j]*sin(q*i*j); s[i]+=x[j]*sin(q*i*j)+y[j]*cos(q*i*j);} if(flag){c[i]=c[i]/N;s[i]=s[i]/N;} } for (i=0; i<N; i++){x[i]=c[i];y[i]=s[i];} }
入力したのはsin3θです。これを変換すると下の2つのグラフになります。
中央のは実数で、下のは虚数部分です。
これからは下の2箇所にピークがあります。
下の部分はsinに相当し、3の位置にあるのでsin3θであることがわかります。
入力するsin波を高周波にすると2つのピークが中央によってきます。
なお、中央より右半分は本来は測定できないので無視します。
ただし、逆Fourier変換するときは無視はできません。