In[28]:=
square[x_]:= x^2;
In[29]:=
square[ 5]
Out[29]=
25
In[30]:=
square[ Sqrt[2]]
Out[30]=
2
In the left side of the definition, we specify the arguments of the function
by
placing an underbar after the variable. The := specifies that it is the
definition of
a function. After this, we give the rule for the evaluation of a function.
Exercise: Define a function to cube of a number.
It is essential to use the underbar to represent a variable. If you use an
underbar,
then any number can be used as an argument. Otherwise, only the argument
will
match the expression. For example,
In[31]:=
squareroot[x]:= x^(1/2)
In[32]:=
squareroot[4]
Out[32]=
squareroot[4]
In[33]:=
squareroot[x]
Out[33]=
Sqrt[x]
In this case, only when the argument of squareroot is x does the function
give the correct value. No other expression matches it because of the lack
of
the underbar.
The simplest way to extend the function capabilities is to able to define
functions
with different expressions for different ranges of the input variables. Recall
that we
did not get the real cube root of -1 in a previous computation. Since the
value of
the cube root of a negative number is the negative of the cube root of its
absolute
value, we can define a function to give the real valued cube root as follows.
In[34]:=
realcuberoot[x_]:= (x)^(1/3) /; x>=0;
realcuberoot[x_]:= - (-x)^(1/3) /; x<0;
This defines a real valued cube root for real numbers. Notice, the definition
for
negative numbers. The /; after the expression specifies the conditions under
which t
the function is to be evaluated. Let us try this on a few values.
In[35]:=
realcuberoot[-1]
Out[35]=
-1
In[36]:=
realcuberoot[ -8]
Out[36]=
-2
In[37]:=
realcuberoot[ 27]
Out[37]=
3
We can define functions by specifying rules for evaluating the functions. To
define
the Fibonacci numbers, we can convert the standard recurrence relation that
defines
them into a Mathematica function.
In[38]:=
fib[1]=1;
fib[2]=1;
fib[ n_]:= fib[ n-1] + fib[n-2]
In[39]:=
fib[10]
Out[39]=
55
In[40]:=
fib[30]
If you evaluated fib[30] then you would have noticed that the computation took
a few
minutes (depending on the speed of your machine). This happens because to
evaluate
fib[30], Mathematica first computes fib[29] and fib[28]. To evaluate
fib[29] it
has to compute fib[28] and all the smaller Fibonacci numbers, but these
intermediate
computations are then thrown away. To compute fib[28], then Mathematica
again
computes all the previous values. This is very inefficient in terms of
computational time,
so there is a way to tell Mathematica to remember all the intermediate
values in
a computation. This is done in the following way. We first make
Mathematica
forget the old definition by using the Clear command.
In[41]:=
Clear[fib]
fib[1]=1;
fib[2]=1;
fib[n_]:= fib[n]= fib[n-1] + fib[n-2]
Here the definition fib[n_]:= fib[n] tells Mathematica to remember all
the
intermediate values. Now the computation should work much faster. There are
also
ways to compute large Fibonacci numbers directly, without computing all
the
previous ones.
Exercise: Define functions to compute n! and |x|.
More detailed description of functions using the Module command are
described in the section on procedural programming.
Up to Tutorial