下に置いてある短いライブラリ https://gist.github.com/t-nissie/b6ef8d39229a2534498b/raw/integrations.rb はRubyのRangeを積分範囲としてブロックで与えられた関数を数値積分します。 台形公式か シンプソンの公式か が選べます。
Rangeのメソッドになってます。 引数として分割数を ブロックとして関数を 与えます。 https://gist.github.com/t-nissie/b6ef8d39229a2534498b/raw/integrations.rb の使い方は次の通りです。
#!/usr/bin/env ruby
##
require './integrations.rb'
p (0.0..Math::PI ).trapezoidal(2000){|x| Math::sin(x)}
p (0.0..Math::PI ).simpson( 2000){|x| Math::sin(x)}
https://gist.github.com/t-nissie/b6ef8d39229a2534498b/raw/integrations.rb の後半部分や https://gist.github.com/t-nissie/b6ef8d39229a2534498b/raw/part.rb なども参照のこと。
2018年ごろに少し話題になっていた岩波数学公式Iのp.240の数値積分に挑戦する。
朝日新聞1988年3月23日の科学欄を見ると、 阪大で物性物理を研究していた斎藤基彦さんが公式の間違いを見つけたらしい。 この「公式」は岩波の数学公式や丸善の数学大公式集にも間違いのまま掲載されていたが、 元は1867年のアムステルダムの公式集で、さらに1790年の本が大元だったようだ。 [朝日新聞の新聞記事のコピーは略。元tweetを参照のこと。]
— Paul Painlevé@JPN (@Paul_Painleve) April 19, 2018
という定積分なのだが、曲者。被積分関数を
となって、
がおそらく求める積分。
ただしこれも一筋縄ではいかず、
のほうを数値積分する。級数展開は https://wolframalpha.com が教えてくれた。自分では導けていない。
上に書いたようにx=0とx=1の近傍だけ分割を細かくして数値積分しているのが https://gist.github.com/t-nissie/b6ef8d39229a2534498b/raw/part.rb
#!/usr/bin/env ruby
##
include Math
require './integrations.rb'
def f(x)
1.0/log(-log(x))
end
def g(x)
(x-1/E).abs<1e-2 ? -(x-1/E)**2*E*E/12 -2*(x-1/E)**4*E**4/45 -859*(x-1/E)**6*E**6/30240: f(x)+f(2/E-x)
end
Fmt = "%20.17f\n"
printf Fmt, i2=(2/E..1.0-1e-2).simpson( 10000){|x| f(x)}
printf Fmt, i3=(1.0-1e-2..1.0).simpson(100000000){|x| f(x)}
printf Fmt, i4=(0.0..1e-4).simpson( 100000000){|x| g(x)}
printf Fmt, i5=(1e-4..1/E).simpson( 100000){|x| g(x)}
puts '--------------------'
printf Fmt, i2+i3+i4+i5
puts '===================='
printf "%20.17f %s\n", -0.154479641320, 'Iwanami'
Ruby 3.1.2p20と2022年ごろの最新のマシンの1コアで35秒くらいかかる。
$ /usr/bin/time ruby --jit part.rb
-0.13449639088600002
-0.00183072931408726
-0.00004147904805336
-0.01811104207072666
--------------------
-0.15447964131886729
====================
-0.15447964132000000 Iwanami
32.25 real 34.35 user 0.24 sys
変数変換とかもっとエレガントな方法があるのかも。
底を
を
らしいが、なぜ
とりあえずRubyで積分をやってみた。 Rangeのメソッドになっていてかっこよいのだが大した機能もないし精度保証もない。 実はJuliaなら既存のパッケージで簡単に精度を保証しながら数値積分ができる → https://gist.github.com/t-nissie/cd1bd788db8aad647566653171c2dfa8 (『岩波数学公式I』の例の数値積分をJuliaのQuadGKパッケージを使って精度保証する)