EECS 110: Lec 6: Fractals and Trutles Aleksandar Kuzmanovic Northwestern University
-
Upload
kellie-mosley -
Category
Documents
-
view
220 -
download
1
Transcript of EECS 110: Lec 6: Fractals and Trutles Aleksandar Kuzmanovic Northwestern University
EECS 110: Lec 6: Fractals and Trutles
Aleksandar Kuzmanovic
Northwestern University
http://networks.cs.northwestern.edu/EECS110-s15/
Midterm and Final (tentative)
• Midterm:– Wednesday 4/29/2015– 9:30am – 11:30am– Tech L361
• Final:– Wednesday 6/3/2015– 9:30am – 11:30am– Tech L361
EECS 110 Today
hw2 due Sunday evening…
Fractals and Turtles!
The Koch Curve
Quiz Write each of these functions concisely using list comprehensions…
Write
def count(e,L):
Write
def lotto(Y,W):
input: e, any element L, any list or stringoutput: the # of times L contains e example: count('f', 'fluff') == 3
input: Y and W, two lists of lottery numbers (ints)
output: the # of matches between Y & W
example: lotto([5,7,42,44],[3,5,7,44]) == 3
Y are your numbers
W are the winning numbers
Name(s):
Remember True == 1 and False == 0
Extra! Write
def divs(N):
input: N, an int >= 2output: the number of positive divisors of Nexample: divs(12) == 6 (1,2,3,4,6,12)
Quiz
Quiz
LC = [x==e for x in L] return sum( LC )
count(e,L)
Quiz
lotto(Y,W)LC = [c in Y for c in W]return sum( LC )
Quiz
divs(N)LC = [ N%c==0 for c in range(1,N+1)] return sum( LC )
Quiz
LC = [x==e for x in L] return sum( LC )
count(e,L)
divs(N)
lotto(Y,W)LC = [c in Y for c in W]return sum( LC )
LC = [ N%c==0 for c in range(1,N+1)] return sum( LC )
return to recursion
Composing functions into specific applications
Creating general functions that will be useful everywhere (or almost…)
what applications?
1 102 3 4 5 6 7 8 9
1
0.5
0
y = 1 x area
steps(low,hi,N) fsteps(recip,low,hi,N)
def recip(x): return 1.0/x
finteg(f,low,hi,N)
Numerical IntegrationLab 2: Tuesday (yesterday)
1 102 3 4 5 6 7 8 9
1
0.5
0
1 102 3 4 5 6 7 8 9
1
0.5
0
low = 1.0 hi = 10.0
y = 1 x area
steps(low,hi,N)
N == 9 == total number of steps (rectangles)
fsteps(recip,low,hi,N)
def recip(x): return 1.0/x
finteg(f,low,hi,N)
Numerical Integration
def fracSteps(N):
return [ x/float(N) for x in range(N) ] 0 1 41
424242
def steps(low,hi,N):
return [ low + (hi-low)*x for x in fracSteps(N) ]0 1 6
77710 10 15
def fsteps(f,low,hi,N):
return [ f(x) for x in steps(low,hi,N) ]
def finteg(f,low,hi,N): return sum(fsteps(f,low,hi,N))*(hi-low)/float(N)
x values
fractional steps
y values
integral: heights
10 16
1610width
When good programs go bad…
def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p)
print: Making programs talk to you!
Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in
finding mistakes in my own programs.- Maurice Wilkes
When good programs go bad…
def power(b, p): """ Returns b**p for p >= 0 """ print( "p is", p, "; b is", b ) if p == 0: return 1 else: return b*power(b, p)
Careful! print != return
def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p-1)
def powerPrint(b, p): """ Returns(?) b**p for p >= 0 """ if p == 0: print 1 else: print b*powerPrint(b, p-1)
A random aside…
import random
random.choice( L )
random.uniform(low,hi)
random.choice( ['north', 'case', 'west'] )
random.uniform(41.9,42.1)
chooses 1 element from the list L
chooses a random float from low to hi
for more explanation, try dir(random) or help(random)
How likely is this to return 42 ?
How would you get a random int from 0 to 9?
A random function…
from random import *
def guess( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) )
if compguess == hidden: # at last! print( 'I got it!’ )
else: guess( hidden )
The final version
from random import *import time
def guessFinal( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) )
print( 'I choose', compguess ) time.sleep(0.05)
if compguess == hidden: # at last! print( 'I got it!’ )
return 0 else: return 1 + guessFinal( hidden )
The two Monte Carlos
Monte Carlo casino, Monaco
Making random numbers work
for you!
Monte Carlo methods, Math/CS
Monte Carlo in action
Suppose you roll two dice.What are the chances that you roll doubles?
def countDoubles( N ): """ inputs a # of dice rolls outputs the # of doubles """ if N == 0: return 0 # zero rolls, zero doubles… else: d1 = choice( [1,2,3,4,5,6] ) d2 = choice( range(1,7) ) if d1 != d2: return countDoubles( N-1 ) # not doubles else: return # doubles!
one roll of the dice
input is the total number of rolls
what should the last line be?
Monte Carlo in action
Suppose you roll two dice.What are the chances that you roll doubles?
def countDoubles( N ): """ inputs a # of dice rolls outputs the # of doubles """ if N == 0: return 0 # zero rolls, zero doubles… else: d1 = choice( [1,2,3,4,5,6] ) d2 = choice( range(1,7) ) if d1 != d2: return countDoubles( N-1 ) # not doubles else: return 1 + countDoubles( N-1 ) # doubles!
one roll of the dice
input is the total number of rolls
Monty Hall
Let’s make a deal ’63-’86
inspiring the “Monty Hall paradox”
Monte Carlo Monty Hall
Suppose you always switch to the other door...What are the chances that you will win the car ?
Run it (randomly) 1000 times and see!
Monte Carlo Monty Hall
def MCMH( init, sors, N ): """ plays the same "Let's make a deal" game, N times returns the number of times you win the car """ if N == 0: return 0 # don't play, can't win carDoor = choice([1,2,3]) # where is the car?
if init == carDoor and sors == 'stay': result = 'Car!' elif init == carDoor and sors == 'switch': result = 'Spam.' elif init != carDoor and sors == 'switch': result = 'Car!' else: result = 'Spam.'
print( 'You get the', result ) if result == 'Car!': return 1 + MCMH( init, sors, N-1 ) else: return 0 + MCMH( init, sors, N-1 )
Your initial choice! 'switch' or 'stay'number of times to play
An example closer to home
......25 26 27 28 502423220
An overworked NU student (S) leaves a pub after a “late-night” breakfast and, each moment, randomly
stumbles toward Dorms (W) or toward Michigan Lake (E)
Dorms
Michigan Lake
(E)
(W)
Platt
Write a program to model and analyze! this scenario...
Hw2 Pr2
S
Once the student arrives at the dorms or the Michigan Lake, the trip is complete.
The program should then print the total number of steps taken.
An example closer to home
......25 26 27 28 502423220
Dorm Michigan Lake
(E)
(W)
Platt
Write a program to model and analyze! this scenario...
Hw2 Pr2
S
rs() rwPos(s, nsteps) rwSteps(s, low, hi)
take a random step of +1 or -1
take nsteps random steps starting at s
take random steps starting at s until you reach either low or hi
An overworked NU student (S) leaves a pub after a “late-night” breakfast and, each moment, randomly
stumbles toward Dorms (W) or toward Michigan Lake (E)
Once the student arrives at the dorm or the Michigan Lake, the trip is complete.
The program should then print the total number of steps taken.
uses a basic random-walk model with unequal step probabilities
Gel electrophoresis
Used to separate proteins and nucleic acids (DNA) from a
biological sample. Molecules with different properties travel
different distances.
one of many applications for random walks…
Monte Carlo Applications
text on MC approaches to protein folding
(a) start configuration (b) end (c) 3d-model
folding @ home
Python's Etch-a-Sketch
A new human-computer interface?
from turtle import *
reset()
left(90)
forward(50)
right(90)
backward(50)
down() or up()
color('green')
width(5)
done()
and lots more!
for turtle help
degrees!
states if the pen draws or not
http://networks.cs.northwestern.edu/EECS110-s15/misc/TurtleDirections.htm
Etch-a-Sketch ?www.gvetchedintime.com
No way this is real…
except that it is !
Recursive Graphics
def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120)
there is no tri … Could we tri this with recursion?(1)
Recursive Graphics
def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120)
there is no tri … Could we tri this with recursion?(1)
def tri(N): """ Plots a triangle """ if N == 0: return else: forward(100)
left(120) tri(N-1)
"Quiz"
def chai(size): """ mystery! """ forward(size) left(90) forward(size/2.0) right(90) right(90) forward(size) left(90) left(90) forward(size/2.0) right(90) backward(size)
What does chai draw?(1)
Turtle Graphics
Finish rwalk to draw a "stock-market-type" random path of nsteps steps. Use recursion!
(2)
Name(s):
from random import *
def rw(nsteps): """ moving for nsteps steps, randomly 45 deg. left/up or right/down """ if nsteps == 0: return if choice(['left','right']) == 'left':
else: # 'right'
one possible result of rw(20)
def chai(size): """ mystery! """ forward(size) left(90) forward(size/2.0) right(90) right(90) forward(size) left(90) left(90) forward(size/2.0) right(90) backward(size)
What does chai draw?(1)
Why are there two identical commands in a row?
Finish rwalk to draw a "stock-market-type" random path of nsteps steps. (2)
one possible result of rw(20)
from random import *
def rw(nsteps): """ moving for nsteps steps, randomly 45 deg. left/up or right/down """ if nsteps == 0: return if choice(['left','right']) == 'left':
left(45)forward(20)right(45)
else: # 'right‘right(45)forward(20)left(45)
return rw(nsteps-1)
What if we didn't go back to the starting pose?
hw2pr3 spiral
100
90
81
72.9
spiral( initLength, angle, multiplier )
close-up of innermost part of the spiral…
spiral( 100, 90, 0.9 )
hw2pr3 svTree
svTree( trunkLength, levels )
svTree( 100, 4 )
and more! (if you want)
Help! My turtle window froze!
Your turtle window becomes unresponsive after your programruns. Type:
>>> done()
to unlock it (but then you have to close it)
The Koch curve
snowflake( 100, 0 )snowflake( 100, 1 ) snowflake( 100, 2 )
snowflake( 100, 3 ) snowflake( 100, 4 ) snowflake( 100, 5 )
Have fun!
fill(1) color("blue")http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/misc/TurtleDirections.htm
Have a great weekend!
good luck with hw2…