Directional Fields

A 2D autonomous ODE system — autonomous meaning its rate functions depend only on the state, not on time, so the field of arrows it defines never shifts — governs two variables x(t)x(t) and y(t)y(t) through their rates of change,

x˙=f(x,y),y˙=g(x,y).\dot x = f(x, y), \qquad \dot y = g(x, y).

The dot is shorthand for the time derivative, x˙=dx/dt\dot x = dx/dt and y˙=dy/dt\dot y = dy/dt, so each equation says how fast its variable changes as time runs forward. The rate functions ff and gg each take a state (x,y)(x, y) and return how fast that variable is changing there. There are two ways to understand such a system qualitatively — to say where its trajectories go without writing down a formula for them. One is algebraic: compute the eigenvalues of the Jacobian at each steady state, the route taken by linear stability analysis. The other is geometric: draw the field of arrows the system defines and read the behavior straight off the picture. This page is the geometric route.

The directional field

For a 2D autonomous system x˙=f(x,y)\dot x = f(x, y), y˙=g(x,y)\dot y = g(x, y), the directional field (also called the direction field) attaches to every point (x,y)(x, y) of the plane the vector

(f(x,y),g(x,y)),\big(f(x, y),\, g(x, y)\big),

the velocity the system has as it passes through that state. It is the vector field on the (x,y)(x, y)-plane: the arrow at each point points in the direction of motion there, and its length gives the speed (the magnitude of the velocity vector).

A trajectory is a curve that everywhere follows these arrows: at each point it passes through, its tangent matches the local field vector. So once the field is drawn, trajectories can be traced by following the arrows like a current, and the system’s long-run behavior — settle to a steady state, fly off, or circle — can be read without ever solving the equations. A phase portrait — one example shown below — is exactly the directional field together with a few representative trajectories.

A phase portrait of the system x˙=x+0.6y\dot x = -x + 0.6y, y˙=0.2xy\dot y = 0.2x - y. The grid of arrows is the directional field; the curve is one trajectory, everywhere tangent to the arrows. It begins at the blue point and winds along them into the red point — the attractive state the whole field flows toward.

The field has an arrow at every one of infinitely many points, which is too much to draw. The saving grace is that the plane splits into a handful of regions in which all the arrows point the same general way, and the boundaries between those regions are easy to find — they are the nullclines.

Drawing the field by hand

Drawing the field is a fixed sequence of five steps. The first two locate the system’s skeleton — the nullclines, and the steady states where they cross. The next two read the flow: the sign of each rate function in every region, then those signs combined into one arrow per region. The last draws the trajectories that follow those arrows. Once the field is drawn, a final read classifies each steady state, and the eigenvalues offer a shortcut to the same verdict. To make the steps concrete, one example runs through all of them: the system

x˙=x,y˙=y,\dot x = x, \qquad \dot y = y,

so f(x,y)=xf(x, y) = x and g(x,y)=yg(x, y) = y.

1. Draw the nullclines

A nullcline of the system x˙=f(x,y)\dot x = f(x, y), y˙=g(x,y)\dot y = g(x, y) is a curve along which one of the two rates of change is zero (null, hence the name):

  • the xx-nullcline is the set where x˙=0\dot x = 0, so the system has no horizontal motion; with the rate written as x˙=f(x,y)\dot x = f(x, y), that is the curve f(x,y)=0f(x, y) = 0;
  • the yy-nullcline is the set where y˙=0\dot y = 0, so the system has no vertical motion; with y˙=g(x,y)\dot y = g(x, y), that is the curve g(x,y)=0g(x, y) = 0.

Each nullcline is named after the variable whose rate of change vanishes on it.

The condition that defines a nullcline is x˙=0\dot x = 0 (or y˙=0\dot y = 0). It lines up with "f=0f = 0" here only because this page writes the rate as x˙=f(x,y)\dot x = f(x, y), making ff the entire right-hand side. When a model factors the rate instead, the nullcline is still the full set where the right-hand side vanishes, which may be several curves. The two-species model is the standard case: with p˙=f(p,q)p\dot p = f(p, q)\, p, the pp-nullcline is where f(p,q)p=0f(p, q)\, p = 0, and a product vanishes when either factor does — so it is the curve f(p,q)=0f(p, q) = 0 together with the axis p=0p = 0, not f=0f = 0 by itself. This is the same product-is-zero reasoning behind that model’s stationary points.

