最小自乗法
データから
Σi 1 と
Σi xi と
Σi xi2 と
Σi xi3 と
Σi xi4
を求めたいとき、
for( k=1; k<=データ個数; k++){
scanf("%f", &x);
scanf("%f", &y);
s[0] = s[0] + 1;
s[1] = s[1] + x;
s[2] = s[2] + x*x;
s[3] = s[3] + x*x*x;
s[4] = s[4] + x*x*x*x;
t[0] = t[0] + y;
t[1] = t[1] + y * x;
t[2] = t[2] + y * x * x;
}
でもいいんだけど、xの 4乗 を x*x*x*x とか書くのはなんだかなあ、という方は
xのj乗を求める数学関数
s[4] = s[4] + pow(x,4);
を使ってもよいです。ただし! 0乗は避けた方がいいです。
たまたま x に 0 が入ってきたとき、0 の 0乗となってしまい、
システムによって動作が違ったり、止まったりするからです。
for( k=1; k<=データ個数; k++){
scanf("%f", &x);
scanf("%f", &y);
s[0] = s[0] + 1; ここはあえてpow(x,j) の使用を避ける
for( j=1; j<=4; j++){
s[j] = s[j] + pow(x,j); xのj乗を求める関数
}
t[0] = t[0] + y;
for( j=1; j<=2; j++){
t[j] = t[j] + y * pow(x,j);
}
}
1, x, x*x, x*x*x, x*x*x*x, ..は前の値にxをかけていくだけなので、
この部分を g とかおいて
for( k=1; k<=データ個数; k++){
scanf("%f", &x);
scanf("%f", &y);
g=1
for( j=0; j<=4; j++){
s[j] = s[j] + g; g は最初1, (2回目はx, 3回目はxの2乗, ...)
g = g * x; 次の回に備えて x をかけておく
}
g=1
for( j=0; j<=2; j++){
t[j] = t[j] + y * g;
g = g * x; 次の回に備えて x をかけておく
}
}
のようにかくこともできます。