?>

Bertrand’s Paradox Code

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 20 20:53:56 2017

@author: Rashida Hakim
title: MIDPOINT METHOD
"""
import math
import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve

#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100
 
#set up plot 
fig, ax = plt.subplots()
ax.set_aspect('equal')

#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
 
#function that uses scipy (a technical computing python library) to find the intersection of two functions
def findIntersection(fun1,fun2,x0):
    return fsolve(lambda x : fun1(x) - fun2(x),x0)

countIntersectingLines = 0

#midpoint method
i = 0
while i < numLines:
    #selects random x and y coordinate for the midpoint
    midpointx = random.uniform(-1*largeCircleRadius, largeCircleRadius)
    midpointy = random.uniform(-1*largeCircleRadius, largeCircleRadius)
    
    while(midpointx**2 + midpointy**2) >= largeCircleRadius**2: #checks if point is outside the circle
        #resets coordinates
        midpointx = random.uniform(-1*largeCircleRadius, largeCircleRadius)
        midpointy = random.uniform(-1*largeCircleRadius, largeCircleRadius)  
           
    def f1(x): #equation of line passing through the chosen midpoint (modified from point-slope form)
        y = -1*(midpointx/midpointy)*(x-midpointx) + midpointy
        return y
    
    def f2(x): #equation for a circle, alternates between top and bottom half to ensure random distribution
        if i%2 == 0:
            y = np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
        if i%2 == 1:
            y = -np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
        return y
    
    chordEndpoint1 = findIntersection(f1, f2,0.0) #x-coordinate of one intersection between chord and circle
    
    chordEndpoint2 = (midpointx - chordEndpoint1) + midpointx
    
    #setting coordinates for chord endpoints
    x1 = chordEndpoint1
    y1 = f1(chordEndpoint1)
    x2 = chordEndpoint2
    y2 = f1(chordEndpoint2)
     
    if(x1**2 + y1**2 <= largeCircleRadius**2 and x2**2 + y2**2 <= largeCircleRadius**2): #checks if solution is correct (some are extraneous)
        #plots lines
        linex, liney = [x1, x2], [y1, y2]
        ax.plot(linex, liney, marker = '')
        
        #uncomment the line below to plot the midpoints of the lines
        #ax.plot((midpointx), (midpointy), 'o', color='b')
        
        if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
            countIntersectingLines += 1
        
        i = i+1 #increments while loop

#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)

#calculate probablity
theoreticalProbability = float(smallCircleRadius**2)/(largeCircleRadius**2)
probabilityOfIntersect = float(countIntersectingLines)/numLines

#title graph
plotTitle = ("Midpoint Method \n Large Circle Radius: " + str(largeCircleRadius) +
            "\n Small Circle Radius: " + str(smallCircleRadius) + 
            "\n Number of Chords: " + str(numLines) + 
            "\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
            "\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('midpointMethod.png')
"""
Created on Fri Jul 21 18:37:50 2017

@author: Rashida Hakim
title: RADIUS METHOD
"""

import math
import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
 
#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100

#set up plot 
fig, ax = plt.subplots()
ax.set_aspect('equal')

#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))

#function that uses scipy (a technical computing python library) to find the intersection of two functions
def findIntersection(fun1,fun2,x0):
    return fsolve(lambda x : fun1(x) - fun2(x),x0)
 
countIntersectingLines = 0

#radius method
i = 0
while i < numLines:
    direction = random.uniform(0, 360) #chooses random angle
    radius = random.uniform(0,largeCircleRadius) #chooses random distance along that angle
    #set midpoint of line based on random values above
    midpointx = radius * math.cos(math.radians(direction)) 
    midpointy = radius * math.sin(math.radians(direction))
    
    def f1(x): #equation of line passing through the chosen midpoint (modified from point-slope form)
        y = -1*(midpointx/midpointy)*(x-midpointx) + midpointy
        return y
    
    def f2(x): #equation for a circle, alternates between top and bottom half to ensure random distribution
        if i%2 == 0:
            y = np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
        if i%2 == 1:
            y = -np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
        return y
    
    
    solution1 = findIntersection(f1, f2,0.0) #x-coordinate of one intersection between chord and circle
     
    solution2 = (midpointx - solution1) + midpointx #x-coordinate of opposing intersection
    
    #setting coordinates for chord endpoints
    x1 = solution1
    y1 = f1(solution1)
    x2 = solution2
    y2 = f1(solution2)
    
    if(x1**2 + y1**2 <= largeCircleRadius**2 and x2**2 + y2**2 <= largeCircleRadius**2): #checks if solution is correct (some are extraneous)
        #plots lines
        linex, liney = [x1, x2], [y1, y2]
        ax.plot(linex, liney, marker = '')
        
        #uncomment the line below to also plot the midpoints of the lines
        #ax.plot((midpointx), (midpointy), 'o', color='g')
        
        if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
            countIntersectingLines += 1
        
        i += 1 #increments while loop

#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)

#calculate probablity
theoreticalProbability = float(smallCircleRadius)/largeCircleRadius
probabilityOfIntersect = float(countIntersectingLines)/numLines

#title graph
plotTitle = ("Radius Method \n Large Circle Radius: " + str(largeCircleRadius) +
            "\n Small Circle Radius: " + str(smallCircleRadius) + 
            "\n Number of Chords: " + str(numLines) + 
            "\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
            "\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('radiusMethod.png')
"""
Created on Thu Jul 20 19:21:48 2017

@author: Rashida Hakim
title: ENDPOINT METHOD
"""
import math
import random
import matplotlib.pyplot as plt
 
#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100

#set up plot 
fig, ax = plt.subplots()
ax.set_aspect('equal')

#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))

countIntersectingLines = 0
 
#endpoint method
for i in range(0,numLines):
    #selects two random angles
    theta1 = random.uniform(0,360) 
    theta2 = random.uniform(0,360)
    
    #determines two points along the circle based on above angles
    x1 = largeCircleRadius*math.cos(math.radians(theta1))
    y1 = largeCircleRadius*math.sin(math.radians(theta1))
    x2 = largeCircleRadius*math.cos(math.radians(theta2))
    y2 = largeCircleRadius*math.sin(math.radians(theta2))
    
    #calculates x and y coordinates of midpoints
    midpointx = float(x1 + x2)/2
    midpointy = float(y1 + y2)/2
    
    #plots lines
    linex, liney = [x1, x2], [y1, y2]
    ax.plot(linex, liney, marker = '')
    
    #uncomment the line below to also plot the midpoints of the lines
    #ax.plot((midpointx), (midpointy), 'o', color='g')
    
    if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
            countIntersectingLines += 1

#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)

#calculate probablity
theoreticalProbability = float(math.atan(smallCircleRadius/largeCircleRadius))/(math.pi/2)
probabilityOfIntersect = float(countIntersectingLines)/numLines

#title graph
plotTitle = ("Endpoint Method \n Large Circle Radius: " + str(largeCircleRadius) +
            "\n Small Circle Radius: " + str(smallCircleRadius) + 
            "\n Number of Chords: " + str(numLines) + 
            "\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
            "\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('endpointMethod.png')