1.4. Higher-order ODEs#
The Euler method solves a first-order ODE of the form
If we introduce functions
This is a system of
Example 1.3
A mass-spring-damper model consists of objects connected via springs and dampers. A simple example of the application of a model is a single object connected to a surface is shown in Fig. 1.10.
Fig. 1.10 The mass-spring-damper model [Wikipedia, 2008].#
The displacement of the object over time can be modelled by the second-order ODE
where
An object of mass 1kg is connected to a dampened spring with
Solution (click to show)
We first need to rewrite the governing equation as a system of first-order ODEs. Let
Since
The initial conditions are
A plot of the displacement of the object in the first 5 seconds of being released is shown in

Fig. 1.11 Euler method solutions for the mass-spring-damper model with
1.4.1. Code#
The code below sets up and solves the mass-sprint-damper model example from Example 1.3 using the Euler method.
# Define mass-spring-damper model
def spring(t, y):
return np.array([ y[1], (- c * y[1] - k * y[0]) / m ])
# Define IVP parameters
tspan = [0, 5] # boundaries of the t domain
y0 = [1, 0] # initial values
h = 0.1 # step length
m = 1; # mass of object
c = 2; # damping coefficient
k = 4; # spring constant
# Solve the IVP using the Euler method
t, y = euler(spring, tspan, y0, h)
print(y)
# Plot solution
fig, ax = plt.subplots()
plt.plot(t, y[:,0], "b-")
plt.xlabel("time (s)", fontsize=12)
plt.ylabel("displacement (m)", fontsize=12)
plt.show()
% Define mass-spring-damper model
spring = @(t, y, m, c, k) [ y(2), (-c * y(2) - k * y(1)) / m];
% Define IVP parameters
tspan = [0, 5]; % boundaries of the t domain
y0 = [1, 0]; % initial values [S, I, R]
h = 0.1; % step length
m = 1; % mass of object
c = 2; % damping coefficient
k = 4; % spring constant
% Solve the IVP using the Euler method
[t, y] = euler(@(t, y)spring(t, y, m, c, k), tspan, y0, h);
% Plot solution
plot(t, y(:, 1), 'b-', LineWidth=2)
xlabel('time (s)', Fontsize=14, Interpreter='latex')
ylabel('displacement (m)', Fontsize=14, Interpreter='latex')
axis padded