最小2乗法の数値計算例(1次多項式で近似)(C言語) |
- プログラムについて
最小2乗法により、1次多項式で近似を行うプログラムである。プログラム中で近似を行ったデータは、適当に決めたものである。
- プログラムソース
#include <stdio.h>
#define N 5 //データの個数
void sai1(double x[],double y[])
{
int i;
double a0,a1,p,q;
double A00,A01,A02,A11,A12;
FILE *output1;
FILE *output2;
output1=fopen("output1.data","w");
output2=fopen("output2.data","w");
A00=A01=A02=A11=A12=0.0;
for (i=0;i<N;i++) {
A00+=1.0;
A01+=x[i];
A02+=y[i];
A11+=x[i]*x[i];
A12+=x[i]*y[i];
}
/*1次式の係数の計算*/
a0=(A02*A11-A01*A12)/(A00*A11-A01*A01);
a1=(A00*A12-A01*A02)/(A00*A11-A01*A01);
/*gnuplotでグラフ表示のためにデータをファイルに保存*/
for(i=0;i<N;i++) {
fprintf(output1,"%f %f\n",x[i],y[i]);
}
/*gnuplotでグラフ表示のために、計算で得られた1次式でデータ近辺のグラフデータを保存*/
for(p=x[0]-10.0;p<x[N-1]+10.0;p+=0.01) {
q=a0+a1*p;
fprintf(output2,"%f %f\n",p,q);
}
fclose(output1);
fclose(output2);
}
int main()
{
double x[N]={1.0,2.0,3.0,4.0,5.0},y[N]={10.6,15.5,19.9,23.8,33.2};
/*横軸(x軸)に値するデータを配列x、縦軸(y軸)に値するデータを配列yに入れ
関数saiに渡す*/
sai1(x,y);
return 0;
}
- GNUPLOTでの結果表示
赤い点がデータ、緑色の線が最小2乗法で得られた直線である。
|
|
|