EECS 110: Lec 6: Fractals and Trutles Aleksandar Kuzmanovic Northwestern University

Post on 03-Jan-2016

221 views 1 download

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…