データが、ある関数f(x)によって表されとします。ここで、次の量Gを
(1.1)
と定義します。は得られたデータです。目的はこのGを最小にするf(x)を見つけることです。#include <stdio.h> #define N 5 //データの個数 void sai1(double x[],double y[]) { int i; double a0,a1,p,q; double A00,A01,A02,A11,A12; FILE *output1; FILE *output2; output1=fopen("output1.data","w"); output2=fopen("output2.data","w"); A00=A01=A02=A11=A12=0.0; for (i=0;i<N;i++) { A00+=1.0; A01+=x[i]; A02+=y[i]; A11+=x[i]*x[i]; A12+=x[i]*y[i]; } /*1次式の係数の計算*/ a0=(A02*A11-A01*A12)/(A00*A11-A01*A01); a1=(A00*A12-A01*A02)/(A00*A11-A01*A01); /*gnuplotでグラフ表示のためにデータをファイルに保存*/ for(i=0;i<N;i++) { fprintf(output1,"%f %f\n",x[i],y[i]); } /*gnuplotでグラフ表示のために 計算で得られた1次式でデータ近辺のグラフデータを保存*/ for(p=x[0]-10.0;p<x[N-1]+10.0;p+=0.01) { q=a0+a1*p; fprintf(output2,"%f %f\n",p,q); } fclose(output1); fclose(output2); } int main() { double x[N]={1.0,2.0,3.0,4.0,5.0}, y[N]={10.6,15.5,19.9,23.8,33.2}; /*横軸(x軸)に値するデータを配列x、 縦軸(y軸)に値するデータを配列yに入れ 関数saiに渡す*/ sai1(x,y); return 0; }