Lecture 4
Warm up Exercise:
- Evaluate the sum of -1^(n+1) / (2n-1) for n from 1 to N where N=100.
- Find a value of N so that the sum is close to pi/4 (with difference < 10^-6)
Flow Control
Up to now, we saw how to make Matlab execute a list of commands without any decision making. Now we will learn to have Matlab do different things depending on the results of previous expressions.
if Statement
We might want have Matlab evaluate a bunch of expressions if some condition is satisfied, and another bunch of expressions otherwise. The syntax for this is (don't type this into Matlab..)
if condition
Bunch
Of
expressions
else
Other
expressions
end
Note that you must replace the condition with an expression that Matlab will evaluate first.
Example:
>> if 3<4
'3 is less than 4'
else
'3 is not less than 4'
end
>>
Since the condition is true, the expression which is evaluated is '3 is less than 4', and this is then displayed on the screen.
We can try something more interesting. Type the following into a file (say, if_example.m)
x = rand;
s = 'The number %g is %s than 0.5\n';
if x<0.5
fprintf(s,x,'less')
else
fprintf(s,x,'more')
end
Save the file and run it (either from the menu, or by typing the name of the file). You might be asked to change directory, do that.
As you know, rand returned a (pseudo-)random number (to initialize it, you need to call something like rand('twister', sum(100*clock)), but read more about rand to find out why.)
fprintf is similar to sprintf except that it writes the result instead of returning it. If you want to understand this a little further..read the help files and look at the difference in the output from the following commands:
>> a=sprintf("Hello!")
>> b=fprintf("Hello!")
The '\n' at the end of the string s is to make sure that Matlab actually goes down a line before returning us the command prompt...try removing it and see what happens.
What is Truth?
I'm not trying to get all philosophical or anything, but we need to know what matlab considers to be "true" and what to be "false", if we want to understand how the execution of an if statement works. For this I want you to create another file (oracle.m) with the following
if x
'True'
else
'False'
end
Then, from the command line, assign various values to x and run your file. See if each x value is true or false. Things you can try out.
x=(1==4)
x=4
x=0
x=[0 0]
x=[]
x=[0 1]
x=[1 2 3]
x='hello'
x=''
x=' '
x=-1
x=i
for Loops
Loops are good when we want to do stuff over and over again. For example, if we didn't know how to sum up the elements of a vector using sum or linear algebra commands, we could use a loop to do it (a bad idea...much slower than the alternative, about 100 times slower!!! check out loop_timer.m if you care.) However, slow they may be, but we might still need them....The syntax is as follows:
for variable = vector
a bunch
of
expressions
here variable is an
ELEMENT of vector
end
The way it works is that for every element in vector, matlab runs through all the commands in the block. during each such execution, the value of variable is set to that element...Let see a simple example:
for v = 1:10
v
v^2
end
Notice that for every number from 1 to 10 we have two printouts (since there were two commands in the block) one simply the number and the other is the number squared...just as we asked.
One can have any legal variable name instead of the variable, but note that it gets overwritten. Also the vector, can be any vector...
for v = 'hello'
v
end
One can "break out" of a loop before it is done by issuing a break command:
for v = 'hello and goodbye'
v
if v=='d'
break
end
end
OK, enough new material..lets exercise!
Exercises
- Find the sum of a vector x=[3 5 12 42 67] without using the old tricks...that is, use a for loop and don't use sum.
- Write a little program that checks if x=73 is prime. Do not use isprime. But you might find mod or rem useful.
- Modify your program to find the first 20 primes
- Write a program that find the error in the calculation from the top of the page for N = 1, 10, 100,...10^6 and plots the results in a meaningful way. (you might want to consider using a log-plot, with loglog, or manually, taking the log from both axes before plotting)