{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Oregon Curriculum Network](http://www.4dsolutions.net/ocn)
\n", "[Discovering Math with Python](Introduction.ipynb)\n", "\n", "# All Aboard the S Train! \n", "\n", "Those of us exploring the geometry of thinking laid out in Synergetics (subtitled explorations in the geometry of thinking) will be familiar with the Jitterbug Transformation, popularized in this [Youtube introduction to the International Mathematicians Union logo](https://youtu.be/1VXDejQcAWY):\n", "\n", "\"imu_logo_u2be\"\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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xybH/uMEjTcZLR/SedTiiko56rrb2yMEk4r5rGkmRJCTTlM7PISJISA8hIkhIDSEiyEhDSEiyEgNISLISVDSEiyEgPISJISUPISJISQNJRuedcXClc864zZYWUXUhMiIuomTLoaQkWQkoaQkWQkBpCRJCSoeQkSQkB5CRJCQHkJEkJAeQkSQkDpISJISUPISJISA0hIshIQ6OVFlNSndt7WakIVZCTlfDW/2ai0x071K76m1TnIkhJulIpGoSZmTgLISaZMEiSEgPJEiyEgPISLISA0hIkhJQ8hIkhIDyEigENISLISUMEiyEkDSEiyEgNISLJMlEkSRISA0hIshIQ0hIshIDSAshIDSEiyEgNJTuF844slOuvnHGbLCwi6gkRF1BJHQ8kyJISQPISJISUPISJISA8hIkhJUPISJISB0kJExBiAeQkTEGIBwEkJCHkJEkJAYBZCQGATEEgdJCRJCQHkJEkJKhpJkSQkB5CRJJkBpCRZCQGkJFxBiAaQkXEElDSEiyEhDSEiyEgPISLISA0hIshJRIEAQMEiyEhDALISUMAshIEgLISA0hIoAPJUrL5xxZkq1ucUzZam8I2E5SfuHhG+8n7kgZdEeETpT9w8I33kAADwrfeQPCt95AAIPCN95A8I33kJAKPCN6UDwjelAAInG3pQMbelAAAxJ0hjQAAMSdIY06QAAxIGJCQAjEgYkAAynEnSGIANKMSBiQAIDEgYkAAgxIGJAACJQJTpJAAlAxIAFEygSgAASEgAQSEgABISAAGLrDESBRGIMXWSABISABBiCQAqiQkACCQkAAiQkkCiJCSQAJCQAARStWXzigBmyw//Z", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"1VXDejQcAWY\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cuboctahedron and icosahedron are related by having the same edge length. The ratio of the two, in terms of volume, is: $20 : 5 \\sqrt{2} \\phi^2$. \n", "\n", "Lets call this the \"S factor\". It also happens to be the [Smod/Emod volume ratio](https://repl.it/@kurner/SandE-Modules)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sfactor: 1.080363026950905814406172628196375701989460486805627392673\n" ] } ], "source": [ "import gmpy2\n", "gmpy2.get_context().precision=200\n", "\n", "root2 = gmpy2.sqrt(2)\n", "root7 = gmpy2.sqrt(7)\n", "root5 = gmpy2.sqrt(5)\n", "root3 = gmpy2.sqrt(3)\n", "\n", "# phi\n", "𝜙 = (gmpy2.sqrt(5) + 1)/2\n", "\n", "# Synergetics modules\n", "Smod = (𝜙 **-5)/2 \n", "Emod = (root2/8) * (𝜙 ** -3)\n", "sfactor = Smod/Emod\n", "print(\"sfactor: {:60.57}\".format(sfactor))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Icosa * sfactor = Cubocta." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sfactor: 1.080363026950905814406172628196375701989460486805627392673\n" ] } ], "source": [ "sfactor = 2 * root2 * 𝜙 ** -2 # 2 * (7 - 3 * root5).sqrt()\n", "print(\"sfactor: {:60.57}\".format(sfactor))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sfactor: 1.080363026950905814406172628196375701989460486805627392673\n" ] } ], "source": [ "# sfactor in terms of phi-scaled emods\n", "e3 = Emod * 𝜙 ** -3\n", "print(\"sfactor: {:60.57}\".format(24*Emod + 8*e3))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sfactor: 1.080363026950905814406172628196375701989460486805627392673\n" ] } ], "source": [ "# length of skew icosa edge EF Fig 988.13A below, embedded in \n", "# octa of edge a=2\n", "EF = 2 * gmpy2.sqrt(7 - 3 * root5)\n", "print(\"sfactor: {:60.57}\".format(EF))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cuboctahedron that jitterbugs into an icosahedron takes twenty regular tetrahedrons -- in volume, eight of them so formed (the other twelve paired in six half-octahedra) -- into twenty irregular tetrahedrons in the corresponding regular icosahedron (same surface edge lengths). \n", "\n", "Each of those 20 irregular tetrahedrons we may refer to as an \"icosatet\" (IcosaTet).\n", "\n", "The computation below shows the icosatet (1/sfactor) times 20, giving the same volume as the \"Jitterbug icosa\" (edges 2R)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "mpfr('0.9256147934109580598004949646327265961785713456820076307984425',200)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "icosatet = 1/sfactor\n", "icosatet" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Icosahedron: 18.512295868219161196009899292654531923571426913640152615969\n" ] } ], "source": [ "JB_icosa = 20 * icosatet\n", "print(\"Icosahedron: {:60.57}\".format(JB_icosa)) # for volume of JB icosahedron" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From Figure 988.00 in *Synergetics*:\n", "\n", "\"Jitterbug\n", "
Jitterbug Relationship
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The S Train is Leaving the Station...\n", "\n", "However there's another twinning or pairing of the cubocta and icosa in Synergetics that arises when we fit both into a contextualizing octahedron. \n", "\n", "\"Phi\n", "\n", "Consider the canonical octahedron of volume 4, with a cuboctahedron inside, its triangular faces flush with the octahedron's. Its volume is 2.5.\n", "\n", "Now consider an icosahedron with eight of its twenty faces flush to the same octahedron, but skewed (tilted) relative to the cuboctahedron's.\n", "\n", "\"icosa_within\"\n", "
From Figure 988.12 in Synergetics by RBF
\n", "\n", "The relationship between this pair is different than in the Jitterbug Transformation. For one thing, the edges are no longer the same length, and for another, the icosahedron's edges are longer, and its volume is greater.\n", "\n", "However, despite these differences, the S-Factor is still involved. \n", "\n", "For one thing: the longer edge of the icosahedron is the S-factor, given edges and radii of the cuboctahedron of volume 2.5 are all R = 1 = the radius of one CCP sphere -- each encased by the volume 6 RD (see below).\n", "\n", "From Figure 988.00 in Synergetics:\n", "\n", "\"Skew\n", "
Cuboctahedron and Icosahedron
both with faces flush to Octahedron of volume 4
\n", "\n", "For another: the cuboctahedron's volume, times S-Factor to the 2nd power, gives the icosahedron's volume." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "mpfr('2.9179606750063091077247899380617129367814492116542282718730885',200)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "icosa_within = 2.5 * sfactor * sfactor\n", "icosa_within" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Verifying S Module Volume\n", "\n", "The \"skew icosahedron\" inside the volume 4 octahedron is what we use to derive the 24 S modules, which make up the difference in volume between the two. The S module's volume may also be expressed in terms of φ." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "smod: 0.045084971874737120511467085914095294300772949514407155339\n" ] } ], "source": [ "smod = (4 - icosa_within)/24\n", "print(\"smod: {:60.57}\".format(smod))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "smod: 0.045084971874737120511467085914095294300772949514407155339\n" ] } ], "source": [ "(𝜙**-5)/2 \n", "print(\"smod: {:60.57}\".format(smod))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets look at the S module in more detail, and compute its volume from scratch, using [a Python formula](Computing%20Volumes.ipynb).\n", "\n", "\"dejong\"\n", "
\n", "\"smod_dimensions\"\n", "\n", "Picking a common apex for three lengths (radials), and then connecting the dots around the base so defined, is step one in using our algorithm. We'll use gmpy2 for its extended precision capabilities.\n", "\n", "The Tetrahedron class in tetravolume module is set by default to work in D units (D = 2R) i.e. the canonical tetrahedron, octahedron, icosahedron, all have edges 1." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "smod: 0.045084971874737120511467085914095294300772949514407155339\n" ] } ], "source": [ "import tetvols\n", "# assume a = 1 D\n", "a = 1 \n", "# common apex is F\n", "FH = 1/𝜙\n", "FE = sfactor/2\n", "FG = root3 * FE/2\n", "# connecting the base (same order, i.e. H, E, G)\n", "HE = (3 - root5)/2\n", "EG = FE/2\n", "GH = EG\n", "\n", "Smod = tetvols.ivm_volume((FH, FE, FG, HE, EG, GH))\n", "print(\"smod: {:60.57}\".format(Smod))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Octa Edge = 1\n", "FH: 0.618033988749894848204586834365638117720309179805762862135\n", "FE: 0.540181513475452907203086314098187850994730243402813696336\n", "FG: 0.467810913324468290005538599027413209092598872997544460757\n", "HE: 0.381966011250105151795413165634361882279690820194237137865\n", "EG: 0.270090756737726453601543157049093925497365121701406848168\n", "GH: 0.270090756737726453601543157049093925497365121701406848168\n" ] } ], "source": [ "print(\"Octa Edge = 1\")\n", "print(\"FH: {:60.57}\".format(FH))\n", "print(\"FE: {:60.57}\".format(FE))\n", "print(\"FG: {:60.57}\".format(FG))\n", "print(\"HE: {:60.57}\".format(HE))\n", "print(\"EG: {:60.57}\".format(EG))\n", "print(\"GH: {:60.57}\".format(GH))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "Setting a = 2 give us the following edges table:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Octa Edge = 2\n", "FH: 1.236067977499789696409173668731276235440618359611525724271\n", "FE: 1.080363026950905814406172628196375701989460486805627392673\n", "FG: 0.935621826648936580011077198054826418185197745995088921515\n", "HE: 0.763932022500210303590826331268723764559381640388474275729\n", "EG: 0.540181513475452907203086314098187850994730243402813696336\n", "GH: 0.540181513475452907203086314098187850994730243402813696336\n" ] } ], "source": [ "print(\"Octa Edge = 2\")\n", "print(\"FH: {:60.57}\".format(FH * 2))\n", "print(\"FE: {:60.57}\".format(FE * 2))\n", "print(\"FG: {:60.57}\".format(FG * 2))\n", "print(\"HE: {:60.57}\".format(HE * 2))\n", "print(\"EG: {:60.57}\".format(EG * 2))\n", "print(\"GH: {:60.57}\".format(GH * 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The S Train\n", "\n", "The fact that the cuboctahedron and icosahedron relate in two ways via a common S-factor suggests the metaphor of a train or subway route. \n", "\n", "Start at the cuboctahedron and follow the Jitterbug Pathway (one stop, one application of the S-factor, but as a reciprocal, since we're dropping in volume). \n", "\n", "We've arrived at the Jitterbug icosahedron. Applying 1/S twice more will take us to another cuboctahedron (dubbed \"SmallGuy\" in some writings). Its triangular faces overlap those of the Jitterbug icosahedron." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SmallGuy: 15.860645438769607979506732934761348026253292147308374978763\n" ] } ], "source": [ "SmallGuy = 20 * (1/sfactor) ** 3\n", "SmallGuy\n", "print(\"SmallGuy: {:60.57}\".format(SmallGuy))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SmallGuy's edges are 2R times 1/sfactor, since linear change is a 3rd root of volumetric change (when shape is held constant). \n", "\n", "Interestingly, this result is one tenth the JB_icosahedron's volume, but a linear measure in this instance. " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SmallGuy Edge: 1.851229586821916119600989929265453192357142691364015262\n", "Icosahedron: 18.51229586821916119600989929265453192357142691364015262\n" ] } ], "source": [ "print(\"SmallGuy Edge: {:56.54}\".format(2 * (1/sfactor))) # SmallGuy edge\n", "print(\"Icosahedron: {:56.53}\".format(JB_icosa)) # for volume of JB icosahedron" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When going in the other direction (smaller to bigger), apply the S factor directly (not the reciprocal) since the volumes increase. \n", "\n", "For example start at the cuboctahedron of volume 2.5, apply the S factor twice to get the corresponding skew icosahedron (\"Icosahedron Within\"), its faces embedded in the same volume 4 octahedron (see above)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# S is for \"Skew\"...\n", "\n", "However, we might also say \"S\" is for \"Sesame Street\" and for \"spine\" as the Concentric Hierarchy forms the backbone of Synergetics and becomes the familiar neighborhood, what we keep coming back to. \n", "\n", "## ... and for \"Subway\"\n", "\n", "The idea of scale factors taking us from one \"station stop\" to another within the Concentric Hierarchy jibes with the \"hypertoon\" concept: smooth transformations terminating in \"switch points\" from which other transformations also branch (a nodes and edges construct, like the polyhedrons themselves).\n", "\n", "Successive applications of both S and Syn3 take us to \"station stops\" along the \"S train\" e.g. \n", "\n", "$$SmallGuy \\rightarrow S^2 \\rightarrow icosa \\rightarrow S \\rightarrow cubocta \\rightarrow Syn3 \\rightarrow RT$$ \n", "\n", "and so on. Bigger and bigger (or other way). \n", "\n", "Remember Syn3? That's also our $IVM \\Leftrightarrow XYZ$ conversion constant. Yet here we're not using it that way, as we're staying in tetravolumes the whole time. \n", "\n", "However, what's so is the ratio between the volume of the cube of edges R and the volume of the tetrahedron of edges D (D = 2R) is the same as that between the RT and volume 20 cuboctahedron, where long diagonals of RT = edges of cubocta.\n", "\n", "\"Conversion\n", "
Cube edges = 1/2 x Tetrahedron edges;
Cube:Tetrahedron volume ratio = S3
\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "JB Icosa: 18.512295868219161196009899292654531923571426913640152615969\n", "JB Cubocta: 20.000000000000000000000000000000000000000000000000000000000\n", "SuperRT: 21.213203435596425732025330863145471178545078130654221097650\n" ] } ], "source": [ "Syn3 = gmpy2.sqrt(gmpy2.mpq(9,8))\n", "JB_icosa = SmallGuy * sfactor * sfactor\n", "print(\"JB Icosa: {:60.57}\".format(JB_icosa))\n", "JB_cubocta = JB_icosa * sfactor\n", "print(\"JB Cubocta: {:60.57}\".format(JB_cubocta))\n", "SuperRT = JB_cubocta * Syn3\n", "SuperRT # 20*S3\n", "print(\"SuperRT: {:60.57}\".format(SuperRT))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The SuperRT is the RT defined by the Jitterbug icosa (```JB_icosa```) and its dual, the Pentagonal Dodecahedron of tetravolume $3\\sqrt{2}(\\phi^2 + 1)$.\n", "\n", "The S train through the 2.5 cubocta, which stops at \"Icosa Within\" does not meet up with S train through 20 cubocta, which runs to SmallGuy. \n", "\n", "The 20 and 2.5 cubocta stations are linked by \"Double D express\" (halve or double all edge lengths). \n", "\n", "$$Cubocta 20 \\rightarrow DoubleD \\rightarrow Cubocta 2.5 \\rightarrow S^2 \\rightarrow Icosa Within \\rightarrow + 24 Smods \\rightarrow Octa4$$ \n", "\n", "The Phi Commuter does a lot of the heavy lifting, multiplying all edges by phi or 1/phi, as in the ...e6, e3, E, E3, E6... progression.\n", "\n", "Multiplying edges by x entails multiplying volume by $x^3$.\n", "\n", "Take Phi Commuter from SuperRT to the 120 E Mods RT (with radius R), get off and transfer to the T Mods RT (mind the gap of ~0.9994), then take the local to the 7.5 RT. \n", "\n", "The space-filling RD6 will be at the same corner (they share vertexes).\n", "\n", "\"The\n", "
RT of volume 7.5 and RD of volume 6
with shared vertexes (by David Koski using vZome)
\n", "\n", "\n", "The RD6's long diagonals make Octa4, your bridge to *Icosa Within* and the S line to the 2.5 cubocta.\n", "\n", "\n", "$$SuperRT \\rightarrow \\phi Commuter \\rightarrow Emod RT \\rightarrow Tmod RT \\rightarrow 3/2 \\rightarrow 7.5 RT \\rightarrow RD6 \\rightarrow Octa4$$ \n", "\n", "This kind of touring by scale factor and switching pathways is called \"taking subways around the neighborhood\" (i.e. Sesame Street).\n", "\n", "\"Sesame\n", "\n", "![subway system](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Xi%27an_Metro_Map.svg/1024px-Xi%27an_Metro_Map.svg.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's another one, derived by David Koski in early March, 2021:\n", "\n", "Icosa of (Octa4 - 24 S modules) $\\rightarrow$ S-factor down $\\rightarrow$ the volumetric difference between SuperRT and the Jitterbug Icosa (which latter inscribes in the former as long face diagonals)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "volume1: 2.700907567377264536015431570490939254973651217014068481681\n", "volume2: 2.700907567377264536015431570490939254973651217014068481681\n" ] } ], "source": [ "volume1 = SuperRT - JB_icosa\n", "volume2 = (4 - 24*Smod) * (1/sfactor)\n", "print(\"volume1: {:60.57}\".format(volume1))\n", "print(\"volume2: {:60.57}\".format(volume2))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Edged 1 Cubocta: 2.500000000000000000000000000000000000000000000000000000000\n" ] } ], "source": [ "# one more application of the 1/sfactor gives the 2.5 cubocta\n", "print(\"Edged 1 Cubocta: {:60.57}\".format(volume2 * (1/sfactor)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*For further reading:*\n", "\n", "* [Five Octahedrons in S* Module Volumes](CompoundFiveOctahedra.ipynb)\n", "* [this Notebook](http://nbviewer.jupyter.org/github/4dsolutions/Python5/blob/master/S_Train.ipynb) in nbviewer\n", "* [Sesame Street Song: The Subway!](https://youtu.be/mNBVTCJ9Dks)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" } }, "nbformat": 4, "nbformat_minor": 4 }