matlab – Spring/Damper Calculation & Plotting

matlab – Spring/Damper Calculation & Plotting

Answer updated to match Simulink model implementation

To use ode45, you first need to write a function that computes the derivative of you input vector (i.e. your differential equation), and store that function in a separate file with the function name as the filename. Please note that the ode solvers can only solve first-order differential equations, so you first need to do a bit of work to convert your second-order differential equation to a first-order one. For more details, see the documentation on ode45.

Based on what you have done in your Simulink model, D2y is known for all values of t (its the step input), so we need to integrate it with respect to time to get Dy and y. So our state vector is X = [x; Dx; y; Dy] and our function looks like (stored in diff_eqn.m):

function dX = diff_eqn(t,X)


dX(1) = X(2); % Dx
dX(2) = -(1/m1)*(c*(X(2)-X(4)/m1) + k1*(X(1)-X(3)/m1));; % D2x
dX(3) = X(4); % Dy

if t<2
  dX(4) = 0; % D2y
  dX(4) = 0.5;

as dX = [Dx; D2x; Dy; D2y].

In your script or your MATLAB command window, you can then call the ode solver (initial conditions all being equal to zero for Dx, x, Dy and y, as per your Simulink model):

[t,X] = ode45(@diff_eqn,[0 20],[0; 0; 0; 0]);

Adjust the ode solver options (e.g. max step size, etc…) to get results with more data points. To get the same plot as in your Simulink model, you can then process the results from the ode solver:

D2x = diff(X(:,2))./diff(t);
D2x = [0; D2x];
D2y = zeros(size(D2x));
D2y(t>=2) = 0.5;
plot(t,[D2y 500*D2x])
grid on
xlabel(Time [s])

Which gives the following plot, matching the results from your Simulink model:


matlab – Spring/Damper Calculation & Plotting

Leave a Reply

Your email address will not be published. Required fields are marked *