最小二乗法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
でるた

最小二乗法

#1

投稿記事 by でるた » 13年前

出来れば早急にお願いします!!

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

#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   /*括弧内の数値を正常に戻したいです*/

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

Re: 最小二乗法

#2

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

コードはcodeタグで囲んでいただけるとありがたいです。
入力と(できれば)期待される出力を教えてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 最小二乗法

#3

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

とりあえず、
printfの,xと,yを削除
scanfの%fを%lfに変更
これでどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 最小二乗法

#4

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

2乗くらいでしたら、powを使わずに普通に書いたほうがいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

でるた

Re: 最小二乗法

#5

投稿記事 by でるた » 13年前

ごめんなさい囲ってませんでしたね ;つД`)

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

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

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

Re: 最小二乗法

#6

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

これまでのレスで言った修正に加え、printfの%fを%gにしてください。
これでうまくいくはずです。

http://ideone.com/pDqiLf
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

でるた

Re: 最小二乗法

#7

投稿記事 by でるた » 13年前

ありがとうございます!!
無事望んでいた出力にすることができました。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る