「シミュレーション」の版間の差分

編集の要約なし
編集の要約なし
編集の要約なし
32行目: 32行目:
<math>\begin{array}{l l l} x(t_k + \Delta t) &=& x(t_k) + \frac{dx}{dt}\bigg|_{t=t_k} \, \Delta t + \frac{1}{2} \frac{d^2x}{dt^2}\bigg|_{t=t_k} \, \Delta t ^2 + \cdots \\ &\approx& x(t_k) + \frac{dx}{dt}\bigg|_{t=t_k} \, \Delta t \\ &\approx& x(t_k) + f(x(t_k), t_k) \, \Delta t \end{array}</math>
<math>\begin{array}{l l l} x(t_k + \Delta t) &=& x(t_k) + \frac{dx}{dt}\bigg|_{t=t_k} \, \Delta t + \frac{1}{2} \frac{d^2x}{dt^2}\bigg|_{t=t_k} \, \Delta t ^2 + \cdots \\ &\approx& x(t_k) + \frac{dx}{dt}\bigg|_{t=t_k} \, \Delta t \\ &\approx& x(t_k) + f(x(t_k), t_k) \, \Delta t \end{array}</math>


ここで,表記上の簡便性から,&math(x(t_k));&math(x_k);と表記することにし,&math(t_k + \Delta t);&math(t_{k+1});, &math(x(t_k + \Delta t));を&math(x_{k+1});などと表記することにします.この時オイラー法は以下のように表すことができます.
ここで,表記上の簡便性から,<math>x(t_k)</math><math>x_k</math>と表記することにし,<math>t_k + \Delta t</math><math>t_{k+1}</math>, <math>x(t_k + \Delta t)</math>を&math(x_{k+1});などと表記することにします.この時オイラー法は以下のように表すことができます.


#math("x_{k+1} = x_k + f(x_k, t_k) \, \Delta t")
<math>x_{k+1} = x_k + f(x_k, t_k) \, \Delta t</math>


オイラー法による近似をグラフで示すと図のようになります.
オイラー法による近似をグラフで示すと図のようになります.
40行目: 40行目:
#ref(Euler.png)
#ref(Euler.png)


次のサンプリング時刻における&math(x(t));の値,すなわち&math(x_{k+1});を接線で一次近似して求めていると解釈できます.もとの微分方程式から,接線の傾きが&math(f(x_k, t_k));ですから,それに&math(\Delta t);を乗じた物を&math(x_{k});に加えることで&math(x_{k+1});を求めています.図をみると誤差(error)が大きくて,本当に使えるのか心配ですが,&math(\Delta t);をできるだけ小さくすれば誤差を少なくできます.しかし,&math(\Delta t);を小さくすると,ある期間(例えば10秒間とか)のシミュレーションをするのにそれだけ計算回数が増えることになるので注意が必要です.
次のサンプリング時刻における<math>x(t)</math>の値,すなわち<math>x_{k+1}</math>を接線で一次近似して求めていると解釈できます.もとの微分方程式から,接線の傾きが<math>f(x_k, t_k)</math>ですから,それに<math>\Delta t</math>を乗じた物を<math>x_{k}</math>に加えることで<math>x_{k+1}</math>を求めています.図をみると誤差(error)が大きくて,本当に使えるのか心配ですが,<math>\Delta t</math>をできるだけ小さくすれば誤差を少なくできます.しかし,<math>\Delta t</math>を小さくすると,ある期間(例えば10秒間とか)のシミュレーションをするのにそれだけ計算回数が増えることになるので注意が必要です.


図では&math(x_k);が真値と一致している場合で書きましたが,実際はそうとも限りません.初期値&math(x_0);からスタートして,オイラー法を繰り返し使った近似計算は次図のようなイメージになります.&math(\Delta t);をできるだけ小さくとって,真値から離れすぎないようにする必要があります.なお,この図では近似のための接線を真値のグラフ&math(x(t));に接するように引いていますが,&math(x_k);が真値からずれている場合は図の通りにはなりません.あくまでイメージです.
図では<math>x_k</math>が真値と一致している場合で書きましたが,実際はそうとも限りません.初期値<math>x_0</math>からスタートして,オイラー法を繰り返し使った近似計算は次図のようなイメージになります.<math>\Delta t</math>をできるだけ小さくとって,真値から離れすぎないようにする必要があります.なお,この図では近似のための接線を真値のグラフ<math>x(t)</math>に接するように引いていますが,<math>x_k</math>が真値からずれている場合は図の通りにはなりません.あくまでイメージです.


#ref(Euler2.png)
#ref(Euler2.png)
51行目: 51行目:
次の微分方程式を例題に,Octaveでオイラー法によるシミュレーションを行うスクリプトを考えてみます.
次の微分方程式を例題に,Octaveでオイラー法によるシミュレーションを行うスクリプトを考えてみます.


#math(\frac{dx}{dt} = - x + 1, \quad x_0 = 0)
<math>\frac{dx}{dt} = - x + 1, \quad x_0 = 0</math>


オイラー法を適用すれば
オイラー法を適用すれば