Jaxを使った常微分方程式の数値解析

Jax.numpy使いたいし力学系も解析したい 今のところ、Jax.numpyの速さを実感しつつもメカニズムは理解していない。 が、どうせJax.numpyを使う機会が増えるので、力学系解析もJax.numpyでできるようにする。 ライブラリは、Diffraxを用いる。 https://github.com/patrick-kidger/diffrax ODEだけではなく、SDEも簡単に扱える。今回はODEだけ。 CDE(Controlled Differeitial Equation)も扱えるらしいが、これが何かはまだ分かっていない。 とりあえず、Duffing方程式の時間発展までを行ってコードを確認する。 $$ \begin{aligned} \dot{x} &= v,\ \dot{v} &= x - x^3 - ev + \gamma\cos(\omega t). \end{aligned} $$ importとソルバーに入れる関数は以下。 import jax.numpy as jnp from diffrax import diffeqsolve, ODETerm, Dopri5, SaveAt, PIDController def Duffing(t, X, args): x, v = X dx = v dv = x - x**3 - args['e']*v + args['g']*jnp.cos(t) return [dx, dv] 関数の引数は、scipyのodeintと同じで、時間 tと変数 Xとパラメータ argsとする。 パラメータの与え方はいくつか考えられるが、今回は辞書型で与えている。 次に、実際に時間発展させるコードを見る。 ARGS = {'e': 0....

April 29, 2023 · 2 min · 300 words · rKamiura

EigenをBoostのodeintに組み込む  [draft]

Eigenを導入したい

November 23, 2022 · 1 min · word · rKamiura

Laurent G. et al. (2019)

元論文: Survival of Self-Replicating Molecules under Transient Compartmentalization with Natural Selection 自己複製分子 (replicator) が、寄生体(parasite)を伴った環境において一時的な区画化(transient compartment)の下で自然選択的に生存するか、生存するならば一時的な区画化は生存に対してどのような影響を与えるのかを調べた研究。 実験方法 次の 4 ステップを 1 round として、$R (\in \mathbb{N})$ round 実行する。 プールから区画に分子を割り当てる(Inoculate) 区画の総分子数 $n = m + y \in \mathbb{N}$ は平均 $\lambda$ のポアソン分布に従うものとみなしてサンプリングする。ここで $m$ は replicator の数で $y$ は parasite の数を表す。 replicator の数 $m$ はパラメータ $x$ を持つ二項分布に従うものとみなしてサンプリングする。 各区画で replicator と parasite の時間発展を行う(Maturate) Inoculate ステップ で得た $m$ と $y=n-m$ を初期値として、次のダイナミクスを実行する。 $$ \begin{aligned} \dot{m}(t) &= \alpha m(t)^2\\ \dot{y}(t) &= \gamma m(t) y(t) \end{aligned} $$...

November 23, 2022 · 4 min · 844 words · tatsukawa