みその計算物理学
ホーム はじめに リンク集
最小2乗法の数値計算例(1次多項式で近似)(C言語)
  • プログラムについて

    最小2乗法により、1次多項式で近似を行うプログラムである。プログラム中で近似を行ったデータは、適当に決めたものである。

  • プログラムソース
    #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;
    }
    
  • GNUPLOTでの結果表示

    赤い点がデータ、緑色の線が最小2乗法で得られた直線である。