はむ吉(のんびり)の練習ノート

プログラミングとことばに関する話題を中心に,思いついたこと,試してみたこと,学んだことを,覚え書きを兼ねてまとめます.その際に役立った,技術書,参考書,辞書,機器などの紹介も行います.

Python 用の高速な数値積分ライブラリを探している(NumPy + SciPy を前提):quadpy の代替として

わけあって,NumPy + SciPy で書かれた関数(1 次元,2 次元)を高速に数値積分できる,Python 用 ライブラリを探している.まるでまとまりがないが,備忘録を兼ねて,とりあえず,現状を書き留めておく.


NumPy + SciPy で書いた関数の,単積分や二重積分を含んだ関数を使うことがよくある.この関数は,パラメータを変えて繰り返し呼ばれるため,ある程度積分に要する時間を短縮する必要がある.当初は scipy.integrate.quad同 dblquad を使っていたが,ことに後者は極端に遅いときがあり,私のユースケースでは使い物にならなかった.そこでいろいろ探すうちに,quadpy というライブラリに出会った.これは,ウェブサイトで謳われている通り,様々な積分区間に対応する様々なアルゴリズムを利用できるため,とても重宝していた.私は数値解析アルゴリズムについては素人のため,適切なものを選択できていたかはわからないが,とにかく満足のいく速度が出せるようになった.しかし,下記ツイートのような事態に突如見舞われた.事情がよくわからないが,とにかく 2023 年からどうなるかわからない*1ので,早急に代替のライブラリを探す必要が生じた.

積分の場合は,私の場合 scipy.integrate.fixed_quad で事足りた.ただ,多重積分の場合は,相当するものがない.私の使う関数では,1 変数目と 2 変数目の積分区間が互いに依存しないため,単積分アルゴリズムを繰り返し使ってもよいのかもしれないが,うまく書けない.多重積分を高速にできるライブラリとしては,torchquad があるが,これは,PyTorch を前提にしており,今回のように機械学習もなにも関係ないケースで使うのはかえって面倒だ.数値計算ライブラリ mpmath には数値積分の機能もあるが,これを NumPy + SciPy で書いた関数と連携させる方法がよくわからない.かくなる上は,モンテカルロ法に基づく多重数値積分ライブラリvegas もあり,これは私が書いた関数にも使えそうではあるが,精度が心配である.引き続き,方法を模索している.

*1:コードが難読化されており,怖いので 2023 年からこのライブラリを import しようとも思えない.