From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Javaで数値積分(ロンバーグ積分)

不定積分ではなく、区間が決まった定積分を計算する方法です。積分する関数は定式化されているものであり、積分区間について連続である関数とする。不連続の時は不連続点で分けて積分するのが賢い?

Javaのコードは下記に示します。
    public double integral(double minx, double maxx, double error, int limitcalc){
//ロンバーグ積分
double ans=0;

boolean errorkey=true;

int m = 0;
int j = 0;

double h = (maxx-minx);

double[][] sum = new double[limitcalc][limitcalc];

sum[m][j] = h/2*(function(minx)+function(maxx));
System.out.println("sum["+m+"]["+j+"]="+sum[m][j]);
m++;

while(errorkey){
h=h/2;
sum[m][0] = sum[m-1][0]/2;
//System.out.println("sum["+m+"]["+j+"]="+sum[m][j]);
for(int i=1; i<=Math.pow(2,m-1);i++){
sum[m][0]=sum[m][0]+h*function(minx+(2*i-1)*h);
}
System.out.println("sum["+m+"]["+j+"]="+sum[m][j]);
//S,m,0の計算終了。続いてS,m,jの計算を行う
for(j=1;j<=m;j++){
sum[m][j]=(Math.pow(4, j)*sum[m][j-1]-sum[m-1][j-1])/(Math.pow(4, j)-1);
System.out.println("sum["+m+"]["+j+"]="+sum[m][j]);
}

if(error>Math.abs((sum[m-1][m-1]-sum[m][m])/sum[m][m])){
errorkey=false;
ans=sum[m][m];
}
if(m==limitcalc-1){
errorkey=false;
ans=sum[m][m];
}
m++;
j=0;
}

return(ans);
}

public double function(double x){
double val =Math.exp(x)/(Math.exp(x)-1);

return(val);
}


使い方
functionメソッドに積分したい関数を用意しておく。今回はexp(x)/(exp(x)-1)を用いました。

integralメソッドに積分区間の下端をminx、上端をmaxxに代入し、積分の計算結果が収束したかを判定するためにerrorに収束判定用の値を代入し、最大計算回数をlimitcalcに代入します。
minxとmaxxはそのままの意味なのですが、分かりづらいerrorとlimitcalcについて説明します。

ロンバーグ積分法は区分求積法であり、積分区間を台形を用いて計算するのですが、積分区間の分割数に応じて誤差が生じます。分割数を倍に増やすと、計算結果が理論値に収束していきます。
このプログラムでは、ひとつ前の計算結果と比較を行い、変化率がerrorより小さくなったときに十分理論値に収束したと判定し計算を終了します。errorに0.01を代入すると、ひとつ前の計算結果の1%の変化で収束判定します。

limitcalcは値が収束せずに無限に計算するのを防ぐため、limitcalc回数だけ分割したら計算を打ち切り、計算結果を返すようにしてあります。

改善すべき点

このプログラムだと積分する関数に応じて、新しいintegralメソッドとfunction関数を用意しなくてはいけないので、何かしらの方法でintegralメソッドに関数を渡せるようにする。
関数が不連続、滑らかでない点があると面倒になる。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/61-36724877
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。