最小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乗法で得られた直線である。
|
|
|
|
|
|