クラメールの公式のプログラミング
Posted: 2009年1月02日(金) 23:30
Cプログラム 二乗法を実行
えーと あるプログラムで悩んでいます。
問題文は以下の通りです。
xy平面に分布する次の10個の点について、
直線 y=ax+b で近似する最小二乗法のCプログラムを書き、
実行してaとbを求めよ。
例えば、
(x,y)=(2,4),(3,6),(4,9),(5,9),(6,13),(7,14),(8,15),(9,20),(10,19),(11,21)
といった感じです。
友人と考えたのですが、なかなかできませんでした。
エラーが発生して、どこが間違っているのですか?
以下がプログラムです。もしかすると、エラーが出ない場合もあります。
どうかお願いします。
えーと あるプログラムで悩んでいます。
問題文は以下の通りです。
xy平面に分布する次の10個の点について、
直線 y=ax+b で近似する最小二乗法のCプログラムを書き、
実行してaとbを求めよ。
例えば、
(x,y)=(2,4),(3,6),(4,9),(5,9),(6,13),(7,14),(8,15),(9,20),(10,19),(11,21)
といった感じです。
友人と考えたのですが、なかなかできませんでした。
エラーが発生して、どこが間違っているのですか?
以下がプログラムです。もしかすると、エラーが出ない場合もあります。
どうかお願いします。
#include <stdio.h>
int main(){
int x[10]={2,3,4,5,6,7,8,9,10,11};
int y[10]={4,6,9,9,13,14,15,20,19,21};
int xny[3]; //[x,1,y]_テーブル
int xy[2][3]; //正規方程式
double del; //_係数の行列式
double a,b; //回帰式の係数
int i,j,k,n=10;
//_連立方程式をクリヤー
for(i=0;i<2;i++) {
for(j=0;j<2;j++) {
xy[j]=0;
}
}
//_連立方程式構築
for(k=0;k<n;k++) {
//_[x,1,y]_テーブル準備
xny[0]=x[k];
xny[1]= 1;
xny[2]= y[k];
//_連立方程式に積和累計
for(i=0;i<2;i++){
for(j=0;j<3;j++){
xy[j]+=xny*xny[j];
}
}
}
//_連立方程式を解く(クラーメルの公式)
del=xy[0][0]*xy[1][1]-xy[1][0]*xy[0][1];
a=(xy[0][2]*xy[1][1]-xy[1][2]*xy[0][1])/del;
b=(xy[0][0]*xy[1][2]-xy[1][0]*xy[0][2])/del;
printf("a=%f,b=%f\n",a,b);
return 0;
}