えーと あるプログラムで悩んでいます。
問題文は以下の通りです。
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; }