Define an @-function f for the right hand side of the first order system: Note that f must be specified as a column vector using [...;...] (not a row vector using [...,...]). In the definition of f, use y(1) for y1, use y(2) for y2. The definition off should have the form

f = @(t,y) [expression for y1';expression for y2'];

You have to use f = @(t,y)... even if t does not occur in your formula. For our example the first component of f is y2, the second component is -sin(y1) + sin(5 t) and we define

f = @(t,y) [y(2); -sin(y(1))+sin(5*t)]

To plot the numerical solution: To obtain plots of all the components of the solution for t going from t0 to t1 use ode45(f,[t0,t1],[y10;y20]) where y10, y20 are the initial values for y1, y2 at the starting point t0. In our example we get a plot for t going from 0 to 20 with the initial values [1;0] using

ode45(f,[0,20],[1;0])

This shows the two functions y1(t)=y(t) (blue) and y2(t)=y'(t) (green).

The circles mark the values which were actually computed (the points are chosen by Matlab to optimize accuracy and efficiency). You can obtain a vector ts and a matrix ys with the coordinates of these points using [ts,ys] = ode45(f,[t0,t1],[y10;y20]). You can then plot the solution curves using plot(ts,ys) (this is a way to obtain a plot without the circles). Note that each row of the matrix ys contains 2 entries corresponding to the two components of the solution at that time:

You can obtain the vector of y1 values in the first column of ys by using ys(:,1), therefore plot(ts,ys(:,1)) plots only y1(t).

To obtain numerical values at specific t values: You can specify a vector tv of t values and use [ts,ys] = ode45(f,tv,[y10;y20]). The first element of the vector tv is the initial t value; the vector tv must have at least 3 elements. E.g., to obtain the solution with the initial values [1;0] at t = 0, 0.5, ..., 10 and display the results as a table with 3 columns t, y1, y2, use

If the right hand side function f(t, y) does not depend on t, the problem is called autonomous. In this case the behavior of the differential equation can be visualized by plotting the vector f(t, y) at each point y = (y1,y2) in the y1,y2 plane (the so-called phase plane).

To plot the vector field for y1 going from a1 to b1 with a spacing of d1 and y2 going from a2 to b2 with a spacing of d2 use vectfield(f,a1:d1:b1,a2:d2:b2). The command vectfieldn works in the same way, but produces arrows which all have the same length. This makes it easier to see the direction of the vector field.

Example: The undamped pendulum problem without a driving force has the differential equation y'' = -sin(y). This gives the first order system

To obtain numerical values use double(subs(sol.y1,'t',tval)) where tval is a number or a vector of numbers. E.g., the following commands generate a table with three columns t, y1, y2 for t=0, 0.5, ..., 10:

Problem setup

We reduce this to standard matlab form of a system of first order ODEs by letting and . This leads to:

The phase portrait is a plot of a vector field which qualitatively shows how the solutions to these equations will go from a given starting point. here is our definition of the differential equations:

f = @(t,Y) [Y(2); -sin(Y(1))];

To generate the phase portrait, we need to compute the derivatives and at on a grid over the range of values for and we are interested in. We will plot the derivatives as a vector at each (y1, y2) which will show us the initial direction from each point. We will examine the solutions over the range -2 < y1 < 8, and -2 < y2 < 2 for y2, and create a grid of 20x20 points.

y1 = linspace(-2,8,20);
y2 = linspace(-2,2,20);
% creates two matrices one for all the x-values on the grid, and one for% all the y-values on the grid. Note that x and y are matrices of the same% size and shape, in this case 20 rows and 20 columns
[x,y] = meshgrid(y1,y2);
size(x)
size(y)

ans =
20 20
ans =
20 20

computing the vector field

we need to generate two matrices, u and v. u will contain the value of y1' at each x and y position, while v will contain the value of y2' at each x and y position of our grid.

we preallocate the arrays so they have the right size and shape

u = zeros(size(x));
v = zeros(size(x));
% we can use a single loop over each element to compute the derivatives at% each point (y1, y2)
t=0; % we want the derivatives at each point at t=0, i.e. the starting timefor i = 1:numel(x)
Yprime = f(t,[x(i); y(i)]);
u(i) = Yprime(1);
v(i) = Yprime(2);
end

Plotting solutions on the vector field

Let's plot a few solutions on the vector field. We will consider the solutions where y1(0)=0, and values of y2(0) = [0 0.5 1 1.5 2 2.5], in otherwords we start the pendulum at an angle of zero, with some angular velocity.

what do these figures mean? For starting points near the origin, and small velocities, the pendulum goes into a stable limit cycle. For others, the trajectory appears to fly off into y1 space. Recall that y1 is an angle that has values from to . The y1 data in this case is not wrapped around to be in this range.