力学系としての振動衝撃モデル
概要
振動衝撃モデルvibro-impact modelは、振動する円筒形カプセル内の物体の動きを表す非スムーズなダイナミックシステムで、主にハードhardとソフトsoftの2つのタイプに分けられます。
モデル 1
円筒形カプセルcylindrical Capsuleは便宜上カプセルと呼びます。以下に登場するイラストでは、はカプセルの長さ、はカプセルの質量、は物体の質量で、であるため、物体の動きがカプセルの動きに影響を与えないと仮定します。
カプセルはの方向に時間単位に基づいて振動数の調和振動を行うと仮定します。これにより、衝突がない場合のカプセルの変位displacement は振動の振幅amplitude とに対する微分について、以下の微分方程式で表すことができます。 は重力加速度、はカプセルの傾きです。これにより、衝突がない場合の物体の変位は です。方向に見たときの物体の座標を、カプセルの座標をとすると、それらの相対変位はについて、以下のように表すことができます。
ハードインパクト
ハードインパクトモデルhard Impact modelは、物体がカプセルの端に触れたときに方向が反転する方法で衝撃を反映します。 ここでは非常に短い時間間隔を表します。物理的な意味を持たないように抽象的なシステムに変換すると、に対する微分について、以下のようになります。
ソフトインパクト
ソフトインパクトモデルsoft Impact modelは、物体がスプリングを付けた板にぶつかって方向が変わることを強制調和振動を通じて反映します。スプリングに触れていないときの相対変位とスプリングに触れているときの相対変位が別々に分けられます。 物理的な意味を持たないように抽象的なシステムに変換すると、とを別々に区別せずに、に対する微分について、以下のようになります。 ここでは符号関数です。
変数とパラメータ
基本的にモデルのパラメータは以下のように与えられます:
- : 物体の質量です。
- : 振動の強さに関連する値です。
- : 重力によって垂直方向に作用する値です。
- : カプセルの傾きです。
- : 重力加速度です。
- : カプセルの長さです。
- : カプセルの長さが変換された値です。
- : 振動数です。
- : システムの固有振動数です。
- : ハードインパクトモデルで、衝突後の速度に関連する値で、衝突直後に速度は元の倍に変わります。の場合、速度が半分になります。
- : ソフトインパクトモデルで、弾性係数です。
- : 弾性係数に関連する値です。
- : ソフトインパクトモデルで、減衰力に関連する値です。
モデルが非次元化non-dimensional</sup
されるときの変数の変換は以下のようになります。 パラメータの変換は以下のようになります。
説明
トラジェクトリ
ソフトインパクトモデルでの場合のアニメーションです。軸は相対変位、軸は速度です。に達すると、強い衝撃とともに速度が変わります:
通常、私たちが関心を持つパラメータはカプセルの長さに関連するです。ソフトインパクトモデルでが変化することによってシステムがどのように変化するか見てみましょう。右側の図の赤い実線はカプセルの境界に対応し、よく見ると物体の変位がわずかに境界の外に出ていることがわかります。
- の場合:
- の場合:
- の場合:
- の場合:
バイフケーション
パラメータをからまで減らしながらバイフケーションダイアグラムを描くと、上のようなバイフケーションが見られます。以下で特徴的なウィンドウが顕著です。
コード
以下は、このポストで使用された図を再現するジュリアのコードです。
バイフケーションダイアグラム
const κ = 400.0
const μ = 172.363
using ProgressMeter
packages = [:DataFrames, :CSV, :Plots, :LaTeXStrings]
@time for package in packages
@eval using $(package)
end
println(join(packages, ", "), " loaded!")
function RK4(f::Function,v::AbstractVector, h=10^(-2))
V1 = f(v)
V2 = f(v + (h/2)*V1)
V3 = f(v + (h/2)*V2)
V4 = f(v + h*V3)
return v + (h/6)*(V1 + 2V2 + 2V3 + V4), V1
end
function factory_soft(idx::Int64, d::Number)
d2 = d/2
function soft(tuv)
t, u, v = tuv
impact = ifelse(abs(u) < d2, 0, -(κ^2)*sign(u)*(abs(u)-d2) - μ*v)
ṫ = 1
u̇ = v
v̇ = cospi(t) + impact
return [ṫ, u̇, v̇]
end
dt = 10^(-5); tend = 50
t_ = 0:dt:tend
ndatapoints = round(Int64, tend/(10dt))
len_t_ = length(t_)
traj = zeros(6, len_t_+1)
x = [0.0, 0.05853, 0.47898]
dx = soft(x)
traj[1:3, 1] = x
for t in 1:length(t_)
x, dx = RK4(soft, x, dt)
if t ≥ ndatapoints
traj[4:6, t] = dx
traj[1:3, t+1] = x
end
end
traj = traj[:, (end-ndatapoints):(end-1)]'
data = DataFrame(traj,
["t", "u", "v", "dt", "du", "dv"])
return data
end
d_range = 0.1:0.0001:0.3
schedule = DataFrame(idx = eachindex(d_range), d = d_range)
xdots = Float64[]; ydots = Float64[]
@showprogress for dr in eachrow(schedule)
data = factory_soft(dr.idx, dr.d)
idx = [false; diff(abs.(data.u) .> (dr.d/2)) .< 0]
sampled = data.v[idx]
append!(xdots, fill(dr.d, length(sampled)))
append!(ydots, sampled)
end
@time a1 = scatter(xdots, ydots,
xlabel = L"d", ylabel = "Impact velocity",
label = :none, msw = 0, color = :black, ms = 0.5, alpha = 0.5, size = (700, 300))
png(a1, "soft_bifurcation")
アニメーション
Plots.gr()
anim = @animate for tk in ProgressBar(1:100:nrow(_data))
plot(_data.u[1:10:tk], _data.v[1:10:tk],
xlabel = "position", ylabel = "velocity", legend = :none,
xlims = (-0.2, 0.2), ylims = (-0.6, 0.6), alpha = (1:10:tk)/tk)
end
mp4(anim, "soft.mp4")
Dimitri Costa, Rachel Kuske, Daniil Yurchenko; Qualitative changes in bifurcation structure for soft vs hard impact models of a vibro-impact energy harvester. Chaos 1 October 2022; 32 (10): 103120. https://doi.org/10.1063/5.0101050 ↩︎