//臨界指数法処理ルーチン
#define max_arpha 20 //αの最大値・最小値 [α,-α]
#define step_arpha 400 //αの変化の刻み
double CFractalDim::CEMArphaC(double *x, double *y, int index)
{
int j, loop;
double* div = new double[step_arpha + 1]; //各ループの3階微分の値
double* arpha = new double[step_arpha + 1]; //各ループのαの値
double i_arpha, i_arpha1, i_arpha2, i_arpha3;
double X, Y, f, g;
for(loop = 0; loop <= step_arpha; loop++) //各ループのαの値を求める
arpha[loop] = max_arpha * (2.0 * loop / step_arpha - 1.0);
for(loop = 0; loop <= step_arpha; loop++){
i_arpha = i_arpha1 = i_arpha2 = i_arpha3 = 0.0;
for(j = index - 2; j >= 0; j--){
X = x[j] / x[0], Y = x[j + 1] / x[0],
f = 0.5 * (Y - X) * y[j ]* pow(X, arpha[loop]),
g = 0.5 * (Y - X) * y[j + 1]* pow(Y, arpha[loop]),
X = log(X), Y = log(Y), i_arpha += (f + g),
f *= X, g *= Y, i_arpha1 += (f + g),
f *= X, g *= Y, i_arpha2 += (f + g),
f *= X, g *= Y, i_arpha3 += (f + g);
}
i_arpha1 /= i_arpha,
i_arpha2 /= i_arpha,
i_arpha3 /= i_arpha,
div[loop] = i_arpha3 - 3.0 * i_arpha2 * i_arpha1 + 2.0 * i_arpha1 * i_arpha1 * i_arpha1;
}
double max = 0.0;
double pos = 0, DIV, xp, arphac;
bool check = true;
for(loop = 0; loop < step_arpha - 1; loop++){
if(div[loop] > max) max = div[loop], pos = loop;
}
// 0交差点を探索する
for(loop = pos; loop < step_arpha - 1; loop++){
if(div[loop] > 0.0 && div[loop + 1] >= 0.0){
DIV = (div[loop + 1] - div[loop]) / (2.0 * max_arpha / step_arpha);
pos = div[loop], xp = arpha[loop], f = arphac = -pos / DIV + xp;
check = false;
break;
}
}
delete [] arpha;
delete [] div;
if(check){
AfxMessageBox("自動次元推定ができませんでした");
return 0.0;
}
return arphac; //beta=a+1
}
言語は一応C++です.(C言語も混ざっていますが).