{ "cells": [ { "cell_type": "markdown", "id": "3f30e2f6", "metadata": {}, "source": [ "# Tutorial" ] }, { "cell_type": "code", "execution_count": 1, "id": "0e1c481e", "metadata": {}, "outputs": [], "source": [ "from pendsim import sim, controller, viz\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "b7749055", "metadata": {}, "source": [ "We import the simulation logic from `pendulum.sim`, any built-in controllers as well as the controller base class from `pendulum.controller`, and the visualizations are stored in `pendulum.viz`. " ] }, { "cell_type": "code", "execution_count": 2, "id": "c3bb27cd", "metadata": {}, "outputs": [], "source": [ "dt, t_final = 0.01, 5.0\n", "\n", "pend = sim.Pendulum(\n", " 2.0, # Large mass, 2.0 kg\n", " 1.0, # Small mass, 1.0 kg\n", " 2.0, # length of arm, 2.0 meter\n", " initial_state=np.array([0.0, 0.0, 0.1, 0.0]),\n", ")" ] }, { "cell_type": "markdown", "id": "1d7059ef", "metadata": {}, "source": [ "Every simulation begins at t=0 and runs for some period of time, measured in seconds. Each simulation has a timestep, usually denoted `dt`,which tells us how often the controller's `policy` is implemented. \n", "\n", "A pendulum is created by instantiating a new `Pendulum` class. This class takes three arguments, M, m, and l. So here, we have created a cart with mass 2kg, a pendulum with mass 1kg, and an arm length 2 m. We also pass in an optional `initial_state` which sets ``[x=0, xdot=0, theta=0.1, thetadot=0]``. So, we start off slightly tipped over." ] }, { "cell_type": "code", "execution_count": 3, "id": "e369aa01", "metadata": {}, "outputs": [], "source": [ "cont = controller.NoController()" ] }, { "cell_type": "markdown", "id": "8f2db468", "metadata": {}, "source": [ "We just set the controller to be a basic controller. It will read the state and will do nothing every timestep. We need to provide a controller every time we run the simulation, even if it does nothing like this one. " ] }, { "cell_type": "code", "execution_count": 4, "id": "25ab0b83", "metadata": {}, "outputs": [], "source": [ "simu = sim.Simulation(dt, t_final, lambda t: 0)" ] }, { "cell_type": "markdown", "id": "1f961613", "metadata": {}, "source": [ "We create a simulation, with timestep `dt`, final time `t_final`, and an external force function of `lambda t: 0`, which basically just returns 0 external force for every time value `t`." ] }, { "cell_type": "code", "execution_count": 5, "id": "0be15e2b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████████| 500/500 [00:00<00:00, 4870.54it/s]\n" ] } ], "source": [ "results = simu.simulate(pend, cont)" ] }, { "cell_type": "markdown", "id": "de6845b2", "metadata": {}, "source": [ "Calling `simulate` on the simulation object actually runs the simulation. `simulate` takes 2 arguments, a pendulum object and a controller object. The results of the simulation are stored into a dataframe, results." ] }, { "cell_type": "code", "execution_count": 6, "id": "6ba51989", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MultiIndex([( 'state', 'x'),\n", " ( 'state', 'xd'),\n", " ( 'state', 't'),\n", " ( 'state', 'td'),\n", " ( 'energy', 'kinetic'),\n", " ( 'energy', 'potential'),\n", " ( 'energy', 'total'),\n", " ( 'forces', 'forces'),\n", " ('control action', 'control action'),\n", " ( 'forces', 'pRx'),\n", " ( 'forces', 'pRy'),\n", " ( 'forces', 'pG'),\n", " ( 'forces', 'cRy'),\n", " ( 'forces', 'cRx'),\n", " ( 'forces', 'cG'),\n", " ( 'forces', 'cN')],\n", " )\n" ] } ], "source": [ "print(results.columns)" ] }, { "cell_type": "markdown", "id": "0a898155", "metadata": {}, "source": [ "So let's see what data we got back. Because there are 4 different states, we have a multi-index with two levels. This allows us to group quantities together to more easily slice and dice the results we get. Often, we see `x`, `xd`, `t`, `td` grouped together as subquantities, because they are our state vectors." ] }, { "cell_type": "code", "execution_count": 7, "id": "40579b04", "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'Time [s]')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(nrows=4, sharex=True)\n", "state_labels = [\"x\", \"xd\", \"t\", \"td\"]\n", "for i, s in enumerate(state_labels):\n", " ax[i].plot(results[(\"state\", s)], label=\"state\")\n", "ax[0].set_ylabel(r\"$x$ [m]\")\n", "ax[1].set_ylabel(r\"$\\dot x$ [m/s]\")\n", "ax[2].set_ylabel(r\"$\\theta$ [rad]\")\n", "ax[3].set_ylabel(r\"$\\dot\\theta$ [rad/s]\")\n", "ax[3].set_xlabel(\"Time [s]\")" ] }, { "cell_type": "markdown", "id": "57821fbf", "metadata": {}, "source": [ "We can see some results of the simulation. It looks like our positive initial $\\theta$ value caused the pendulum to tip over and just about swing completely back up." ] }, { "cell_type": "code", "execution_count": 8, "id": "1f786f1f", "metadata": {}, "outputs": [], "source": [ "visu = viz.Visualizer(results, pend, dt=dt, speed=1)" ] }, { "cell_type": "markdown", "id": "2c18ed4f", "metadata": {}, "source": [ "We can confirm this by creating a vizualizer using the `Visualizer` class. We instantiate it with the same `pend` object, and the results from our simulation." ] }, { "cell_type": "code", "execution_count": 9, "id": "491b106d", "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmIAAAGGCAYAAADYa+3vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAZfklEQVR4nO3dfWzV9R3o8c8pjgJSSpAAIz08Vaf4wJjoGA4RvIqQRcWbMTWbE4MuKhJdk6uiN/MhLjXqNowGhnebGInDqMGHDI3kqsB8mMJkcz4GJ5ZRUbqHFug8jHLuH4u9YzzT/vrtaV+v5Pxxzvn19/2QA+Td3+/XX3PFYrEYAAB0uLLUAwAAdFdCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEjkg9wP7s2rUr6uvro6KiInK5XOpxAAAOSrFYjK1bt8bQoUOjrGzfx706dYjV19dHPp9PPQYAwGHZuHFjVFVV7fP9Th1iFRUVEfHvP0S/fv0STwMAcHCampoin8+3tsy+dOoQ++J0ZL9+/YQYAFByDnRplYv1AQASEWIAAIkIMQCARIQYAEAiQgwAIBEhBgCQiBADAEgk0xBbuHBhjBkzpvU+YBMmTIhnn302yyUBAEpGpiFWVVUVd955Z6xZsybWrFkTZ555Zpx//vnx9ttvZ7ksAEBJyBWLxWJHLjhgwIC4++67Y/bs2QfctqmpKSorK6OxsdGd9QGAknGwDdNhv+KopaUlHnvssdi+fXtMmDCho5YFAOi0Mg+xt956KyZMmBCff/559O3bN5YtWxbHH3/8XrctFApRKBRanzc1NWU9HgBAMpn/1OSxxx4b69ati9deey2uuuqquPTSS+Odd97Z67a1tbVRWVnZ+sjn81mPBwCQTIdfI3bWWWdFdXV1LFq0aI/39nZELJ/Pu0YMACgpne4asS8Ui8XdYus/lZeXR3l5eQdPBACQRqYhdtNNN8X06dMjn8/H1q1bY+nSpfHSSy/Fc889l+WyAAAlIdMQ+/TTT+OSSy6JTz75JCorK2PMmDHx3HPPxdlnn53lsgAAJSHTEPvlL3+Z5e4BAEqa3zUJAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJBIpiFWW1sbp556alRUVMSgQYNixowZ8f7772e5JABAycg0xFauXBlz5syJ1157LVasWBE7d+6MqVOnxvbt27NcFgCgJOSKxWKxoxbbsmVLDBo0KFauXBmTJk064PZNTU1RWVkZjY2N0a9fvw6YEACg7Q62YY7owJmisbExIiIGDBiw1/cLhUIUCoXW501NTR0yFwBACh12sX6xWIyampqYOHFinHjiiXvdpra2NiorK1sf+Xy+o8YDAOhwHXZqcs6cOfGb3/wmfvvb30ZVVdVet9nbEbF8Pu/UJABQUjrVqcm5c+fG008/HatWrdpnhEVElJeXR3l5eUeMBACQXKYhViwWY+7cubFs2bJ46aWXYuTIkVkuBwBQUjINsTlz5sQjjzwSTz31VFRUVMTmzZsjIqKysjJ69+6d5dIAAJ1epteI5XK5vb7+4IMPxqxZsw749W5fAQCUok5xjVgH3qIMAKDk+F2TAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEsk0xFatWhXnnntuDB06NHK5XDz55JNZLgcAUFIyDbHt27fHV7/61bj//vuzXAYAoCQdkeXOp0+fHtOnT89yCQAOQ3Nzc2zatCmOOeaY1KNAt5ZpiB2qQqEQhUKh9XlTU1PCaQC6pubm5jh28MT4x782xGtrV8cJJ5yQeiTotjrVxfq1tbVRWVnZ+sjn86lHAuhSmpubo3rgxPjLtjdjW2Gnb3ghsU4VYvPmzYvGxsbWx8aNG1OPBNBlfBFhm//5ZkRUxAvPPhUTJkxIPRZ0a53q1GR5eXmUl5enHgOgy9lbhE2ZNiX1WNDtdaojYgC0PxEGnVemR8S2bdsW69evb33+0Ucfxbp162LAgAExbNiwLJcGIEQYdHaZhtiaNWtiypT//w++pqYmIiIuvfTSWLx4cZZLA3R7Igw6v0xDbPLkyVEsFrNcAoC9EGFQGlwjBtDFiDAoHUIMoAsRYVBahBhAFyHCoPQIMYAuQIRBaRJiACVOhEHpEmIAJUyEQWkTYgAlSoRB6RNiACVIhEHXIMQASowIg65DiAGUEBEGXYsQAygRIgy6HiEGUAJEGHRNQgygkxNh0HUJMYBOTIRB1ybEADopEQZdnxAD6IREGHQPQgygkxFh0H0IMYBORIRB9yLEADoJEQbdjxAD6AREGHRPQgwgMREG3ZcQA0hIhEH3dkTqAQD2pq6uLhoaGlKPkal//vOf8T//xzXxWWFdiDDonoQY0OnU1dXF6NGjo7m5OfUomaqM46Ix3ouIiqjoGVF9fHXqkYAOJsSATqehoSGam5tjyZIlMXr06NTjtLv/PhL2v//XtXHH3XdEQ0NDDBs2LPV4QAcSYkCnNXr06Dj55JNTj9Guvrgm7D9PR1YOqow77r4j9WhAAi7WB+ggLswH/psQA+gAIgzYGyEGkDERBuyLEAPIkAgD9keIAWREhAEHIsQAMiDCgIMhxADamQgDDpYQA2hHIgw4FEIMoJ2IMOBQCTGAdiDCgMMhxADaSIQBh0uIAbSBCAPaQogBHCYRBrSVEAM4DCIMaA9CDOAQiTCgvRyRegCA1P71r3/FO++8E5s3b45cLhfDhw+PY445JsrK9vxeVYQB7UmIAd1SS0tLLF++PBYuXBgvvPBCFAqF3d6vqKiIc889N66++ur45je/GREiDGh/Tk0C3c4HH3wQZ5xxRpx33nnx2WefRW1tbaxevTo+/vjj2LBhQ6xYsSKuv/76eP3112PixInxne98Jz7++GMRBrQ7R8SAbuX555+PCy64IL785S/HCy+8EFOm7BlTw4cPj7POOituuummWLp0acydOzfGjpge/4h3Q4QB7ckRMaDbePXVV+P888+PyZMnxx/+8Ie9Rth/KisrixkzZsSXmoe3RtjSh/6PCAPajRADuoXm5ua45JJLYuzYsfHEE0/EkUceeVBfUz1wYnz6+b9PR375qIr45ZJfRrFYzH5goFtwahLoFu66667YtGlTLF++PHr16nXA7fd2YX4hCjF9+vR4/PHHY+bMmdkPDXR5HXJEbMGCBTFy5Mjo1atXjBs3LlavXt0RywJERMSOHTti0aJFMXv27PjKV75ywO339dOR06ZNizPOOCPuv//+7IcGuoXMQ+zRRx+N6667Lm6++eZ488034/TTT4/p06dHXV1d1ksDRETEypUrY/PmzXHFFVcccNsD3aLiBz/4QaxatSo2bdqU4cRAd5F5iP30pz+N2bNnx+WXXx6jR4+O+fPnRz6fj4ULF2a9NEBERKxZsyb69esXJ5100n63O5j7hJ1++ukREbF27dqsxgW6kUyvEduxY0esXbs2brzxxt1enzp1arzyyit7bF8oFHa7qWJTU1OW4wGd3Lvvvtsu+3n11VfjuOOO2+ud8r/Q3NwcJ+UPfJ+wqqqqqKioiBdeeCGqqqraZb72+nMCpSfTEGtoaIiWlpYYPHjwbq8PHjw4Nm/evMf2tbW1cdttt+319YO5uBboGv7xj39Ez54943vf+1677fO0007b7/svv/xyfPS3P0Qu+sb/3c99wnK5XPTo0SPuvffeuPfee9ttvp49e8bDDz8czzzzTLvtE0jn888/P6jtOuSnJnO53G7Pi8XiHq9FRMybNy9qampanzc1NUU+n898PqBz6d+/f1x99dXR3NzcLvt7+eWXY8uWLfvd5uyzz45fL30k8vn8fqOtUCjEtm3bYuLEiXH88ce3y3wREX369In+/fu32/6A0pBpiA0cODB69Oixx9Gvzz77bI+jZBER5eXlUV5enuVIQIno379/u4VJdXV1PPPMM7Ft27bo27fvPre78MILD7ivt956K3bu3BnHHntsDB06tF3mA7qvTC/W79mzZ4wbNy5WrFix2+srVqw44GkCgPYyfPjwKBaL8fTTT7d5X8uWLYvevXvHkCFD2mEyoLvL/Kcma2pq4he/+EX86le/infffTd++MMfRl1dXVx55ZVZLw0QERFHHXVUjBo1KubPn9+mu+Jv27YtHnjggTjppJPiS1/6UjtOCHRXmYfYhRdeGPPnz4/bb789xo4dG6tWrYrly5fH8OHDs14aoNXEiRPjjTfeiEWLFh32Pm644YZoamqKb3zjG+04GdCddcid9a+++urYsGFDFAqFWLt2bUyaNKkjlgVoNWrUqBg3blzU1NTEyy+/fMhfv2TJkliwYEGceeaZMWDAgAwmBLojv/Qb6DbOOeecGDJkSEydOjWWLl16UKcpW1pa4q677orvf//7MXbs2Pj617/eAZMC3YUQA7qNnj17xsUXXxyjRo2Kiy++OM4777xYvXr1XoNs586d8dRTT8WECRPixhtvjNNOOy3OO++8/d4UFuBQdch9xAA6i549e8a3v/3tGD16dLz44osxadKkGDp0aJx66qkxYsSI2LVrV3zwwQfx+uuvx9///vfI5/Nx2WWXxbBhw1KPDnRBQgzolk444YQYPXp0fPTRR/Hhhx/GW2+9Fb/73e8il8tFRUVFjBkzxr3CgMwJMaDbKisri+rq6qiurk49CtBNudgBACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIJNMQ+/GPfxynnXZa9OnTJ/r375/lUgAAJSfTENuxY0fMnDkzrrrqqiyXAQAoSUdkufPbbrstIiIWL16c5TIAACXJNWIAAIlkekTsUBUKhSgUCq3Pm5qaEk4DAJCtQz4iduutt0Yul9vvY82aNYc1TG1tbVRWVrY+8vn8Ye0HAKAUHPIRsWuuuSYuuuii/W4zYsSIwxpm3rx5UVNT0/q8qalJjAEAXdYhh9jAgQNj4MCBWcwS5eXlUV5ensm+AQA6m0yvEaurq4u//e1vUVdXFy0tLbFu3bqIiDj66KOjb9++WS4NANDpZRpiP/rRj+Khhx5qff61r30tIiJefPHFmDx5cpZLAwB0epnevmLx4sVRLBb3eIgwAAD3EQMASEaIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJCIEAMASESIAQAkIsQAABIRYgAAiQgxAIBEhBgAQCJCDAAgESEGAJBIZiG2YcOGmD17dowcOTJ69+4d1dXVccstt8SOHTuyWhIAoKQckdWO33vvvdi1a1csWrQojj766PjTn/4UV1xxRWzfvj3uueeerJYFACgZmYXYtGnTYtq0aa3PR40aFe+//34sXLhQiAEARAdfI9bY2BgDBgzoyCUBADqtzI6I/bcPP/ww7rvvvvjJT36yz20KhUIUCoXW501NTR0xGgBAEod8ROzWW2+NXC6338eaNWt2+5r6+vqYNm1azJw5My6//PJ97ru2tjYqKytbH/l8/tD/RAAAJSJXLBaLh/IFDQ0N0dDQsN9tRowYEb169YqIf0fYlClTYvz48bF48eIoK9t3++3tiFg+n48bb7yxdX8AAJ3d559/HnfeeWc0NjZGv3799rndIZ+aHDhwYAwcOPCgtt20aVNMmTIlxo0bFw8++OB+Iywiory8PMrLyw91JACAkpTZNWL19fUxefLkGDZsWNxzzz2xZcuW1veGDBmS1bIAACUjsxB7/vnnY/369bF+/fqoqqra7b1DPBsKANAlZXb7ilmzZkWxWNzrAwAAv2sSACAZIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACQixAAAEhFiAACJCDEAgESEGABAIkIMACARIQYAkIgQAwBIRIgBACRyROoB9qdYLEZERKFQSDwJAMDB+6JdvmiZfckVD7RFQn/5y18in8+nHgMA4LBs3Lgxqqqq9vl+pw6xXbt2RX19fVRUVEQul0s9ziFramqKfD4fGzdujH79+qUeh3bic+26fLZdk8+16+rMn22xWIytW7fG0KFDo6xs31eCdepTk2VlZfutyFLRr1+/TvcXhLbzuXZdPtuuyefadXXWz7aysvKA27hYHwAgESEGAJCIEMtQeXl53HLLLVFeXp56FNqRz7Xr8tl2TT7XrqsrfLad+mJ9AICuzBExAIBEhBgAQCJCDAAgESEGAJCIEOtghUIhxo4dG7lcLtatW5d6HNpow4YNMXv27Bg5cmT07t07qqur45ZbbokdO3akHo1DtGDBghg5cmT06tUrxo0bF6tXr049Em1UW1sbp556alRUVMSgQYNixowZ8f7776cei3ZWW1sbuVwurrvuutSjHBYh1sGuv/76GDp0aOoxaCfvvfde7Nq1KxYtWhRvv/12/OxnP4uf//zncdNNN6UejUPw6KOPxnXXXRc333xzvPnmm3H66afH9OnTo66uLvVotMHKlStjzpw58dprr8WKFSti586dMXXq1Ni+fXvq0Wgnb7zxRjzwwAMxZsyY1KMcNrev6EDPPvts1NTUxBNPPBEnnHBCvPnmmzF27NjUY9HO7r777li4cGH8+c9/Tj0KB2n8+PFx8sknx8KFC1tfGz16dMyYMSNqa2sTTkZ72rJlSwwaNChWrlwZkyZNSj0ObbRt27Y4+eSTY8GCBXHHHXfE2LFjY/78+anHOmSOiHWQTz/9NK644op4+OGHo0+fPqnHIUONjY0xYMCA1GNwkHbs2BFr166NqVOn7vb61KlT45VXXkk0FVlobGyMiPDvs4uYM2dOfOtb34qzzjor9Sht0ql/6XdXUSwWY9asWXHllVfGKaecEhs2bEg9Ehn58MMP47777ouf/OQnqUfhIDU0NERLS0sMHjx4t9cHDx4cmzdvTjQV7a1YLEZNTU1MnDgxTjzxxNTj0EZLly6N3//+9/HGG2+kHqXNHBFrg1tvvTVyudx+H2vWrIn77rsvmpqaYt68ealH5iAd7Gf7n+rr62PatGkxc+bMuPzyyxNNzuHK5XK7PS8Wi3u8Rum65ppr4o9//GP8+te/Tj0KbbRx48a49tprY8mSJdGrV6/U47SZa8TaoKGhIRoaGva7zYgRI+Kiiy6KZ555Zrf/1FtaWqJHjx7x3e9+Nx566KGsR+UQHexn+8V/AvX19TFlypQYP358LF68OMrKfI9TKnbs2BF9+vSJxx57LC644ILW16+99tpYt25drFy5MuF0tIe5c+fGk08+GatWrYqRI0emHoc2evLJJ+OCCy6IHj16tL7W0tISuVwuysrKolAo7PZeZyfEOkBdXV00NTW1Pq+vr49zzjknHn/88Rg/fnxUVVUlnI622rRpU0yZMiXGjRsXS5YsKan/APi38ePHx7hx42LBggWtrx1//PFx/vnnu1i/hBWLxZg7d24sW7YsXnrppTjmmGNSj0Q72Lp1a3z88ce7vXbZZZfFcccdFzfccEPJnXp2jVgHGDZs2G7P+/btGxER1dXVIqzE1dfXx+TJk2PYsGFxzz33xJYtW1rfGzJkSMLJOBQ1NTVxySWXxCmnnBITJkyIBx54IOrq6uLKK69MPRptMGfOnHjkkUfiqaeeioqKitZr/iorK6N3796Jp+NwVVRU7BFbRx55ZBx11FElF2ERQgza5Pnnn4/169fH+vXr94hqB5tLx4UXXhh//etf4/bbb49PPvkkTjzxxFi+fHkMHz489Wi0wRe3I5k8efJurz/44IMxa9asjh8I9sKpSQCARFxRDACQiBADAEhEiAEAJCLEAAASEWIAAIkIMQCARIQYAEAiQgwAIBEhBgCQiBADAEhEiAEAJCLEAAAS+X9ZoL+9i5FF7AAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ani = visu.animate()" ] }, { "cell_type": "markdown", "id": "4022dd97", "metadata": {}, "source": [ "We can animate the figure by calling the `Visualizer`'s `animate` function. Importantly, we must bind the result of that function to a variable, `ani`, because the animation plays as long as that variable exists. If we just call `visu.animate()` without storing the result in a varialbe, the animation will only exist long enough to be created and then immediately destroyed. \n", "\n", "So, just bind your animations to variables." ] }, { "cell_type": "markdown", "id": "0f7fae04", "metadata": {}, "source": [ "In order to display properly in notebooks, it sometimes may be necessarily to convert the generated animation to an HTML5 video:" ] }, { "cell_type": "code", "execution_count": 10, "id": "af35fae4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "HTML(ani.to_html5_video())" ] } ], "metadata": { "kernelspec": { "display_name": "newenv", "language": "python", "name": "newenv" }, "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.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }