A Manual Matlab
A Manual Matlab
A Manual Matlab
Ivan Graham,
with some revisions by Nick Britton,
Mathematical Sciences, University of Bath
February 9, 2005
This manual provides an introduction to MATLAB with exercises which are specifically oriented to the MATLAB
service provided by Bath University Computing Service (BUCS). However much of the information provided
here is applicable to any MATLAB installation, PC, Mac or UNIX.
This manual has a dual role: it serves first as a set of directed tutorials to be carried out in the laboratory
and second as a general reference manual for MATLAB.
Each chapter of the manual represents one tutorial, and includes exercises to be done during private
study time. For each tutorial you should read through the relevant chapter, trying out the various features
of MATLAB which are described, and then you should do the exercises.
You may extend the chapter by doing your own experiments with the system. Responsible experimenta-
tion is essential when learning computing.
Contents
0 Introduction: What is MATLAB? 1
1.1.1. Starting a MATLAB session (in WindowsXP). Here is one way to do it.
• Log on to Windows.
• From the Desktop, click Start, then Amos, mary, midge from the pop-up menu.
1
• In the BUCS XClient pop-up window, change host from bucs to amos or midge and log on.
• In the blue UNIX window, type xterm & (where represents a space) to the $ prompt for a second UNIX
window, which you may need later. (See e.g. the last paragraph of section 1.2.)
• In either one of these UNIX windows, type matlab.
(It is highly advisable to run only one MATLAB session at any one time. The total number of MATLAB sessions
that may be run on campus is limited by the licence. You need only one session to do everything you need
to do. However, there is no limit to how many UNIX windows you can have.)
1.1.2. Running MATLAB. After you have typed matlab, a MATLAB logo will come up and then a MATLAB
command window with a prompt >>. Now you are ready to use MATLAB. When MATLAB is starting you should
get a flash of the MATLAB graphics window on your screen. If this did not happen, something is wrong with
your set-up and you will not get graphics when you want them. ASK YOUR TUTOR FOR HELP (and/or
go to the BUCS help desk in the library after your first tutorial) if this happens.
1.1.3. Terminating your session. To finish a MATLAB session, type exit to the >> prompt. Then type
exit to the $ prompts. Then log out from your Windows session. It is essential that you log out completely
after you have finished with any machine.
From now on, when you are instructed to type various commands, unless you are explicitly told to type
them elsewhere, they should be typed to the prompt >> in the MATLAB command window.
ans =
x =
2
% log and sin and built-in constant pi
% The ; at the end suppresses output
y = 3.1337
y = 3.1337e+00
y = 3.13366556593561
Spacing:
FORMAT COMPACT Suppress extra line-feeds.
FORMAT LOOSE Puts the extra line-feeds back in.
3
ans x y
4
of these now: for is one of the loop-constructing commands that will be used in the programs you write in
this course.
Use any help facility to find the manual page for the command plot, which resides in the directory
graph2d. Read the manual page for plot.
• Getting started with MATLAB 6: a quick introduction for scientists and engineers, by Rudra Pratap.
This is a user-friendly book that you might wish to buy.
The MATLAB web-site http://www.mathworks.com is maintained by the company The MathWorks which
created and markets MATLAB.
5
1.8 Exercises for Chapter 1
Note that MATLAB has pi as a built-in approximation for π (accurate to about 13 decimal places), and
built-in functions sqrt and cos. Look up the manual pages for these if necessary.
2. After MATLAB has done a calculation the result is stored in the variable ans. After you have done (iii)
above, type ans^2 to find cos2 (π/6). The true value of this is 43 . (Check that you know why!) Print
out ans using both format short and format long and compare with the true value. On the other
hand use MATLAB to compute ans-3/4. This illustrates rounding error: the fact that the machine is
finite means that calculations not involving integers are done inexactly with a small error (typically
of size around 10−15 or 10−16 ). The analysis of the effect of round-off error in calculations is a very
interesting and technical subject, but it is not one of the things that we shall do in this course.
3. The quantities ex and log(x) (log to base e) are computed using the MATLAB commands
√
exp and log.
3 3
Look up the manual pages for each of these and then compute e , log(e ) and eπ 163 .
π
4. Compute sin2 6 + cos2 π6 . (Note that typing sin^2(x) for sin2 x will produce an error!)
2.1 Arrays
The basic data type in MATLAB is the rectangular array, which contains numbers (or even strings of symbols).
MATLAB allows the user to create quite advanced data structures, but for many scientific applications it is
sufficient to work with matrices. These are two-dimensional arrays of data in the form
a1,1 a1,2 . . a1,m
a2,1 a2,2 . . a2,m
A= .
.
. . . .
an,1 an,2 . . an,m
Note that the notation implies that ai,j is the element of A which is stored in the ith row and jth column.
The number of rows n need not be the same as the number of columns m. We say that such a matrix A is
of dimension n × m. When n = 1 we have a column vector and when m = 1 we have a row vector. When
n = m = 1, A has a single entry, and is commonly known as a scalar.
You do not need any prior knowledge of matrices to follow this part of these notes.
A matrix can be created in MATLAB using any name starting with a letter and containing only letters,
numbers and underscores (_). A major distinction between MATLAB and many other programming languages
6
is that in MATLAB one does not have to declare in advance the size of an array. Storage of arrays is dynamic
in the sense that an array with a given name can change size during a MATLAB session.
The MATLAB command
x = exp(1);
creates a single number whose value is e and stores it in the variable whose name is x. This is in fact a 1 × 1
array. The command
y = [0,1,2,3,4,5];
creates the 1×6 array whose entries are equally spaced numbers between 0 and 5 and stores it in the variable
y. A quicker way of typing this is y = [0:5]. (More generally, the command [a:b:c] gives a row vector
of numbers from a to c with spacing b. If the spacing b is required to be 1, then it can be left out of the
specification of the vector.) Matrices can change dimension, for example if x and y are created as above,
then the command
y = [y,x]
produces the response
y =
Columns 1 through 7
In the example above we created a row vector by separating the numbers by commas. To get a column
vector of numbers you separate them by semi-colons, e.g. the command z = [1;2;3;4;5]; creates a 5 × 1
array of equally spaced numbers between 1 and 5.
Matrices of higher dimension are created by analogous arguments. For example, the command
A = [[1,2,3];[4,5,6];[7,8,10]];
puts the matrix
1 2 3
4 5 6
7 8 10
into the variable A. Complicated matrices can be built up from simpler ones, for example four matrices A1,
A2, A3, A4 of size n × m can be combined to produce a 2n × 2m matrix A = [[A1,A2];[A3,A4]].
On the other hand, if an n × m matrix A has been created then we can easily extract various parts of
it. To extract the second column of A type A(:,2) and to extract the third row type A(3,:). Here is an
extract of a MATLAB session in which various parts of the matrix A created above are extracted.
ans =
2
5
8
ans =
7
2 3
5 6
Vectors and matrices can be created in your MATLAB workspace by various methods. For example there
are many built-in commands: zeros(n,m) and ones(n,m) produces n × m matrices of zeros and ones. The
command rand(n,m) produces a random n×m matrix. The command eye(n,n) produces the n×n identity
matrix with ones on its diagonal (from top left to bottom right) and zeros elsewhere. Try these out for some
values of n and m. Type help command for each of these commands and read the MATLAB manual page for
each of them. Don’t worry if you don’t understand all about random numbers.
If the entries of a vector or matrix are given by a formula then there is a simple way to create them,
called a for loop. For example, if we wish to create a vector x whose entries are the squares of the natural
numbers from 1 to 10 we can use the command for i=1:10; x(i) = i^2; end. We shall return to for
loops in tutorial 3.
z =
Columns 1 through 7
Note that log is the built-in function which computes loge (or ln) and that the resulting vector y above
is the result of applying loge to each entry of the previous vector y. MATLAB handles an infinite answer by
recording it as Inf and producing a warning. (Why is it -Inf?) Note that these calculations verify that
loge (1) = 0 and loge (e) = 1.
At ~masigg/ma20014/matlab/manual/tutorial2a.m is a short MATLAB script illustrating some elemen-
tary arithmetic. You should copy it and run it.
8
2.3 Graphics
The simplest plotting command is plot. If x and y are any two vectors of the same size, then the command
plot(x,y,’r*’)
plots the components of y in turn against the components of x, using red asterisks. There are several
variations of this command. Type help plot or doc plot or run demo --> Graphics --> Line plotting
to find out more about this command. Other simple plotting commands, for which you should consult the
help pages or see demo --> Graphics --> 2-D Plots, include fplot, bar, hist, stem, stairs and
pie.
The following script file (available at ~masigg/ma20014/matlab/manual/tutorial2b.m) produces three
simple plots. The first is a static plot comparing the function sin(x) with its approximation x − x3 /3!. The
second is a static plot producing a helix (spiral). The third plots this dynamically using the comet commnd.
The plots come up in the Figure window. They can be printed or copied and pasted into another document
if required.
t = [0:300]/3;
hold off
plot3(sin(t),cos(t),t,’r*’,sin(t),cos(t),t,’g-’)
9
pause
comet3(sin(t),cos(t),t)
Finally the script tutorial2c.m demonstrates another animated plot. It plots the waves given by the
functions
sin(x − t) , cos(x − t)
for values of x between 0 and 8π and for time t = 0, 1, 2, ..., 100. Here a for loop is used to advance time in
an obvious way. Note the very important drawnow command, which causes the plot to be put on the screen
at each time step, thus allowing the animation to be seen.
% script file tutorial2c.m
% animated plot showing the behaviour of the
% waves sin(x-t) and cos(x-t) for 201 equally spaced points in the range
% 0 <= x <= 2*pi
% and t ranging from 0 to 10 in steps of 0.1
10
4. Generate the 1 × 10 row vector v whose i-th component is cos(iπ/4).
5. Modify the script file tutorial2c.m in the editor/debugger window to do an animated plot of the
functions sin(4(x − t)) and 4 cos(x − t) for x between 0 and 8π and t from 0 to 10. Experiment with
different line colours and types.
% script tutorial3a.m
% computes the sum of the series
%
% 1 - 1/2 + 1/3 - 1/4 + ...
%
N = input(’type the number of terms to be added up: ’)
% asks the user to provide a value for N
11
sum_series = 0; % initialise the sum of the series
for n = 1:N
sum_series = sum_series + sign/n;
sign = -sign; % changes sign for alternating series
end
When you have worked with MATLAB for a while you will find that program speeds can be improved by
using (if possible) vector or matrix operations instead of loops. For example, to sum the series (3.1) to an
even number of terms N, we can use the following very short script.
% script tutorial3b.m
% computes the sum of the series
%
% 1 - 1/2 + 1/3 - 1/4 + ...
%
% to an even number of terms
% using vector operations
Exercise: Make sure you understand how this program works. Use help sum.
To compare the speed of the programs tutorial3a.m and tutorial3b.m, we can add the commands
tic and toc (see the manual pages) at the beginning and end of each of the scripts. I did this and found
the following elapsed times (in seconds), which illustrates the benefit in terms of speed of avoiding the loops
if possible.
tutorial3a tutorial3b
We have seen how to use a for loop to create a vector whose entries are given by a formula. If the
entries of a matrix are given by a formula then we can use nested for loops to create it. For example the
Hilbert matrix H is an n × n matrix whose entry in the ith row and jth column is 1/(i + j − 1). If a value
has been assigned to n, we can write
for i = 1:n
for j = 1:n
H(i,j) = 1/(i+j-1);
end % for j
end % for i
I have added the comment after the end statements to show which loop is ended. This is useful when
there are several nested loops.
12
For the MATLAB beginner, double for loops are the easiest way to create the matrix H. However they are
actually very inefficient in terms of computing time. The reason for this is quite technical; it’s to do with
the way each MATLAB command is interpreted into machine instructions. As you get better at using MATLAB
you will find faster ways of creating matrices which are given by a formula.
Nevertheless it is very important for you to gain experience with nested loops here, since in other
languages they are not slow and are the preferred method for doing many array operations.
%script tutorial3c.m
end
13
Here condition and statements are the same as in the while loop, but in this case the statements are
executed only once if condition is true and are not executed at all if condition is false. For example the
following script divides 1 by i, provided i is non-zero; otherwise, j is not assigned a value.
if (i ~= 0)
j=1/i;
end
The symbol ~= is a relational operator and stands for is not equal to. Other relational operators include ==,
<=, >=, etc. Type help ops to find out about these. Note the difference between the relational operator ==
and the usual use of the symbol =, which assigns a value to a variable.
The if-else statement allows us to choose between two courses of action. For example the following
script reads in a number and prints out a message to say if it is negative or non-negative.
x = input(’ Type x : ’)
if (x<0)
disp(’x is negative’)
else
disp(’x is non-negative’)
end
Note that indenting of statements inside loops and if statements helps make your program more readable.
Going further, adding elseif allows us to choose between a number of possible courses of action.
x = input(’ Type x : ’)
if (x<0)
disp(’x is negative’)
elseif (x>0)
disp(’x is positive’)
else
disp(’x is zero’)
end
if (condition1)
statementsA
elseif (condition2)
statementsB
elseif (condition3)
statementsC
...
else
statementsE
end
• First condition1 is tested. If it is true then statementsA are executed and execution then skips to
the next statement after end.
14
• If condition1 is false, then condition2 is tested. If it is true, then statementsB are executed and
execution skips to the next statement after end.
• Continuing in this way, all the conditions appearing in elseif lines are tested until one is true. If
none is true, then statementsE are executed.
% script tutorial3d.m
The logical relations that make up the condition in a while or if statement can quite complicated.
Simple relations can be converted into more complex ones using the three logical operators & (and), | (or)
and ~ (not). For example the quadratic equation ax2 + bx + c = 0 has two equal roots, −b/(2a), provided
that b2 − 4ac = 0 and a 6= 0. This can be programmed as:
2. Compute 20!. Devise two different ways, one with a for loop and one without. Find out about the
MATLAB built-in function factorial and use it to check your answers. You might wish to make use of
the MATLAB command prod.
3. Using the script tutorial3a.m, show by experiment that the series (3.1) sums to loge (2).
15
P∞ n+1 a ,
4. For a series of terms with alternating sign of the form i=1 (−1) n where an ≥ 0, let
∞
X N
X
L= (−1)n+1 an , SN = (−1)n+1 an .
n=1 n=1
There is a theorem that says that (under certain additional conditions) the absolute value of the error
incurred in summing the series up to a finite number of terms is no more than the absolute value of
the first term not included in the sum. With the above notation this means that, for any integer N ,
|L − SN | ≤ aN +1 .
Investigate the correctness of this theorem for the series (3.1) by checking it for a number of (large)
values of N . (You will also need the MATLAB command abs.)
5. Using a simple while loop, write a script to sum the series 1 + 2 + 3 + ... such that the sum is as
large as possible without exceeding 100. The program should display how many terms are used in the
sum.
6. Write a script that takes as input an integer n and creates the n × n matrix A with (i, j)th component
given by A(i, j) = sin(1/(i + j − 1)).
7. Here is a guessing game. Use MATLAB to generate a random integer between 1 and 10. This can be
done with the command:
(Use the manual pages to make sure you understand this command.)
You have to guess the random integer without printing it out. Write a script that computes the
random integer as above and that also takes as input your guess and produces as output a message
which tells you if your guess was correct or not, and if not whether your guess was too low or too high.
8. Modify the script tutorial3b.m to compute the sum of the series (3.1) for any number of terms (even
or odd). Use an if statement.
9. Write a script that takes as input three numbers a, b and c and prints out either the solutions of the
quadratic equation ax2 + bx + c = 0, when these solutions are real, or a message indicating that the
solutions are not real.
16
4.1 The MATLAB workspace
You have seen by now that when you use MATLAB you create variables in your workspace. At any stage of a
MATLAB session you can type
who
to find out what variables are in your current workspace. A variation on this is the command whos which
gives more information. Look up the help pages for these commands.
Variables that are lying around in your current workspace are typically called global variables. When
you type a command to the >> prompt that involves any symbol, MATLAB first looks to see whether this
symbol is the name of a variable in your current workspace. If so, it uses the current value of that variable
in the computation. If not, it looks to see whether the symbol is the name of a built-in constant, in which
case it uses the built-in value. If not, it looks to see whether the symbol is a script or function name, in
which case it runs it. Finally, if the symbol is none of these things, an error message will usually result.
For example, if we start a new MATLAB session and to the prompt we type pi, the response is
ans =
3.1416
ans =
9.4248
However, if we are feeling perverse, we may choose to use the symbol pi as the name of a new variable,
with a different value. For example we may type to the prompt: pi = 3. After doing this the response to
the command 3*pi will be
ans =
9
On the other hand if we type (for example by accident) pii, we get the response:
??? Undefined function or variable ’pii’.
This illustrates that whenever you type a MATLAB command interactively, all your current variables are
visible and may be operated on by the command that you type.
17
from your MATLAB workspace. This is useful in many ways; in particular it reduces the build-up of variables
in your workspace and aids in splitting up a complex task into simpler independent tasks.
All programming in high-level languages makes use of such splitting techniques.
Here is an√example of a function file called bell.m, which calculates the bell-shaped function f =
exp(−ax2 /2)/ 2π for given scalar inputs x and a.
% function bell.m
function f = bell(x,a)
f = exp(-0.5*a*(x^2))/sqrt(2*pi);
One of the important rules for functions is that they must be saved to a file which has the same name
as the name of the function. Thus the above function should be saved to the file bell.m.
To run this, for example, type
bell(1,2)
The response is
ans =
0.1468
This is less useful than it might be. If, for example, we want to draw a plot of this function it would be
much better if we could feed a vector of x values to the function bell and get out a whole vector of function
values. A small change to the definition allows this:
% function vbell.m
function f = vbell(x,a)
f = exp(-0.5*a*(x.^2))/sqrt(2*pi);
The only difference between this and bell.m is that by employing the elementwise exponentiation .^, the
variable x can be a vector and vbell produces a vector output. The output is obtained by typing (either
interactively or inside a script):
vbell(x,a)
which gives a vector of values of the bell function evaluated at each of the entries of x. An application of
this to plot the bell function is contained in the following script:
%script tutorial4a.m
a = 1;
x = (0:1000)/100; % equally spaced points between 0 and 10
plot(x,vbell(x,a),’b*’)
The effect will be to plot the function bell at 1001 equally spaced points between 0 and 10 and with a set
to be 1.
Copy bell.m, vbell.m and tutorial4a.m. Run tutorial4a and afterwards type whos. Note that
the variable f which appears in the function vbell is local to that function and does not appear in your
workspace.
What happens if you replace the call to vbell inside the plot command in tutorial4a.m with a call to
bell?
18
4.4 The general form of a function file
Functions are incredibly useful and need considerable care when they are implemented.
A function file always begins with a function definition line of the form
function [output variables] = functionname(input variables)
Here functionname must be the same as filename, where filename.m is the name of the file in which the
function is stored. The output variables are variables whose values may be determined by the function,
and which may depend on the variables in the list of input variables.
To use the above function (e.g. in a script or interactively) you would type
[my output variables] = functionname(my input variables)
where my input variables are the actual input variables which you want to apply the function to and
my output variables are the names of the variables where you would like to put the result.
There are a number of rules about constructing functions that I shall not attempt to reproduce here,
but authors of advanced functions need to be aware of them. Type help function or doc function for
more information.
Perhaps the best way to learn about functions is to look at functions that other people have written.
Many (but not all) of the functions provided in MATLAB are given as M -files that you can copy and use for
your own purposes. Try typing the command
type factorial
to see the listing of the MATLAB-provided function that produces the factorial of an integer. Repeat this with
the functions why, pascal and roots. There are many others that you can look at.
Many contributed functions that can be freely copied are also to be found at the MATLAB website
http://www.mathworks.com.
2. Write and test a function swop(x,y) that swops the values of its input variables, (i.e. the statement
[x,y] = swop(x,y) should swop the values of x and y).
3. Write your own MATLAB function to compute the exponential function using the Taylor series expansion:
x2 x3
ex = 1 + x + + + ...
2! 3!
Remember to give your function a name that is different from the MATLAB built-in function exp.
Make your own decision about when to stop adding more terms from the expansion. Compare the
performance of the function that you have written with the built-in function exp.
19
5 Fifth Tutorial: A Population Dynamics Example
In this tutorial you will use the skills you have developed to investigate a program on Cellular Automata.
Cellular automata (CA) provide a simplified way of modelling physical, biological or social phenomena. In a
CA model the universe is divided up into small cells. Each cell can take any one of a finite number of states
(e.g. live or dead, or perhaps something more complicated). A single generation is determined by assigning
a single state to each of the cells. Then a strict (and often quite simple) set of rules is used to determine how
a given generation evolves into the next one. The model then consists of repeated iterative application of the
rules to obtain each successive generation from the previous one. In principle this iteration can go on forever;
in computer implementations it goes on for a finite (possibly quite large) number of generations. There is
much interest in CA models among mathematicians and applied scientists such as ecologists or biologists.
This arises from the often observed fact that a simple model with relatively few states and relatively simple
rules can often produce very realistic and complicated behaviour. There is also a huge interest amongst
computer scientists, especially those concerned with the theory of artificial intelligence. Let us consider a
flat square universe, divided up into an n×n array of small cells, denoted (i, j), for i, j = 1, . . . , n. The states
of these cells may be represented as the elements A(i, j) of a matrix A, for i, j = 1, . . . , n. The immediate
neighbours of cell (i, j) are defined to be those cells that touch it (excluding cell (i, j) itself). So an interior
cell (i, j) (where i = 2, . . . , n − 1 and j = 2, . . . , n − 1) has immediate neighbours (i − 1, j − 1), (i − 1, j),
(i − 1, j + 1), (i, j − 1), (i, j + 1), (i + 1, j − 1), (i + 1, j) and (i + 1, j + 1) (see Fig. 1). With this universe
we can consider different types of states for the cells and different sets of rules for determining the model.
j−1 j j+1
i+1 ? ? ?
i ? ?
i−1 ? ? ?
• A live cell dies in the next generation if more than 4 of its immediate neighbours at the present
generation are dead; otherwise it stays alive.
• A dead cell comes to life in the next generation if more than 4 of its immediate neighbours at the
present generation are alive; otherwise it stays dead.
Since the computer is finite, our universe has to end somewhere. To apply these rules consistently, we need
to define the states of the cells that lie just outside the boundary of the universe. For the purpose of this
example, we shall say that
20
• All cells outside the boundary of our universe are assumed to be dead.
This means that we can effectively extend the boundary of our universe to include cells (0, j), (n + 1, j),
j = 0, . . . , n + 1, and (i, 0), (i, n + 1), i = 0, . . . , n + 1, all of which are defined to be dead. To compute the
next generation from any given one, we can then proceed as follows:
• For each cell (i, j), i, j = 1, . . . , n, compute the number of live neighbours and store these in another
matrix, say L(i, j). Take particular care to get the computation correct at the edges of the universe.
• Then, using the information in the matrices A and L, the next generation of live and dead cells can be
computed by applying the two rules above. Since each generation is computed only from the previous
one, the new generation should be computed in a separate matrix, say ANEW , and the old A should
only be overwritten with ANEW when all of ANEW has been found.
3. Visualise A.
4. Initialise ANEW and L to be matrices of zeros of the same size as A (it turns out to be convenient,
but not essential, to define ANEW and L to be n + 2 × n + 2 matrices - see below).
5. Then enter a loop to compute successive generations. (The variable gen no will count the number of
generations which have been computed.)
• for gen no = 1 : 1000
A is then an (n + 2) × (n + 2) matrix.
(b) For i, j = 2, ..., n + 1, compute the number of live cells that are nearest neighbours of cell (i, j).
Put it in the matrix entry L(i, j).
(c) To find ANEW , initialise by setting ANEW = A. Then change some entries of ANEW as
appropriate:
(d) For i = 2, ..., n + 1 and j = 2, ..., n + 1,
• If A(i, j) = 1 and L(i, j) < 4 set ANEW (i, j) = 0;
• If A(i, j) = 0 and L(i, j) > 4 set ANEW (i, j) = 1.
(e) Create a new n×n matrix A that consists of the interior values of ANEW (i, j), for i, j = 2, . . . n+1.
21
(f) Visualise A.
2. Look up the help page for the command round. Explain to yourself how the initial random distribution
of 1’s and 0’s is computed in majority.m.
3. Look up the help page for the command size. By putting the line size(A);pause; at appropriate
places in the program majority.m, illustrate to yourself the dynamic storage mentioned above.
4. For small n (e.g. n = 4) print out the matrix A and the corresponding matrix L. Check manually that
the program is doing the correct computation.
5. Perform similar investigative work on lookat.m. What happens if the drawnow command is removed?
Experiment with different plot colours and point markers. More detailed information on plot can be
got by typing doc plot.
1. Run the program majority.m a few times. Try different values of n and different random initial states.
You should observe that a very irregular random initial state is smoothed out by the birth and death
rules, and eventually arrives at a pattern of blue and white regions with quite smooth interfaces between
them. (Some discussion of this can be found in What’s happening in the Mathematical Sciences, by
B. Cipra, American Mathematical Society, Providence, 1996, pages 70-81.)
2. Rewrite the program majority.m so that it reads in an integer p as a variable and then replaces the
majority rule above with a variable rule:
• A live cell dies in the next generation only if more than p of its immediate neighbours at the
present generation are dead; otherwise it stays alive.
22
• A dead cell comes to life in the next generation only if more than p of its immediate neighbours
at the present generation are alive; otherwise it stays dead.
Perform experiments with your program to see how the choice of p changes the outcome.
3. Modify the program majority.m to model the case where all cells outside the boundary of the universe
are assumed to be live instead of dead.
Think of further generalisations of the rules and add them to your program. The next item is one
suggestion.
4. Consider a modified population model where the fate of a cell is determined not just by its 8 immediate
neighbours but also by their immediate neighbours, (excluding the initial cell, of course), a total of
24 cells in all. Call these cells the near-immediate neighbours and replace the majority rule by the
following.
• A live cell dies in the next generation only if more than 12 of its near-immediate neighbours at
the present generation are dead; otherwise it stays alive.
• A dead cell comes to life in the next generation only if more than 12 of its near-immediate
neighbours at the present generation are alive; otherwise it stays dead.
Rewrite the program to implement and visualise this model.
5. Can you devise a alternative version of the program majority.m where the matrices A, L and ANEW
are always n × n? Write such a program and test it by comparing the results with those produced by
majority.m.
23
7.1 Exercises on Chapter 7
1. Copy the file ~masigg/ma20014/matlab/manual/tutorial7.m to your workspace and run it.
2. Type demo to the >> prompt, double-click in the Toolboxes item and run the demo on the Symbolic
Math Toolbox. It might take some time.
3. Read the help pages for the commands solve and ezplot. Let f be the cubic f (x) = x3 + 6x2 + 9x+2.
Solve the equation f (x) = 0, and plot a graph of f . It should be clear from the graph that the cubic
has three real roots.
4. Find out how solve can be used to solve simultaneous equations. Hence solve the three simultaneous
equations x + 2y + 3z = 1, 4x + 5y + 6z = 2, 7x + 8y + 8z = 3. What happens if the last equation
is changed to 7x + 8y + 9z = 3? What happens if it is changed again to 7x + 8y + 9z = 4? Can you
explain the results?
5. Find out how to use the symbolic differentiation command diff and the substitution command subs.
(NB: there is also a diff command in vanilla MATLAB; you must therefore type help sym/diff.)
Consider the function f (x) = sin(tan(x)) − tan(sin(x)). Find the derivatives of f , di f (x)/dxi , for
i = 1, . . . , 6. Evaluate f and each of its derivatives at x = 0. What do you find? Use the command
ezplot to draw a graph of this function. Does the graph support your computations?
p
6. Look up the help page for the integrator int. Find the indefinite integral of the function tan(x).
Use the command pretty to make a more readable output.
7. Read the help pages for the differential equation solver dsolve. Use it to solve the differential equation
d2 y/dt2 + y = 0 for y = y(t). The solution will contain two arbitrary constants C1 and C2. Find the
particular solution of this differential equation which satisfies y = 1 and dy/dt = 1 at t = 0. Plot a
graph of the solution you have found. Repeat the exercise with the differential equation replaced by
d2 y/dt2 + 100y = 0.
p
8. Read the manual page for ezsurf. Plot the function 1/ x2 + y 2 .
Chapter 3
7. Program in guess.m.
9. Program in quadratic.m
Chapter 4
1. Solution in twice.m
To compute twice 2, for example, type twice(2).
24
2. Solution in swop.m.
To swop the the order of the numbers 1 and π, type [a1,a2] = swop(1,pi). The swopped numbers
will be loaded into the variables a1 and a2.
3. Solution in myexp.m.
To compute an approximation to e4 , type myexp(4). This function will only agree with the MATLAB
built-in function exp up to about 7 decimal places. What happens if we compare exp(-20) with
myexp(-20)?
4. Solution in mysqrt.m.
√
To compute an approximation to π, type mysqrt(pi). Note that the program also takes care of the
cases a < 0 (when there is no real answer) and a = 0 (when the iteration fails but the answer is 0).
The MATLAB commands error and break are used in the handling of these cases.
Creating a file: Type touch filename to create the file filename. If this file already exists then the
effect of the command will be to change the time when it was last updated to the present time. (You
can also create a file using an editor such as pico; type pico filename.)
Listing a file: Type more tutorial1.m to list the contents of the file tutorial1.m on the screen. You
must be sitting in the directory in which tutorial1.m is stored. If not you must type the full name
of the file, (e.g. more ~masigg/ma20014/matlab/manual/tutorial1.m).
Printing a file: Type lwf tutorial1.m | lpr -Pll to print out tutorial1.m on the library laser printer.
Removing a file: Type rm rubbish.m to remove the file rubbish.m. (Make sure you get it right, as you
will not get a chance to change your mind after removing it!)
Finding what directory you are in: Type pwd to find your current working directory.
Listing the contents of a directory: Type ls to get the names of all the files in the current directory.
Type ls -l to get a listing of the files together with their read, write and execute permissions.
Creating a directory: Type mkdir directoryname to create a subdirectory directoryname of the cur-
rent directory. (A directory in UNIX is analogous to a folder in Windows/DOS.)
Changing directory: Type cd ~masigg to change to the home directory of user masigg. To change to
directory ma20014, a subdirectory of masigg’s home directory, type cd ~masigg/ma20014. Type cd
to change to your own home directory. If you’re in your home directory, type cd subdir1 to change
to subdir1, a subdirectory of your home directory.
Changing the permissions on a file or directory: Type chmod u+x filename to add execute (x) per-
mission for the owner (u). Other versions of the same command can be constructed by replacing u
by g (group) or o (others) or replacing x by r (read) or w (write). Change + to - to take away the
permission rather than add it.
25
C Appendix: Some useful MATLAB commands
On-line help
help lists topics on which help is available
helpwin opens the interactive help window
helpdesk opens the web-browser-based help facility
help topic provides help on topic
lookfor string lists help topics containing string
demo runs the demo program
Graphics
plot plots a graph
xlabel(’x’) labels x axis x
ylabel(’y’) labels y axis y
title(’title’) gives a figure a title title
axis fixes figure axes
clf clears figure from figure window
cla clears figure from figure window, leaving axes
String-number conversion
num2str converts a number to a string (so it can be output e.g. as part of a message)
Logical functions
isempty true (=1) if a matrix is empty
find finds indices of non-zero elements of a matrix
Arithmetic functions
sum(x) calculates the sum of the elements of the vector x
prod(x) calculates the product of the elements of the vector x
Termination
^c (Control-c) local abort, kills the current command execution
quit quits MATLAB
exit same as quit
26
D Appendix: Advanced Programming Style in MATLAB
This section contains more advanced information on MATLAB programming style. It is designed to illustrate
performance improvements that may be obtained by replacing operations on scalars with operations on
vectors, wherever possible.
When you run a MATLAB script or function program by typing its name, it is automatically interpreted
into a program written in the language C. This program is compiled, linked, and run, all without you having
explicitly to ask for this. This is tremendously helpful and means that you can develop programs in a
fraction of the time it takes to develop the corresponding C code. But you may pay a price for this in the
run time of certain types of program. In particular, because of the way the interpreter works, loops created
with the MATLAB code (using the for, while or if commands) may run slowly, especially if they contain a
lot of arithmetic calculations.
Thus it is a very good idea to avoid such loops in your program where at all possible. It is not always
possible to avoid them, but there are a surprising number of ways around the use of loops which may not
be obvious at first glance. The secret of good MATLAB programming is to try to identify situations when
the same arithmetic operations are being applied to a whole vector of numbers (or maybe even a matrix of
numbers). MATLAB contains many highly optimised built-in functions that allow you to operate on all the
elements of vectors and matrices with one command. These can be used to achieve effects that you may
first think can only be done using loops. Because you are using the highly optimised built in-functions your
program can run very much faster than if you wrote everthing elementwise inside loops.
This process of vectorising your code is not only relevant to the production of efficient MATLAB code, but
is also useful for coding on certain special types of computer architecture that can exploit it.
The purpose of this section is to give you a sequence of examples illustrating these techniques.
Examples 1 and 2: Numerical integration using the composite trapezoidal rule.
To integrate a function f over the interval [0, 1], choose an integer n > 0 and set h = 1/n and xi = ih,
i = 0, . . . , n. Then the composite trapeziodal rule is constructed by applying the trapezoidal rule on each
subinterval [xi−1 , xi ] to get:
Z 1 n−1
1 X 1
f (x)dx ≈ hf (x0 ) + h f (xi ) + hf (xn ) .
0 2 2
i=2
Computing the right-hand side involves doing the sum in the middle and then adding on the first and last
terms. Apparently the simplest way of doing this is by using a for loop. This is illustrated in program
ex1.m, in which we have also added a couple of lines to count and print out the number of flops (floating
point operations) and cpu time (time taken by the processor) for the program. In this case we use the
program to compute the integral of exp(x)1/π . Here is a sample output from ex1.m:
Note that the cputime may vary a little each time the program is run, due to the timesharing property
of the machine. The cputimes reported are the averages of three consecutive experiments on the BUCS
machine amos. Here is the listing for the program ex1.m:
27
% Program ex1.m: script file to
% integrate exp(x)^{1/pi} over [0,1]
% using the composite trapezoidal rule
% on a uniform mesh with n subintervals
% and using a loop to do the adding up
Note that the 1D trapezoidal rule with 4000 points is extremely accurate. We use such a large number
of points merely to illustrate the efficiency of the program.
The program ex1.m contains one loop inside which most of the computation is done. (Exercise: edit the
program so that it prints out the number of flops done inside and outside the for loop.) The loop is used
simply to add up the terms in the sum in the trapezoidal rule formula. A better way to do this is to use
the MATLAB built-in function sum. (Exercise: look up the help page for the command sum.) This command
is used in the program ex2.m, which is given as follows.
28
h = 1/n; % uniform mesh
Here is a sample output from program ex2.m. Note that the use of the built-in function sum has made
this program more than ten times as efficient as program ex1.m. Note that the flop count is also considerably
lower for program ex2.m, although the difference to ex1.m on this indicator is not nearly as great as for the
cputime.
n = input(’type n: ’)
H = zeros(n,n); % Initialise H
t = cputime;
29
for i = 1:n % Use a double do loop to assemble H
for j = 1:n
H(i,j) = 1/(i+j-1);
Because of what we have learned from Examples 1 and 2 we may reasonably suspect that this program
will not be the most efficient way of handling the assembly of H because of the double loop inside which
computation is done. The program ex4.m addresses this problem by using built-in functions to assemble H
and avoiding loops entirely.
n = input(’type n: ’)
H = zeros(n,n); % Initialise H
t = cputime;
Exercise: check that you understand why program ex4.m has the same output as ex3.m. In doing so it
is very important to note that MATLAB distinguishes between a 1 × n row vector and an n × 1 column vector.
The product of the former times the latter (using the product function *) is a scalar, whereas the product
of the latter times the former is an n × n matrix!
The relative performance of programs ex3.m and ex4.m is illustrated in the following table:
Note that in both columns the cputime is growing with O(n2 ), but that the asymptotic constant in this
estimate is about 16 times bigger for ex3.m than for ex4.m. Put more simply, ex4.m is about 16 times faster
than ex3.m.
Of course a time of 22 seconds may be reasonable if your only aim was to compute the 800 x 800 Hilbert
matrix. However, if processes with loops lie inside programs that are called many times over, it is clear that
a quite severe efficiency loss may be experienced. This can be alleviated by using the built-in matrix and
vector functions where possible.
Exercise: look up the MATLAB built-in function toeplitz. Can you find a method for assembling the
n × n Hilbert matrix that is more efficient than ex4.m? Exercise: look up the MATLAB built-in function
condest. Find an estimate for the condition number of H when n = 5, 10 and 20.
30