MM1CPM_CW2
COMPUTER PROGRAMMING - Coursework 2
Introduction:
This coursework is designed to help you revise your basic MATLAB knowledge
that you have gained in lectures 4-9. For each question you should write a script
that contains the answers. Save your scripts to disk with some sensible name for
example, the ffle containing the code for question one could be called Q1.m.
Once you have ffnished all the questions (or as many as you can manage), zip all
your scripts up into a single zip ffle and upload this to moodle. Name the zip ffle
using the following format Firstname_surname_studentid.zip. So for example my
In each .m ffle you generate, put on the ffrst line your name and e-mail address –
the markers will use this e-mail address to give you feedback. For questions
which require you to write English sentences just include these as comments
using the '%' character in a script ffle. Try to include comments in the script ffles
describing what the program is doing – you will get marks for this.
Finally, please remember this is individual work and not group work. Work
handed in must be entirely your own and not copied from anyone else. By all
means discuss the coursework with your friends BUT then go away and write the
programs yourself.
1Question 1 (10% of total mark): This question will
help you reinforce your basic computer knowledge.
Answer, by writing comments in a script ffle Q1.m:
a) Name the ffve fundamental components of a
computer which were covered in the lecture.
b) In no more than 10 words describe what each
component does.
c) Why does it take more time to get information from
a hard disk than from the computers main memory.
d) Give three examples of an embedded computer that
you use in your daily life.
Question 2 (10% of total mark): All computers store and transmit text as
American Standard Code for Information Interchange (ASCII) code. When you
start writing programs to interface to robots in your mechatronics courses you
will use ASCII code a lot to send commands to these robots. This question helps
you practice using ASCII code in MATLAB, make a new script called Q2.m and
answer the following questions:
a) Write a short program which asks the user to enter their name.
b) Make the program convert the text the user entered to ASCII numbers.
c) Using your program convert the
sentence 'Computers store all data as
numbers' to ASCII code. Save the
resulting list of numbers in Q2.m as a
comment.
Question 3 (10% of total mark):
This question lets you practice using
the sprintf and disp commands. Very
often when dealing with embedded
computers you won't have much
screen space to display information. It
is therefore important to be able to
carefully control text output.
Using one disp command and one
sprintf command make MATLAB print
out the poem on the right.
2
Oh! I have slipped the surly bonds of earth,
And danced the skies on laughter-silvered wings;
Sunward I've climbed, and joined the tumbling
mirth
Of sun-split clouds, --and done a hundred things
You have not dreamed of -- Wheeled and soared and
swung
High in the sunlit silence. Hov'ring there
I've chased the shouting wind along, and flung
My eager craft through footless halls of air...
Up, up the long, delirious, burning blue
I've topped the wind-swept heights with easy grace
Where never lark or even eagle flew --
And, while with silent lifting mind I've trod
The high untrespassed sanctity of space.
John Gillespie Magee, Jr
Figure 1: An Intel processor
chip seen from below. The
gold pins are the electrical
contacts used for getting
information in and out of the
chip.The poem should be formatted exactly the same way as I have formatted it,
including:
*Spaces between lines
*The author's name should be right aligned using tabs.
*All special characters should be printed.
Store your answer in Q3.m.
Question 4 (10% of total mark): This question lets you practice matrix
operations in MATLAB. Write a script to do the following and save it as Q4.m:
a) Generate the following matrices:
a=
[
0 0 1
0 1 0
0 0 1]
b=
[
1 0 0
0 1 0
1 0 0]
b) Add matrix a to matrix b and store the result in 'B'.
c) Subtract matrix a from matrix b, and store the result in 'C'
d) Perform a matrix multiplication of a by b.
e) Add four to each element of matrix a, and store the result in matrix e.
f) Generate a random matrix 10x10 between the values of -10 and 10 called Z
use surf to plot this matrix.
g) Calculate the determinant of matrix Z.
Question 5 (20% of total mark): This question is about basic image
processing, it will help you practice loops and 2D arrays. We are going to use
MATLAB to load in an image, then we are going to write an algorithm to adjust
the exposure. The algorithm we are going to write is used in digital cameras and
photo processing software. From moodle download the zip ffle CW2.zip, in this
ffle you will ffnd the jpg ffle museum_london.jpg, which is a picture of the natural
history museum in London. Extract this image to your home directory, then write
a script to do the following:
a) Load the image ffle using the imread command into an array 'a'. The imread
command works just like the load command, and will produce a 2D array of
numbers. Each element in the array represents the brightness of one pixel in the
image. The lower the number the darker the pixel, the higher the number the
brighter the pixel.
3b) Display the image using the command imshow(a), the image you see should
look like ffgure 2
c) Make two copies of the array 2D 'a', into variables 'L' (for light) and 'D' (for
dark).
d) The ffrst thing to do when working with a new array is to ffnd and store its
size. Calculate the size of the array 'a', using the size command and store the x
and y size in two variables x_len and y_len.
e) We now need to start writing our code to process the image. The ffrst step is
to write two nested for loops which will iterate over each pixel in the image. To
do this write one for loop that counts using x from 1 to the x_len. Now deffne a
second for loop inside the ffrst for loop which counts from 1 to y_len using y.
You have just made a nested for loop. There are more examples of how to do
nested loops in lecture 5. Now, by using the sprinf and disp commands within
the nested for loop, make the script display the following text for each pixel:
The brightness of pixel at ?,?? is ???.
where ? represents the x position, ?? represents the y position and ??? represents
the pixel brightness.
f) Now comment out the command printing each brightness value to the screen
(but don't delete them – otherwise you won't get the marks). We are now going
to make the image darker (less exposed). Within the nested for loops, multiply
each value stored at each position in array 'a' by 0.3 and store the result in the
same location in array 'D'. Now at the end of your script use imshow to display
the darker version of the image. If you issue the ffgure command before
imshow, matlab will display each ffgure in a new window. Compare the original
and less exposed images.
g) Now we are going to increase the exposure of the image by making it lighter.
Within the nested for loops, multiply each value stored, at each position in the
4
Figure 2: The natural history museum in London.array 'a' by 1.5 and store the result in the same location in array 'L'. Display the
result in a new ffgure.
h) Often it is important to know how long a piece of code takes to run. MATLAB
has two built in functions to help you ffnd out how long code takes to run. These
are tic and toc functions. They work a bit like a stop watch, the tic command
starts a stop watch and toc stops the stop watch. When toc is called the time
elapsed is also printed out. Try putting tic at the beginning of your program and
toc at the end of your program. How long does it take your program to run?
Write the result as a comment in your program.
i) Now comment out the nested for loop with the '%' character so that it no
longer runs (but don't delete it – otherwise you won't get the marks), and replace
its functionality with matrix multiplication commands. How long does your
program now take to run – why is this?
Question 6 (20% of total mark): This question is designed to help you
practice writing simple functions.
a) Write a script to prompt the user for the height, width and breadth of a box.
The computer should then use the disp command and the sprintf command to
write the text:
Your box has dimensions width=??, height=??, length=??
Where ?? are replaced with the information the user entered.
b) Deffne a function called box_area which accepts three variables and returns
the area of the box.
c) Deffne another function called box_volume, which accepts three variables and
returns the volume of the box.
d) Use these functions to print the text:
The box has the area of xxx and volume of xxx.
e) Edit the script to ask the user for the units used in the measurements, then
adjust the text to read
The box has the area of xxx units_for_area and volume of xxx units_for_volume.
Where units_for_area and units_for_volume are replaced by the correct units.
Hint: You have to use %s*%s*%s, and %s*%s in the sprintf command to print the
correct units.
f) Edit the script so that if the user enters the dimensions height=5, width=30,
length=30 the program prints to the screen 'It's a pizza box!'
5Question 7 (20% of total mark): This example will
help you practice for loops, while loops and if
statements. In this question we are going to use
MATLAB to simulate randomly moving gas particles in
a box. To simplify the problem we are only going to
simulate a 2D gas in a 2D space. Please note: This
question is quite tricky and I don't expect everyone to
finish it, I have put it in because it's quite fun and will
challenge the people who find MATLAB easy. Try to
do as much as you can.
Generating a 2D box
a) Define a 2D array called 'a' of size 8x8 only
containing zeros, this array represents an empty 2D box containing no gas
particles. We are going to represent gas particles within the box by using the
number 1. Set the point at 3,3 to be equal to one, this represents one gas
particle at position 3,3.
b) Using the imagesc make your script display the 2D matrix 'a'. This command
works just like surf but only produces flat 2D images.
c) Just as you did in question 5 find out the size of the matrix 'a', and store its x
and y size in the variable 'x_len' and 'y_len'.
d) Again, just as you did in question 5, write two nested for loops which iterate
through all the x and y coordinates to the array 'a'. Use sprintf and disp to
output the following text for each point in the 2D array:
'At the value x=??, y=?? the value of a=??'
Where ?? are replaced by the current x value, y value and corresponding value of
a(y,x)
e) Place the disp command and the sprintf within an if statement, so that the
text is only printed when value at a(y,x) is equal to 1. Change the line of text to
read:
'A gas particle exists at x=??, y=??'
where, ?? is replaced by the actual x and y coordinate of the gas particle.
Moving the gas particle
f) Gas particles will randomly move within any space due to thermal energy. In
order to simulate this movement, we need to write some code to randomly move
the gas particle in our 2D matrix. Change your if statement you wrote above, so
that if your code finds a gas particle, it will choose a random number between 0
and 4, store this number in the variable r. Depending upon the number chosen
we are going to move our gas particle up (r==0), down (r==1), right (r==2) or
6
Figure 3: Gas particles in a box.left (r==3). We therefore need the rand command to produce only whole
numbers, we can do this by using the floor command to round 'r' down to the
nearest whole number. Use the floor command to make sure only whole
numbers are randomly generated.
g) Write an if-elseif-elseif statement which will print the following text using the
disp command, depending upon the value of r generated:
Value of r Text to print
0 Moving particle up
1 Moving particle down
2 Moving particle right
3 Moving particle left
h) The above if-elseif-elseif tells us which direction we would like to move the
particle, but does not actually move the particle in the 2D array. In this next
section we will write the code to actually move the particle. Firstly, above the ifelseif
statement but still in the for loops, save the current value of x and y to
two variables called x_new, and y_new. Now comment out the disp commands
within the if-elseif-elseif statement and replace them with the following
commands:
0: y_new=y_new 1
1: y_new=y_new+1
2: x_new=x_new+1
3: x_new=x_new-1
This will generate a new random coordinate for the gas particle only one pixel
away from where it currently resides.
Hint: In the next few subsections, the script will start to produce a lot
of output to the screen, printing to the screen is very slow, to speed up
your code use the ; command at the end of lines.
i) The final job is to move the particle to the new coordinate we have generated.
Place these commands:
a(y,x)=0
a(y_new,x_new)=1
within the for loops but after the if-elseif-elseif statements to move the gas
particle by one step. Make sure the imagesc command comes after both for
loops, and run the program to see what happens to your particle.
-j) In order to make your particle continually move you need to place the two
nested for loops in a while loop. Make a while loop that runs 1000 times. The
code may run so fast that your 2D plot of the matrix will not update, if this
happens place the command pause(0.5) after the imagesc command. Your
particle should now randomly move in the box until it reaches the edge. Why
does the program crash when the gas particle reaches the edge of the box?
Write the reason for the crash at the top of the script.
k) To keep the particle within the box use four nested if statements to check if
the values of y_new,x_new are within the array. Rerun the code and see what
happens to the particle. Congratulations you have simulated a gas particle in a
box! Now, add four more particles to your box and let the simulation run. And
run the code, what is what is wrong with the simulation (place the answer at the
top of the script)?
l) To stop the gas particles destroying themselves when they meet, wrap the
code that moves the gas particle:
a(y_new,x_new)=1
a(y,x)=0
in an if statement, which will only execute if a(y_new,x_new)==0.
m) Increase the size of your box to 100 by 100, using two for loops generate a
square of 20x20 gas particles in the center of the box. Let the simulation run
and watch the gas particles spread out in the box.
n) We are now going to simulate a liquid evaporating from a surface. Comment
out the for loops you wrote in part 'n' – but don't delete them or you will loose
the marks. Using two for loops generate a layer of gas particles at the bottom of
your box 20 units deep, which spans the entire box. Let the simulation run and
watch the particles evaporate.
8Removing gas particles from the simulation (tricky)
o) Set the value at 4,4 in your matrix to 5. Edit your code so that if your particle
moves on to a data point with a value of 5, the gas particle is deleted. This could
represent a hole in your box though which gas escapes.
p) The problem with this simulation is that once the particles reach the top of our
box they become trapped. In reality the particles would continue moving away
from the surface forever. To prevent the particles becoming trapped in the box,
use a single for loop to set the top edge of the box to the value of 5. When a
particle reaches the top of the box it will now be deleted – thus simulating
particles escaping from the top of the box.
q) Now include the effect of gravity in the simulation, by making it more probable
that the particle will choose to move towards the bottom of the box than in any
other direction.
9
Figure 4: Simulating evaperation. Your code should
produce something that looks like this.