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

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

  • プログラムソース
    import java.io.*;
    
    class Co
    {
            static final int N=5;
    }
    
    class Saisyounizyouhou1
    {
            public static void main()
            {
                    double x[]={1.0,2.0,3.0,4.0,5.0},y[]={10.6,15.5,19.9,23.8,33.2};
                    Saisyounizyouhou1 f=new Saisyounizyouhou1();
    
    /*横軸(x軸)に値するデータを配列x、縦軸(y軸)に値するデータを配列yに入れ
    関数sai1に渡す*/
                    f.sai1(x,y);
    
            }
    
            void sai1(double x[],double y[])
            {
                    int i;
                    double a0,a1,p,q;
                    double A00,A01,A02,A11,A12;
    
                    A00=A01=A02=A11=A12=0.0;
    
                    try
                    {
                            FileWriter fw1=new FileWriter("output1.data");
                            FileWriter fw2=new FileWriter("output2.data");
    
                            for (i=0;i<Co.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<Co.N;i++) 
                            {
                                    fw1.write(x[i] + " " + y[i] + "\n");
                            }
    
    /*gnuplotでグラフ表示のために、計算で得られた1次式でデータ近辺のグラフデータを保存*/
                            for(p=x[0]-10.0;p<x[Co.N-1]+10.0;p+=0.01) 
                            {
                                    q=a0+a1*p;
                                    fw2.write(p + " " + q + "\n");
                            }
                            fw1.close();
                            fw2.close();
                    }
                    catch(Exception e)
                    {
                            System.out.println(e);
                    }
            }
    }
    
  • GNUPLOTでの結果表示

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