タイトル

計算式

タイトル

1,最小2乗法
2,フーリエ変換

葉

1,最小2乗法

最小2乗法とは、ある測定結果とそれ時近似した関数との差の2乗を
最小にするようにその関数を決める方法です。

では、(xi,yi)という測定結果から

y=ax+b

という直線で近似できるものとします。このとき測定結果からのずれは

最小2乗法

この式を連立するとaとbが求まり、近似式が完成します。
今回の例は1次関数ですしたが、n次の場合は(n+1)個の変数を用意して
(n+1)次連立方程式を解くことで求まります。

葉

上上へ

葉

2,フーリエ変換

ある関数f(x)が周期性を持っていると考えられるとき、それを
フーリエ変換するとsin,cos関数を重ね合わせたもの近似できます。
たとえばある関数が

X(t)=X(t+T)

という周期Tの関数のとき、X(t)は隅関数XeとXoに分解できます。

Fourier変換1

ここで、X(t)は周期Tの関数です。これから、T→∞とすると
1/T→df , n/T→fで積分できます。今の式にCnを代入し、T→∞とすると

Fourier変換2

この式の前者をFourier変換、後者を逆Fourier変換といいます。
ここまでが数学的な話でしたが、実験では離散的な数値になってしまいます。
dt間隔でサンプリングした場合、1/2dt以上の周波数は測定不能です。
また、測定中に1周期が終わらないような長い周期も観測できません。

測定回数がN個のとき、1ステップは 1/NΔt ごとになります。
いま、Xr=X(kt) , Xk=X(r/NT)とすると

Fourier変換3

前者を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];}
}

●実行結果

Fourier変換3

入力したのはsin3θです。これを変換すると下の2つのグラフになります。
中央のは実数で、下のは虚数部分です。
これからは下の2箇所にピークがあります。
下の部分はsinに相当し、3の位置にあるのでsin3θであることがわかります。

入力するsin波を高周波にすると2つのピークが中央によってきます。
なお、中央より右半分は本来は測定できないので無視します。
ただし、逆Fourier変換するときは無視はできません。

葉

上上へ

戻るTopに戻る