はじめに
Switch向けに「ナビつき! つくってわかる はじめてゲームプログラミング」(任天堂)という面白いソフトがある。はじプロと略されることもある。
ブロックをつなげるようにして簡単にゲームを作ることが出来るソフトだ。
購入して随分立つのだが、チュートリアルを中途半端に進めたまま放置していたので、オイラー法くらい作ってみるか、ということで作ってみた。
オイラー法
オイラー法とは、微分方程式の初歩的な数値解法だ。今回解くのは、
$$
\frac{df}{dx} = -f
$$
である。解析解は簡単に求まるが、数値的に解いてみる。
単純に離散化してやると、
$$
\frac{f(x+\Delta x) - f(x)}{\Delta x} = -f(x)
$$
と書ける。これから、
$$
f(x+\Delta x) = f(x) - f(x)\Delta x
$$
となる。漸化式で書くと、
$$
f_{k+1} = f_k - f_k\Delta x
$$
と書ける。これをどんどん計算してやればよい。
精度はよくないので、注意。
C++による実装
はじプロは残念ながら小数点以下2桁しか精度がないので、$\Delta x=0.01$とする。
正解の目安が欲しいので、
#include <iostream>
int main()
{
double f = 10;
double dx = 0.01;
for (int i = 0; i < 20; i++)
{
std::cout << f << std::endl;
f = f - f * dx;
}
return 0;
}
実行すると、
10
9.9
9.801
9.70299
9.60596
9.5099
9.4148
9.32065
9.22745
9.13517
のような感じ。
はじプロでの実装
ボタンを押す度に計算を進めることにした。ボタンを押しっぱなしにするとものすごい勢いで計算が進んでしまうので、タイマーを使って遅延させて、ゆっくり計算することにする。
値の保持に手間取ったのだが、カウンターを使えばいい。カウンターに初期値を設定して、ボタンを押す度にカウンターの値$\times \Delta x$を引けばいい。
下のような感じになる。
実行すると次のような感じ。
終わりに
楽しかった。