RPGツクールと数学のブログ

RPGツクールと数学についてのブログです。

減衰振動

過去ブログの転載です。

減衰振動とは、その名の通り減衰していく振動のことです。

定数 a, b, c, dを用いて、 y=ae^{-bt}\sin(ct+d)と表わされます。

f:id:fermiumbay13:20190802010742p:plain

グラフはこんなかんじです。時間とともに減衰していく様子が確認できますね。この振動は一見すると物々しいもののようですが、実はかわいいのです。見てください。

f:id:fermiumbay13:20190802010825g:plain

ふわっと膨らんでしぼんでぶるぶるするのです。いいでしょう。ゲーム作りで使いたくなってきますよね。使ってるのは正弦関数と指数関数なので、ツクール2000でも使えそうです。

減衰振動のパラメータは多いので、どういうときにどうしたらいいかをまとめました。 y=ae^{-bt}\sin(ct+d)+y_{0}
y_{0}t \to \inftyのときになる値。振動が減衰しきって落ち着いたときの値ですね。
 a:減衰振動そのものの大きさ。大きいほど激しい振動になります。
 b:減衰スピード。大きいほど速く減衰が終わります。小さくすればなかなか減衰しない。
 c:振動スピード。大きいほど一回一回の振動が速くなります。
 d:初期位相。振動のズレです。必要であれば設定していいと思いますが、基本的に0でいいです。
一番いいのは、てきとうな値にして試行錯誤することでしょうね。何か条件でも入れて計算すればそれっぽいのは求まりますが、めんどくさそうです。

減衰振動の場合分けと終了条件(収束判定)

以下では、パラメータによる減衰振動の場合分けと、減衰振動が止まるための条件について考察します。終了条件がわからないと困る場面もそこそこあるので、求められるようにしておきましょう。

ただし終了条件といっても、本来はいつまでも減衰し続けるので、減衰が止まることはありません。そこで、振動の幅がある値 \delta以下になったら止まったと判定することにします。

例えばピクセル単位の画像の移動に減衰振動を使うとしたら、1ピクセル以下の振動になったらもう振動してないのと同じですから、 \delta=1とすればいいのです。

また、終了したと判定するための時間を t_{m}とします。 t \gt t_{m}となったら減衰終了で y=y_{0}となります。
要するに減衰振動の収束判定を考えます。

パターン1:何もなし(a=0またはc=d=0のとき)

 a=0c=d=0のときはy=y_{0}になってしまうので、これは何も起きません。
 t_{m}=\inftyであり、常に y=y_{0}です。これは考える価値はありません。

パターン2:非減衰な振動(パターン1ではないが、b=0のとき)

減衰の部分がなくなって、 y=a \sin(ct+d)+y_{0}となります。これはただの振動です。減衰しないので、振動は永遠に続きます。つまり、 t_{m}=\inftyとなります。これはこれで使いますけど、ここであえて言及することは特にありません。

パターン3:減衰するだけ(パターン1, 2ではないが、c=0のとき)

今度は逆に減衰するけど振動はしないパターンです。 y=ae^{-bt}\sin d+y_{0}となります。 \sin dが掛かってますが、これは tが入ってないただの定数なので、実質 a \sin dが係数で減衰し続けるだけになります。減衰が終わると y=y_{0}となります。

減衰が終わる条件を求めてみましょう。減衰項による変化が \delta以下になったら終了と判定します。すなわち、 |ae^{-bt}\sin d| \lt \deltaとなるときの最低の t t_{m}とします。

 \displaystyle |a \sin d e^{-bt}| \lt \delta
 \displaystyle |a \sin d | e^{-bt} \lt \delta
 \displaystyle e^{-bt} \lt \frac{\delta}{|a \sin d |}
 \displaystyle -bt \lt \log \frac{\delta}{|a \sin d |}
 \displaystyle t \gt -\frac{1}{b} \log {\delta}{|a \sin d |}
 \displaystyle t \gt \frac{1}{b} \log \frac{ |a \sin d |}{\delta}
となります。これ以降の tなら常に \delta以下になるので、
 \displaystyle t_{m}=\frac{1}{b} \log \frac{|a \sin d |}{\delta}ということになります。
 t \gt t_{m}なら y=y_{0}と見なせるわけですね。

パターン4:減衰振動(パターン1, 2, 3のどれでもない)

これがホントの減衰振動です。 y=ae^{-bt} \sin(ct+d)+y_{0}です。

減衰振動では y_{0}より大きくなって、小さくなって、を繰り返していて、この振動の最中に突然 y=y_{0}になったら不自然ですから、大きくなるのと小さくなるのの間となる、振動のない瞬間に止めることを考えましょう。

ということで、まずは ae^{-bt}\sin(ct+d)=0となるときの条件を求めます。 ae^{-bt}は0になることはないので、 \sin(ct+d)=0となるときですね。つまり整数 nを用いて ct+d=n \piと表されるときです。そのときの tは、 \displaystyle t=\frac{n \pi - d}{c}となります。

整数 nは任意ですが、 n \gt n_{m}のとき常に \delta以下になるような整数 n_{m}を考えます。すなわち、 \displaystyle t_{m}=\frac{n_{m} \pi - d}{c}となるようにします。この n_{m}を求めましょう。

振動に関わらず、減衰部分だけ考えて
 |ae^{-bt}| \lt \deltaとなるときの tを求めてみます。
 \displaystyle |a|e^{-bt} \lt \delta
 \displaystyle e^{-bt} \lt \frac{\delta}{|a|}
 \displaystyle -bt \lt \log \frac{\delta}{|a|}
 \displaystyle t \gt \frac{1}{b} \log \frac{|a|}{\delta}
となるので、右辺と一致するようなtになるときの nを求めます。
 \displaystyle \frac{n \pi - d}{c}=\frac{1}{b} \log \frac{|a|}{\delta} が成り立つということです。
 \displaystyle n \pi - d = \frac{c}{b} \log \frac{|a|}{\delta}
 \displaystyle n=\frac{1}{\pi} \left( \frac{c}{b} \log \frac{|a|}{\delta}+d \right)
となりました。この nを超えるような nであれば常に \delta以下になるので、これの切り上げという意味で、次のようにして n_{m}を決めます。
 \displaystyle n_{m}= \left\lfloor \frac{1}{\pi} \left( \frac{c}{b} \log \frac{|a|}{\delta}+d \right)+1 \right\rfloor
 \displaystyle \lfloor \cdot \rfloorは小数点以下切り捨てです。切り上げは何かと使いづらいので1足して切り捨てました。厳密には切り上げじゃないので無駄があるのですが、とりあえず n_{m}をこのように決めれば常に \delta以下になります。

従って、 \displaystyle n_{m}= \left \lfloor \frac{1}{\pi} \left( \frac{c}{b} \log \frac{|a|}{\delta}+d \right)+1 \right\rfloorとして
 \displaystyle t_{m}=\frac{n_{m} \pi - d}{c}として求まるときの t_{m}より tが大きければ減衰振動が終了したと判定できます。