こんばんは!お久しぶりです
今日は最小二乗法のプログラムをご紹介しようと思います。
最小二乗法というのは複数のデータが与えられた場合に適切な近似式を求める方法です。詳しい説明は省いて、プログラムだけをお見せします
___________________________________________________________________________________________________________________________
#include<stdio.h>
#define M 7 /*データの個数をマクロ定数定義*/
double a[2]; /*切片と傾きを入れる変数をグローバル変数定義*/
void least_square(double x[M],double y[M]);
int main(void){
double x[M] = {2.0,3.0,4.0,5.0,6.0,7.0,8.0};
double y[M] = {2.1,2.5,3.2,4.0,4.9,5.9,6.7};
least_square(x,y); /*最小二乗法を行う関数*/
printf("%lf+%lfx\n",a[0],a[1]); /*近似曲線を表示*/
return 0;
}
void least_square(double x[M],double y[M]){
double sum_x2 = 0;
double sum_xy = 0;
double sum_x = 0;
double sum_y = 0;
int i;
for(i=0;i<M;i++){
sum_x2 += x[i] * x[i];
sum_xy += x[i] * y[i];
sum_x += x[i];
sum_y += y[i];
}
a[0] = (sum_x2 * sum_y - sum_x * sum_xy)/(M * sum_x2 - sum_x * sum_x);
a[1] = (M * sum_xy - sum_x * sum_y)/(M * sum_x2 - sum_x * sum_x);
}
#define M 7 /*データの個数をマクロ定数定義*/
double a[2]; /*切片と傾きを入れる変数をグローバル変数定義*/
void least_square(double x[M],double y[M]);
int main(void){
double x[M] = {2.0,3.0,4.0,5.0,6.0,7.0,8.0};
double y[M] = {2.1,2.5,3.2,4.0,4.9,5.9,6.7};
least_square(x,y); /*最小二乗法を行う関数*/
printf("%lf+%lfx\n",a[0],a[1]); /*近似曲線を表示*/
return 0;
}
void least_square(double x[M],double y[M]){
double sum_x2 = 0;
double sum_xy = 0;
double sum_x = 0;
double sum_y = 0;
int i;
for(i=0;i<M;i++){
sum_x2 += x[i] * x[i];
sum_xy += x[i] * y[i];
sum_x += x[i];
sum_y += y[i];
}
a[0] = (sum_x2 * sum_y - sum_x * sum_xy)/(M * sum_x2 - sum_x * sum_x);
a[1] = (M * sum_xy - sum_x * sum_y)/(M * sum_x2 - sum_x * sum_x);
}
__________________________________________________________________________________________________________________
ぜひ、データの整理に役立ててください
本日はこの辺で失礼します。
またねっ