減衰調和振動
📂古典力学減衰調和振動
減衰調和振動

バネ定数をkとするとき、単振動の運動方程式は次のようになる。
mx¨+kx=0
単振動ではバネの復元力のみを考慮する。しかし、実際には摩擦力などの他の外力が物体の運動に影響を与えるため、これを無視することはできない。そこで、速度に比例する摩擦力があると仮定してみよう。この力を減速力retarding forceと言う。この減速力が働く振子の運動を減衰調和振動damped harmonic oscillationと言う。具体的な例には、空気抵抗などがある。減速力が−cx˙のようであれば、運動方程式は以下のようになる。
⟹mx¨+cx˙+kxx¨+mcx˙+mkx=0=0
ここで、ω02=mkで代替すると、γ=2mcとする。このとき、ω0を固有角振動数、γを減衰係数damping factorと呼ぶ。すると、運動方程式は下のようになる。
x¨+2γx˙+ω02x=0
このような微分方程式は微分演算子D:=dtdを利用して簡単に解ける。微分演算子を上の運動方程式に適用すると以下のようになる。
⟹D2x+2γDx+ω02x(D2+2γD+ω02)x=0=0
したがって、D2+2γD+ω02=0を解けばよい。この方程式の解は根の公式によって下のようになる。
D=−γ±γ2−ω02
したがって、
Dx=(−γ±γ2−ω02)x
これは単純な1階微分方程式なので、解は以下のように求めることができる。
x(t)=Ae(−γ+γ2−ω02)t+Be(−γ−γ2−ω02)t
このとき、A、Bは定数である。指数に根が含まれているため、上記の式のグラフはγ2−ω02の値によって異なる。

過減衰overdamping
γ2−ω02>0
平衡点からバネがついた物体を引っ張って放したとき、物体は平衡点に戻るが、図のように減衰力が強いために振動は起こらない。
臨界減衰critical damping
γ2−ω02=0
この場合、(eq1)の二つの解が同じである。したがって、第二の解を求める必要があり以下のように知られている。
x(t)=Ae−γt+Bte−γt
過減衰と同様に振動は起こらないが、過減衰に比べて非常に速く平衡点近くまで到達することが分かる。
未減衰underdamping
γ2−ω02<0
簡単にするために、iωd=γ2−ω02としよう。dはdampedの最初の文字から来ている。すると運動方程式は以下のようになる。
x(t)=e−γt(Aeiωdt+Be−iωdt)
このとき位置xは実数でなければならず、x∗(t)=x(t)を満たさなければならない。∗は共役複素数を意味する。これにより、以下の条件を得る。
Aeiωdt+Be−iωdt=A∗e−iωdt+B∗eiωdt⟹B=A∗
したがって、運動方程式は以下のようになる。
x(t)=e−γt(Aeiωdt+A∗e−iωdt)
そして、A=a+ibとすると、以下の式が成立する。
x(t)=e−γt[a(eiωdt+e−iωdt)+ib(eiωdt−e−iωdt)]
オイラーの公式を適用すると、以下のようになる。
x(t)=e−γt[2acos(ωdt)−2bsin(ωdt)]
すると、三角関数の加法定理により、ある実数A、ϕ0に対して以下の式が成立する。
x(t)=e−γtAcos(ωdt+ϕ0)
e−γtによって、グラフの大きさは指数関数的に減少しつつ、前の二つの場合とは異なりcosが含まれるために振動する。
シミュレーション
減衰調和振動子の場合、振動数と減衰係数の差によって、過減衰、臨界減衰、未減衰に分けられる。各状態で振動子がどのように動くかを視覚的に見ることができれば、理解するのに大きな助けになる。Juliaでは、単にグラフを描くことを超えて、非常に簡単にgifファイルを作成して保存することができる。以下は、減衰調和振動子のアニメーションを作成して保存するコードと、実際の実行画面である。

using Plots
O_γ=3
O_ω=1
function Overdamping(x)
0.5exp((-O_γ+sqrt(O_γ^2-O_ω^2))*x)+0.5exp((-O_γ-sqrt(O_γ^2-O_ω^2))*x)
end
C_γ=1
C_ω=1
function Criticaldamping(x)
exp(-C_γ*x)+x*exp(-C_γ*x)
end
U_γ=1
U_γ=U_γ^2
U_ω=5
U_ω=U_ω^2
function Underdamping(x)
real(exp.(-U_γ*x).*cos.(1im*sqrt(Complex(U_γ-U_ω))*x))
end
p = plot([Overdamping, Criticaldamping, Underdamping], zeros(0),label=["Overdamping" "Criticaldamping" "Underdamping"], xlim=(0,15), ylim=(-0.7,1.2))
anim = Animation()
for x = range(0, stop=15, length = 200)
push!(p, x, Float64[Overdamping(x), Criticaldamping(x), Underdamping(x)])
frame(anim)
end
gif(anim,"Damping_fps30.gif",fps=30)
参照