430 likes | 563 Views
EECS 110: Lec 6: Fractals and Trutles. Aleksandar Kuzmanovic Northwestern University. http://networks.cs.northwestern.edu/EECS110-s14/. Midterm and Final. Midterm: Wednesday 4/30/2014 9:30am – 11:30am Kresge Centennial Hall 2415 Final: Wednesday 6/4/2014 9:30am – 11:30am
E N D
EECS 110: Lec 6: Fractals and Trutles Aleksandar Kuzmanovic Northwestern University http://networks.cs.northwestern.edu/EECS110-s14/
Midterm and Final • Midterm: • Wednesday 4/30/2014 • 9:30am – 11:30am • Kresge Centennial Hall 2415 • Final: • Wednesday 6/4/2014 • 9:30am – 11:30am • Kresge Centennial Hall 2415
EECS 110 Today hw2 due Sunday evening… Fractals and Turtles! The Koch Curve
Quiz Write each of these functions concisely using list comprehensions… Name(s): Write input: e, any element L, any list or string Remember True == 1 and False == 0 output: the # of times L contains e def count(e,L): example: count('f', 'fluff') == 3 W are the winning numbers Write input: Y and W, two lists of lottery numbers (ints) Y are your numbers def lotto(Y,W): output: the # of matches between Y & W example: lotto([5,7,42,44],[3,5,7,44]) == 3 Extra! Write input: N, an int >= 2 output: the number of positive divisors of N def divs(N): example: divs(12) == 6 (1,2,3,4,6,12)
Quiz count(e,L) LC =[x==e for x in L] return sum( LC )
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 count(e,L) LC =[x==e for x in L] return sum( LC ) lotto(Y,W) LC = [c in Y for c in W] return sum( LC ) divs(N) LC =[ N%c==0 for c in range(1,N+1)] return sum( LC )
return to recursion Composing functions into specific applications what applications? Creating general functions that will be useful everywhere (or almost…)
1 y = x 1 def recip(x): return 1.0/x 0.5 area 0 1 2 3 4 5 6 7 8 9 10 Numerical Integration Lab 2: Tuesday (yesterday) steps(low,hi,N) fsteps(recip,low,hi,N) finteg(f,low,hi,N)
1 y = x 1 def recip(x): return 1.0/x 0.5 area 0 1 2 3 4 5 6 7 8 9 10 1 0.5 0 1 2 3 4 5 6 7 8 9 10 low = 1.0 hi = 10.0 N == 9 == total number of steps (rectangles) steps(low,hi,N) fsteps(recip,low,hi,N) finteg(f,low,hi,N)
Numerical Integration def fracSteps(N): return [ x/float(N) for x in range(N) ] 0 1 41 42 42 42 fractional steps def steps(low,hi,N): return [ low + (hi-low)*x for x in fracSteps(N) ] 0 1 6 x values 15 10 10 7 7 7 def fsteps(f,low,hi,N): return [ f(x) for x in steps(low,hi,N) ] y values 10 16 def finteg(f,low,hi,N): return sum(fsteps(f,low,hi,N))*(hi-low)/float(N) 16 10 integral: heights width
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 for more explanation, try dir(random) or help(random) random.choice( L ) chooses 1 element from the list L random.choice( ['north', 'case', 'west'] ) How would you get a random int from 0 to 9? random.uniform(low,hi) chooses a random float from low to hi random.uniform(41.9,42.1) How likely is this to return 42 ?
A randomfunction… 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 * importtime 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 Making random numbers work for you! Monte Carlo methods, Math/CS Monte Carlo casino, Monaco
Monte Carlo in action Suppose you roll two dice. What are the chances that you roll doubles? input is the total number of rolls 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 what should the last line be?
Monte Carlo in action Suppose you roll two dice. What are the chances that you roll doubles? input is the total number of rolls 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: return1 + countDoubles( N-1 )# doubles! one roll of the dice
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 Your initial choice! 'switch' or 'stay' number of times to play 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 )
An example closer to home Hw2 Pr2 Platt ... ... Dorms Michigan Lake S (W) (E) 0 22 23 24 25 26 27 28 50 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 dorms or the Michigan Lake, the trip is complete. The program should then print the total number of steps taken. Write a program to model and analyze! this scenario...
An example closer to home Hw2 Pr2 Platt ... ... Dorm Michigan Lake S (W) (E) 0 22 23 24 25 26 27 28 50 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. Write a program to model and analyze! this scenario... 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
Gel electrophoresis one of many applications for random walks… uses a basic random-walk model with unequal step probabilities Used to separate proteins and nucleic acids (DNA) from a biological sample. Molecules with different properties travel different distances.
Monte Carlo Applications folding @ home (a) start configuration (b) end (c) 3d-model text on MC approaches to protein folding
Python's Etch-a-Sketch from turtle import * reset() left(90) forward(50) right(90) backward(50) down() or up() color('green') width(5) done() and lots more! degrees! states if the pen draws or not A new human-computer interface? http://networks.cs.northwestern.edu/EECS110-s14/misc/TurtleDirections.htm for turtle help
Etch-a-Sketch ? www.gvetchedintime.com No way this is real… except that it is !
Recursive Graphics there is no tri … Could we tri this with recursion? (1) def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120)
Recursive Graphics there is no tri … Could we tri this with recursion? (1) def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120) def tri(N): """ Plots a triangle """ if N == 0: return else: forward(100) left(120) tri(N-1)
"Quiz" Turtle Graphics Name(s): Finish rwalk to draw a "stock-market-type" random path of nsteps steps. Use recursion! (1) What does chai draw? (2) 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' 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) one possible result of rw(20)
(1) What does chai draw? 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) Why are there two identical commands in a row?
(2) Finish rwalk to draw a "stock-market-type" random path of nsteps steps. 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) one possible result of rw(20) What if we didn't go back to the starting pose?
hw2pr3 spiral 81 72.9 90 close-up of innermost part of the spiral… spiral( 100, 90, 0.9 ) 100 spiral( initLength, angle, multiplier )
hw2pr3 svTree svTree( 100, 4 ) svTree( trunkLength, levels ) and more! (if you want)
Help! My turtle window froze! Your turtle window becomes unresponsive after your program runs. 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! http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/misc/TurtleDirections.htm fill(1) color("blue")
Have a great weekend! good luck withhw2…