동역학계로써의 진동 충격 모델
개요
진동 충격 모델vibro-impact model은 진동하는 원통형 관 속에 있는 물체의 움직임을 나타내는 넌스무스한 다이내믹 시스템으로, 크게 하드와 소프트hard, Soft 두 가지 타입으로 나눌 수 있다.
모델 1
원통형 관cylindric0al Capsule은 편의상 캡슐이라고 부르자. 이하 등장하는 삽화에서 는 캡슐의 길이, 은 캡슐의 질량, 는 물체의 질량이고 이라서 물체의 운동이 캡슐의 움직임에는 영향을 미치지 못한다고 가정한다.
캡슐은 과 같은 방향으로 시간단위 기준으로 했을 때 진동수 의 조화진동을 한다고 가정한다. 이에 따라 충돌이 없을 때 캡슐의 변위displacement 는 진동의 세기amplitude 와 에 대한 미분 에 대해 다음과 같은 미분방정식으로 나타낼 수 있다. 는 중력 가속도, 는 캡슐의 기울기다. 이에 따라 충돌이 없을 때 물체의 변위 는 이다. 방향으로 봤을 때 물체의 좌표를 , 캡슐의 좌표를 라 할 때 그들의 상대적 변위 는 에 대해 다음과 같이 나타낼 수 있다.
하드 임팩트
하드 임팩트 모델hard Impact model은 물체가 캡슐의 바운드에 닿았을 때 방향이 반대로 바뀌는 방식으로 충격을 반영한다. 여기서 는 아주 짧은 시간 간격을 나타낸다. 물리적인 의미를 가지지 않도록 추상적인 시스템으로 바꾸면 에 대한 미분 에 대해 다음과 같다.
소프트 임팩트
소프트 임팩트 모델soft Impact model은 물체가 스프링을 댄 판에 부딪혀서 방향이 바뀌는 것을 강제 조화 진동을 통해 반영한다. 용수철에 닿지 않았을 때의 상대적 변위 와 용수철에 닿아있을 때의 상대적 변위 가 따로 나뉜다. 물리적인 의미를 가지지 않도록 추상적인 시스템으로 바꾸면 와 를 따로 구분하지 않고 에 대한 미분 에 대해 다음과 같다. 여기서 은 부호 함수다.
변수와 파라미터
기본적으로 모델의 파라미터들은 다음과 같이 주어져 있다:
- : 물체의 질량이다.
- : 진동의 세기에 관련된 값이다.
- : 중력에 의해 수직 방향으로 작용하는 값이다.
- : 캡슐의 기울기다.
- : 중력가속도다.
- : 캡슐의 길이다.
- : 캡슐의 길이가 변환된 값이다.
- : 진동수다.
- : 시스템의 고유 진동수다.
- : 하드 임팩트 모델에서, 충돌 이후의 속도에 관련된 값이며, 충돌 직후에 속도는 기존의 배로 바뀐다. 인 경우 속도가 절반이 된다.
- : 소프트 임팩트 모델에서, 탄성계수다.
- : 탄성계수에 관련된 값이다.
- : 소프트 임팩트 모델에서, 제동력에 관련된 값이다.
모델이 넌디멘져널non-dimensional하게 바뀔 때 변수의 변환은 다음과 같다. 파라미터의 변환은 다음과 같다.
설명
트래젝터리
소프트 임팩트 모델에서 일 때의 애니메이션. -축은 상대변위 , -축은 속도 이다. 에 도달하면 강한 충격과 함께 속도가 변한다:
보통 우리가 관심을 가지는 파라미터는 캡슐의 길이에 관련된 다. 소프트 임팩트 모델에서 가 변하는 것에 따라서 시스템이 어떻게 변하는지 살펴보자. 오른쪽 그림의 붉은 실선은 캡슐의 바운더리에 해당하며, 자세히 보면 물체의 변위가 아주 살짝 바운더리 외부로 벗어나고 있다.
- 일 때:
- 일 때:
- 일 때:
- 일 때:
바이퍼케이션
파라미터 를 부터 까지 줄여가며 바이퍼케이션 다이어그램을 그려보면 위와 같은 바이퍼케이션을 볼 수 있다. 이하에서 캐어릭한 윈도우가 두드러진다.
코드
다음은 이 포스트에서 사용된 그림들을 재현하는 줄리아 코드다.
바이퍼케이션 다이어그램
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 ↩︎