Vibro-impact Model as a Dynamical System
Overview
The Vibro-impact Model represents the motion of an object inside a vibrating cylindrical capsule in a nonsmooth dynamical system, which can broadly be classified into two types: Hard and Soft.
Model 1
Let’s refer to the Cylindrical Capsule for convenience as a capsule. In the illustrations below, is the length of the capsule, is the mass of the capsule, is the mass of the object, and it is assumed that the object’s motion, represented by , does not affect the capsule’s movement.
The capsule is assumed to perform harmonic oscillations in the direction of with a frequency of per time unit . Therefore, in the absence of collision, the capsule’s displacement , given the amplitude of vibration and the derivative with respect to , , can be represented by the following differential equation: is the gravitational acceleration, and is the incline of the capsule. Consequently, in the absence of collision, the displacement of the object can be expressed as: Looking in the direction of , when the coordinate of the object is and the coordinate of the capsule is , their relative displacement with respect to can be expressed as:
Hard Impact
The Hard Impact Model reflects the impact by reversing the direction when the object touches the bounds of the capsule. Here, represents a very short time interval. When abstracted to a non-physical system, it can be expressed in terms of the derivative of with respect to as:
Soft Impact
The Soft Impact Model simulates the impact through a forced harmonic oscillation, where the direction changes as the object hits a spring-loaded plate. The relative displacement when not in contact with the spring and when in contact are considered separately. Abstracting to a non-physical system without distinguishing between and , it can be expressed in terms of the derivative of with respect to as: Here, represents the sign function.
Variables and Parameters
The model’s parameters are generally given as follows:
- : The mass of the object.
- : A value related to the amplitude of vibration.
- : A value acting vertically due to gravity.
- : The incline of the capsule.
- : The gravitational acceleration.
- : The length of the capsule.
- : A transformed value of the capsule’s length.
- : The frequency of vibration.
- : The system’s natural frequency.
- : In the Hard Impact Model, a value related to the velocity after collision, where the velocity changes to times its original right after the collision. At , the velocity is halved.
- : The elastic coefficient in the Soft Impact Model.
- : A value related to the elastic coefficient.
- : A value related to the damping force in the Soft Impact Model.
When the model is transformed to non-dimensional, the transformation of variables is as follows: The transformation of parameters is as follows:
Explanation
Trajectories
Animation for the Soft Impact Model when . The -axis represents the relative displacement , and the -axis represents the velocity . When reaching , the velocity changes abruptly along with a strong impact:
Typically, the parameter of interest is related to the capsule’s length. Let’s see how the system changes as changes in the Soft Impact Model. The red solid line in the right figure corresponds to the capsule’s boundary, and it’s noticeable that the object’s displacement slightly exceeds the boundary.
- At :
- At :
- At :
- At :
Bifurcation
Drawing a bifurcation diagram while decreasing the parameter from to reveals the bifurcation shown above. Characteristic windows become prominent below .
Code
The following is Julia code used to reproduce the images in this post.
Bifurcation Diagram
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")
Animation
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 ↩︎