A system can have more than one xx-nullcline or more than one yy-nullcline — whenever f=0f = 0 or g=0g = 0 factors into several curves, each piece is a separate nullcline. Keep each one a single curve; do not merge a factored condition like f=2x(x4)=0f = -2x(x - 4) = 0 into one drawing, split it into the two lines x=0x = 0 and x=4x = 4.

For the running example, f=x=0f = x = 0 gives the yy-axis — the xx-nullcline, with no horizontal motion along it — and g=y=0g = y = 0 gives the xx-axis, the yy-nullcline. The two nullclines are just the coordinate axes.

Step 1. The xx-nullcline x=0x = 0 (violet dashed, the yy-axis) and the yy-nullcline y=0y = 0 (blue dashed, the xx-axis).

2. Label the steady states

Where an xx-nullcline crosses a yy-nullcline, both x˙\dot x and y˙\dot y vanish at the same point: the state does not move at all. Such a point is a steady state (also called a stationary point) of the system.

The one trap is to mark every nullcline crossing. Only an xx-nullcline meeting a yy-nullcline gives a steady state. Where two xx-nullclines cross — or two yy-nullclines — just one velocity component is zero, so the state still moves; that intersection is not a steady state.

In the running example the two axes meet only at the origin, so (0,0)(0, 0) is the system’s lone steady state.

Step 2. The nullclines cross only at the origin, marked as the lone steady state (0,0)(0, 0).

3. Consider the signs in each region

The nullclines cut the plane into regions. Inside any one region neither ff nor gg changes sign, so every arrow points the same general way, and a single test point fixes it. Pick any point in the region and check two signs:

  • the sign of ff sets the horizontal part: positive means the arrow points right, negative means it points left;
  • the sign of gg sets the vertical part: positive means it points up, negative means it points down.

The nullclines are exactly the places where one part flips: crossing an xx-nullcline reverses the horizontal direction (since ff changes sign there), and crossing a yy-nullcline reverses the vertical direction.

For the running example the axes split the plane into the four quadrants. Here f=xf = x is positive when x>0x > 0 and negative when x<0x < 0, so the horizontal part points away from the yy-axis on both sides; g=yg = y is positive when y>0y > 0 and negative when y<0y < 0, so the vertical part points away from the xx-axis.

Step 3. In each quadrant, read off two separate arrows: the sign of ff gives a horizontal one, the sign of gg a vertical one. Both point away from the axes here.

4. Combine the arrows

Bring each region’s two arrows together tail to tail, so they meet at a right angle. The corner points the way the field flows there, and their net direction is a single diagonal arrow — the velocity of the whole region in one stroke.

For the running example both parts point outward in every quadrant, so the corner, and the diagonal it adds up to, points away from the origin.

Step 4. The horizontal and vertical arrows of each quadrant joined tail to tail, the right-angle corner pointing outward.

Step 4, net direction. Each corner replaced by the single diagonal arrow it adds up to, all pointing outward from the origin.

5. Sketch the trajectories

With an arrow in every region, draw curves that follow them. Trajectories are free to cross nullclines, and watching how clarifies what looks at first like a contradiction: on a yy-nullcline there is no vertical motion, so a trajectory crosses it moving purely horizontally; on an xx-nullcline there is no horizontal motion, so it crosses moving purely vertically. A trajectory slows in one direction as it nears a nullcline without stopping outright, because the other direction’s motion carries it across.

In the running example the outward arrows give trajectories that leave the origin as straight rays, spreading out in every direction.

Step 5. Trajectories follow the arrows — equal rays radiating outward from the steady state, the repulsive node in full.

Classifying the steady state

The finished picture classifies each steady state by how the nearby trajectories behave — the same three real-eigenvalue cases that linear stability analysis reaches algebraically:

  • arrows pointing toward the steady state from every side mark an attractive node, which is stable;
  • arrows pointing away on every side mark a repulsive node, which is unstable;
  • arrows pointing inward along one direction and outward along another mark a saddle node, which is also unstable: the outward direction alone carries some nearby states away.

For the running example every arrow points away from the origin, so (0,0)(0, 0) is a repulsive node — an unstable steady state that nearby trajectories flee.

This is the same verdict the eigenvalues give, read off a drawing instead of a characteristic polynomial. The two routes are worth running against each other: sketch the field, classify by eye, then confirm with the eigenvalues of the Jacobian.

