はじめに
ブランコのような振り子運動をするモデルに、その固有角速度と同じ角速度の振動をする強制力を加えると時間と共に振動運動は激しさを増していく。この現象を共振という。今回は、単振り子のモデルに強制振動力を加えることで強制振動をする振り子の挙動を調査する。具体的には、まず微分方程式を数学的に解き固有角速度に対するその特徴を調べる。次に、Pythonを用いたシミュレーションにおいて共振点という運動が不安定になる点が存在することを視覚的に確かめる。
強制振動の微分方程式
以下に、1質点の振動運動を叙述する運動方程式を示す。
m \frac{d^2 x}{dt^2}= -kx(t)+f(t)
$f(t)$は時刻によって変化する強制力である。
今回は単純にするため、$f(t)=Asin\omega_1 t$とする。
ここで、固有角速度$\omega_0$は、
\omega_0=\sqrt{\frac{k}{m}}
と示せる。共振とは、固有角速度と強制力の角速度が同じになり、互いに振動を強め合い不安定になる現象である。まず、そのことを数学的に示す。つまり、$\omega_0=\omega_1$のときにおいて、以下の等式を証明する。
x(t=\infty)=\pm \infty
次に、オイラー法を用いた数値解析プログラムをPythonで作成して、$x-t$グラフを作成したのちに、角速度$\omega_1$と十分時間が経過したときの$x$の関係性を調べる。これによって共振点では振動が不安定になることを視覚的に確かめる。
微分方程式の解法
今回の運動方程式は2次の線形微分方程式である。したがって、線形性より過渡解と定常解を求めてそれの和を求めれば、一般解が求まる。
過渡解
以下の微分方程式の解を考える。
m \frac{d^2 x_B}{dt^2}= -kx_B(t)
解は、初期条件によって決定される任意定数$C_0$を用いて、
x_A(t)=C_0 sin(\omega_0 t)
定常解
以下の微分方程式を満たす解$x_B(t)$を経験的予測により見つける。
m \frac{d^2 x_B}{dt^2}= -kx_B(t)+Asin(\omega_1 t)
以下の解を候補として挙げる。
x_B(t)=C_1 sin(\omega_1)
これを代入して整理すると、
C_1 =\frac{A}{k-m\omega_1^2}
となる。
一般解
線形性により過渡解と定常解の和をもとめることで、一般解を求めることができる。
したがって、
x(t)=x_A(t)+x_(b)=C_0 sin(\omega_0 t)+C_1 sin(\omega_1 t)=C_0 sin(\omega_0 t)+\frac{A}{k-m\omega_1^2} sin(\omega_1 t)
このことから、$\omega_0=\omega_1$のとき、
x(t=\infty)=\pm \infty
となってしまい、系は不安定となる。これを共振という。
数値解析
上記の考察をプログラミングによる数値解析で視覚的に示す。
振動のアニメーション
$\omega_0$を固定し、$\omega_1$を変数として振動の変化を観察する。
プログラム
以下のようなプログラムを作成した。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import japanize_matplotlib
# アニメを作る初期設定
fig = plt.figure()
ims = []
def wave(omega):
#初期位置
x=1
v=0
#質量
m=1
#ばね定数
k=1
x_ary=[]
t_ary=[]
A=1
#時間
t=0
#時間の刻み幅
delta_t=0.01
while(t<100):
f=A*np.sin(omega*t)
#運動方程式
a=f/m-k*x/m
#位置と速度の更新
v=v+a*delta_t
x=x+v*delta_t
t=t+delta_t
x_ary.append(x)
t_ary.append(t)
return t_ary,x_ary
# t_ary,x_ary=wave(1)
# plt.plot(t_ary,x_ary)
# plt.show()
# n=100
# omega = np.linspace(0,2,n)
# I_ary=[]
# for i in range(n):
# t_ary,x_ary=wave(omega[i])
# I_ary.append(max((np.abs(x_ary))))
# plt.plot(omega,I_ary)
# plt.xlabel("振動数")
# plt.ylabel("振幅")
# plt.savefig("kixyousin.png")
# plt.show()
n=100
omega = np.linspace(0,2,n)
for i in range(n):
t_ary,x_ary=wave(omega[i])
im=plt.plot(t_ary,x_ary)
ims.append(im)
# 複数枚のプロットを 20ms ごとに表示
ani = animation.ArtistAnimation(fig, ims, interval=20)
#保存
ani.save("強制振動.gif", writer="pillow")
結果
以下のような動画になる。
このように、強制力の角速度が変化するとシステムの挙動が大きく変化する。
共振点
プログラム
以下のようなプログラムを作成した。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import japanize_matplotlib
def wave(omega):
#初期位置
x=1
v=0
#質量
m=1
#ばね定数
k=1
x_ary=[]
t_ary=[]
A=1
#時間
t=0
#時間の刻み幅
delta_t=0.01
while(t<100):
f=A*np.sin(omega*t)
#運動方程式
a=f/m-k*x/m
#位置と速度の更新
v=v+a*delta_t
x=x+v*delta_t
t=t+delta_t
x_ary.append(x)
t_ary.append(t)
return t_ary,x_ary
# t_ary,x_ary=wave(1)
# plt.plot(t_ary,x_ary)
# plt.show()
n=100
omega = np.linspace(0,2,n)
I_ary=[]
for i in range(n):
t_ary,x_ary=wave(omega[i])
I_ary.append(max((np.abs(x_ary))))
plt.plot(omega,I_ary)
plt.xlabel("振動数")
plt.ylabel("振幅")
plt.savefig("kixyousin.png")
plt.show()
結果
$\omega_0 = \omega_1$付近で、振幅は急上昇することが分かる。
これは、分子にある周波数の光を当てるとその周波数の光のみを吸収してそれ以外の光を反射させるという視覚による認識の原理であり、IRやNMRといった分子を識別する機器の基となる考え方である。また、共振点をずらせば安定な運動をすることから制御工学などにも繋がる考え方でもある。
まとめ
今回は、1質点の強制振動を題材にして共振現象について代数的に調査した。すると共振点では運動が不安定になることが分かった。また、シミュレーションからもそのことが視覚的にも確認することができた。共振現象は、力学だけでなく、電気工学、制御工学、分析化学など様々な分野の原理を支える重要な概念である。したがって、それらを深く理解することは各分野を勉強する上で極めて役に立つものといえる。
参考文献
力学・場の理論