explanation of ode45 for constant force

1 view (last 30 days)
Ajinkya
Ajinkya on 23 Jan 2023
Edited: Sam Chak on 24 Jan 2023
I am implementing the shm equation ( m x'' + c x' + k x = F0) in matlab using ode45. The RHS is a constant force (F0). I am still getting an oscillatory response. The steady state response is equal to the static deformation. What is confusing me are the oscillations. What a force with constant magnitude result in an oscillatory response. Is my implementation wrong or my understanding of physics?
The sample code is shown below.
function dydt = sdof_fun(t,y,m,k,c,F)
dydt(1) = y(2);
dydt(2) = (F/m) - (k/m)*y(1) - (c/m)*y(2);
dydt = dydt(:);
end
[t,w] = ode45(@(t,y) sdof_fun(t,y,m,k,c,F),tspan,ic);
  2 Comments
Ajinkya
Ajinkya on 23 Jan 2023
Oh, Is that the free vibration response (response of the Homogeneous equation)?
Torsten
Torsten on 23 Jan 2023
Edited: Torsten on 23 Jan 2023
It depends on the zeros of the characteristic equation
m*x^2 + c*x + k = 0
what kind of response you get (especially the sign of the discriminant disc = c^2 - 4*k*m).
So check your constants.

Sign in to comment.

Answers (1)

Sam Chak
Sam Chak on 24 Jan 2023
Edited: Sam Chak on 24 Jan 2023
Analysis shows that the steady-state value of of the linear system is given by
.
In your case, I guess that the oscillatory response is observed because . If so, then try extending the simulation time long enough until you see the response converges to .
Another way is to check the value of the system's damping ratio, given by
.
If the damping ratio value is very small, then the oscillations die out very slowly. If , then a critically-damped response will be observed.
The following example shows the convergence, with so that the oscillations die out faster.
m = 11; % change to 49/20 to observe a critically-damped response
c = 7;
k = 5;
F = 3;
params = [m c k F];
tspan = 0:0.01:30;
ic = [-1 0];
[t, y] = ode45(@(t, y) sdof_fun(t, y, params), tspan, ic);
plot(t, y(:,1), 'linewidth', 1.5), grid on
xlabel('t'), ylabel('y')
title('System Response')
function dydt = sdof_fun(t, y, params)
m = params(1);
c = params(2);
k = params(3);
F = params(4);
dydt(1) = y(2);
dydt(2) = (F/m) - (k/m)*y(1) - (c/m)*y(2);
dydt = dydt(:);
end

Categories

Find more on Programming in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!