Alternative: eigenvalues instead of the arrows

Steps 3 and 4 do the real labor — probing test points region by region to find the sign of the flow, then combining those signs into one arrow per region. Linear stability analysis reaches the same local picture algebraically, and it slots into the procedure as an intermediate step: run it once the steady states are in hand (right after step 2), and it stands in for the arrow work of steps 3 and 4 while handing you the classification for free.

It feels unfamiliar here only because linear stability analysis is usually met as the final verdict on a steady state, not as a tool for drawing a field. The repurposing is small. At a steady state (xˉ,yˉ)(\bar x, \bar y), linearize the system: form the Jacobian JJ of (f,g)(f, g) there and take its eigenvalues. Two pieces of data come out, and each replaces one part of the hand-drawing:

  • the eigenvalue signs give the classification outright — the same three real-eigenvalue cases, with λ1,λ2<0\lambda_1, \lambda_2 < 0 an attractive node, λ1,λ2>0\lambda_1, \lambda_2 > 0 a repulsive node, and opposite signs a saddle node — so you never combine arrows by hand to see which way the steady state pulls;
  • the eigenvectors give the directions of that pull — the lines along which trajectories run straight in or straight out — so they hand you the skeleton to draw step 5’s trajectories along. This matters most for a saddle, where the two eigendirections are exactly the in-line and the out-line and every other trajectory bends hyperbolically between them.

So the eigenvalue computation is the intermediate step: it sits between finding the steady states and sketching the field, supplying the local flow picture that steps 3 and 4 would otherwise build up test point by test point.

For the running example the system is already linear, so its Jacobian is the constant matrix

J=(1001),J = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix},

with eigenvalues λ1=λ2=1\lambda_1 = \lambda_2 = 1. Both are positive — the repulsive-node case — the same verdict the arrows gave, reached without drawing a single arrow.

The subscripts on λ1\lambda_1 and λ2\lambda_2 do not tie one eigenvalue to xx and the other to yy. Each eigenvalue pairs with an eigenvector — a direction in the plane — not with a coordinate or a rate function, and the labels 1,21, 2 are only an ordering. The examples here make it look as though λ1\lambda_1 goes with xx and λ2\lambda_2 with yy purely because their Jacobians are diagonal: the systems are decoupled (x˙\dot x has no yy, y˙\dot y has no xx), so the eigenvectors line up with the coordinate axes and each eigenvalue does govern one axis. In a coupled system — off-diagonal Jacobian entries — the eigendirections are slanted, mixing xx and yy (the dashed lines in the saddle node figure are exactly these), and no single eigenvalue belongs to one variable.

Worked example

The running example came out a repulsive node. Here is the whole procedure once more, compressed, on a system that comes out the opposite way — attractive. Take the decoupled system

x˙=2x,y˙=3y,\dot x = -2x, \qquad \dot y = -3y,

so f(x,y)=2xf(x, y) = -2x and g(x,y)=3yg(x, y) = -3y.

Nullclines. Setting f=0f = 0 gives x=0x = 0, the yy-axis: that is the xx-nullcline. Setting g=0g = 0 gives y=0y = 0, the xx-axis: that is the yy-nullcline. They cross at the origin, the system’s only steady state (0,0)(0, 0).

Arrows. The two nullclines are the coordinate axes, so the regions are the four quadrants. Check the signs:

  • f=2xf = -2x is negative when x>0x > 0 and positive when x<0x < 0, so the horizontal part always points back toward the yy-axis;
  • g=3yg = -3y is negative when y>0y > 0 and positive when y<0y < 0, so the vertical part always points back toward the xx-axis.

In every quadrant both parts point inward, so the combined arrow points toward the origin from all sides. The picture is an attractive node.

The directional field of x˙=2x\dot x = -2x, y˙=3y\dot y = -3y. Every trajectory flows in to the steady state at the origin, confirming the attractive node read off the arrows. The approach bends along the xx-axis because the xx component decays more slowly (2-2) than the yy component (3-3).

Eigenvalue check. Because the system is linear, its Jacobian is the constant coefficient matrix

J=(2003),J = \begin{pmatrix} -2 & 0 \\ 0 & -3 \end{pmatrix},

whose eigenvalues are its diagonal entries λ1=2\lambda_1 = -2 and λ2=3\lambda_2 = -3. Both are negative, which is precisely the linear stability analysis condition for an attractive node — the same classification the drawing produced.