//最小2乗法処理ルーチン
#include
// n : 入力はデータの総数,出力は始点のインデックス
double CFractalDim::Minimize2error(double *x, double *y, int& n)
{
int loop, center, P;
double Y, Z, DIV, error, p;
double mse = DBL_MAX, DIVMAX = 0.0;
for(center = 0; center < n; center++){ // 始点の移動
Y = Z = 0.0;
for(loop = 0; loop < n; loop++){
p = x[loop] - x[center];
Y += p * p, Z += p * (y[loop] - y[center]);
}
DIV = Z / Y; //傾きを決定する
//近似直線の式 y = DIV * (x - x[center]) + y[center];
//誤差を計算
error = 0.0;
for(loop = 0; loop < n; loop++){
p = DIV * (x[loop] - x[center]) - (y[loop] - y[center]);
error += p * p;
}
//最小かどうか調べる
if(error < mse){
mse = error, DIVMAX = DIV, P = center;
}
}
n = P;
return DIVMAX; // 傾きを戻り値とする
}
言語は一応C++です.(C言語も混ざっていますが).