So \(y \rightarrow 0\) for \(t \rightarrow \infty\)
Thus, \(\dot{x} = x + e^{-y}\) becomes \(\dot{x} \rightarrow x + 1\) for long times
This has exponentially growing solutions
Toward \(\infty\) for \(x > -1\) and \(-\infty\) for \(x < -1\)
Solution grows exponentially in at least one dimension, so it is unstable.
Step 3: Sketch nullclines
Nullclines are the sets of points for which \(\dot{x} = 0\) or \(\dot{y} = 0\), so flow is either horizontal or vertical.
Step 4: Plot flow lines
Existence & Uniqueness
Non-linear \(\dot{\mathbf{x}} = f(\mathbf{x})\) and given an initial condition.
Existence and uniqueness of solution guaranteed if \(f\) is continuously differentiable
Corollary: Trajectories do not intersect, because if they did, then there would be two solutions for the same initial condition at the crossing point
Linearization About Fixed Points
Solving Linearized Systems
Example
More Examples
Classification of Fixed Points
Eigenvalue Behavior Summary
Eigenvalues
Fixed Point Type
Behavior
Real, both negative
Stable node
Trajectories converge to fixed point
Real, both positive
Unstable node
Trajectories diverge from fixed point
Real, opposite signs
Saddle point
Stable in one direction, unstable in another
Complex, negative real part
Stable spiral
Oscillatory decay toward fixed point
Complex, positive real part
Unstable spiral
Oscillatory divergence from fixed point
Purely imaginary
Center
Neutral closed orbits (undamped oscillation)
Relevance for Nonlinear Dynamics
So, we have said that we can find fixed points of nonlinear dynamics, linearize about each fixed point, and characterize the dynamics about each fixed point in the non-linear model by the corresponding linear model.
Is this always true? Do the nonlinearities ever disturb this approach?
A theorem can be proven which states
That all the regions on the previous slide are “robust” (nodes, spirals, saddles) and correspond between linear and nonlinear models.
But that all the lines on the previous slide are “delicate” (centers, stars, degenerate nodes, non-isolated fixed points) and can have different behaviors in linear and non-linear models.
Bifurcations
The phase portraits we have been looking at describe the trajectory of the system for a given set of initial conditions. However, for “fixed” parameters (rate constants in eqns, for instance).
What we might like is a series of phase portraits corresponding to different sets of parameters.
Many will be qualitatively similar. The interesting ones will be where a small change of parameters creates a qualitative change in the phase portrait (bifurcations).
What we will find is that fixed points & closed orbits can be created/destroyed and stabilized/destabilized.
Saddle-Node Bifurcation
Canonical example: \(\dot{x} = r + x^2\)
For \(r < 0\): two fixed points (one stable, one unstable)
At \(r = 0\): the two fixed points collide and annihilate
For \(r > 0\): no fixed points — system escapes to infinity
Hopf Bifurcation
A Hopf bifurcation occurs when a fixed point changes stability and a limit cycle (sustained oscillation) is born or destroyed
Eigenvalues of \(J\) cross the imaginary axis as a parameter varies
Common in biological oscillators: circadian rhythms, cell cycle checkpoints, neural firing
Example: Genetic Control Network
Genetic Control Network
The Griffith model is a canonical example of a saddle-node bifurcation giving rise to bistability — two coexisting stable steady states separated by an unstable one. Griffith (1971) model of genetic control:
x = protein concentration
y = mRNA concentration
Genetic Control Network
Biochemical version of a bistable switch:
Only stable points are no protein and mRNA or a fixed composition
If degradation rates too great, only stable point is origin
Implementation
Testing
Many properties one can test
Mass balance
Changes upon parameter adjustment
Good to test these before and after integration
Python Packages
SciPy provides several interfaces for ODE solving:
where b and c are positive constants, and a prime (‘) denotes a derivative. To solve this equation with odeint, we must first convert it to a system of first order equations. By defining the angular velocity \(\omega(t) = \theta'(t)\), we obtain the system:
\[\theta'(t) = \omega(t)\]
\[\omega'(t) = -b*\omega(t) - c*\sin(\theta(t))\]
Pendulum Oscillation
Let y be the vector \([\theta, \omega]\). We implement this system in python as:
We assume the constants are \(b = 0.25\) and \(c = 5.0\):
b, c =0.25, 5.0
Pendulum Oscillation
For initial conditions, we assume the pendulum is nearly vertical with \(\theta(0) = \pi - 0.1\), and it initially at rest, so \(\omega(0) = 0\). Then the vector of initial conditions is
y0 = [np.pi -0.1, 0.0]
We generate a solution 101 evenly spaced samples in the interval \(0 \leq t \leq 10\). So our array of times is:
t = np.linspace(0, 10, 101)
Pendulum Oscillation
Call odeint to generate the solution. To pass the parameters b and c to pend, we give them to odeint using the args argument.
from scipy.integrate import odeintsol = odeint(pend, y0, t, args=(b, c))
The solution is an array with shape (101, 2). The first column is \(\theta(t)\), and the second is \(\omega(t)\). The following code plots both components.
Consider a simple model of cells transitioning between two phases of the cell cycle:
graph LR
G1[G1 Phase] -->|α| G2S[G2/S Phase]
G2S -->|β| G1
G1 -->|γ| Death[Death]
G2S -->|γ| Death
style G1 fill:#f9d5e5,stroke:#333,stroke-width:2px
style G2S fill:#a1e7e6,stroke:#333,stroke-width:2px
style Death fill:#f8b195,stroke:#333,stroke-width:2px
Can this model oscillate under physically meaningful situations and, if so, when?
Implementation Note: Stiff Systems
Very roughly, most ODE solvers take steps inversely proportional to the rate at which the state is changing
For systems where there are two processes operating on differing timescales, this can be problematic
If everything happens really fast, the system will come to equilibrium quickly
If everything is slow, you can take longer steps
A typical biological example: receptor–ligand binding equilibrates in milliseconds, while downstream transcriptional responses occur over hours — a \(10^6\)-fold difference in timescale
Stiff solvers additionally require the Jacobian matrix
This very roughly allows them to keep track of these differences in timescales
odeint can automatically find this for you
Sometimes it’s faster/better to provide this as parameter Dfun
For stiff problems with solve_ivp, prefer method='Radau' or method='BDF'
Fitting ODE Models to Data
ODE models have no closed-form solution in general — must simulate to evaluate the likelihood
Fitting is an outer optimization loop around numerical integration: