サンプルプログラム¶
Lorenz方程式の精度保証¶
sample/lorenz.cppは、Taylor展開法によってLorenz方程式の精度保証を行うプログラムである。Wrapping effectを全く考慮しておらず、Taylor展開の次数を5にしても\(t=1.45678\)程度で区間が無限大に発散するため、実用性はない。
tlncを用いてLorenz方程式
\[\begin{split}\frac{d\mathbf{u}}{dt}=\mathbf{f}(t,\mathbf{u})=
\begin{pmatrix}
-6x+6y \\ -xz+28x-y \\ xy-\frac{8}{3}z
\end{pmatrix}\end{split}\]
の\(\mathbf{f}(t,\mathbf{u})\)を記述しているのがプログラムの
// Lorenz equation
auto f = (
-6_dc * x + 6_dc * y,
-x * z + 28_dc * x - y,
x * y - (8_di / 3_di) * z
);
の部分で、make_phi<K>
とmake_phi_aux<K>
を使ってTaylor展開法に必要な処理を自動生成している。Taylor展開の次数を\(p\)とすると何も工夫しない場合の項の数と計算時間は\(O(3^p)\)となるが、サンプルプログラムではメモ化をすることでコンパイル時間が\(O(3^p)\)になる代わりに計算時間を\(O(p)\)に抑えている。\(p\ge 6\)にするとコンパイル時のメモリ使用量とコンパイル時間が増えすぎるので、wrapping effectを考慮した実装にしても実用性はないと思う。