pythonで遊んでみる〜アニメーションで見る定在波

知識

こんにちは、はっこんです。

ボクは現在実験系の研究室に所属しています。

大学4年時の卒研のテーマが理論だったので、当時はちょくちょくコードをいじっていたのですが、

現在となってはその機会がまったくないのです。

ということで、久しぶりにpythonで遊んでみたくなりました。

とは言ったものの、プログラミング自体かなり久しぶりなので、まずは比較的簡単なことからにします。

今回の目的はpythonのmatplotlibを使ってアニメーションを作成することです。

ボクはいつもグラフを出力するばかりで、アニメーションを出力したことはないのでやってみました。

具体的に何をするかと言うと、2つの波を重ね合わせて定在波を作ることしか思い浮かばなかったのでそれをやります笑

用意する2つの波は波長、周期、速度が全く同じですが、進行方向が真逆のものです。

ちなみに速度は音速、振動数はなんとなく「ファ」の音にしました。

ただ2つのcos波を重ね合わせるだけなので物理面はちょー簡単です。

コードはこのようになります。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation

#environment
v = 340         # m/s
f = 349         # Hz
T = 1 / f       # s
ramda = v / f   # m
beta = 2 * np.pi / ramda    
omega = 2 * np.pi / T       

x_range = np.linspace(-2*np.pi/beta, 2*np.pi/beta, 100)
t_range = np.linspace(0.0, T, 100)

#plot
fig = plt.figure()
artists = []
flag_legend = True
for t in t_range:
    y1 = np.cos(omega*t - beta*x_range)
    y2 = np.cos(omega*t + beta*x_range)
    im1 = plt.plot(x_range,y1,label="y1",color="blue")
    im2 = plt.plot(x_range,y2,label="y2",color = "green")
    im3 = plt.plot(x_range,y1+y2,label="y1+y2",color = "red")
    # if flag_legend:
    #     plt.legend()
    #     flag_legend = False
    artists.append(im1+im2+im3)
    
ani = animation.ArtistAnimation(fig, artists,30)
# ani.save('output.mp4', writer="ffmpeg")

アニメーションの作成には2つの方法があるようです。

今回はArtistAnimationを用いて作成しました。

おそらくArtistAnimationはアニメーションのフレームをリストにする方法です。

凡例とアニメーション保存の部分はコメントアウトしました。

なぜか凡例をつけるとアニメーションの速度がかなり落ちてしまいます。

アニメーション保存はいろいろ試したのですがうまくいきませんでした笑

今回はパソコンの内部機能を使ってアニメーションをキャプチャしました。

その結果がこんな感じ。

凡例付けてないので分かりづらいですが、赤線が2つの波を重ね合わせたものです。

ちゃんと定在波が確認できますね。

ちなみに片方の波の振動数をいじるとこんな感じ。

ちょっと気持ち悪いけどおもしろいですね。

今回はこんなとこにしておきましょう。

コメント

タイトルとURLをコピーしました