ページ 11

最小二乗法

Posted: 2013年6月09日(日) 22:13
by でるた
出来れば早急にお願いします!!

最小二乗法による一次関数で近似するプログラムです。
不明な点はコンパイル結果で出てくる数値のことですが
プログラムに問題があれば指摘お願いします。

#include <stdio.h>
#include <math.h>
#define EPS 1.0e-5
#define n 4

int main(void){
int i,k;

double x[n],y[n];

double sum_xy=0,sum_x=0,sum_y=0,sum_x2=0;

double a=0,b=0;

for(i=0;i<n;i++){
printf("X座標を入力[%d]:",i,x);
scanf("%f",&x);
printf("Y座標を入力[%d]:",i,y);
scanf("%f",&y);
}

for(k=0;k<n;k++){
sum_xy+=x[k]*y[k];
sum_x+=x[k];
sum_y+=y[k];
sum_x2+=pow(x[k],2);
}

a=(sum_x2*sum_y-sum_xy*sum_x)/(n*sum_x2-pow(sum_x,2));
b=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-pow(sum_x,2));

printf("直線y=(%f)+(%f)x",a,b);

return 0;
}

ーーコンパイル結果ーー
直線y=(-1.#IND00)+(-1.#IND00)x   /*括弧内の数値を正常に戻したいです*/

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:16
by みけCAT
コードはcodeタグで囲んでいただけるとありがたいです。
入力と(できれば)期待される出力を教えてください。

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:18
by みけCAT
とりあえず、
printfの,xと,yを削除
scanfの%fを%lfに変更
これでどうですか?

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:20
by みけCAT
2乗くらいでしたら、powを使わずに普通に書いたほうがいいと思います。

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:30
by でるた
ごめんなさい囲ってませんでしたね ;つД`)

入力  x     y
     0.0   1.0
     0.2   1.9
     0.4   3.2
     0.6   4.3

上の数値を入力すれば
直線y=(0.92)+(5.6)x   ・・・と表示されるはずです。

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:38
by みけCAT
これまでのレスで言った修正に加え、printfの%fを%gにしてください。
これでうまくいくはずです。

http://ideone.com/pDqiLf

Re: 最小二乗法

Posted: 2013年6月09日(日) 22:50
by でるた
ありがとうございます!!
無事望んでいた出力にすることができました。

最近ずっとJavaをやっていたので
C言語が忘れ気味になってました(;・∀・)

また質問するかもしれません
その時はよろしくお願いします