前回の続きです。
F9連打ではアニメーションとしては味気ないので、マクロ機能を活用して、自動的にグラフが更新されるようにしていきます。
目標:エクセルマクロを使用してアニメーションを作成する
一旦は、これが目標となります。順を追って説明をしていきます。
マクロ使用の目的
ここまでの復習です。以下の\(P_2(t)\)をエクセルの散布図として\(X\)\(Y\)平面上にグラフ化し、定数としていた\(R_1\)、\(\omega_1\)、\(R_2\)、\(\omega_2\)を連続して適当に変化させることで、グラフ描画を連続的に変化させることが目的でした。
\(P_2(t)= (R_1 cos(\omega_1 t) + R_2 cos(\omega_2 t),R_1 sin(\omega_1 t)+R_2 sin(\omega_2 t))\)
\(R_1\)、\(\omega_1\)、\(R_2\)、\(\omega_2\)の変化のさせ方は、単純な乱数でも全く問題ありません。やはりそれでは面白くないので、ある程度連続的に変化するように工夫します。
連続して適当に変化する乱数の生成
試しに、0~1の範囲での乱数を180回連続して並べてみます。横軸が何度目の乱数か、縦軸が乱数の値とすると、下図のようになりました。

エクセルの散布図をある程度連続的に変化するようにとすると、単純なランダムな数字の列は望ましくなく、下図のイメージにあるようにある程度、数値変化に連続性があることが望ましいと言えます。

そこで、ある位置変数\(x\)と考え、\(x\)が時刻\(\tau\)に従って、変化することとします。さらに、\(x(\tau)\)の速度、加速度を考え、変数を\(v(\tau)=\displaystyle \frac{dx}{d\tau}(\tau), a(\tau)=\displaystyle \frac{dv}{d\tau}(\tau)\)とします。ここで、時刻\(\tau\)は、\(P_2(t)\)の時刻\(t\)と区別するために別の変数としています。
\(x(\tau), v(\tau), a(\tau)\)は離散化して、乱数的に生成した\(a(\tau)\)を逐次足し合わせて積分するとします。\(i\)を自然数として
離散時間:\(\tau_{i+1} = \tau_i + \Delta \tau\)
[0]初期値:\(x(\tau_1) = 0, v(\tau_1) = 0 \)
[1]速度:\(v(\tau_{i+1}) = v(\tau_i) + Rnd(\tau_i) \Delta\tau \)
[2]位置:\(x(\tau_{i+1}) = x(\tau_i) + v(\tau_{i+1}) \Delta\tau \)
とします。\(Rnd(\tau_i)\)は、時刻\(\tau_i\)において、\(-1\)以上、\(+1\)未満の数値をランダムに返すものとします。これで[0][1][2][1][2][1][2] …を繰り返し計算すれば、適当に連続した乱数列\(X_i\)が得られます。なお、初期値は適当でよいのですが、最初から大きな値を設定すると発散しがちですのでとりあえず\(0\)としておくのが無難です。
ここまでの説明に沿って、横軸を時刻\(\tau_i\)、縦軸を\(x(\tau_i), v(\tau_i)\)としてエクセルでグラフ描画しました。作成にあたり、google geminiを使用しています。

上記画像に対応したExcelファイルは下のリンクから、ダウンロードできます。
このエクセルファイルを開いて、F9キーを押すと、ランダムにグラフが更新されます。
ここで、グラフの\(v(\tau)\)を拡大して見てみます。

画像から読めるように、Vの値が激しく変動していることが読み取れます。変化量を乱数的に決定しているので当然といえば当然の結果ですね。
そこで、この変動を滑らかにするために、google geminiに指示を出して、\(v(\tau_i)\)は、過去5点の移動平均にするように変更しました。以下が変更の結果です。

ダウンロード用のファイルです。