Chapter 2: Mathematical Preliminaries
Lesson 1: Ordinary Differential Equations (ODEs): Order, Linearity, Initial Value Problems
This lesson formalizes ordinary differential equations (ODEs) as the core mathematical objects underlying continuous-time system dynamics. We define order and linearity, distinguish homogeneous and nonhomogeneous equations, formulate initial value problems (IVPs), and state existence and uniqueness results that guarantee well-posed system models. Simple analytic solutions and basic numerical implementation templates are provided in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica.
1. ODEs in System Dynamics
In system dynamics and control engineering, the evolution of physical states (position, velocity, current, temperature, etc.) is typically described by ordinary differential equations (ODEs). For a single state variable \( y(t) \), a first-order ODE has the generic form
\[ y'(t) = f\bigl(t, y(t)\bigr), \]
where \( t \) denotes time and \( f \) encodes the system dynamics derived from balance laws (e.g. Newton's laws, Kirchhoff's laws) and constitutive relations (spring law, Ohm's law, etc.).
More generally, when several physical quantities interact, we obtain a system of first-order ODEs:
\[ \mathbf{x}'(t) = \mathbf{f}\bigl(t, \mathbf{x}(t), \mathbf{u}(t)\bigr), \]
where \( \mathbf{x}(t) \) is the state vector and \( \mathbf{u}(t) \) collects external inputs (forces, voltages, control signals). Later chapters will build on this viewpoint to construct transfer-function and state-space models; here we focus on the core ODE concepts.
flowchart TD
A["Physical system"] --> B["Modeling assumptions (lumped, continuous time)"]
B --> C["Balance + constitutive equations"]
C --> D["ODE model: x_dot = f(t,x,u)"]
D --> E["Specify initial condition x(t0) = x0"]
E --> F["Time response x(t)"]
2. Definition and Order of an ODE
An ordinary differential equation relates an unknown function \( y : I \subset \mathbb{R} \to \mathbb{R} \) and its derivatives with respect to a single independent variable \( t \):
\[ F\Bigl(t, y(t), y'(t), y''(t), \dots, y^{(n)}(t)\Bigr) = 0. \]
The order of the ODE is the highest derivative of \( y \) that appears. Thus if \( y^{(n)}(t) \) is the highest derivative present, we say the equation is of order \( n \).
Often, one rewrites the ODE in normal form:
\[ y^{(n)}(t) = f\Bigl(t, y(t), y'(t), \dots, y^{(n-1)}(t)\Bigr), \]
which is convenient for both theoretical and numerical analysis. Higher order equations can always be converted to a first-order system by introducing auxiliary variables:
\[ x_1(t) = y(t), \quad x_2(t) = y'(t), \dots, x_n(t) = y^{(n-1)}(t), \]
\[ \mathbf{x}'(t) = \begin{bmatrix} x_1'(t) \\ x_2'(t) \\ \vdots \\ x_n'(t) \end{bmatrix} = \begin{bmatrix} x_2(t) \\ x_3(t) \\ \vdots \\ f\bigl(t, x_1(t), \dots, x_n(t)\bigr) \end{bmatrix}. \]
This reduction is fundamental in control engineering, where one usually works with first-order vector ODEs corresponding to system states.
Example (mechanical mass–spring–damper):
\[ m y''(t) + c y'(t) + k y(t) = u(t). \]
This is a second-order ODE because the highest derivative is \( y''(t) \). Introducing \( x_1(t) = y(t) \), \( x_2(t) = y'(t) \), we obtain a first-order system:
\[ \begin{aligned} x_1'(t) &= x_2(t), \\ x_2'(t) &= -\frac{c}{m} x_2(t) - \frac{k}{m} x_1(t) + \frac{1}{m} u(t). \end{aligned} \]
3. Linearity, Homogeneity, and Superposition
A central distinction in system dynamics is between linear and nonlinear ODEs. Consider an \( n \)-th order scalar ODE in normal form:
\[ y^{(n)}(t) = f\Bigl(t, y(t), y'(t), \dots, y^{(n-1)}(t)\Bigr). \]
The equation is called linear if it can be written as
\[ a_n(t) y^{(n)}(t) + a_{n-1}(t) y^{(n-1)}(t) + \dots + a_1(t) y'(t) + a_0(t) y(t) = g(t), \]
where the coefficient functions \( a_k(t) \) and the input \( g(t) \) depend only on time \( t \), not on \( y \) or its derivatives. In particular, no products such as \( y^2(t) \), \( y(t) y'(t) \), or nonlinear functions like \( \sin(y(t)) \) may appear.
Writing the left-hand side as a differential operator \( L \),
\[ L[y](t) := a_n(t) y^{(n)}(t) + a_{n-1}(t) y^{(n-1)}(t) + \dots + a_0(t) y(t), \]
the ODE takes the compact form \( L[y](t) = g(t) \). The mapping \( y \mapsto L[y] \) is linear in the vector space of sufficiently smooth functions.
3.1 Homogeneous vs. nonhomogeneous
A linear ODE is called homogeneous if \( g(t) \equiv 0 \):
\[ L[y](t) = 0, \]
and nonhomogeneous otherwise.
3.2 Superposition principle (proof)
Let \( L \) be the linear operator defined above, and consider the homogeneous equation \( L[y](t) = 0 \). Suppose \( y_1(t) \) and \( y_2(t) \) are two solutions:
\[ L[y_1](t) = 0, \quad L[y_2](t) = 0. \]
For arbitrary scalars \( c_1, c_2 \in \mathbb{R} \), the linearity of \( L \) yields
\[ L[c_1 y_1 + c_2 y_2](t) = c_1 L[y_1](t) + c_2 L[y_2](t) = c_1 \cdot 0 + c_2 \cdot 0 = 0. \]
Therefore \( c_1 y_1(t) + c_2 y_2(t) \) is also a solution: any linear combination of homogeneous solutions is again a solution. This is the superposition principle.
For a nonhomogeneous linear ODE \( L[y] = g \), if \( y_p \) is a particular solution and \( y_h \) is any solution of the homogeneous equation \( L[y_h] = 0 \), then
\[ L[y_p + y_h] = L[y_p] + L[y_h] = g + 0 = g, \]
so \( y_p + y_h \) solves the nonhomogeneous problem. Consequently, the general solution of a linear nonhomogeneous ODE is
\[ y(t) = y_h(t) + y_p(t), \]
where \( y_h \) is any homogeneous solution and \( y_p \) is a particular solution.
4. Initial Value Problems and Well-Posedness
An initial value problem (IVP) specifies both an ODE and the value(s) of the unknown function and its derivatives at an initial time \( t_0 \). For an \( n \)-th order ODE in normal form,
\[ y^{(n)}(t) = f\Bigl(t, y(t), y'(t), \dots, y^{(n-1)}(t)\Bigr), \]
an IVP prescribes \( n \) initial conditions:
\[ y^{(k)}(t_0) = \eta_k, \quad k = 0,1,\dots,n-1. \]
In system dynamics, these initial conditions encode the initial state of the system (initial position, velocity, current, etc.).
4.1 First-order IVPs and vector form
It is convenient to study IVPs in first-order vector form. Let \( \mathbf{x}(t) \in \mathbb{R}^n \) and consider
\[ \mathbf{x}'(t) = \mathbf{f}\bigl(t, \mathbf{x}(t)\bigr), \quad \mathbf{x}(t_0) = \mathbf{x}_0. \]
A function \( \mathbf{x}(t) \) is a solution on an interval \( I \) if it is continuously differentiable and satisfies the ODE and initial condition at every point of \( I \).
4.2 Existence and uniqueness: Picard–Lindelöf theorem
For system dynamics models to be meaningful, an IVP must be well-posed: for given initial data there should exist a unique solution, and this solution should depend continuously on the data. A cornerstone result is the Picard–Lindelöf theorem.
Theorem (Picard–Lindelöf, local form).
Consider a first-order IVP \( y'(t) = f(t,y(t)),\; y(t_0) = y_0 \). Suppose \( f(t,y) \) is continuous on a rectangle
\[ D = \{(t,y) \in \mathbb{R}^2 : |t - t_0| \le a,\, |y - y_0| \le b\}, \]
and \( f \) is Lipschitz continuous in \( y \) on \( D \), i.e., there exists \( L \ge 0 \) such that
\[ |f(t,y_1) - f(t,y_2)| \le L |y_1 - y_2| \quad \text{for all } (t,y_1), (t,y_2) \in D. \]
Then there exists a unique solution \( y(t) \) defined on some interval \( [t_0 - h, t_0 + h] \subset [t_0 - a, t_0 + a] \).
Sketch of idea.
The ODE can be written in integral form \( y(t) = y_0 + \int_{t_0}^t f(s, y(s)) \, ds \). Defining a mapping \( T \) on a suitable function space by
\[ (Ty)(t) := y_0 + \int_{t_0}^t f\bigl(s, y(s)\bigr)\,ds, \]
the Lipschitz condition implies that \( T \) is a contraction on a small interval, and Banach's fixed-point theorem ensures a unique fixed point \( y \), which is the unique solution.
4.3 Nonuniqueness when Lipschitz fails
If the Lipschitz condition in \( y \) fails, uniqueness can be lost.
Example. Consider
\[ y'(t) = \sqrt{|y(t)|}, \quad y(0) = 0. \]
Both \( y_1(t) \equiv 0 \) and \( y_2(t) = \tfrac{1}{4} t^2 \) for \( t \ge 0 \) (extended by zero for \( t \le 0 \)) satisfy the IVP. The nonlinearity \( \sqrt{|y|} \) is continuous but not Lipschitz near \( y = 0 \), so uniqueness fails.
flowchart TD
A["Specify f(t,y) and (t0,y0)"] --> B["Check continuity of f on region D"]
B --> C["Check Lipschitz in y on D"]
C --> D["If Lipschitz: unique local solution"]
C --> E["If not Lipschitz: nonuniqueness may occur"]
D --> F["Extend solution while (t,y) remains in D and finite"]
5. First-Order Linear ODEs and Integrating Factor
A first-order linear ODE has the form
\[ y'(t) + a(t) y(t) = b(t), \]
where \( a(t) \) and \( b(t) \) are given functions. The associated IVP is
\[ y'(t) + a(t) y(t) = b(t), \quad y(t_0) = y_0. \]
5.1 Integrating factor method
Define the integrating factor as
\[ \mu(t) = \exp\Bigl(\int_{t_0}^t a(s)\,ds\Bigr). \]
Multiplying the ODE by \( \mu(t) \) gives
\[ \mu(t) y'(t) + \mu(t) a(t) y(t) = \mu(t) b(t). \]
The left-hand side is the derivative of \( \mu(t) y(t) \):
\[ \frac{d}{dt}\bigl(\mu(t) y(t)\bigr) = \mu'(t) y(t) + \mu(t) y'(t) = a(t)\mu(t) y(t) + \mu(t) y'(t), \]
because \( \mu'(t) = a(t)\mu(t) \) by construction. Hence the ODE becomes
\[ \frac{d}{dt}\bigl(\mu(t) y(t)\bigr) = \mu(t) b(t). \]
Integrating from \( t_0 \) to \( t \) yields
\[ \mu(t) y(t) - \mu(t_0) y(t_0) = \int_{t_0}^t \mu(s) b(s)\,ds. \]
Since \( \mu(t_0) = 1 \) by definition, and \( y(t_0) = y_0 \), we obtain the explicit solution
\[ y(t) = \mu(t)^{-1} \Bigl( y_0 + \int_{t_0}^t \mu(s) b(s)\,ds \Bigr). \]
5.2 Constant-coefficient homogeneous case
For the simple but important homogeneous ODE
\[ y'(t) + a y(t) = 0, \quad a \in \mathbb{R}, \quad y(t_0) = y_0, \]
we have \( a(t) \equiv a \), \( b(t) \equiv 0 \), and
\[ \mu(t) = \exp\bigl(a (t - t_0)\bigr). \]
Thus
\[ \mu(t) y(t) = y_0 \quad\Rightarrow\quad y(t) = y_0 \exp\bigl(-a (t - t_0)\bigr). \]
This exponential decay (for \( a > 0 \)) or growth (for \( a < 0 \)) is ubiquitous in system dynamics: it is the canonical behavior of a stable first-order mode.
6. Computational Templates for Simple IVPs in Python, C++, Java, MATLAB/Simulink, and Mathematica
We illustrate how to implement the IVP \( y'(t) = -a y(t), \; y(0) = y_0 \) with \( a > 0 \) using basic numerical integration. We deliberately keep the implementation simple (forward Euler) and also point to specialized libraries that will be used more extensively in later chapters.
6.1 Python (NumPy, SciPy)
In Python, the scipy.integrate module provides high-quality
IVP solvers such as solve_ivp. For didactic purposes, we
first show a simple Euler integrator and then a call to
solve_ivp.
import numpy as np
from scipy.integrate import solve_ivp
# Parameters
a = 2.0 # decay rate
y0 = 1.0 # initial value
t0 = 0.0
tf = 5.0
h = 0.01 # step size for manual Euler integration
# Right-hand side f(t, y) = -a y
def f(t, y):
return -a * y
# 1) Simple explicit Euler implementation (from scratch)
n_steps = int((tf - t0) / h)
t_grid = np.linspace(t0, tf, n_steps + 1)
y_euler = np.zeros_like(t_grid)
y_euler[0] = y0
for k in range(n_steps):
y_euler[k + 1] = y_euler[k] + h * f(t_grid[k], y_euler[k])
# 2) Using SciPy's solve_ivp with a robust method (e.g. RK45)
sol = solve_ivp(f, (t0, tf), [y0], method="RK45", dense_output=True)
t_eval = np.linspace(t0, tf, 100)
y_scipy = sol.sol(t_eval)[0]
# Compare with exact analytical solution:
y_exact = y0 * np.exp(-a * (t_eval - t0))
Libraries closely related to system dynamics and control in Python
include scipy.integrate for IVPs, sympy for
analytic manipulation of ODEs, and the control package
(python-control) for transfer-function and state-space
models.
6.2 C++ (Boost.odeint)
In C++, the Boost.odeint library offers flexible ODE solvers. Below is a simple example using Euler integration; higher-order methods can be swapped in with minimal changes.
#include <iostream>
#include <vector>
#include <boost/numeric/odeint.hpp>
using state_type = double;
struct exp_decay {
double a;
void operator()(const state_type &y, state_type &dydt, const double t) const {
(void)t; // unused time variable
dydt = -a * y;
}
};
int main() {
using namespace boost::numeric::odeint;
double a = 2.0;
state_type y = 1.0; // initial value y(0)
double t0 = 0.0;
double tf = 5.0;
double dt = 0.01;
exp_decay rhs{a};
// simple stepper (Euler)
euler<state_type> stepper;
double t = t0;
while (t <= tf) {
std::cout << t << " " << y << "\n";
stepper.do_step(rhs, y, t, dt);
t += dt;
}
return 0;
}
In more advanced control-oriented C++ workflows, Boost.odeint can be
combined with linear algebra libraries such as Eigen to
integrate vector-valued ODEs describing multi-state systems.
6.3 Java (Apache Commons Math)
Java does not have a built-in ODE solver, but the Apache Commons Math library provides a variety of integrators.
import org.apache.commons.math3.ode.FirstOrderDifferentialEquations;
import org.apache.commons.math3.ode.FirstOrderIntegrator;
import org.apache.commons.math3.ode.nonstiff.EulerIntegrator;
public class ExpDecayIVP {
// dy/dt = -a y
static class ExpDecay implements FirstOrderDifferentialEquations {
private final double a;
ExpDecay(double a) {
this.a = a;
}
@Override
public int getDimension() {
return 1;
}
@Override
public void computeDerivatives(double t, double[] y, double[] yDot) {
yDot[0] = -a * y[0];
}
}
public static void main(String[] args) {
double a = 2.0;
double t0 = 0.0;
double tf = 5.0;
double h = 0.01;
FirstOrderDifferentialEquations ode = new ExpDecay(a);
FirstOrderIntegrator integrator = new EulerIntegrator(h);
double[] y = new double[] { 1.0 }; // initial condition
integrator.integrate(ode, t0, y, tf, y);
System.out.println("Approximate y(" + tf + ") = " + y[0]);
}
}
6.4 MATLAB / Simulink
In MATLAB, IVPs are typically solved using ode45 or related
solvers. The same model can be represented in Simulink as a block
diagram containing an integrator block and a gain block.
% Parameters
a = 2.0;
y0 = 1.0;
tspan = [0 5];
% Right-hand side dy/dt = -a y
f = @(t, y) -a * y;
% Solve with ode45
[t, y] = ode45(f, tspan, y0);
% Compare with analytic solution
y_exact = y0 * exp(-a * (t - tspan(1)));
% Plot
figure;
plot(t, y, 'o', t, y_exact, '-');
xlabel('t'); ylabel('y(t)');
legend('ode45', 'exact');
grid on;
In Simulink, the same dynamics are realized by connecting a gain block
with value -a to an integrator block whose output is
y(t), with an initial condition y(0) = y0.
This Simulink representation is a direct graphical encoding of the ODE.
6.5 Wolfram Mathematica
Mathematica offers symbolic and numeric ODE solvers. A minimal example
using NDSolve is:
a = 2.0;
y0 = 1.0;
sol = NDSolve[
{
y'[t] == -a*y[t],
y[0] == y0
},
y,
{t, 0, 5}
];
Plot[
Evaluate[y[t] /. sol],
{t, 0, 5},
AxesLabel -> {"t", "y(t)"}
]
Mathematica can also produce closed-form solutions via
DSolve, verifying the analytic expression
\( y(t) = y_0 \exp(-a t) \).
7. Problems and Solutions
The following problems reinforce the concepts of order, linearity, homogeneous vs. nonhomogeneous equations, and IVP well-posedness.
Problem 1 (Order and linearity classification).
For each of the following ODEs, determine (i) its order, and (ii)
whether it is linear or nonlinear. For linear equations, state whether
they are homogeneous or nonhomogeneous.
- \( y''(t) + 3 y'(t) + 2 y(t) = 0 \).
- \( y'(t) = t^2 y(t) \).
- \( y''(t) + y(t)^2 = \sin(t) \).
- \( y'(t) + t y(t) = y(t)^3 \).
Solution.
- Order 2 (highest derivative is \( y'' \)). Linear, homogeneous (right-hand side is zero).
- Order 1. Linear, homogeneous (can be written \( y'(t) - t^2 y(t) = 0 \)).
- Order 2. Nonlinear because of the term \( y(t)^2 \). The notion of homogeneity/nonhomogeneity is reserved for linear equations, so this classification does not apply here.
- Order 1. Nonlinear due to the term \( y(t)^3 \); again, homogeneity in the linear sense does not apply.
Problem 2 (Superposition for a mechanical ODE).
Consider the homogeneous mass–spring–damper equation
\[ m y''(t) + c y'(t) + k y(t) = 0, \quad m > 0. \]
Suppose \( y_1(t) \) and \( y_2(t) \) are two solutions. Show that for any constants \( \alpha, \beta \in \mathbb{R} \), the function \( y(t) = \alpha y_1(t) + \beta y_2(t) \) is also a solution.
Solution.
Define \( L[y] := m y'' + c y' + k y \). Then \( L[y_1] = 0 \) and \( L[y_2] = 0 \) by assumption. Using linearity:
\[ L[\alpha y_1 + \beta y_2] = m (\alpha y_1'' + \beta y_2'') + c (\alpha y_1' + \beta y_2') + k (\alpha y_1 + \beta y_2) = \alpha L[y_1] + \beta L[y_2] = 0. \]
Hence \( y(t) = \alpha y_1(t) + \beta y_2(t) \) satisfies the same homogeneous ODE and is therefore a solution.
Problem 3 (Uniqueness via Lipschitz and a counterexample).
(a) Show that the function \( f(t,y) = t y \) is
globally Lipschitz in \( y \) on any bounded
\( t \)-interval.
(b) Conclude that the IVP
\[ y'(t) = t y(t), \quad y(0) = y_0 \]
has a unique solution on all of \( \mathbb{R} \).
(c) Contrast this with the earlier IVP \( y'(t) = \sqrt{|y(t)|}, \; y(0) = 0 \), which has multiple solutions.
Solution.
(a) For any fixed \( t \),
\[ |f(t,y_1) - f(t,y_2)| = |t y_1 - t y_2| = |t|\,|y_1 - y_2|. \]
On a bounded interval \( |t| \le M \), this gives \( |f(t,y_1) - f(t,y_2)| \le M |y_1 - y_2| \), so \( f \) is Lipschitz in \( y \) with Lipschitz constant \( L = M \).
(b) The Picard–Lindelöf theorem applies on any bounded interval. Since \( f(t,y) = t y \) is smooth in both variables, the solution can be extended indefinitely, giving a unique global solution:
\[ y(t) = y_0 \exp\Bigl(\tfrac{1}{2} t^2\Bigr). \]
(c) In contrast, \( f(t,y) = \sqrt{|y|} \) is not Lipschitz in \( y \) near \( y = 0 \), and uniqueness fails, as previously shown.
Problem 4 (Solving an IVP with integrating factor).
Solve the IVP
\[ y'(t) + 3 y(t) = 6, \quad y(0) = 2. \]
Solution.
This is a first-order linear ODE with \( a(t) = 3 \), \( b(t) = 6 \). The integrating factor is
\[ \mu(t) = \exp\bigl(\int_0^t 3\,ds\bigr) = \exp(3 t). \]
Multiplying the ODE by \( \mu(t) \):
\[ \exp(3 t) y'(t) + 3 \exp(3 t) y(t) = 6 \exp(3 t), \]
and the left-hand side is \( \frac{d}{dt}\bigl(\exp(3 t) y(t)\bigr) \). Thus
\[ \frac{d}{dt}\bigl(\exp(3 t) y(t)\bigr) = 6 \exp(3 t). \]
Integrate from 0 to \( t \):
\[ \exp(3 t) y(t) - \exp(0) y(0) = \int_0^t 6 \exp(3 s)\,ds = 2\bigl(\exp(3 t) - 1\bigr). \]
Since \( y(0) = 2 \),
\[ \exp(3 t) y(t) - 2 = 2\bigl(\exp(3 t) - 1\bigr) \quad\Rightarrow\quad \exp(3 t) y(t) = 2 \exp(3 t). \]
Therefore \( y(t) = 2 \) for all \( t \).
Problem 5 (From second-order ODE to first-order system).
Consider again the mass–spring–damper equation with input
\( u(t) \):
\[ m y''(t) + c y'(t) + k y(t) = u(t), \]
with initial conditions \( y(0) = y_0 \), \( y'(0) = v_0 \). Rewrite this as a first-order system \( \mathbf{x}'(t) = \mathbf{f}(t,\mathbf{x},u) \) and state the corresponding vector initial condition.
Solution.
Let \( x_1(t) = y(t) \), \( x_2(t) = y'(t) \). Then
\[ \begin{aligned} x_1'(t) &= x_2(t), \\ x_2'(t) &= -\frac{c}{m} x_2(t) - \frac{k}{m} x_1(t) + \frac{1}{m} u(t). \end{aligned} \]
In vector notation, \( \mathbf{x}(t) = [x_1(t)\; x_2(t)]^{\top} \),
\[ \mathbf{x}'(t) = \begin{bmatrix} x_2(t) \\ -\frac{c}{m} x_2(t) - \frac{k}{m} x_1(t) + \frac{1}{m} u(t) \end{bmatrix}, \quad \mathbf{x}(0) = \begin{bmatrix} y_0 \\ v_0 \end{bmatrix}. \]
This first-order system is the standard starting point for later state-space and control design formulations.
8. Summary
In this lesson, we formalized ordinary differential equations as the mathematical backbone of continuous-time system dynamics. We defined the order of an ODE, distinguished linear from nonlinear equations, and introduced homogeneous vs. nonhomogeneous linear ODEs. The linear structure was characterized via a differential operator, leading to the superposition principle and the decomposition of solutions into homogeneous and particular parts.
We then formulated initial value problems (IVPs) and discussed well-posedness through the Picard–Lindelöf theorem, emphasizing the role of Lipschitz continuity for uniqueness. For first-order linear equations, the integrating factor method provided explicit solutions, with the exponential response as a central motif in dynamic systems. Finally, we connected theory to computation with simple implementation templates in Python, C++, Java, MATLAB/Simulink, and Mathematica. These foundations will support the use of Laplace transforms, transfer functions, and state-space models in subsequent chapters.
9. References
- Cauchy, A.-L. (1827). Sur les équations différentielles du premier ordre. Comptes Rendus de l'Académie des Sciences, 4, 220–226.
- Picard, É. (1890). Sur l'existence des intégrales des équations différentielles. Journal de Mathématiques Pures et Appliquées, 6(4), 145–210.
- Peano, G. (1890). Sui principi fondamentali dell'analisi. Rendiconti del Reale Istituto Lombardo di Scienze e Lettere, 22, 441–448.
- Carathéodory, C. (1918). Über die Existenz von Lösungen der Differentialgleichungen. Mathematische Annalen, 76(3), 325–351.
- Hartman, P., & Wintner, A. (1953). On the local behavior of solutions of nonlinear differential equations. American Journal of Mathematics, 75(2), 449–476.
- Nagumo, M. (1942). On the uniqueness of solutions of ordinary differential equations. Osaka Mathematical Journal, 4, 51–60.
- Massera, J. L., & Schäffer, J. J. (1966). Linear differential equations and functional analysis. Annals of Mathematics, 84(2), 365–383.
- Yoshizawa, T. (1966). Stability theory by Liapunov's second method. Publications of the Mathematical Society of Japan, 9, 1–124.