前回の問題で取り組んだ、Java言語で数値積分するプログラム例を紹介します。少々長くなりましたから、JavaDocを利用してドキュメントを出力出来るようにしておきました。先ずはこのソースコードをエディタにコピーして、後で紹介するバッチファイルを実行してJavaDocを生成させてください。
ドキュメントは、ソースコードを保存したディレクトリ内に作られるjavadocディレクトリ内にあります。index.htmlをダブルクリックするとブラウザに表示されますので、こちらを読むと構成がわかりやすいでしょう。
なお、プログラムの実行時には、アサーションを利用していますので、-eaオプションを忘れずに指定しましょう。
解説
問題 関数を数値積分するプログラムを作りましょう。
前回、手で計算した結果を活かしながら、数値積分の結果を検証するプログラムを作りましょう。以下はその一例です。
コンパイルからドキュメントの生成、実行までをいちいち入力するのは大変ですから、バッチファイルを作っておきましょう。
ソースコード:comp.bat
バッチファイルでは、コンパイルとJavaDocの生成が先に実行されます。コンパイル時やJavaDoc生成時にメッセージが多数出力されると、ターミナル上で追うのが大変ですから、上のバッチファイルで行っているようにリダイレクトしておくと良いでしょう。最後に、-ea
オプションを付けてプログラムを実行しています。これはEnableAssertionの意味で、アサーションのコードを有効にします。アサーションは、実行途中の変数の値を確認したい場合に使います。
以下はその実行結果です。出力の途中を少々省略します。
この実行結果をみると、区分点間の距離h が小さくなれば、どちらの方法を用いてもかなり高い精度で積分の近似値を求めることが出来ています。区分求積法(Quadrature)の場合に比べて台形公式(Trapezoidal)の方が、1桁から3桁精度が良いようです。
クラスの継承やインターフェイスを使いましたから、少々長いコードになってしまいましたが、本質的にはシンプルなプログラムできちんと積分出来ちゃうんですからうれしいですね。
ちょっとご注意を
今回のような滑らかな関数では精度良く近似できましたが、常にこのように精度良く計算できるとは限らないことを覚えておいてください。関数が滑らかでなかったり、そもそも連続でなかった場合には、それぞれの場合に応じて、また関数の引数の値に応じて計算方法を調整しなければなりません。
実用的には、必要な精度で値が安定するまでhの値を順次小さくしていくのが定石です。その際計算の無駄を如何に省くかがキモとなります。
実際に数値積分を活用する場合には、一度の計算で値を安心して信じることなく、可能な限り結果の見立てと検証を繰り返して確認するようにしましょう。
今回はここまで
数値計算の2つの方法をJava言語で実装しました。サンプルとしては少々長いソースコードでしたが、後々の再利用がしやすいようにと考えると、あのようになりました。Java言語の文法入門書で学習したばかりの初心者の方々には敷居の高いものだったかもしれません。課題をこなす中で自然と便利さを感じて習得していっていただければと思います。特に、プログラミングは概念だけをいくら学んでも、なかなか使えるようにはなりません。実践あるのみです。健闘をお祈りいたします。