diff --git a/ipynb/ClimbingWall.ipynb b/ipynb/ClimbingWall.ipynb index 3da5749..dfb2904 100644 --- a/ipynb/ClimbingWall.ipynb +++ b/ipynb/ClimbingWall.ipynb @@ -13,8 +13,8 @@ ">Today marks the beginning of the Summer Olympics! One of the brand-new events this year is [sport climbing](https://olympics.com/tokyo-2020/en/sports/sport-climbing/).\n", ">\n", ">Suppose the organizers place climbing holds uniformly at randomly on a 10-by-10 meter climbing wall until there is a **path**: a series of moves from the bottom of the wall to a hold, and then to successive holds, and finally to the top of the wall, where each move is no more than 1 meter distance. There are two climbing events:\n", - "> - For the first event, all the holds are placed at random heights on a single vertical line. \n", - "> - For the second event, holds are placed at random anywhere on the wall. \n", + "> - For the first event, all the holds are placed on a single vertical line, at random heights. \n", + "> - For the second event, holds are placed anywhere on the wall, at random. \n", ">\n", "> On average, how many holds (not including the bottom and top of the wall) have to be placed to make a path in each event?\n", "\n", @@ -487,6 +487,57 @@ "wall.paths" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also show a wall from the first event:" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(2.0, 0.8054573219536296): (2.0, 3.7940849597834956),\n", + " (2.0, 1.5184730166577696): (2.0, 3.7940849597834956),\n", + " (2.0, 1.8128499238377271): (2.0, 3.7940849597834956),\n", + " (2.0, 2.2742370649657704): (2.0, 3.7940849597834956),\n", + " (2.0, 3.1029899543622506): (2.0, 3.7940849597834956),\n", + " (2.0, 3.120138418133569): (2.0, 3.7940849597834956),\n", + " (2.0, 3.3476732789104258): (2.0, 3.7940849597834956),\n", + " (2.0, 3.7940849597834956): (2.0, 3.7940849597834956)}" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "height = 4\n", + "wall1 = Wall(height)\n", + "for hold in place_holds(height):\n", + " wall1.add((height / 2, hold))\n", + "plot_wall(wall1)\n", + "wall1" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -593,17 +644,17 @@ "\n", "The Monte Carlo approach can only give an approximation. To get an exact result requires a level of math that is above my ability. Fortunately, a real mathematician, [George Hauser](https://www.math.rutgers.edu/component/comprofiler/userprofile/gdh43?Itemid=753), provided the following analysis of the first event:\n", "- If you choose uniformly randomly *n* numbers between 0 and 1 and put them in order (including 0 and 1 in the list) and look at the *n*+1 gaps between them, the probability that any given *k* of the gaps are greater than *x* is (1-*kx*)*n* if *kx* ≤ 1 and 0 otherwise. So by inclusion-exclusion, the probability that the largest gap is greater than *x* is the sum of the probabilities that each individual gap is greater than *x*, minus the sum of the probabilities that each pair of gaps are simultaneously greater than *x*, plus the sum of all triples, etc. \n", - "- So as a formula it is Pr(*X**n* > *x*) = ∑*k* ≤ 1/*x* (-1)*k*-1 (*n*+1 choose *k*) (1-*kx*)*n*.\n", - "- Here *X**n* is the largest gap that appears in a sample of *n* random points between 0 and 1. \n", - "- What we are interested in is *N*, the first step at which *X**n* < *x*, and E(*N*) the expectation of *N*. \n", - "- This expectation is ∑*n* ≥ 1 *n* Pr(*X**n* < *x* and *X**n-1* > *x*). \n", - "- But the sequence *X**n* is decreasing since the biggest gap can only get smaller when you add a new hold. \n", - "- So this series just telescopes into ∑*n* ≥ 1 Pr(*X**n* > *x*).\n", - "- So combining the two formulas we need to evaluate ∑*n* ≥ 1*k* ≤ 1/*x* (-1)*k*-1 (*n*+1 choose *k*) (1-*kx*)*n*. \n", - "- If you sum first over n, this gives ∑*k* ≤ 1/*x* (-1)*k*-1 (*kx*)-2 (1/(*kx*)-1)*k* - 1. \n", + "- So as a formula it is Pr(*X*n > *x*) = ∑k ≤ 1/x (-1)k-1 (*n*+1 choose *k*) (1-*kx*)n.\n", + "- Here *X*n is the largest gap that appears in a sample of *n* random points between 0 and 1. \n", + "- What we are interested in is *N*, the first step at which *X*n < *x*, and E(*N*) the expectation of *N*. \n", + "- This expectation is ∑n ≥ 1 *n* Pr(*X*n < *x* and *X**n-1* > *x*). \n", + "- But the sequence *X*n is decreasing since the biggest gap can only get smaller when you add a new hold. \n", + "- So this series just telescopes into ∑*n* ≥ 1 Pr(*X*n > *x*).\n", + "- So combining the two formulas we need to evaluate ∑n ≥ 1k ≤ 1/x (-1)k-1 (*n*+1 choose *k*) (1-*kx*)n. \n", + "- If you sum first over n, this gives ∑k ≤ 1/x (-1)k-1 (*kx*)-2 (1/(*kx*)-1)k - 1. \n", "- I couldn't really simplify this further, but it is easy enough to plug in *x* = 1/10 (i.e. 1 out of 10 meters) and get the answer.\n", "\n", - "Hauser did the computation with exact rationals and with floating point approximations:" + "We can use Hauser's formula to do the computation with exact rationals and with floating point numbers:" ] }, {