{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mon Nov 20 15:21:48 2017\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "print(time.ctime())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<sub>Bei diesem IPython-Notebook handelt es sich um eine Beispiel-Rechnung als Ergänzung zur Dissertationsschrift von C. Knoll. Allgemeine Hinweise zu den Beispielen sind in der [readme.md-Datei des entsprechenden Repositoriums](https://github.com/cknoll/beispiele/blob/master/readme.md) zu finden.</sub>\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Betrachtetes System**: aktuiertes Pendel, dessen Aufhängepunkt an einem horizontal verschieblichen Wagen hängt, der elastisch mit einem aktuierten Wagen verbunden ist.\n",
    "\n",
    "\n",
    "Bild stimmt nicht mehr!!\n",
    "\n",
    "<img src=\"files/images/pendel_wagen_feder_wagen.png\">\n",
    "\n",
    "**Betrachtete Aspekte**:\n",
    "\n",
    "* Ist das System statisch Eingangs-Zustands-Linearisierbar.\n",
    "  * Wenn ja, wie sieht ein entsprechender linearisierender Ausgang aus?\n",
    "\n",
    "* Wie ist die Situation, wenn ein \"intuitiver\" flacher Ausgang (Absolutkoordinaten des Pendelschwerpunkts) untersucht wird?\n",
    "\n",
    "* Flachheitsbasierte Trajektorienplanung\n",
    "\n",
    "\n",
    "[//]: # (custom_config_start)\n",
    "$$\n",
    "\\newcommand{\\col}{\\mathrm{col}}\n",
    "\\newcommand{\\bs}{\\boldsymbol}\n",
    "\\newcommand{\\y}{\\bs y}\n",
    "\\newcommand{\\nx}{n_{\\boldsymbol x}}\n",
    "\\newcommand{\\Ddt}{\\left(\\tfrac{d}{dt}\\right)}\n",
    "$$\n",
    "[//]: # (custom_config_end)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext ipydex.displaytools\n",
    "%matplotlib inline\n",
    "\n",
    "import sympy as sp\n",
    "from sympy import sin, cos, pi\n",
    "from sympy.interactive import printing\n",
    "import symbtools as st\n",
    "import scipy.integrate as sc_integrate\n",
    "import matplotlib.pyplot as pl\n",
    "\n",
    "import symbtools.modeltools as mt\n",
    "\n",
    "\n",
    "printing.init_printing(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAZBAMAAAB6LZWoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iiWZ2EETvq82Z\nVDJF77rnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABC0lEQVQoFWMQUjJgwAM4lFQYFPDIg6WshqkS\nk7CyBjS/M7umZ0CEwJ7mmMywvgBNSacB13ckJZUBDKsZ+DYgK2KfysC1geXgcaAY2JTzDAxT+E4p\nICvh+cDA6eAM1AlVMpGB+QcDL4oSTgEG+wZlhvfA+AOZwv6FgfUDmpJ6B4Z4Bg2gMqiSvwyMG9CV\nXGCQBlpyH+gLsFu2McQ7oCnhTmD9AlSiBsRgJVVp9xvQlLAvy/3BwMByAKaEAWgvmhIGkPMYYoAq\nIKYwgDyH6iMGYLAwcDhwPIArmQJUMgGkBQE4HRhe370Icy6D96cDzId+JSDkgc7Yr8Mw//9/oBDY\nuchSmGxqKVEilI+0AMtTPuYh/ishAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\texttt{ttheta.T} := \\left[\\begin{matrix}q_{1} & q_{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "ttheta.T := [q₁  q₂]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAZBAMAAAB6LZWoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iEM2riWZ2RO+Z\nVDKhftUhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABJElEQVQoFWMQUjJgwAO4lNQZFPDIg6XMqKnE\nPwDDOpavUCGoRUwJGEoY1FCVYCpAiBDtXPNOzwUIbWAWc8WUWRAhsClcmxnyHdCUrDZg+4KkxLuB\nIZWBD8VTLDsY2ALYDx4BqgKbcp6BYTvfMQVkc3g+MHAXFAN1QpVsZGD+xcCLooRbgMF+gTLDe2D8\ngUxh+c7A8QFNiX8BQz+DFlAZVMlfBsYAdCUXGESBltx3gFoUydBfgKaEdQLHd6ASTSAGO9dt5v0F\naEpYMuf+YmBgPwBTwgC0F00JA8h5DD1AFRBTGECeQ/URAzBYGLgKuB7AlWwHKtkA0oIA3AUMT+9e\ndIApKf10gPnQtwkIeaAz4nUY9v//DxQCOxdZCpNNLSVKhPKRGgBuSkDnWrJ6RAAAAABJRU5ErkJg\ngg==\n",
      "text/latex": [
       "$$\\texttt{tthetad.T} := \\left[\\begin{matrix}\\dot{q}_{1} & \\dot{q}_{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "tthetad.T := [q̇₁  q̇₂]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAZBAMAAAB6LZWoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90imYlmdhBE76vN\nVDLrfj8uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABHElEQVQoFWMQUjJgwAM4lVQZFPDIg6WsqajE\nicEJwzq4GMQiJ4YgLEqgYtR0i2l6+wQ0m5jDKiohQmCLOBcz7G9AUzLLgPsHkpKuBIY9DHwHkBVx\nLGPgPsDq6AEUA5viz8CwlM9bAVkJywcGroBgoE6okoUMzD8ZeFGUcAkw2E9QZngPjD+QKRxfGdg+\noCnpD2DIZ9AEKoMq+cvAeABdyQUGGaAl9xugFh1nyA9AU8JTwPYVqEQdiMHO7S6/PwFNCcf22p8M\nDKwOMCUMQHvRlDCAnMeQAlQBMYUB5DlUHzEAg4WBM4DzAVzJUqCSBSAtCMAVwPDm7sUGmJKYTw7M\nTr8LEPJAZ5xXYVj//z9QCOxcZClMNrWUKBHKR9oA6QpA/GlcEr0AAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\texttt{tthetadd.T} := \\left[\\begin{matrix}\\ddot{q}_{1} & \\ddot{q}_{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "tthetadd.T := [q̈₁  q̈₂]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    }
   ],
   "source": [
    "t = sp.Symbol('t')\n",
    "np = 0\n",
    "nq = 2\n",
    "n = np + nq\n",
    "pp = st.symb_vector(\"p1:{0}\".format(np+1))\n",
    "qq = st.symb_vector(\"q1:{0}\".format(nq+1))\n",
    "\n",
    "aa = st.symb_vector(\"a1:{0}\".format(nq+1))\n",
    "\n",
    "ttheta = st.row_stack(pp, qq) ##:T\n",
    "tthetad = st.time_deriv(ttheta, ttheta) ##:T\n",
    "tthetadd = st.time_deriv(ttheta, ttheta, order=2) ##:T\n",
    "st.make_global(ttheta, tthetad, tthetadd)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "params = sp.symbols('s3, m2, m3, g')\n",
    "st.make_global(params)\n",
    "\n",
    "tau1, tau2 = ttau = st.symb_vector(\"tau1, tau2\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Festlegung der Geometrie des mechanischen Systemes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI4AAAAyBAMAAAB42/41AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhAiZnZEq82Z\nu90eBEZ7AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD40lEQVRIDe1XSWgUQRR9M+nucTKL4i4oNh40\nasAJXryoESKIETKKB1EkHUG8uAweJKDgoKhRBFvxLB5cieiAIi4HB8GLIMaDCi44IAQFlxjXiLF9\nVZ1M13SHOG1ytKC6/6/6/83/v5bXg5lOL0baFjifMKFp+UhhsLapARP/BWWL5xSzhLysahxtqudr\ndHkyzoXEUcqYsBScDeFwFE/sUZVonlr1eamu3aqijwuFYzSVnY1SWRTCTXY3HmPOgcMVU65Sd6jR\nFbRD7YVtP9E8fcWRPEfGFPnY1L7O5outnt3FOW7VfkWzHFQeCTtVRN39LLARKOEW8D5vfKNBKgfE\nJ+NKtv4FJ7GbXeLoU1BbWHVZgZDiDmjZZC7ZBRzPIo9nwCPgO6fSGWB1Dp1Rq7ZAdQm7xEn2IGJK\nFdjwQbRrnELrdBtJM9ZDx/6DEDjPgR+ciNjAQ2B82tJEeC3sEifShR32AA7HBlv8VT9FEY8+3ykK\nnJcezgwYfWnb6KNFGafVxF43vEEI8TYy+jGLCTQCmxHrU3CYl94LEWjNVxqeYpfxtGZExCJNtSXG\nYSzX5gbHFgHnFRzWWf+MVIEJ5zlbrnMiH+Om9+OkLHTQSuTVkMUTkdRAXtEicAN7TXfJcZdW7npd\n2M88/ThGR3uGFsZn4ET7Tnulc3alc2bxp9Nc8xKwvmOpjViRBhCLInEgc/XjCBNWxxAr7WvyXLCk\nJ3CSP1Ti7ACO2AcNPmOppq0xk4Lj8px2Qru68DGgntOIia0fLwQdoNXNs4LDLB23DyKO08MdJ+bd\neKJ33gml6ibusfm/i679E/EayMsdqf45gnt1+B/5x3gCoP9xuHFzXll2eaKUwtRnm+JbaykKxTA4\n1xVXnQdJbSFw3MM96Fw3KLjvEDhpS3VdrSqh8tpe4ZmwK9RAPGXug363PoM1HXMhWJBOR9k9whR3\notL8OB73oS2jTda6kcpvFCwIPGUXhBl9cI9SrLLQfhyP+3AbNV/SJrQvkgWB1+QfQZiz0UmcmhIf\nXvPjeNyn/6JVSwbolSwITOOdLwizGy0WoPV4IJT8OB73xQVz8i5Hv2RBiSMJ860gzb/gKNxXjueX\nZEGZV6skTCzNupyhROSLR+E+1gc1kSLifZIFZZ1dwsQbAgxfZ4X70JbDbG0iEqZkQcl5LmHKJU+a\nSjSB+ijcB/3SPgtbZ12ULEinU1wvSZiSdRKNw+HIuaG5D/Jc8OMgbsaJUbm7A+slgIbmPpeESZjN\nCxezzlWc06G5D/xU4CeUiZmOwwwLVJTmWy9lJijyHisTpmRUxSQMzmjdq8rPB8Rlo/a/aZT+x/0B\nggkSb55v1HYAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\texttt{S3} := \\left[\\begin{matrix}q_{1} - s_{3} \\sin{\\left (q_{2} \\right )}\\\\s_{3} \\cos{\\left (q_{2} \\right )}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "S3 := ⎡q₁ - s₃⋅sin(q₂)⎤\n",
       "⎢               ⎥\n",
       "⎣  s₃⋅cos(q₂)   ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAyBAMAAABWsh3iAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhDN3asiZnZE\nmbs5ao2tAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABCklEQVQoFWOQ//+JAQaY/v8XYBB2cYXxGVhd\nnAUYROBcEIMFlwDrN6g6uIoKdAEoH6cZnFpb90DUQM04OIHjK4MbSAgiwCrFwJHg244Q4P3AwKjA\nYI4QYHzAMP8AskC8AsN6BhQBA4ZnKAJsG7iAQYBkBmv35j8oAgwMXB/QBDgSGBgMEdYyMDAqMMyt\n7waKQJ3OlF8LkgYCeHhAuHQXYL20yAFkNdwdbAaslSgCCxkY1FAEXjAw2Acga/nBwHDeAEmA9S9Q\nYAOSACcwCP0VkAWAKlAEMLQwAA21RzaU4R0Dw3oUa4EOuwY0E+F0dgNWcHKE+4VVe4cDigoQBwTg\nKiBcqglgZA/0DAQAA4w9aU6O4DgAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}\\dot{q}_{1}\\\\0\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡q̇₁⎤\n",
       "⎢   ⎥\n",
       "⎣ 0 ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAyBAMAAADCeHZVAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhDN3asiZnZE\nmbs5ao2tAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEg0lEQVRYCe1XXWgcVRT+djKzk0l211DrQ9Xa\nxYfSNga29MEHoQ2ahoJINj4UodCsWIqlhQZ80OBfH2xEq7hVpKA0WUQECdK1RdGsxW0p+CZLoSAi\nNT4oVqhu09a/phm/e2fm3rvTWdqw6ZsHZuac75z77blz595zFmv8eSyfWL7fhzuHti4fI5yhR/qw\nsjNCr6LHfyxUu2PKKc2I7rJB6fxpeJSajCq3VPYYplOiobJ8zvBoNRnVfqCnYVr9NBSl6ViK7oq5\nKhml1jHlEUUnlHRdUXobPvuKSEw0atU+DH3O2YECHq89AHt2pkTspMDfntlRF09YfA1hlqfK3Vcx\nLFHjJlDr/Dki+3AR1smD1A4X7FX2BHLVncA47d94ZVbhreLAxSLfbCmidO5Gd+mxV+k1RaLrMQl4\nTWzF9zhP7250XXHzsK+cKqJK+xleoxVMWuXuEtDFXwmyzDaRyuNBeoHtzwrZRU2iExgpw7n0A3AW\nxwDnOh0jBWDeXfxShN/L60dghVu2/yFdM6JMzWG6HlKKuEAk+oLw4Ft/jhizzFzjcwuRRWet36Au\nKO+Dt+DWvQWTciwvMgiyZEgoAYotRbyDHUzB4dZVWV5/Fz3kEBN35tHD7Lqu8hfHoyzHCvglgVKi\neB54EuCYz6uk2M2xqQYyCw8Br9Pm8jiXkSsBLt16edLVHh5w8SwDVHwXF9Ar6MTyHK5gvb0S6fzG\nImFggNdeHMsHWpbPYHmcQyc4iThlgH7CMe/PnuAd0wWm9ObxMo7e/wZOz3xQJ/YNrydqfLtyZ6YH\nI0pm3LyRUqKZfIZhFL7J6YrUWm7BhuRKnMYZ4Ah94afOzxLY2BIrDKLDmzYXA3wCn4aaGRccG5Ow\nn9r0M2AeG6k8jr58yIwVeiqPNb4vNMrDx18LlNa7eKFYgZTvN+GUqIdZWvtfFJ6YJKOxoCnaa/9q\nSDRX5iOaeCxuCeZtKBQ3/HrnWf5PGb2BDt7lexEHd5n4eCJZGqV9TzSOJ/2c1mFugnaUYyVjgFJt\noyFLm5ltVyHtP3X3gBGUqIoTSolVVWoHu2dCk/CY6tNWu4nrCFPzhpTljStVKPu01YZS1Xr0zw4G\n0aIVmPobw6sf/ULMsrfBmw4Th3soyZS61qfruQb6vysCO0Ur8DTwUtVjaUOuYrYE+CgibLc8utZP\nwy5mK9k5QLYCvwI/Af9yvFswWwKzyLRmGbUFutaPra4jmxdlRLYCpGQpvUbKVN1sCTBCKJRWygjV\ntT7zxyJBkaVsBUj5u6bUYTel1LXeKzhflznDQUC2ApqSE9dhQaEME0rMUtf6dB/u4OruZbRsBTQl\nl0eH4ebLo2o9i0mNdGLishXgrMOJWw2zJWAPpiQxS13rvdoMVxbeZdZptgLb/IPb/Fc2XzoQdD+6\nJcAuxdh2Q0a1XkSODnris4mJ3JBRmLmXkrME+9Sg1gset9x7V4yPpjw2orBbOTbCWi+Z7P51XPW4\n8DWrlgC3cLhFtT7OY9jiCFZhsuUIne0mboxtpy5PoWjH3oIzy9vw53n5/+L/B7uJXEXY1V2BAAAA\nAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}\\dot{q}_{1} - \\dot{q}_{2} s_{3} \\cos{\\left (q_{2} \\right )}\\\\- \\dot{q}_{2} s_{3} \\sin{\\left (q_{2} \\right )}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡q̇₁ - q̇₂⋅s₃⋅cos(q₂)⎤\n",
       "⎢                    ⎥\n",
       "⎣  -q̇₂⋅s₃⋅sin(q₂)   ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    }
   ],
   "source": [
    "#Einheitsvektoren\n",
    "\n",
    "ex = sp.Matrix([1,0])\n",
    "ey = sp.Matrix([0,1])\n",
    "\n",
    "\n",
    "# Koordinaten der Schwerpunkte und Gelenke\n",
    "S2 = ex*q1 # Schwerpunkt K2\n",
    "G3 = S2 # Gelenk\n",
    "\n",
    "# Schwerpunkt des Pendels #zeigt nach oben\n",
    "S3 = G3 + mt.Rz(q2)*ey*s3 ##:\n",
    "\n",
    "# Zeitableitungen der Schwerpunktskoordinaten\n",
    "Sd2, Sd3  = st.col_split(st.time_deriv(st.col_stack(S2, S3), ttheta)) ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\ndyiAXDYAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\texttt{T} := \\frac{m_{2} \\dot{q}_{1}^{2}}{2} + \\frac{m_{3} \\dot{q}_{2}^{2}}{2} s_{3}^{2} \\sin^{2}{\\left (q_{2} \\right )} + \\frac{m_{3}}{2} \\left(\\dot{q}_{1} - \\dot{q}_{2} s_{3} \\cos{\\left (q_{2} \\right )}\\right)^{2}$$"
      ],
      "text/plain": [
       "T :=       2         2   2    2                                2\n",
       "m₂⋅q̇₁    m₃⋅q̇₂ ⋅s₃ ⋅sin (q₂)   m₃⋅(q̇₁ - q̇₂⋅s₃⋅cos(q₂)) \n",
       "─────── + ──────────────────── + ──────────────────────────\n",
       "   2               2                         2             "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAAUBAMAAABSVS+EAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVJl2u4kiEO8yZt2r\nRM0tcn99AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACXElEQVQ4EZWUT2jTUBzHv+navib9Y9QdPAiL\nsCEISrdalTGlDPHgQcLEHRQ1bgMHHhpQwVs9iDBB9CLeXLEoeHIq9KaIwgRBzcHCQMFcFC9q7NbO\nCaV+k3QkeooPXvL5vd/3997v995LgP9syWoQcD/AyDQTUmaMkBERv4R0wg4Z0VDRwrqjYSMSp42w\n7FLYiMTn/lLlLJqbCv1oLE6P5Ru7XdNticIDHyCGJlRcLJyEPFqzOTbCnjy+d7/vTmjUlpJN6Afz\nYtmSLiMx8oqubxjv0awqX5XriOcvAAv0HGZfMjKricHtJMUGBkz8lNVnSLagONiBQS7g4LZP+A5p\nLa1DXlsykWfEI0BcQ8aexFtaEqe8ArktRAfSKjIlDOEhFb92okdNquZVoJVe2UPEdSDmIKXXMW8A\nsgP5N/oWIDmILSDlrsD18b5b8im7zPeABayIU12NzPhUCWXrKbsXr7QR1xCzwSw/GSbEHHAG59vM\ngiTW12+ehdJhPPOv6G6Obt3IeitvUJkQKhZ2JVUcYA5fAQcesX5IKQ3ZzmbgNaO4fxUVR0hP2Ll/\noo13hpsM5/yc4BjzP4Q+zuJVMlvFpDyHnL7F5DAwAeTySovHptGK6cDH4gngAzDGm+CeelnF9Ogw\nwSWIF0UDU8feoFG7Z3GMQvFymJXcdRW5m+5z3H34jTWXqx4G1HP5L+/+8pyzepaxvI0yeHZBq2Of\n6VsBBV5WrNHK2LizsZ86fj+nzfjzkOBWcbFnBRRyu3vDE9Rxo9tlJTawtbaNI9HbDLfux2NfHzei\nx60r//l//QGEl5pF9StaXAAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\texttt{V} := g m_{3} s_{3} \\cos{\\left (q_{2} \\right )}$$"
      ],
      "text/plain": [
       "V := g⋅m₃⋅s₃⋅cos(q₂)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    }
   ],
   "source": [
    "# Energie\n",
    "\n",
    "T_rot = 0 # Pendel as mathematisches Pendel angenommen\n",
    "T_trans = ( m2*Sd2.T*Sd2 + m3*Sd3.T*Sd3 )/2\n",
    "\n",
    "T = T_rot + T_trans[0] ##:\n",
    "V = m3*g*S3[1] ##:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "external_forces = [tau1, tau2]\n",
    "assert not any(external_forces[:np])\n",
    "mod = mt.generate_symbolic_model(T, V, ttheta, external_forces)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}m_{2} + m_{3} & - m_{3} s_{3} \\cos{\\left (q_{2} \\right )}\\\\- m_{3} s_{3} \\cos{\\left (q_{2} \\right )} & m_{3} s_{3}^{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡   m₂ + m₃      -m₃⋅s₃⋅cos(q₂)⎤\n",
       "⎢                              ⎥\n",
       "⎢                         2    ⎥\n",
       "⎣-m₃⋅s₃⋅cos(q₂)      m₃⋅s₃     ⎦"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Massenmatrix\n",
    "mod.MM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}m_{2} \\ddot{q}_{1} + m_{3} \\left(\\ddot{q}_{1} - \\ddot{q}_{2} s_{3} \\cos{\\left (q_{2} \\right )} + \\dot{q}_{2}^{2} s_{3} \\sin{\\left (q_{2} \\right )}\\right) - \\tau_{1}\\\\- g m_{3} s_{3} \\sin{\\left (q_{2} \\right )} - m_{3} \\ddot{q}_{1} s_{3} \\cos{\\left (q_{2} \\right )} + m_{3} \\ddot{q}_{2} s_{3}^{2} - \\tau_{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡            ⎛                          2           ⎞     ⎤\n",
       "⎢m₂⋅q̈₁ + m₃⋅⎝q̈₁ - q̈₂⋅s₃⋅cos(q₂) + q̇₂ ⋅s₃⋅sin(q₂)⎠ - τ₁⎥\n",
       "⎢                                                         ⎥\n",
       "⎢                                                 2       ⎥\n",
       "⎣ -g⋅m₃⋅s₃⋅sin(q₂) - m₃⋅q̈₁⋅s₃⋅cos(q₂) + m₃⋅q̈₂⋅s₃  - τ₂  ⎦"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mod.eqns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mod.calc_state_eq()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASgAAAB9CAMAAAAm7Q7bAAAANlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHL6OuAAAAEXRSTlMAMquZdlQQ\nQN0iRM2JZu+7fO4K0LoAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAytSURBVHgB7VyLtoMqDkVtvbXV\ndvz/n52EkMhTwWoPc0fWOj0oIcFteG3SqmbWqVVXiiLwIHyUaubuBukelbpuqgnRaWcEqrng2EJg\nqg+ofn5ttfoPyisESj1qHC1rBOoP/GXb5AXUNkZaojqghnG69bdnZvN/J1YbUM/3oFQ79zAX1zWk\nVwZU/57ASdqXarr28Tt3ybBUGVAdrFaUeo/wcb+AWnl/7w8UDjMOURdQKzj1M/oSevkF1ApMSvUz\nbjg/ehi/PGoNqtcNHQrd6up6azipvgUWQw9RF1CrQGEhDVEXUJtAwSoK0/29KflLgcrWUfjoehU1\ndI+5hQGrmlQdUONrfnTVwLM0pDqglqbVlbuAynwfF1AXUJkIZIpdHnUBlYlAptjlURdQmQhkilXo\nUdcBaOa7uw5Ac4GqUq7CrlclTpr8qSqa5ToAzXMUOQAdu08Hx6DVpMq6nhyAjnhgXNNZcWVAyQHo\nA4BqZvioJVUGlByAPuAMlA5CK0EKgfpn/qeS1tgHoMCaY6xGLek/VYUm2gegSj0uzjzpJtYBqBqr\nos4rG6OsA9CpKpzqW3DyAegTztWfFYV1V+ZR2Cf18ql53e/3T0WDeYVA6QPQt/5aRXIs+31BdUBd\nB6C/d4JDLVbnUYc+3YHKLqAywfxfAaoZx8+fbpERqMP2egMGiZ+TIFr4GYunnn6F3pF7vQFjn09K\nQE310T1y+yOkjux6r6I2h8Ib6/B4mHCfw+4V2wpf94FAlW3OdOSv2557/KtCDX19r0+8h9HjGKaw\nh+bbchtkXx0IFJKS2SnaY7qoBhqb+jaxn+m9WM9n8LXIAlvp9h8H1BC+ybTZJvKSYRQKnlE09N3Q\nR+so9Yo7olQttiU17cxxQN1KaJE2Ph4lehc0GL9Sn3gTHm/V+6qLbdn4SH4HUFM3NTeABb7ibrfp\nI2uDaYQibWEcxw5k4NvwI3Sc2w1KyLJ55h5+R+Bp/YzATXRIA30RBcqtGiA3meGc1PcfWPAMr3dz\nG41/5tsSo5HMHqCeMzzPG8YMDUcz3RAM9eDm492Pdq8WOgv8faCkfyhkmAbqPqab9o9GH7XIavIe\n9D0WkaZ3T9XAMoStwn0zG7L6HoCCcwmw+dItyrclNmKZcqCG/obvCL+H0eFjf57qju/0bYaKAQ+Z\nEBtorR5/G2y5+tyGubv3NCI/acXVAZwNjMWymjT3Ud4kFuFr9floJWwV7pN+sEbqDVBgiOLU822J\njVimHChqAD4fORG0aETAGCg9PWuInhohNelpqe3U8zPT11yUmZneACf6n6wm9ddj7x9OoJpFxOma\ndsbfs2CrYNgAxeoNUFBggCIvZUWuLZDKTHuAeuOwA14wzAr7XDNq/+Cuh0ODhhHK9XTPHtXAlekm\n2HlwqY2+R6MWFQRTu4iw092higbAWAU1ZmvD6n2gsm1hk9IJgepv8H7yE+BDjZ0+ioacJ3Y9Hsxx\nnGnpLYIXgXJdMrz7O45bGiEcsTAB4iZAxKwmJ9KnC+mDRdgRYFRTekgEgNAqJDOYs3ofqHxbpC7x\nOcALLYxm0a8dJ/Kh1XMZaEbXkFm6u40vM3uNkIdinPwGdYf5CkMKMD30q3m2t1F3T15NwkjtJREx\n3jhNk/6uP/ohOSyNlFBM6vt27hRMfa26vcnJs215pt3LPV3P0YALY93T7M09ds7VJDO8dgdZTRof\ncasaj3G2MGIVRF8bxkpsuZbtq6+BUrA2ovUUbWEG6HV6FrSthHnqgtBJ0eN4NXkPl1FQqkVg1e6M\nD2JVbe8ICmyFDeU73wPFmhRtipsXLEadZxIBO2Mw6WbLH3q9+LKlME8i4nR+MSxAg1vejXxbXkX7\n8kCgVBEFeQ87zNqcwk5nt13nc2iWQluBDbxxJFBnEnfRxuPNoreT1LJdcCRQ6kQqOPUkP6OCDwUq\n9TT/hvvlQNFPCP5LPvNfYTlQ+bqPl5QdH6k2q1fLTjhDWIVfZWsHymXAecdHjxzsd2AFFyztv0LH\nqlw7UO42mXd8+gEOocItKNazCNRhB6DrppxS2jU7t/Iu5NDqGCo8zyhIHXkAmm0UBHlbsVXHZ8CX\nHZ/DQy9q0rT7IrMnd2bXS5DrupkMVFImzoBbOz5iagJKPUK778ElqHMqUB65bsdZCFCejCHghWA3\n7JJhwK0dH+2FmVJfpsOQdg+eedeNE4EKyHUhI6GlBqhAxhDwCQbc2vERFc6UOqgzNE9Iu+/CJah0\nIlBEgy7kOk9Z7QvSGz9w34+87iIDtIMm4OG5iWD3+Up5AJoOAyb8tF+lPBUoj1w3JKV+Vu56SAdH\nCHiVYsAFKE2FC6UOt/nUavd8KqqjmTOBCsj1ZcrirocHFORVLgGvUgy4PARR4UypAzdvpruQdpcq\nX2XOBMoj1x2Skj3KkxEqPMmAy9NqKlwodZkOQ9pdanyVORMor2HWlCWDuS/CBLx3P3bJVLjLuuMZ\n4Snph0BZU1YKqIWAz3hY45QO667itHuGti2RHwLlNCXc+DvFOReEicO6qzjtnqNtSwaBKjwA3VL5\ns/IjqPDsxuoDUDdW7g8IXae5yyrbub3/4hC6GFcf7knxnxwR2Cgsq2z77jf5KCFTqDAco8Lt91fj\nSTnnyCv4widRYTPZds6R1kp13ZAAqDC2N0IkFjxDEedoAoB5lV1gBrY+obTY9g5JXdqU6q1VR4kA\nKHe8Aolv/TYe6kut8z/NxpZX2X7x2nW0mWzbixx2aVOtdbU6SvhABSf5cSLRavLW3mol1NfSYmdl\nlW3f3MjHmym2v48c9oEKYnsTROLSbt6MLHe8XDjoeQLepbOC98qSl4lmsm2JSdIKfNoUug0PZ64B\nrg53faA4HAzXyDqWVROJSR4SNDBQSZmAc0xJGrZyWcEHAcA60grphkSYcZLvNKFDcdoUHmKbLvWB\n4gBDDu2lrjh5PGQJV6kCztHXZlhNZivlpYYBwLhdgb9UmDFrWFZibNtEPkJ1jEt2aVOwl0GX+kCZ\nkFUJ7dWEYcBDCp+4eFQgw1wlUHDy6DqTkmS2UqSDAOCtMGPWsKzE2DbFkaYCh00T09WhSQmgJLTX\nTBAuD8krnTyuEkN9nUjfBKvJbKX4QxAAvBVmzBq4fbCWhiwmEzmcok3pKdPVQYMPlOl6EtpLMbU+\nDyl8ImgQf0lwlRwrje01KSopbCX7QxgAvBFmLBrAjMd30rojSZtm0KU+UGYwl9BeIhIDHtJa6TBQ\ngQyH7QacY0KS2Ur2h0gA8EaYMWsI+U4azJO0aQZd6gPF86iE9hoiEV4SzpUUCFzEVaqAc0ywmsJW\nGn+IBABD6PFamLFokJUY29bfsUgHDlOUcro6PL0PlBXbix0EZmL9hRLMLclZ6bBHLcWYs8J2zTDh\nli9XliSHjFv+6mhaKgU5bmaC77QiRYOqeGOjOkj4QCm9hbFDeyNALCsd0BApR9MStrvJOYqknvqh\nqvgD6rE00WXi0zQjzncG+41AyWp1lA6A0ptiO7R360HDTbvTihLOcSsA2FHsXazynd6m2KuKl6vV\nUSAAKowejRCJWDMzrYX6xlU4/hoXid2NNJNt59AsK9W1tRCoPyfuYih8d++IyOEQqL+I7f0Oh63a\nh1DBEaC27P5/lrtA/UtifQ99DOMXLlBnOMvGrLjLpGwHqXZoguilOMm0y2Jk1tunJ1krwkUnZVcK\nXJobVj3Wyjhigthy4cxXFOcWne1RUS46t3GWnEtz83ZQC0RNEFvOnLmlaG/2ZKDiVLbV2C3G3RJ1\ns4YeAAYl4lC4ukdx4czdunuuTgYqwUUvLU1sgBYBk/Np7mU7mDBBdLdFegcqy24cDZRHcx/AuOuf\n3/B/H8PaDq7S3QFfX4aOJX0wUIbmZgNRxp0L9X/2KI9HF5n472NY9IVLd0s9w9QzZ77c35s7GChD\nc/MPgkQZd2duN0D5PDorKI0OXnQTW86c+V54lnoHA2Vobv5BkCjjznP7GuPOCkqjg1k3s+XMmS8P\nvDd3LFBMc3MUdJRxd+Z27noeK88KSqODF930jtxVxV6QsN6xQAnNbX4QJMG4M/UP9hkon0fnXxRJ\n0tz80D7dzbqJqQ/4eq5W/P9YoJjmhmbQD4JEGXcJdQYxBkq/eouVZwWl0cGim9hy5syLcQkqHAsU\nq5coaOaiuUD/t+Z2AcoRAA4brs0vinglwSWboIMW0U1MPX0GdXbcOAUo67yAPcZqmjW3Lx5llUPW\nUuAWxK6MCc2Wi26idrdo7Ji6xD0CSvMSu3cToerlvCDSVIfqDTf+WtuiIFTu37HpbtZNTH0JX+9r\nta5RKSR4fxAcAumcr+NGuGirDYdkIyaILWfO/EsrE+Gj/gtaVZ8N+0uNtgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\texttt{mod.f } := \\left[\\begin{matrix}\\dot{q}_{1}\\\\\\dot{q}_{2}\\\\\\frac{m_{3} \\left(g \\cos{\\left (q_{2} \\right )} - \\dot{q}_{2}^{2} s_{3}\\right) \\sin{\\left (q_{2} \\right )}}{m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}}\\\\\\frac{\\left(g \\left(m_{2} + m_{3}\\right) - m_{3} \\dot{q}_{2}^{2} s_{3} \\cos{\\left (q_{2} \\right )}\\right) \\sin{\\left (q_{2} \\right )}}{s_{3} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "mod.f  := ⎡                   q̇₁                    ⎤\n",
       "⎢                                          ⎥\n",
       "⎢                   q̇₂                    ⎥\n",
       "⎢                                          ⎥\n",
       "⎢        ⎛               2   ⎞             ⎥\n",
       "⎢     m₃⋅⎝g⋅cos(q₂) - q̇₂ ⋅s₃⎠⋅sin(q₂)     ⎥\n",
       "⎢     ────────────────────────────────     ⎥\n",
       "⎢                        2                 ⎥\n",
       "⎢             m₂ + m₃⋅sin (q₂)             ⎥\n",
       "⎢                                          ⎥\n",
       "⎢⎛                    2           ⎞        ⎥\n",
       "⎢⎝g⋅(m₂ + m₃) - m₃⋅q̇₂ ⋅s₃⋅cos(q₂)⎠⋅sin(q₂)⎥\n",
       "⎢──────────────────────────────────────────⎥\n",
       "⎢             ⎛           2    ⎞           ⎥\n",
       "⎣          s₃⋅⎝m₂ + m₃⋅sin (q₂)⎠           ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "___\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$\\texttt{mod.g } := \\left[\\begin{matrix}0 & 0\\\\0 & 0\\\\\\frac{1}{m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}} & \\frac{\\cos{\\left (q_{2} \\right )}}{s_{3} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)}\\\\\\frac{\\cos{\\left (q_{2} \\right )}}{s_{3} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)} & \\frac{m_{2} + m_{3}}{m_{3} s_{3}^{2} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "mod.g  := ⎡          0                        0            ⎤\n",
       "⎢                                                ⎥\n",
       "⎢          0                        0            ⎥\n",
       "⎢                                                ⎥\n",
       "⎢         1                      cos(q₂)         ⎥\n",
       "⎢  ────────────────       ─────────────────────  ⎥\n",
       "⎢             2              ⎛           2    ⎞  ⎥\n",
       "⎢  m₂ + m₃⋅sin (q₂)       s₃⋅⎝m₂ + m₃⋅sin (q₂)⎠  ⎥\n",
       "⎢                                                ⎥\n",
       "⎢       cos(q₂)                  m₂ + m₃         ⎥\n",
       "⎢─────────────────────  ─────────────────────────⎥\n",
       "⎢   ⎛           2    ⎞       2 ⎛           2    ⎞⎥\n",
       "⎣s₃⋅⎝m₂ + m₃⋅sin (q₂)⎠  m₃⋅s₃ ⋅⎝m₂ + m₃⋅sin (q₂)⎠⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "___\n"
     ]
    }
   ],
   "source": [
    "mod.f ##:\n",
    "\n",
    "mod.g ##:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAACIAAABkCAMAAADUmBKBAAAAP1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFBd4eAAAAFHRS\nTlMAMquZdlQQQO0wRM3dIolm77t8bNtGev4AAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHtSURBVEgN\n7Vdhb4QgDK2i3E0RdeP//9a1ZUCh6nLLkmWJ/SAePB7Now9O6AJHDypcHAHoghkwRoWAlfr7QJBO\nj5ae9XWIDXOZH98Ui1NZK0jLAfAyZPHrYIepZqpYpm0B6INFHUTSEmK3Fef3M3Smd4VJQgxqBLB5\nfIwnkG3HwSVQKicQG2g+0V5AaCN3TvSEBeaBSIjqbCGwPVYEp3IKoekxlUsIqkIxbtzwQ+pCHazK\nYlzoMbEYNcTPwZk0lNoaknqr9oagHP/Sat7sBg0XQ25jtponU2Y/Ski2mkNIF/DBQZBHePB7tppD\nt0XLUf97Ocik1bB6yf0cYiEbitUA3GHtCquBLyUsWKTV1oJQBxlNAZjQtVM6jCULDbIc3TyO436Q\nLiGi1TY++vk3PmqWv7eaHVLyKcOqXVDn37+PqiXij1oX6rPGrz6JTx0aMmNJWKq7FAqy8kHoc+Ue\nsOx88ZWaO4AEhkxcgXGpdiEbuJimkOtSpbvEO6CLDdO0LEtkuYKcLPR4viUNAGK6o0j349ls4063\nH6ZYNr/NBaJ05ko6cLQBm9gkxQLW478agVC6lLzzm2bJQ+nlhiQl6vZHutxWIxFb6U6sVh2H2mot\nC9xW4wpVutR1e7QBGvG1R99+ZVn6lhra7wxeI47AJ0aWJsk/m8EmAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\texttt{f} := \\left[\\begin{matrix}\\dot{q}_{1}\\\\\\dot{q}_{2}\\\\0\\\\0\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "f := ⎡q̇₁⎤\n",
       "⎢   ⎥\n",
       "⎢q̇₂⎥\n",
       "⎢   ⎥\n",
       "⎢ 0 ⎥\n",
       "⎢   ⎥\n",
       "⎣ 0 ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADkAAABkCAMAAAAL1mieAAAAP1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFBd4eAAAAFHRS\nTlMAMquZdlQQQO0wRIlmzd0i77t8bBwggJIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAIVSURBVFgJ\n7ZjRkoMgDEVR0XarrXaX///WFamWEyQtnZ190hfFm2Mw0NuMpnLLUZt3j1sAjKlcY+ejfRc0gw+v\nnSert6Fn4ACya/qhzz8GMsnrPOPuNj4fzCvIIIfJR/ZXxm8jyiDvS3lb123BuKAM0i3kxWWqTDkm\nO9f4HBdnkWodCDkmR9f7qCqcVmA7C5nkkjNPQo5JMZ0t2eNCyDFpQglavUKrDPJ+948fsqsCGWRY\n6kbfCasM0tz87puyGxcyya6ffz1Z0EAmKcupjQ9Sq47XjgqVVQhWnKKQWVtYcUpCBkkrTkjKIGnF\nCUkZJK04ISnHpDA3SQo5JoUVS1LIJGHFKQk5JsV0JClkT57cKUQVOfV3/G9/OLWs8zyOV2VHVm4d\npFKcRfIV6mymXVPhce63/qK/VZMI8Z/WU3FqY9pJqVbeqbu6qXMN2PyWilPPqlVIxalfkHmn9mVX\ncu54X7wTFFJx6hc5x9Dmry233AlKzp3Zns5fPt1yKKRouX/O3PEaSSMvmO1jJ+z31OqqGLbczNnU\nk7vWw/rS8nz01LIi6pi1VUOFeJCiIMmQFYIVJ7G8QRJWzMAwiowcJK04IWnkIGnFCTnfiCwDJK24\ngBTmVkAKKy4i0TQXkJ/PVlhxQU5DKy4hw05YrbiEpBUXkbDilISRYw+lscqdg1SKs0ihQp9+M+78\nJ2BrL6+ybPryzdha8wvC6SxOy90ZPwAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\texttt{G} := \\left[\\begin{matrix}0 & 0\\\\0 & 0\\\\1 & 0\\\\0 & 1\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "G := ⎡0  0⎤\n",
       "⎢    ⎥\n",
       "⎢0  0⎥\n",
       "⎢    ⎥\n",
       "⎢1  0⎥\n",
       "⎢    ⎥\n",
       "⎣0  1⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJIAAAAZBAMAAAAoImqmAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iiWZ2EETvq82Z\nVDJF77rnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABjUlEQVQ4EdWVPUjDQBiGX21L0qpFXF1KFJEi\n2MFJBAPi5OLkJLSTughOgi7N6qZYZ8Whi4OdulpdBBd/NgepewWLFCyK1PuR5LsvXdo66E3He8/3\n5O7LhWDEyaD3YTvjSPWuUYbZf2/Kl0KtsD5/os5O138SMiHdlSnsCZLO9hTUhWfKFFlc3+BL7bKZ\nlW2PcQGmTHuZxDsj0CazD3G+xbgAkybrCIkSagajsujlNQ13lnGGpPH6CCZNg3XE3ZdTWqSzBVFJ\nxi1QSN6kSEIxaYoPY97DAyV0NoZX+k0eINLEkGFSpRqTpryLLJhJZZPyCf6wGojVmYlgynSH0ZBJ\nZaiSDltf6CtxU4BJ00Au1uAmnWHC35GYlJF1mYlg0mQVN5vcpLNohZp216oeMxFMmiDPz/qks1Uq\nEnPRTrPjBNMmcZ1CJpHZrv1suMSl4CYf06a4CzwaNRBXDLWne9JxsV4Qpn2T8zFlil5MYW66aCAy\nO261jGzprRK5+sjRLMD0nuhat/O/aXJ+6X+X/gYAP3hkQyF8fQAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\texttt{xx.T} := \\left[\\begin{matrix}q_{1} & q_{2} & \\dot{q}_{1} & \\dot{q}_{2}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "xx.T := [q₁  q₂  q̇₁  q̇₂]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---\n"
     ]
    }
   ],
   "source": [
    "# partiell linearisierte Gleichungen (hier: partiell=vollständig)\n",
    "mod.calc_coll_part_lin_state_eq()\n",
    "\n",
    "f = mod.ff ##:\n",
    "G = mod.gg ##:\n",
    "g1, g2 = st.col_split(G)\n",
    "\n",
    "xx = mod.x ##:T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Überprüfung auf statische Eingangs-Zustands-Linearisierbarkeit\n",
    "\n",
    "Konstrunktion der Distributionen $\\Delta_k$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "nx = len(xx)\n",
    "\n",
    "# Liste der Distributionen\n",
    "# (mit Eingangsvektorfeldern starten (Delta_0 = G) )\n",
    "Delta_list = [mod.g]\n",
    "\n",
    "for k in range(1, nx):\n",
    "    Delta_j_full = Delta_list[-1]\n",
    "    Delta_j = Delta_j_full[:, -nq:]# nur die letzten nq Spalten für Lieklammer relevant\n",
    "    Delta_k = []\n",
    "    for vf in st.col_split(Delta_j):\n",
    "        Delta_k.append(st.lie_bracket(mod.f, vf, xx))\n",
    "    \n",
    "    # neu berechnete VF zusammen mit bisherigen in Matrix konvertieren\n",
    "    Delta_k = st.col_stack(Delta_j_full, *Delta_k)\n",
    "    Delta_list.append(Delta_k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dim(Delta_0) = 2\n",
      "Delta_0 involutiv? True\n",
      "\n",
      "dim(Delta_1) = 4\n",
      "Delta_1 involutiv? True\n",
      "\n",
      "dim(Delta_2) = 4\n",
      "Delta_2 involutiv? True\n",
      "\n",
      "dim(Delta_3) = 4\n",
      "Delta_3 involutiv? True\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for i, D in enumerate(Delta_list):\n",
    "    print(\"dim(Delta_%i) =\" %i, st.rnd_number_rank(D))\n",
    "    \n",
    "    # failing_vf enthält die ersten beiden VF, deren Lie-Klammer nicht in der Distribution liegen\n",
    "    inv_flag, failing_vf = st.involutivity_test(D, xx)\n",
    "    print(\"Delta_%i involutiv? %s\\n\" %(i, inv_flag))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fazit:\n",
    "Das System ist also statisch Eingangs-Zustands-Linearisierbar.\n",
    "\n",
    "---\n",
    "\n",
    "Überprüfung: wird durch die Absolutkoordinaten des Pendelschwerpunkts ein in statisch linearisierender Ausgang gebildet (d.h. hat dieser Ausgang einen wohldefinierten und vollständigen relativen Grad?):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "h1, h2 = S3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Funktion definieren, die $L_{\\bs g_i}L_{\\bs f}^k h(\\bs x)$ in Abhängigkeit von $h, i$ und $k$ berechnet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def LgLf(h, i, k):\n",
    "    \"\"\"\n",
    "    h:    Skalarfeld\n",
    "    i:    Index für Eingangsvektorfeld\n",
    "    k:    Ordnung der Lieableitung bezüglich k\n",
    "    \"\"\"\n",
    "    Lf = st.lie_deriv(h, mod.f, xx, n=k)\n",
    "    res = st.lie_deriv(Lf, mod.g[:, i], xx)\n",
    "    return res.simplify()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}\\frac{\\sin^{2}{\\left (q_{2} \\right )}}{m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}} & - \\frac{m_{2} \\cos{\\left (q_{2} \\right )}}{m_{3} s_{3} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)}\\\\- \\frac{\\sin{\\left (2 q_{2} \\right )}}{2 m_{2} - m_{3} \\cos{\\left (2 q_{2} \\right )} + m_{3}} & - \\frac{\\left(m_{2} + m_{3}\\right) \\sin{\\left (q_{2} \\right )}}{m_{3} s_{3} \\left(m_{2} + m_{3} \\sin^{2}{\\left (q_{2} \\right )}\\right)}\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡           2                                      ⎤\n",
       "⎢        sin (q₂)                -m₂⋅cos(q₂)       ⎥\n",
       "⎢    ────────────────      ────────────────────────⎥\n",
       "⎢               2                ⎛           2    ⎞⎥\n",
       "⎢    m₂ + m₃⋅sin (q₂)      m₃⋅s₃⋅⎝m₂ + m₃⋅sin (q₂)⎠⎥\n",
       "⎢                                                  ⎥\n",
       "⎢      -sin(2⋅q₂)            -(m₂ + m₃)⋅sin(q₂)    ⎥\n",
       "⎢────────────────────────  ────────────────────────⎥\n",
       "⎢2⋅m₂ - m₃⋅cos(2⋅q₂) + m₃        ⎛           2    ⎞⎥\n",
       "⎣                          m₃⋅s₃⋅⎝m₂ + m₃⋅sin (q₂)⎠⎦"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sp.Matrix([[LgLf(h1, i=0, k=1), LgLf(h1, i=1, k=1)],\n",
    "           [LgLf(h2, i=0, k=1), LgLf(h2, i=1, k=1)]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Für $q_2 \\neq 0$ usw. ist diese Matrix regulär. D.h. $\\y$ hat bis auf Singularitäten den vektoriellen relativen Grad $(2, 2)^T$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}