はじめMath! Javaでコンピュータ数学

第73回 微分・積分の数学 数値積分 区分求積法・台形公式[後編]

この記事を読むのに必要な時間:およそ 4 分

コンパイルからドキュメントの生成,実行までをいちいち入力するのは大変ですから,バッチファイルを作っておきましょう。

ソースコード:comp.bat
javac TestNumericalIntegration.java > compile.log
javadoc *.java -d ./javadoc -private > javadoc.log
java -ea TestNumericalIntegration

バッチファイルでは,コンパイルとJavaDocの生成が先に実行されます。コンパイル時やJavaDoc生成時にメッセージが多数出力されると,ターミナル上で追うのが大変ですから,上のバッチファイルで行っているようにリダイレクトしておくと良いでしょう。最後に,-eaオプションを付けてプログラムを実行しています。これはEnableAssertionの意味で,アサーションのコードを有効にします。アサーションは,実行途中の変数の値を確認したい場合に使います。

以下はその実行結果です。出力の途中を少々省略します。

出力画面

(1) True value =0.7853981633974483
0 : Quadrature diff =-0.21460183660255172
0 : Trapezoidal diff=0.2853981633974483
1 : Quadrature diff =-0.14761453849477102
1 : Trapezoidal diff=0.10238546150522898
(略)
18 : Quadrature diff =-1.905158201864765E-6
18 : Trapezoidal diff=2.1904413838313985E-9
19 : Quadrature diff =-9.528998897723184E-7
19 : Trapezoidal diff=7.744338503812287E-10
(2) True value =46.41321980490211
0 : Quadrature diff =-0.5419896772052653
0 : Trapezoidal diff=-5.269979121760578
1 : Quadrature diff =1.6890420259118457
1 : Trapezoidal diff=-0.6671701939727015
(略)
18 : Quadrature diff =1.77515612449497E-5
18 : Trapezoidal diff=-2.2478055683450293E-7
19 : Quadrature diff =8.763391441846125E-6
19 : Trapezoidal diff=-2.2477816941091078E-7

この実行結果をみると,区分点間の距離h が小さくなれば,どちらの方法を用いてもかなり高い精度で積分の近似値を求めることが出来ています。区分求積法(Quadrature)の場合に比べて台形公式(Trapezoidal)の方が,1桁から3桁精度が良いようです。

クラスの継承やインターフェイスを使いましたから,少々長いコードになってしまいましたが,本質的にはシンプルなプログラムできちんと積分出来ちゃうんですからうれしいですね。

ちょっとご注意を

今回のような滑らかな関数では精度良く近似できましたが,常にこのように精度良く計算できるとは限らないことを覚えておいてください。関数が滑らかでなかったり,そもそも連続でなかった場合には,それぞれの場合に応じて,また関数の引数の値に応じて計算方法を調整しなければなりません。

実用的には,必要な精度で値が安定するまでhの値を順次小さくしていくのが定石です。その際計算の無駄を如何に省くかがキモとなります。

実際に数値積分を活用する場合には,一度の計算で値を安心して信じることなく,可能な限り結果の見立てと検証を繰り返して確認するようにしましょう。

今回はここまで

数値計算の2つの方法をJava言語で実装しました。サンプルとしては少々長いソースコードでしたが,後々の再利用がしやすいようにと考えると,あのようになりました。Java言語の文法入門書で学習したばかりの初心者の方々には敷居の高いものだったかもしれません。課題をこなす中で自然と便利さを感じて習得していっていただければと思います。特に,プログラミングは概念だけをいくら学んでも,なかなか使えるようにはなりません。実践あるのみです。健闘をお祈りいたします。

今回のまとめ

  • 区分求積法と台形公式を用いて数値積分するプログラムを作りました。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。