非整数階微分

フラクショナル微分の離散定義

    信号 f ( t )の α 階微分は以下の式で定義される.



プログラムリスト

上記の文字に対応していない場合があります.コメントを参照してください.


#define MAXKAISUU s //微分演算をおこなう時に利用する過去の情報の最大数
#define m_chk_mean true //最終的に平均値を零とする処理をおこなうかどうか
#define m_DT 1.0 //時系列のサンプリング時間間隔

//入力信号をそのまま微分する
//*data・・・微分をおこなう対象データのポインタ
//bibun・・・微分階数
//s・・・データの大きさ
void CFractionalDlg::FractionalDifferential(double *data, double bibun, int s)
{
	register int m, t;

	//bibunが整数かどうか判別する(整数の時には動作が異なる)
	int kaisuu = (bibun == (int)bibun)? (int)bibun: MAXKAISUU;
	double* ganma = new double[kaisuu + 1];

	//ガンマ関数の値をストックする    (n+1)C(m+1)
	//ついでに符号も保存する
	ganma[0] = 1.0;
	for(m = 1;m <= kaisuu; m++)
		ganma[m] = - ganma[m - 1] * (bibun - m + 1) / (double)m;

	//非整数階微分をする
	double p = pow(m_DT, bibun); //h^d
	for(t = s; t; data[--t] -= data[0]);		//先頭の値を零にする

	register double f;
	int M;
	for(t = s; t; ){
		--t;
		M = (t < kaisuu)? t: kaisuu;
		for(f = data[t], m = 1; m <= M; f += ganma[m] * data[t - m], m++);
		data[t] = f / p;
	}
	delete [] ganma;

	//データの平均を0に
	if(m_chk_mean){
		for(f = 0.0, t = s; t; f += data[--t]);
		for(f /= s, t = s; t; data[--t] -= f);
	}
}

言語は一応C++です.(C言語も混ざっていますが).
バグがありましたら連絡してください.お願いします.

戻る
2002/5
by Hiroyuki Koga