# matlab – Spring/Damper Calculation & Plotting

## matlab – Spring/Damper Calculation & Plotting

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)

m1=500;
c=1200;
k1=25000;

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
else
dX(4) = 0.5;
end
``````

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])
legend(D2y,m1*D2x,Location,NorthEast)
``````

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