Functions
5 Functions
There are several ways you can use functions in MATLAB. There are
built-in functions such as the sine and cosine functions, there are
special means to deal with polynomials, there is the ability to work
with symbolic functions and you can define your own functions using
function m-files.
5.1 Built-in functions
Listed below are some of the basic functions built into MATLAB.
First the standard
trigonometric functions
,
exponential functions and logarithmic functions.
MATLAB notation |
Mathematical notation |
Meaning of the operation |
sqrt(x)
|
x |
square root |
abs(x)
|
|x| |
absolute value |
sign(x)
|
|
sign of x (+1, -1, or 0) |
exp(x)
|
ex |
exponential function |
log(x)
|
ln x |
natural logarithm |
log10(x)
|
log10x |
logarithm base 10 |
sin(x)
|
sin x |
sine |
cos(x)
|
cos x |
cosine |
tan(x)
|
tan x |
tangent |
asin(x)
|
sin-1 x |
inverse sine |
acos(x)
|
cos-1 x |
inverse cosine |
atan(x)
|
tan-1 x |
inverse tangent |
Here are some functions that make the display of numbers nicer:
-
format
. Typical ones can be either short, long, or
rat. For example the command >> format rat will cause the
display to use fractions when appropriate
Here are some functions which are useful for dealing with vectors or matrices
-
colon-operator
the construct
a:h:b
we'll
call the semicolon operator. It generates a
vector
of
numbers between a and b of step size h.
- cross
The cross command find the
cross product
between 2 three-dimensional vectors.
- dot
The dot command find the
dot product
between two vectors.
- dot-operator
The ``dot'' or period before an operator
such as * for multiplication, or ``/'' for
division or ``^'' for exponentiation. Tells MATLAB to
operate ``element by element'' or ``point by point''. For an example
look at a
dot operator example
- help
The help command accesses MATLAB's
built-in help facility. To try it out try the command: help
plot.
- prod
The prod command takes the product of a
list of numbers, when given a matrix it takes the product of each
column returning a column vector. Here is how one could implement
the factorial command, n!:
>> n = 10; prod(1:n) % returns 10! = 3628800 = 10*9*8*...*1
- roots
The roots command find zeroes of a
polynomial. Click here to see
an example.
- sum
The sum command adds the entries in a
list or the columns in a matrix. For example, let's see that the sum
1 + 22 + 32 + ··· + n2 is a perfect square when n = 24.
>> n=1:24; % thenumber 1 through 24
>> a = sum(n.^2); % need a dot as n is a list
>> sqrt(a)
ans = 70 % a perfect square
Except for n=1 this is the only n for which this is true. Here is
an example to simulate the number of heads in 100 coin tosses 250
times.
>> r = rand(100,250); % 100 random numbers in [0,1] 250 times
>> r = floor(r+.5); % takes integer part of r + .5
% this is a number 0 or 1 with equal
% chance
>> a = sum(r); % adds down the columns, giving 250
% numbers
>> hist(a); % plot a histogram -- bell shaped
- transpose-operator
the symbol ' or
single-quote indicates transpose. It switches a row
vector
into
a column vector or vice versa.
Here are some MATLAB commands for plotting functions:
- cylinder
Despite its name, this command plots a surface
of revolution of a curve around the z-axis. The curve is entered
in a vector of radius values. (That is you plot the surface given by
x2 + y2 = f(z)2.) To plot a sphere you could enter the
commands
>> z = -1:.1:1;
>> r = sqrt(1 - z.^2);
>> cylinder(r).
- grid
puts a grid up during a
plot
command.
- linspace
The command linspace(a,b,n) generates
n points equally spaced over the closed interval [a,b]. Note that if
you wish to divide an interval into 10 equal subintervals, you need
11 points including the end points of the interval. If you omit
n then the command linspace(a,b) generates 100
equally spaced points over [a,b]. Similar to
colon-operator
.
- meshgrid
Like the
linspace
command, this
creates a matrix of x and y values to be used in plotting
three-dimensional graphs. It is used in the following manner:
>> [x,y] = meshgrid(-1:.1:1,-pi,:.1,pi);
- plot
The plot command is used to plot lists
of data. In its simplest use if x and y are the
same size list, then plot(x,y) plots the x list
verse the y list. More advanced features are possible. See
the
help
page or click
here.
- plot3
The three-dimensional plotting function. The
command plots3(x,y,z) plots the points (xi,yi,zi) with
a straight line connecting the point (xi,yi,zi) to
(xi+1,yi+1,zi+1).
- sphere
Will plot a sphere. See
help sphere
for
more info.
- surf
Creates a graph of a surface. It is called by
>> surf(x,y,z)
, where x, y and z
are matrices. To use it you would typically create the values of
x and y with the meshgrid command, and the value
of z as a function of x and y.
- view
This command changes the view or perspective of a
three dimensional graph. You can call it with two angles or a
vector. The vector is a three-dimensional vector that points in the
opposite direction than where you are looking from. For example,
view([1,1,1])
will give a view of the origin as if you are
looking from the point (1,1,1).
- zoom
The zoom command is usually followed by
either an on or off. When on it allows you to
explore the current plot with your mouse. ``Dragging'' out a window
will force MATLAB to ``zoom in'' on that area. To undo this double
click the mouse. As well, clicking in an
area will force a similar effect.
5.2 Polynomials
There are a number of MATLAB commands that allow one to work easily
with polynomials. For example:
conv
,
deconv
,
poly
,
polyder
,
polyfit
,
polyval
,
roots
. See
the
help
commands if you can't find a definition.
To use any of these built-in functions you need to be familiar with
the shorthand convention MATLAB uses to store polynomials.
Since a polynomial is determined by its coefficients
(why?), it is only necessary to keep track of these numbers not the powers
of
x. For example, 15
x3 - 6
x + 12 is associated with the list
(15,0,-6,12). Now a list in MATLAB can be a row
vector
or a
column vector.
MATLAB takes the convention that polynomials will be row
vectors so the polynomial above would be
p = [15,0,-6,12] % notice commas not semicolons -- row vector
If we wanted to find the roots of the polynomial 15
x3 - 6
x + 12, or
the solutions to the equation 15
x3 - 6
x + 12=0 we could use the
MATLAB command
roots
as follows
>> roots(p) % notice answer is a column vector
ans =
-1.07097 + 0.00000i % this is the real number -1.07097
0.53549 + 0.67841i % these two are complex conjugates
0.53549 - 0.67841i
A general fact about polynomials tells us that a 3rd degree polynomial
will have 3 roots. So we start with a row vector with 4 entries, and we
get back a column vector with 3 entries.
5.3 Function m-files
If you want to explore many functions, it is tedious to keep
retyping and/or using the Up Arrow key to repeat commands. Here we
learn to simplify our work with
script files
and
m-files
.
A script file will be a file that stores a sequence of keystrokes that
makes it easier to reuse, or easier to edit if it is complicated.
An m-file (or function m-file) in MATLAB is the way subroutines are
implemented. Knowledge of how to create m-files can make MATLAB a very
powerful tool for studying mathematics.
-
SAVING COMMAND SEQUENCES IN M-FILES OR SCRIPT FILES
if you are working on the CSI network, and you do not already have a
diskette in drive A you need to inform MATLAB where to find your
personal script files. Try the command
>. path(path,'a:\'); % or restart MATLAB with diskette in a:
To create a new script file in Windows 3.1:
-
Open the file menu (by clicking on FILE on the menu bar with
the left mouse button);
- click on NEW in the menu; a sub menu will appear;
- click on the M-FILE option.
This will open a new untitled file in the Notepad editor (it is
possible to set up MATLAB to use other editors). You should
resize and arrange your windows so that it is easy to go back and
forth between the MATLAB Command window and the Notepad window.
- You are know ready to go!
Script file exampleeg:script-file
Type in the following lines in the Notepad window. (Nothing will
happen in the MATLAB window.) After typing a couple lines, choose
Save As from the Notepad File menu. Save the file under the name
``limit.m'': you must use the extension ``.m'' or MATLAB
will not recognize it. Choose Save from the File menu when you're
done, but leave the Notepad window open. You will have written a
program in the MATLAB language.
This program uses a shortcut: instead of writing
x=[.1 .01 .001 ...], we write
x=(.1).*(n) where n=1,2,3,...
%%%% this file should be saved as limit.m
%%%% a % (percent sign) makes a comment to the end of the line
clear % gets rid of old definitions
format long % gives more digits in the answer
n= 1:1:6; % the numbers 1 though 6
x=-(.1).^n; % the numbers 10^(-1) through 10^(-6)
y=sin(x)./x;
[x;y]' % limit from left in a table form
x=(.1).^n; % or use x = -x with x above
y=sin(x)./x;
[x;y]' % limit from right in a table form
(Recall: MATLAB ignores text following a %
.)
After saving the file, return to the MATLAB Command window (by
clicking somewhere inside the window), and type
>> limit % evaluates the file limit.m
Note that you don't type the ``.m''. MATLAB should begin to execute
the commands just as if you had typed them in the Command window.
If you made an error while typing the file limit.m, MATLAB will
halt on the line with the error and print out an error
message. Simply return to the Notepad window, fix
the error, Save the file, and try typing limit
again in the
Command window. If you already closed the Notepad window,
Click on Open in the File menu (in the Command window),
find limit.m in the file list and reopen the file.
Note: MATLAB does not find syntax errors before
running the program since it uses an
interpreter rather than a compiler (like C or Pascal).
moral: MATLAB beeps when it is trying to get your
attention. This means it can't figure out what you mean. Pay
attention and find out why it beeped, its just trying to help you.
- Function m-files
In order to create functions in MATLAB we need to have an understanding
of how MATLAB handles the following computer related concepts
Format of the m-file: what is the syntax.
- Input and Output of data: how to pass arguments
- looping: for loops
- Conditional expressions: how to direct the flow
- Calling the function from MATLAB.
Let's look first at an example to illustrate these points. The
function n! in mathematics is shorthand for 1 · 2 ···
n. In MATLAB there is no built-in factorial function. Lets define one
as fact. our function fact should have as its input
a non-negative integer, and its output should be the factorial.
function y = fact(n) % the function word is a non-comment. y
% is the name of the output variable
% and n is the name the m-file gives
% to the input variable.
if n < 0
% this line prints out an error message
fprintf("factorial needs a non-negative integer\n");
% returns if there is an error
return
end
y = 1; % initialize the value of y
for i = 1:n % a loop
y = y*i;
end % end the loop
Let's analyze the important lines.
-
function y = fact(n)
This line follows the syntax of a function m-file. The first word if
the keyword function. Then the return value
or output, in this case the
value of y. What does the return value equal, the function
name without the .m extension, in this case fact,
and then the input, in this case n. Hence when n is
referred to in the file, it refers to the input value.
-
if n < 0
This is the syntax for a conditional test. The simplest usage is
if (CONDITION)
THEN-BODY
end
as in the factorial example.
In general, it can be
if (CONDITION)
THEN-BODY
elseif (CONDITION)
ELSEIF-BODY
else
ELSE-BODY
end
An example in general can be given with the heavyside function:
function y = h(x) % save this a h.m
if x < 0
y = -1; % so h(-5) = -1
elseif x = 0
y = 0; % h(0) = 0
elsif x > 0 % and h(5) = 1
y = 1;
end
-
fprintf(stderr,"factorial needs a non-negative integer\n");
This is one way to pass a message back to MATLAB. The command
fprintf is the print function, the word stderr tells
MATLAB where to print the upcoming message (in this case where error
messages go), and the line in quotes is the message. The \n
is
the end of line character.
-
for i = 1:n
This is main looping construct. This increases the value of i
from 1 to n where n is the number given to
fact when the function is called.
The general syntax for a for loop is
for x = array
COMMANDS
end
Whew, that was a lot of work considering the following commands
will find the factorial:
>> prod(1:n); % product of 1,2...n
>> gamma(n+1); % gamma function is related to factorial
The array can be quite general. Here are some examples which can be
run from the command line, or put into an m-file
>> tot = 0; % our total
>> for i = 1:2:100 % just the odd numbers
> tot = tot + i; % you may have a different prompt
>> end; tot % prints sum of odd numbers between 1
% and 99
>> x = randn(1,100); % a list of 100 normally distributed
% random numbers
>> temp = 1:100; % the number 1 through 100
>> for i = temp(x < -2 | x > 2) % these are outliers in the data
> x(i) = 0 % make outliers 0
>> end
The last example uses some a complicated way to get the array or
list of numbers to index over. It takes only those indices for the
list x which have x-values less than -2 or bigger than 2.
Another looping construct is the while command. This has
the form
while (CONDITION)
BODY
end
An simple example could be to construct the first n Fibonacci
numbers. These numbers are 1,1,2,3,5,8,13,21,34,55 if n is 10.
function fib = fib(n) % save as fib.m. return name same as
% function name. That's okay!
fib = ones (1, n); % fib = [1,1,1,1,1,1,1,1,1,1] if n=10
i = 3;
while (i <= n)
fib (i) = fib (i-1) + fib (i-2); % 1+1=2, 1+2=3, 2+3=5, 3+5=8 ...
i=i+1; % increment i
end
The while loops keeps looping until the condition that i be
less than or equal to n is no longer true. The command ones
is a simple way of making a sequence of all ones. Of course we
should check that n is an integer bigger than 3. Don't
forget to increment your expression or you'll find an infinite
loop. (you can use the control-c key sequence to disable this.
>> i = 1;while i < 2
> fprintf(``Help me! I'm stuck in an endless loop\n'')
>> end
Some more examples of m-files:
-
Evaluating functions from mathematics.
Suppose you wanted to evaluate the function f(x) several times in
the course of a mathematical experiment. One way to type less is with
an m-file
function y = f(x) % save as f.m
y = 1 - x.^2/2 + x.^4/4; % 5 terms in Taylor series for cosine
% x. Notice the dots
This was written so that both x and y could be lists
of numbers. To use this we might do this in a MATLAB session
>> x = linspace(0,pi);
>> y = f(x);z=cos(x); % pass f(x) a list of numbers. No
% problem.
>> plot(x,y,x,z) % compare approximation to cosine x
>> h=.01, difquo = (f(x+h) - f(x))/h % compute difference quotient
>> plot(x,difquo,x,sin(x)) % compare difference quotient.
- Writing your own
ezplot
.
Suppose you want to make plotting of a function simple, but you don't
want to use ezplot as it works only for symbolic functions. Here is a
simple m-file you could use. Can you think of any extensions you might
make?
function y = myezplot(f,a,b)
%% myezplot: called with a function defined in an m-file, a and b
%%graphs the function f defined in f.m over the range of
%% values specified by the range [a,b]. If a and b are omitted it
%% takes the interval [-5,5] as a default.
if nargin = 1
a=-5;b=5
end
for x = linspace(a,b) % loop over x in [a,b]
y(i) = feval(f,i) % call the function in f.m. Needs to use
% feval
end
plot(x,y);
To call this function you would first define your function in
a m-file, say yourfunc.m, then you would use the command
>> myezplot(yourfunc,0,3) % plots yourfunc between 0 and 3
This example uses the variable nargin which is a count of the
number of arguments in the input. As well
it shows how you can pass a function name to a function. You need to
use the command feval to evaluate the function.