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