みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

回帰分析(の移植)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

回帰分析(の移植)

投稿記事 by みけCAT » 14年前

今日学校で物理の実験があり、
そういえば前にHSPで回帰分析のコードを書いていたので、C言語に移植してみました。
※入力の仕様は若干異なります

CODE:

#include 
#include 
#include 

int main(void) {
	/*入力用*/
	char inputbuf[100000];
	char* comma;
	char* comma2;
	/*入力チェック用*/
	char* endptr;
	/*統計用*/
	int datanum=0;
	int ignorenum=0;
	/*計算用*/
	double x,y;
	double abkeisuu;
	double ateisuu;
	double b2keisuu;
	double bkeisuu;
	double teisuu;
	double b;
	double a;
	double keisuu[6]={0,0,0,0,0,0};
	/*
	  0:a^2
	  1:b^2 
	  2:ab
	  3:a
	  4:b
	  5:定数
	*/
	/*データ入力*/
	while(fgets(inputbuf,sizeof(inputbuf),stdin)) {
		/*入力データの解析*/
		/*改行を消す*/
		comma=strchr(inputbuf,'\n');
		if(comma)*comma=0;
		/*一つ目のコンマ*/
		comma=strchr(inputbuf,',');
		if(comma==NULL) {
			/*コンマが一つもない*/
			ignorenum++;
			continue;
		}
		*comma=0;
		/*二つ目のコンマ*/
		comma2=strchr(comma+1,',');
		if(comma2)*comma2=0;/*いらないデータは消す*/
		/*変換とデータチェック*/
		x=strtod(inputbuf,&endptr);
		if(*endptr!=0) {
			ignorenum++;
			continue;
		}
		y=strtod(comma+1,&endptr);
		if(*endptr!=0) {
			ignorenum++;
			continue;
		}
		/*係数を加える*/
		keisuu[5]+=y*y;
		keisuu[0]+=x*x;
		keisuu[1]+=1;
		keisuu[3]-=2.0*x*y;
		keisuu[2]+=2.0*x;
		keisuu[4]-=2.0*y;
		/*データ数を増やす*/
		datanum++;
	}
	/*計算*/
	/*
	  a^2+b^2+ab+a+b+1
	  a^2+(b+1)a+b^2+b+1→2a+(b+1)=0→2a=-b-1→a=-b/2-1/2
	*/
	if(keisuu[0]==0) {
		puts("エラー:第一次0除算");
		return 1;
	}
	abkeisuu=-keisuu[2]/2.0/keisuu[0];
	ateisuu=-keisuu[3]/2.0/keisuu[0];
	b2keisuu=keisuu[0]*abkeisuu*abkeisuu+keisuu[1]+keisuu[2]*abkeisuu;
	bkeisuu=keisuu[0]*2.0*abkeisuu*ateisuu+keisuu[2]*ateisuu+keisuu[3]*abkeisuu+keisuu[4];
	teisuu=keisuu[0]*ateisuu*ateisuu+keisuu[3]*ateisuu+keisuu[5];
	if(b2keisuu==0) {
		puts("エラー:第二次0除算");
		return 1;
	}
	b=-bkeisuu/2.0/b2keisuu;
	a=abkeisuu*b+ateisuu;
	/*結果の出力*/
	printf("総行数:%d\n",datanum+ignorenum);
	printf("無視した行数:%d\n",ignorenum);
	printf("データの行数:%d\n",datanum);
	if(b>=0) {
		printf("y=%1.15gx+%1.15g\n",a,b);
	} else {
		printf("y=%1.15gx%1.15g\n",a,b);
	}
	return 0;
}
実行結果
[tabs][tabs: 自由落下]入力

CODE:

時刻[s],速さ[m/s]
0.05,0.70
0.15,1.60
0.25,2.57
0.35,3.53
0.45,4.51
出力

CODE:

総行数:6
無視した行数:1
データの行数:5
y=9.55000000000001x+0.194499999999998
[tabs: 傾斜30度の斜面を降りる]入力

CODE:

時刻[s],速さ[m/s]
0.05,0.37
0.15,0.77
0.25,1.22
0.35,1.71
0.45,2.09
出力

CODE:

総行数:6
無視した行数:1
データの行数:5
y=4.38x+0.137
[/tabs]
Ideoneでの実行結果
プログラムを添付しておくので、よかったら使ってみてください。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


コメントはまだありません。