next up previous
: PI制御によるステップ幅の更新 : ステップ幅の適応制御 : 埋め込み型ルンゲ・クッタ公式の利用

ステップ幅の更新

まず、前節で求めたerrとステップ幅$ h$ との関係を求めよう。 $ \Delta$ は(20)$ -$ (21)で計算されるから、$ O(h^5)$ である。 err$ \Delta$ の2乗の和の平方根で表されるので、同じく$ O(h^5)$ である。 従って、 ステップ幅として$ h_1$ を使用した場合 $ \mathtt{err}_1$ となり、 $ h_0$ を使用した場合 $ \mathtt{err}_0$ となったとき、

$\displaystyle \frac{\mathtt{err}_1}{h_1^5} = \frac{\mathtt{err}_0}{h_0^5}$ (26)

が成り立つ。 従って目標誤差が $ \texttt{err}_0$ の場合は、

$\displaystyle h_0 = h_1 \biggl\vert \frac{\mathtt{err}_0}{\mathtt{err}_1} \biggr\vert^{1/5}$ (27)

によってステップ幅を($ h_1$ から)$ h_0$ に変化させれば良い。

最も効率的に計算するには、 $ \texttt{err}_0$ の値を1にすれば良い。 従って、もし現在の誤差 $ \mathtt{err}_1$ が1より大きい場合は、 (27)式に従って 現在のステップ幅$ h_1$ をどのくらい小さくすれば良いかが分かり、 $ \mathtt{err}_1$ が1より小さい場合は 同じ式(27)を用いて、 次のステップにおいてステップ幅をどのくらい安全に大きく出来るかが分かる。

実際のNR3のルーチンでは、1よりもわずかに小さい安全項$ S$ を用いた下式:

$\displaystyle h_{n+1} = S h_n \biggl( \frac{1}{\mathtt{err}_n} \biggr)^{1/5}$ (28)

でステップ幅の更新を行っている ((27)式において $ \mathtt{err}_0 = 1$ とし、下付き数字を $ 1 \to n, 0 \to n+1$ とした) 。 また経験則により、 急激なステップ幅の更新は良くないことが分かっているため、 StepperDopr5では、1回のステップでステップ幅が10倍以上大きくなったり、 1/5以下に小さくなったりする更新を禁止している。





ykagawa 平成20年7月29日