YUIMA 入門
確率微分方程式のシミュレーションと推測のためのパッケージ`yuima`の構造と使い方をまとめます.
calculus パッケージ入門
司馬博文
6/18/2024
calculus
は c++
を通じて数値微分・数値積分を高速に実行するパッケージである.同時に,ほとんどの演算を,純粋に記号操作により実行する機能も持つ.一般の多変数関数を,記号のまま微分,Taylor 展開することができる.
A Blog Entry on Bayesian Computation by an Applied Mathematician
$$
$$
R パッケージcalculus
は,記号微分と数値微分・積分をシームレスに繋いだ機能を提供するパッケージである.
数値微積分はRcpp
パッケージとcubature
パッケージを通じてC++
バックエンドを用いて提供する.記号微分は外部の記号計算ソフトウェアに依らない実装を提供している.
numDeriv
は数値微分による Jacobian, Hessian 計算を提供するが,それ以上の高階の微分ができず,テンソル値関数の微分もできない.tensorA
は Einstein の縮約記法を提供するが,2階のテンソルまでに限る.mpoly
は1変数の Hermite 多項式を提供するが,多変数には対応していない.pracma
は1変数の Taylor 展開を提供するが,多変数には対応していない.cubature
は多変数関数の数値積分に対応しているが,その他の(直交)座標には対応していない.特に R は記号計算が苦手である.外部の記号計算ソフトウェアに繋ぐことは試みがあるかもしれないが,R 独自のパッケージ内で扱うシステムは従来なかった.
Ryacas
はYacas
という外部の記号計算ソフトウェアへのインターフェースを提供する.caracas
は R-Python インターフェースreticulate
を通じてSymPy
という Python の記号計算ライブラリへのインターフェースを提供する.これにより,R の,新たな統計推測手法を実装し論文として公開するために用いる言語という性質を活かすことが,パッケージcalculus
の目的にある (Guidotti, 2022, p. 4).
確率過程に対する漸近展開公式では,1000 を超える連立常微分方程式系を解き,その解を通じて多変数 Hermite 多項式の和を計算する必要があり,その際に YUIMA パッケージにおいて記号微分を実行する際に用いられている:
ベクトル,行列,テンソルはいずれも配列 array
として実装されている.特に,ベクトルと行列はテンソルの特殊な場合と理解できるように,実装上も,統一的に Einstein の縮約記法が適用可能である.
すべての関数(=数学的演算)は,数値バージョンと記号演算バージョンのディスパッチとして実装される.
numeric
, complex
, character
, expression
のいずれかの型を持つ,同次元の配列に対して定義されている.
例えば1次元のcharacter
に対しては:
[1] "((a + b) * (0+1i)) - ((d + e) / 3)"
ここで,1i
, 0
, expression(d+e)
,3
はいずれもcharacter
に変換されてから実行されている:
この段階では+0
などを省くのみで,評価や簡約化はされない.
\[
(a+b)(c+d)
\] を \[
a+bc+d
\] と解釈してしまうことなどを防ぐため,すべての変数は()
で囲まれる.
この挙動はoptions(calculus.auto.wrap=FALSE)
で無効にできる.
関数evaluate
が提供されている.
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
関数evaluate
はベクトル化されている:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6
[2,] 3 3 4 5 6 7
eval
関数では,1つの変数の代入しか行えない.
複数与えられた場合でも,最後の1つのみ評価した結果が返される:
evaluate
関数と同様の結果を得るには,成分ごとに繰り返し適用する必要がある.例えば次のように:
関数derivative
は関数を表す文字列f
と,微分する変数名を表すvar
の2つの引数を取る.
多変数も同様.階数は引数order
で指定する: \[
\frac{\partial }{\partial x}\frac{\partial ^2}{\partial y^2}y^2\sin(x)=2\cos(x)
\]
\[ \frac{\partial }{\partial x}\sin(x)\bigg|_{x_0} \]
は次のように計算できる:
\[ \frac{\partial ^4}{\partial x^4}\sin(x)\bigg|_{x=0} \] は次のように計算できる:
\[ \frac{\partial }{\partial x}\frac{\partial ^2}{\partial y^2}y^2\sin(x)\bigg|_{(x,y)=(0,0)} \]