{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook describes the details of forming the coefficient matrix and ordinate vector from walking data for a linear least squares solution to the optimal gains from a simple full state feedback controller employed by the human while walking." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sympy import init_printing, symbols, Matrix, Symbol, zeros, eye" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "init_printing(print_builtin=False)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n = 3 # number of time samples in each gait cycle\n", "m = 2 # number of gait cycles\n", "p = 2 # number of sensors\n", "q = 2 # number of controls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First form the equation that generates the controls given the error in the sensors at a single time step during a single foot step.\n", "\n", "$$\n", "\\begin{align}\n", " \\mathbf{m}(t) & = & \\mathbf{m}_0(\\varphi) + \\mathbf{K}(\\varphi) \\mathbf{s}_e(t) \\\\\n", " & = & \\mathbf{m}_0(\\varphi) + \\mathbf{K}(\\varphi) [\\mathbf{s}_0(\\varphi) - \\mathbf{s}(t)] \n", "\\end{align}\n", "$$\n", "\n", "Now rearrange the equations such that we have one linear in both the gains, $\\mathbf{K}(\\varphi)$, and in $\\mathbf{m}^*(\\varphi)$:\n", "\n", "$$\n", "\\begin{align}\n", " \\mathbf{m}(t) & = & \\mathbf{m}_0(\\varphi) + \\mathbf{K}(\\varphi) \\mathbf{s}_0(\\varphi) - \\mathbf{K}(\\varphi) \\mathbf{s}(t) \\\\\n", " & = & \\mathbf{m}^*(\\varphi) - \\mathbf{K}(\\varphi) \\mathbf{s}(t)\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"measured\" controls, $\\mathbf{m}(t)$:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAADwAAAAyBAMAAADy2KUxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhBEqyJ2u93N\n", "ZplQnf8bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZElEQVQ4EWOQ//+JAQfQ//+RQdjFFYcsQ4iL\n", "IYMILkmQuOMgl2ZT75hZyaa5DNMPYJczca1kiJ/GYIgszampAPOYM/cBhn4FhvvI0pcYzGHSAfEJ\n", "DPYBDFXI0lsY+ANgwWLPwPCagUESSZr1BwOjAUz6DQPDJga2H6wMcZMuQ9SwfGXgvgCTFmJg/cbA\n", "d6CZdQvLD/YzQHAWJD0BKs3xjYH3AwOPggLfAxYBqG6g4TBptg0MnAUMzEUOjAacCyDSrF8Y+BNg\n", "hkOEGBjiG7gmgA0/ybANyeUwaUYHfwcoex7C3zBZBrZKfRib6dFTIBM9OdyBSUNodOkivNJ8fxxQ\n", "5NF1o0hi2j0qDQ4BcKiRkQ0YvEDawbqxZQO/arg0tmzAYA2XZsDMBgzI0pjZAEUaMxsgS2PJBsjS\n", "WLIBsjTIjWCAlA2QnQaTRsoGkLICNSkiZYO+/ZVATajSDAxUzgYECmz8xT0AGw15wNQeSDkAAAAA\n", "SUVORK5CYII=\n" ], "text/latex": [ "$$\\left[\\begin{matrix}m_{q=0}\\\\m_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡m_q=0⎤\n", "⎢ ⎥\n", "⎣m_q=1⎦" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = Matrix(q, 1, lambda i, j: Symbol('m_q={}'.format(i)))\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The unknown gains, $\\mathbf{K}(\\varphi)$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAALgAAAAyBAMAAAAdNgxKAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhC73c2ZRGZ2\n", "Iqv0ydCJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACqUlEQVRYCe2YPWgTYRjH/83dGTW9VGjBRTCL\n", "Q1HQTnbSK9SKICSD6CKki5tDQSctmMHBjw61ICKIjYNjJbhVlyODIIhkddFsdnCoNl0itr5fuTy5\n", "N9z7HnhOuSF57rnf+8vx3EvyJzi+/wuZHKf3f2Jy/kImblyZn8FUNmpunRPyq0fTfYIlL+V4mE5u\n", "ySv5Tkq5HS/lh3fTyS15Kc/V0skteSk/WCo8CVL4LXkpr74+8apO5M0mOeHl+KkS7Rh5LHBcys9f\n", "pktRKDntgQbe4hxtGPlL3zku5euP6FLkA8Se8G1MVAhi5HG2L1/+WiNLUW1hkp7D+4OxM6Rj4kHk\n", "Xsfb8eG9OKkE5QruMtXm+8+BNLq7yDf6ciNP5YVtr5vDtaDc2nrAjgaTLzPVu667VOSNx1we9uVG\n", "nsqLi+jk8Jw9AHmUWzgG+Nfb/rZsuGwsobrI3ow8lR9oYDNkY/6g1lcDdLkjdI7IjtfBRF1dZG9G\n", "nsrFMvbQbmKLTyHM18VuGQuKq2IsK7gzuFv4gkSePFAhx5TbkQXGV522fwPfWhcrqvNxcJ+LbhKP\n", "GY7IfS7gN001YWB6uuL+xuynp+ICe8mtRWWvhST+y70fjCNyFGrRQlY4WKOnQ2ojT+XFEjVs4BY9\n", "HVIbeSpfv08NjUN7vYnTNqmNPJWTdf+mHMmHzvE/jMUy5ES3Z8mrOx+FomhwopBjsQw50VJLXsot\n", "Q04kt+SlPB5y3MXIIwtDKNL4hFDkvlyKyZNDkc4nhCI4cXlyKNJ5+jMXCzkabAhFGk9/oOMhR8HW\n", "oUjjqTwechRsHYo0nsrjIUfC9qFI46k8HnLUnViHIo2ncrHvSMhRsHUo0nm6W4S9H3LAYlyaUKTz\n", "CaHIf7YXpglFOj8KRb1voSEhai7bv0Sy/DPnL+hWWHgNBrLdAAAAAElFTkSuQmCC\n" ], "text/latex": [ "$$\\left[\\begin{matrix}k_{q=0,p=0} & k_{q=0,p=1}\\\\k_{q=1,p=0} & k_{q=1,p=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡k_q=0,p=0 k_q=0,p=1⎤\n", "⎢ ⎥\n", "⎣k_q=1,p=0 k_q=1,p=1⎦" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = Matrix(q, p, lambda i, j: Symbol('k_q={},p={}'.format(i, j)))\n", "K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The unknown nominal controls, $\\mathbf{m}^*(\\varphi)$:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAADwAAAAzBAMAAAA5hHaUAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhBEqyJ2u93N\n", "ZplQnf8bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABqklEQVQ4Ec3UvS9DURgG8KftvVc/aAWLyU0M\n", "0qk6GQy9jVoMdDBr/4SmC2WRiDDRGCQWMUm6iZRNdJWQNKwSjcTEgNB0kNT9Os55b087sDhLz+3v\n", "vu+5X8/BWPsdXUai/YbhzGwXxWImiZFuaP2fpqzq9GTKgc1GnThlpbJc7sHYuiDqWdu/Mn5G3G6u\n", "TWwflLT4MRAsEHWq/eEKcvtImmRIeCZSw66OB0rWkd08m8sjlcWqyKG4zhgp4BkYFfkWUz/8ApxC\n", "a6mCVxHLsoc6BLWJaG2Ds9qCb9LlYBMDr+jXdSzt3TmnKJ+I1F3WThAqIFA01KrS6rs2x43FZdac\n", "NY02lEG32mzewb7J0JHD6gdieW91bj1ctptf4Vy4cqcC8BkLhjs/FO6bsVZKsKn/8cmc0s8BuGfs\n", "/Hq52JOjXwZxbzXBzrX/xP8uBvxupDHgKZHGQEgJb2TP7If6i5Rgzip3XokkJfNrnCUpwTTnzpRA\n", "YElKRJakRGRrFXvwlEiZp0TKQkqES2O9xZTYG5EnBkJKdi5LZlXas2GTlFgbNt3uSUqs7Z4Mb0rw\n", "DRAKiH6WIqG+AAAAAElFTkSuQmCC\n" ], "text/latex": [ "$$\\left[\\begin{matrix}m^{*}_{q=0}\\\\m^{*}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡m_q=0__*⎤\n", "⎢ ⎥\n", "⎣m_q=1__*⎦" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ms = Matrix(q, 1, lambda i, j: Symbol('m^*_q={}'.format(i)))\n", "ms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The measured sensors, $\\mathbf{s}(t)$:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAADQAAAAyBAMAAADhD+XFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhB2Zs27mSJE\n", "q91tYugtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABNElEQVQ4EWOQ//+JAQvQ//+RQdjFFYsMQ4iL\n", "IYMINgmQmOOgklJLd8BwKMSFHA6cC5ClkpKAPIjUfgaWACQpdgXmCzCpeKkDSDIMfA4MX2FSPPN/\n", "IkvFb2AQhkpxG7Dmb2BfXnYFKu8fwPAcKsUhwMDPwH7+gB/DjQ4gKABKPYNKcTowpDFszWXYD9O1\n", "gUEMZmBamQEDwzUGQ6hUvAPDH6gURESE4RbEwAS+AwgXguS4f7M8hepiW4DwF0iIuS0L7m0tLSAT\n", "EZVcClA9MAohxQd0CQpASK2/iiKBbCCaxEiWIj6JskwABhvWJMqy9gFcCi2JMjAjpNCSKJIUehJF\n", "kkJPokhS6EkUSYobLYkiSQFdCgSIJIouhZREGZgFgEoRKQopiXKv+5uALEW1JIqn0MNdVAIAEmFr\n", "xPrMSsAAAAAASUVORK5CYII=\n" ], "text/latex": [ "$$\\left[\\begin{matrix}s_{p=0}\\\\s_{p=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡s_p=0⎤\n", "⎢ ⎥\n", "⎣s_p=1⎦" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = Matrix(p, 1, lambda i, j: Symbol('s_p={}'.format(i)))\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And the equation:\n", "\n", "$$\\mathbf{0} = \\mathbf{m}^*(\\varphi) - \\mathbf{K}(\\varphi) \\mathbf{s}(t) - \\mathbf{m}(t)$$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "/04oZAAAAABJRU5ErkJggg==\n" ], "text/latex": [ "$$\\left[\\begin{matrix}- k_{q=0,p=0} s_{p=0} - k_{q=0,p=1} s_{p=1} + m^{*}_{q=0} - m_{q=0}\\\\- k_{q=1,p=0} s_{p=0} - k_{q=1,p=1} s_{p=1} + m^{*}_{q=1} - m_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-k_q=0,p=0⋅s_p=0 - k_q=0,p=1⋅s_p=1 + m_q=0__* - m_q=0⎤\n", "⎢ ⎥\n", "⎣-k_q=1,p=0⋅s_p=0 - k_q=1,p=1⋅s_p=1 + m_q=1__* - m_q=1⎦" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zero = ms - K * s - m\n", "zero" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now for a simple linear least squares the equations can be massage into this form:\n", "\n", "$$\\mathbf{Ax}=\\mathbf{b}$$\n", "\n", "which, for large $m$, gives and over determined system of linear equations.\n", "\n", "We define $\\mathbf{x}$ as:\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "BnABYWeigGKWAAAAAElFTkSuQmCC\n" ], "text/latex": [ "$$\\left[\\begin{matrix}k_{q=0,p=0}\\\\k_{q=0,p=1}\\\\k_{q=1,p=0}\\\\k_{q=1,p=1}\\\\m^{*}_{q=0}\\\\m^{*}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡k_q=0,p=0⎤\n", "⎢ ⎥\n", "⎢k_q=0,p=1⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=0⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=1⎥\n", "⎢ ⎥\n", "⎢m_q=0__* ⎥\n", "⎢ ⎥\n", "⎣m_q=1__* ⎦" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = K.reshape(q * p, 1).col_join(ms)\n", "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To form the $\\mathbf{A}$ matrix for a single time step in a single foot step the equation can be rearranged:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAWoAAAAyBAMAAACHXIz+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhDN3XZmu5ki\n", "RKv9tVFwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEHklEQVRoBe2aO2gUQRjH/8nd5nLJJRdICsEi\n", "V0kghWejnW4gEtAiUUQFi1MUjZ3gW3ycsbkQSKJYKCJa2AXMEVSwUA9EECzuahtT+AhY+AbRxLi3\n", "z/l25jazyWzkwG32+2b+882Pyczu5s+he/Er6utav/gFnf1b6wsau/o3oKvOmKu4fZFSazNjusSi\n", "7Ot5UFPVNES6LGm01E1Z7TyZVJwcxJ6SuAepaUptSaOlvgqsq4HDNCc70LifyZlQm/pEqG1ptNT3\n", "gS1kVgbIC1tmEfvhpTSaIONtabTUf4A3WUohyNKzaPsmaDebKLUtpdSNheu1RrPtkjJovw3qPDtS\n", "GOeKaPsp7DEaKbUtpdSHMMWObu7JsKkb+2TY5vbQIGW8vwYztE2QlTOI13zTUWpbSqhTn0HeONew\n", "WTAJ/LLtH0Qqoy1a6t2nq9chaF+ekPlPIM2ehVoybCKjvEQzVlBmh2Tkd4glJWuN14t3vTmhzaNB\n", "eJaoDDWpYezrLcIKzCxAuoiY7Gm0pIT6OfbO49bNcd0qGv+BxCSpbyU+WQD1OeAO+9cSFDOaEneR\n", "lHzy2VJCfQD4jNsL8WPth43raJU6L5jIJwugvgw8EhTwNTV3oHW/r81N6Wm0pYT6Hprzqb2zxmkz\n", "r7ixQ/LucC/wyQKoE1lN5uPsOHboXnkaUWpYUkL9cvQK0J6PdVgDte9IV2gNM/PJAqi1Hme3Ccp4\n", "TTsLb72ERk+7L06yLZaUUJvdDXp70dwhw7hAnyHsaDCy2qeRjFCY8NTl0sCQPcGY+Hlt9jIybFAI\n", "JFWKp95YeOiMbJxxQ6fJvTOyV5fm3ObVCXjqGbmJJWVyxcKqeOrjciUkZXLFwqo46tY/zq4OLCUp\n", "C6yx/E6OevmlVnHkf+rVW+z/a/0P11qB8aKSnjN4TFeH2yErN15UQsNv8FiuDke9YuNFKbTf4LFd\n", "HY5agfGikJs3eMzvbY5agfGikJo3eITUKowXh7pnVHfCgHugJcQbPEJqFRaGjdiktxRZ2pERNnPj\n", "QEuIN3iipi4jzn6IJTOxWRfVC4ItIUnqlRsv2pGqJXRKR25txYMz/AMdrH0gZwnlOINHuNYqjBeb\n", "tW36F0udK6GTzZ040BLiDR4xtQLjxeJJZbWJUvLxDeff78EhnHVImXuwJcQbPGJqBcaLxdTUgTSS\n", "byoDeF/1hCYN6jMMrRMGW0K8wSOmVmC8WEAtOgp4MY6yzTdYwhoHlbkvYQlxBo+YeuXGi42UKtzI\n", "AnOu7ZDTscDQOuESlpDf4LFcHe7d6FRTdO/CR2uH5BMV8gwh9cNaQhFTp+bjJ22+5qLweW32hrWE\n", "IqaODY+5b5reXjckC20kYS2hiKlbM35AYR7WEoqYOmEcSIkrrCUUMfWzdxLMCG0J9dXpLy3q8lct\n", "fwGx9l9Lsu1kfwAAAABJRU5ErkJggg==\n" ], "text/latex": [ "$$\\left[\\begin{matrix}- s_{p=0} & - s_{p=1} & 0 & 0 & 1 & 0\\\\0 & 0 & - s_{p=0} & - s_{p=1} & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-s_p=0 -s_p=1 0 0 1 0⎤\n", "⎢ ⎥\n", "⎣ 0 0 -s_p=0 -s_p=1 0 1⎦" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = zeros(q, q * p)\n", "for row in range(q):\n", " A[row, row * p:(row + 1) * p] = -s.T\n", "A = A.row_join(eye(q))\n", "A" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAADwAAAAyBAMAAADy2KUxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhBEqyJ2u93N\n", "ZplQnf8bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZElEQVQ4EWOQ//+JAQfQ//+RQdjFFYcsQ4iL\n", "IYMILkmQuOMgl2ZT75hZyaa5DNMPYJczca1kiJ/GYIgszampAPOYM/cBhn4FhvvI0pcYzGHSAfEJ\n", "DPYBDFXI0lsY+ANgwWLPwPCagUESSZr1BwOjAUz6DQPDJga2H6wMcZMuQ9SwfGXgvgCTFmJg/cbA\n", "d6CZdQvLD/YzQHAWJD0BKs3xjYH3AwOPggLfAxYBqG6g4TBptg0MnAUMzEUOjAacCyDSrF8Y+BNg\n", "hkOEGBjiG7gmgA0/ybANyeUwaUYHfwcoex7C3zBZBrZKfRib6dFTIBM9OdyBSUNodOkivNJ8fxxQ\n", "5NF1o0hi2j0qDQ4BcKiRkQ0YvEDawbqxZQO/arg0tmzAYA2XZsDMBgzI0pjZAEUaMxsgS2PJBsjS\n", "WLIBsjTIjWCAlA2QnQaTRsoGkLICNSkiZYO+/ZVATajSDAxUzgYECmz8xT0AGw15wNQeSDkAAAAA\n", "SUVORK5CYII=\n" ], "text/latex": [ "$$\\left[\\begin{matrix}m_{q=0}\\\\m_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡m_q=0⎤\n", "⎢ ⎥\n", "⎣m_q=1⎦" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = m\n", "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can check to make sure that our new form gives the same answer as the previous form:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "/04oZAAAAABJRU5ErkJggg==\n" ], "text/latex": [ "$$\\left[\\begin{matrix}- k_{q=0,p=0} s_{p=0} - k_{q=0,p=1} s_{p=1} + m^{*}_{q=0} - m_{q=0}\\\\- k_{q=1,p=0} s_{p=0} - k_{q=1,p=1} s_{p=1} + m^{*}_{q=1} - m_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-k_q=0,p=0⋅s_p=0 - k_q=0,p=1⋅s_p=1 + m_q=0__* - m_q=0⎤\n", "⎢ ⎥\n", "⎣-k_q=1,p=0⋅s_p=0 - k_q=1,p=1⋅s_p=1 + m_q=1__* - m_q=1⎦" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zero2 = A * x - b \n", "zero2" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "assert zero == zero2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now for $n$ time steps in a gait cycle we want to form the $\\mathbf{A}$ matrix such that there are different gains for each time step." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "gain_matrices = []\n", "control_vectors = []\n", "control_star_vectors = []\n", "sensor_vectors = []\n", "for time_step in range(n):\n", " gain_matrices.append(Matrix(q, p, lambda i, j:\n", " Symbol('k^{}_q={},p={}'.format(time_step, i, j))))\n", " control_vectors.append(Matrix(q, 1, lambda i, j:\n", " Symbol('m^{}_q={}'.format(time_step, i))))\n", " control_star_vectors.append(Matrix(q, 1, lambda i, j:\n", " Symbol('m^*{}_q={}'.format(time_step, i))))\n", " sensor_vectors.append(Matrix(p, 1, lambda i, j:\n", " Symbol('s^{}_p={}'.format(time_step, i))))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "gg==\n" ], "text/latex": [ "$$\\left [ \\left[\\begin{matrix}k^{0}_{q=0,p=0} & k^{0}_{q=0,p=1}\\\\k^{0}_{q=1,p=0} & k^{0}_{q=1,p=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}k^{1}_{q=0,p=0} & k^{1}_{q=0,p=1}\\\\k^{1}_{q=1,p=0} & k^{1}_{q=1,p=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}k^{2}_{q=0,p=0} & k^{2}_{q=0,p=1}\\\\k^{2}_{q=1,p=0} & k^{2}_{q=1,p=1}\\end{matrix}\\right]\\right ]$$" ], "text/plain": [ "⎡⎡k_q=0,p=0__0 k_q=0,p=1__0⎤, ⎡k_q=0,p=0__1 k_q=0,p=1__1⎤, ⎡k_q=0,p=0__2 k_\n", "⎢⎢ ⎥ ⎢ ⎥ ⎢ \n", "⎣⎣k_q=1,p=0__0 k_q=1,p=1__0⎦ ⎣k_q=1,p=0__1 k_q=1,p=1__1⎦ ⎣k_q=1,p=0__2 k_\n", "\n", "q=0,p=1__2⎤⎤\n", " ⎥⎥\n", "q=1,p=1__2⎦⎦" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gain_matrices" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n" ], "text/latex": [ "$$\\left [ \\left[\\begin{matrix}m^{0}_{q=0}\\\\m^{0}_{q=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}m^{1}_{q=0}\\\\m^{1}_{q=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}m^{2}_{q=0}\\\\m^{2}_{q=1}\\end{matrix}\\right]\\right ]$$" ], "text/plain": [ "⎡⎡m_q=0__0⎤, ⎡m_q=0__1⎤, ⎡m_q=0__2⎤⎤\n", "⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥\n", "⎣⎣m_q=1__0⎦ ⎣m_q=1__1⎦ ⎣m_q=1__2⎦⎦" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "control_vectors" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "h+oAAAAAAElFTkSuQmCC\n" ], "text/latex": [ "$$\\left [ \\left[\\begin{matrix}m^{*0}_{q=0}\\\\m^{*0}_{q=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}m^{*1}_{q=0}\\\\m^{*1}_{q=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}m^{*2}_{q=0}\\\\m^{*2}_{q=1}\\end{matrix}\\right]\\right ]$$" ], "text/plain": [ "⎡⎡m_q=0__*0⎤, ⎡m_q=0__*1⎤, ⎡m_q=0__*2⎤⎤\n", "⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥\n", "⎣⎣m_q=1__*0⎦ ⎣m_q=1__*1⎦ ⎣m_q=1__*2⎦⎦" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "control_star_vectors" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAQoAAAA0CAMAAABFEoaSAAAAP1BMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFBd4eAAAAFHRS\n", "TlMA74lUMhB2Zs27mSJEq93TkUDZoT2gnHsAAAAJcEhZcwAADsQAAA7EAZUrDhsAAASySURBVGgF\n", "zZvrgnQwDEDrPsPw3bz/s34pLdFqIr3srh87xTjiTNHIUoqa+rqvqfXJ69p3MoIA1ON77Ij1zqpq\n", "hWk/XtTcvzTA8mZ2NrCztd6wsnNPPj1+O85LcEMx38PXk1LzK7QDxDfNqmnbdleHmvv2Swufa8Br\n", "B9s1MhXnrmx8TViFmO+HDyraFf7cTohvmpU+3H1CzW1Bt2Gqxq73P1uZinNXFkWo0F8R8d3wVfVR\n", "alrhT3BCfGgiAGpuG7dbh1iGIEkWKt6VRRZVoXfShDr1FoFURW/j9j8Ryl/pLXFVwxeKq1iI6C+9\n", "jusV+jyrCNiPV1GP3g+CF6D4aRXdul02iZMNofAeAu2v7xUDbQKf4LQKtWgL1Mn2w1V8YDDw8a/V\n", "5y+F4g+pqPt+AEQPUoPjCg1EqJMfbJ29wvCBTt+CRHwP376apnkHxgJblIgfUPECDW/dt+qxJodr\n", "CBUUcK44YrX8aVzWmbgUyVR7+G3MtZ7791so/nsVk97cDLv8zfEShMKLA20bayG+HI9V36vo1mok\n", "rpXqzEziVBTiWxXP8bwK9XmvazhPQplJnIpCfKviOZ5VMcFIu+uDY3eFMpMoFaX4RoUAz6p4bVf1\n", "4OUGZyZRKkrxjQoBnlXx1nfiXl/Yh3EY+tm5MePMJEpFKb5RIcCzKiYYVPRbOjp8IK9rIY+eX3Ya\n", "IO3Vd+p9bB+lohTfniDPw2dVHLfCqevhuc126zuWwV12T9234UCUioOVmW9UCPDPVUBvgAN2B4Q4\n", "M0lTkZnvquDxEhWaPsOw8zxBwA3KTFJVZOX7Kji8QMUE50K7uIN4lJkkqsjL91SweIGK5tX3NznI\n", "mZkkqsjL91SweIGKkXvyn6giL99TweIFKhbiCe92oU5UkZfvqWDxz1WM66/fdEkoTcW4zn/CqY52\n", "LeK7Ksb17z+mJIT40EQA1Nxvzijx2he4fxHKXXUz7/HJkpAGiPgeni4JOXxGBUq8bo5MGiq2bnFF\n", "n3gvZElIpAInXjb266foV/tyFd9WEurWYHnS+PN6sKQOEoWHHVBPqfEJSJ8gOPG69gY7d+kVC7lX\n", "2CRJhYrB27TRxut+ovg5FbKS0CdUqTURpKlQEXh4Tu0e/WX+sQqceF0IxwxCwTKiuLptkagiAv9d\n", "JaEuIlbBHSQCn6MkZH52lHgdHeHSuPQKzsTtteJ5SUiOz1ESUrZ6dSZeFwPHzEXFsTTUOE8Qwy9U\n", "ErLhZygJKVu9Ch3TsTxSRRn+Yfoxnr+ZFqpeHSdIIb5V8RzPq+DKS+r4v7q4XlGIb1U8x/MqmPIS\n", "SqLiVBTiWxXP8awKrryEhstRKkrxjQoBnlXBlJfgmnmMBqJUlOIbFQI8q4IpLyWrKMU3KgR4VgVT\n", "vUpWUYpvTxC6OobDZ1XAl/fpvnoF69JOEItXmflGhQD/XMV9eSmfisx8VwWPl6jQdK86lq1X7E8w\n", "svF9FVz4AhX35SVQYZOoqDvI0YOhMn1XfYvleypYvEDFfXkJJVGJKvLyPRUs3lVxvpngvUVAlpfQ\n", "SwTn70y2CvNleIXity9BEK/GkOUl9GoJKeBc6b27kpcvwysUP2qe0V5aUL1yq+iX9akzhflS/H9l\n", "tDYqHyrTiAAAAABJRU5ErkJggg==\n" ], "text/latex": [ "$$\\left [ \\left[\\begin{matrix}s^{0}_{p=0}\\\\s^{0}_{p=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}s^{1}_{p=0}\\\\s^{1}_{p=1}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}s^{2}_{p=0}\\\\s^{2}_{p=1}\\end{matrix}\\right]\\right ]$$" ], "text/plain": [ "⎡⎡s_p=0__0⎤, ⎡s_p=0__1⎤, ⎡s_p=0__2⎤⎤\n", "⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥\n", "⎣⎣s_p=1__0⎦ ⎣s_p=1__1⎦ ⎣s_p=1__2⎦⎦" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sensor_vectors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Picking off a trio we should get our familiar equation back:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n" ], "text/latex": [ "$$\\left[\\begin{matrix}- k^{0}_{q=0,p=0} s^{0}_{p=0} - k^{0}_{q=0,p=1} s^{0}_{p=1} + m^{*0}_{q=0} - m^{0}_{q=0}\\\\- k^{0}_{q=1,p=0} s^{0}_{p=0} - k^{0}_{q=1,p=1} s^{0}_{p=1} + m^{*0}_{q=1} - m^{0}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-k_q=0,p=0__0⋅s_p=0__0 - k_q=0,p=1__0⋅s_p=1__0 + m_q=0__*0 - m_q=0__0⎤\n", "⎢ ⎥\n", "⎣-k_q=1,p=0__0⋅s_p=0__0 - k_q=1,p=1__0⋅s_p=1__0 + m_q=1__*0 - m_q=1__0⎦" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zero = - control_vectors[0] + control_star_vectors[0] - gain_matrices[0] * sensor_vectors[0]\n", "zero" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The larger $\\mathbf{A}$ matrix for all of the time steps can be formed by stacking the $\\mathbf{A}$ matrices from a single time step diagonally:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n" ], "text/latex": [ "$$\\left[\\begin{array}{cccccccccccccccccc}- s^{0}_{p=0} & - s^{0}_{p=1} & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & - s^{0}_{p=0} & - s^{0}_{p=1} & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & - s^{1}_{p=0} & - s^{1}_{p=1} & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & - s^{1}_{p=0} & - s^{1}_{p=1} & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & - s^{2}_{p=0} & - s^{2}_{p=1} & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & - s^{2}_{p=0} & - s^{2}_{p=1} & 0 & 1\\end{array}\\right]$$" ], "text/plain": [ "⎡-s_p=0__0 -s_p=1__0 0 0 1 0 0 0 0\n", "⎢ \n", "⎢ 0 0 -s_p=0__0 -s_p=1__0 0 1 0 0 0\n", "⎢ \n", "⎢ 0 0 0 0 0 0 -s_p=0__1 -s_p=1__1 0\n", "⎢ \n", "⎢ 0 0 0 0 0 0 0 0 -s_p=\n", "⎢ \n", "⎢ 0 0 0 0 0 0 0 0 0\n", "⎢ \n", "⎣ 0 0 0 0 0 0 0 0 0\n", "\n", " 0 0 0 0 0 0 0 0 0⎤\n", " ⎥\n", " 0 0 0 0 0 0 0 0 0⎥\n", " ⎥\n", " 0 1 0 0 0 0 0 0 0⎥\n", " ⎥\n", "0__1 -s_p=1__1 0 1 0 0 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 -s_p=0__2 -s_p=1__2 0 0 1 0⎥\n", " ⎥\n", " 0 0 0 0 0 -s_p=0__2 -s_p=1__2 0 1⎦" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Am = zeros(n * q, n * (q + q * p))\n", "for time_step in range(n):\n", " An = zeros(q, q * p)\n", " for row in range(q):\n", " An[row, row * p:(row + 1) * p] = -sensor_vectors[time_step].T\n", " An = An.row_join(eye(q))\n", " num_rows, num_cols = An.shape\n", " Am[time_step * num_rows:(time_step + 1) * num_rows, time_step * num_cols:(time_step + 1) * num_cols] = An\n", "Am" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The control vector and the gain vector are simple column stacks:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAEAAAACZCAMAAACohswLAAAATlBMVEX///8AAAAAAAAAAAAAAAAA\n", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n", "AAAAAADECekxAAAAGXRSTlMAMquZdlQQQO0wRIkiu+/dzWbR6a/X63xsC1aHiQAAAAlwSFlzAAAO\n", "xAAADsQBlSsOGwAAA+JJREFUaAXtWmF7nCAMRkXbHZ6e7bqN//9Hl+BReI8IaLfu6TP5cB5KXkhM\n", "eAmoVKZoo03mcfHRQtJ9W2rWWFekdnNDwnaQEeZVTqnGdppKnzYb7Eg3J+EJt11YqrUMwP1IpXGd\n", "z4v07H5vqQHQHwBwKhwHGJxy9nJ4BGpm2a234GDBBhfTjiMZVquL0VeW1V3JDwDAqOuV9B2sJuF+\n", "4h5MZ7oNN3ADUDFA06v5RrdHy97LTypKDDBQ3zzu3indXjfF4wCJAViUhbqZf6fNlwcBggAda6Bm\n", "1uBCXryhPAQIAkwsuupBWKMcAxggADA6E/AtpW5GObROmwWBMEAA4OKU1y6u+9ZQiA003IaUaW++\n", "LFRn1ea7iQCAe8bSkSM1ziHCfQYMNi4A8FSgH94nBkgewNmLnTOoQBUIkDyAmtgEj9MNBEgB4NJq\n", "k7p0HCAFALLW4pwr2PDhXxmgZXfYLiUA/WJfH20AaAUAiBsQ9JUCAMSNl4FrHgDjBgR9JQ+AceNl\n", "4FoFsDm1EFQJII4b6NlX8gAYN14GrnkAjBsQ9JUCAMSNl4ErAKTMtI9YaBJMmAl6kyrxCD6PmVQT\n", "ZjkewdB7BqljpqZr3fTtNGLyCJNWHTMRBQaA2AY0V9cwE3W8BVDHTBmAOmbKADirwI/ETLsAJGba\n", "AyAz07YRYfSuIjITAQS+xdeYIIjMNHazpaXgWgoA1OhfM5P6bm9FZnqyT4ny9xsQN2KjnxSNIZiE\n", "JpHbC09L0zqJnACfbQOBWOK4Kb/GlFggbooAn0csjynPoPcRCyzdRpoYQizUEQss3XBCqSIWXLoB\n", "QB2x4NINAOqI5Ux5yJ9h6QZGTJ1dJBZYuhUACPIklpMXyA2+GDf+R8QShz2H815iISYJKc8RYoGl\n", "G04oVcSC3gUAArHE6ob/kXsCQEosakg34zIjCF34f9Jm3C6AM+WhrVlpMw6WbvAave3h+kFmMt3r\n", "i1+CAa6v8AgyGYsZOzu9+cbStZCxzLSPtG7CSsJ8r2CDifba1wg5CMBi6179BwD8FrQMUVCBhAzt\n", "TWdKEWDJy5eMSIct5I651LUwgubW9/0150kAkDLT5M7jMiZAFdKUJye6PotHcDjleXr+5tAOnfL8\n", "eo4zlrq9NEh5YhXogOg85UnfukQs5ykP2+lrnfKYN/tjc6OM1cFY4DtQDBFLmz2pKgCczOTs+bWY\n", "KSWWncyUEss+ZjpMLH4nq5pY4owFXbmOWDIZSx2xQD6MI/gLKc++jCVNec6Mhc7OpM8H6DX+8UOa\n", "zW+yaErZzljev8ka+NsqzR/wSGX78wH3TZb250WSLN/rCoc01OQ3139jFguYogQAAAAASUVORK5C\n", "YII=\n" ], "text/latex": [ "$$\\left[\\begin{matrix}m^{0}_{q=0}\\\\m^{0}_{q=1}\\\\m^{1}_{q=0}\\\\m^{1}_{q=1}\\\\m^{2}_{q=0}\\\\m^{2}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡m_q=0__0⎤\n", "⎢ ⎥\n", "⎢m_q=1__0⎥\n", "⎢ ⎥\n", "⎢m_q=0__1⎥\n", "⎢ ⎥\n", "⎢m_q=1__1⎥\n", "⎢ ⎥\n", "⎢m_q=0__2⎥\n", "⎢ ⎥\n", "⎣m_q=1__2⎦" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bm = control_vectors[0]\n", "for control in control_vectors[1:]:\n", " bm = bm.col_join(control)\n", "bm" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "YNQR5wAAAABJRU5ErkJggg==\n" ], "text/latex": [ "$$\\left[\\begin{matrix}k^{0}_{q=0,p=0}\\\\k^{0}_{q=0,p=1}\\\\k^{0}_{q=1,p=0}\\\\k^{0}_{q=1,p=1}\\\\m^{*0}_{q=0}\\\\m^{*0}_{q=1}\\\\k^{1}_{q=0,p=0}\\\\k^{1}_{q=0,p=1}\\\\k^{1}_{q=1,p=0}\\\\k^{1}_{q=1,p=1}\\\\m^{*1}_{q=0}\\\\m^{*1}_{q=1}\\\\k^{2}_{q=0,p=0}\\\\k^{2}_{q=0,p=1}\\\\k^{2}_{q=1,p=0}\\\\k^{2}_{q=1,p=1}\\\\m^{*2}_{q=0}\\\\m^{*2}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡k_q=0,p=0__0⎤\n", "⎢ ⎥\n", "⎢k_q=0,p=1__0⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=0__0⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=1__0⎥\n", "⎢ ⎥\n", "⎢ m_q=0__*0 ⎥\n", "⎢ ⎥\n", "⎢ m_q=1__*0 ⎥\n", "⎢ ⎥\n", "⎢k_q=0,p=0__1⎥\n", "⎢ ⎥\n", "⎢k_q=0,p=1__1⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=0__1⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=1__1⎥\n", "⎢ ⎥\n", "⎢ m_q=0__*1 ⎥\n", "⎢ ⎥\n", "⎢ m_q=1__*1 ⎥\n", "⎢ ⎥\n", "⎢k_q=0,p=0__2⎥\n", "⎢ ⎥\n", "⎢k_q=0,p=1__2⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=0__2⎥\n", "⎢ ⎥\n", "⎢k_q=1,p=1__2⎥\n", "⎢ ⎥\n", "⎢ m_q=0__*2 ⎥\n", "⎢ ⎥\n", "⎣ m_q=1__*2 ⎦" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xm = gain_matrices[0].reshape(q * p, 1).col_join(control_star_vectors[0])\n", "for gain, control_star in zip(gain_matrices[1:], control_star_vectors[1:]):\n", " xm = xm.col_join(gain.reshape(q * p, 1)).col_join(control_star)\n", "xm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the original equations can be regenerated with:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "jdUGpf8DUMLpqMbQruQAAAAASUVORK5CYII=\n" ], "text/latex": [ "$$\\left[\\begin{matrix}- k^{0}_{q=0,p=0} s^{0}_{p=0} - k^{0}_{q=0,p=1} s^{0}_{p=1} + m^{*0}_{q=0} - m^{0}_{q=0}\\\\- k^{0}_{q=1,p=0} s^{0}_{p=0} - k^{0}_{q=1,p=1} s^{0}_{p=1} + m^{*0}_{q=1} - m^{0}_{q=1}\\\\- k^{1}_{q=0,p=0} s^{1}_{p=0} - k^{1}_{q=0,p=1} s^{1}_{p=1} + m^{*1}_{q=0} - m^{1}_{q=0}\\\\- k^{1}_{q=1,p=0} s^{1}_{p=0} - k^{1}_{q=1,p=1} s^{1}_{p=1} + m^{*1}_{q=1} - m^{1}_{q=1}\\\\- k^{2}_{q=0,p=0} s^{2}_{p=0} - k^{2}_{q=0,p=1} s^{2}_{p=1} + m^{*2}_{q=0} - m^{2}_{q=0}\\\\- k^{2}_{q=1,p=0} s^{2}_{p=0} - k^{2}_{q=1,p=1} s^{2}_{p=1} + m^{*2}_{q=1} - m^{2}_{q=1}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-k_q=0,p=0__0⋅s_p=0__0 - k_q=0,p=1__0⋅s_p=1__0 + m_q=0__*0 - m_q=0__0⎤\n", "⎢ ⎥\n", "⎢-k_q=1,p=0__0⋅s_p=0__0 - k_q=1,p=1__0⋅s_p=1__0 + m_q=1__*0 - m_q=1__0⎥\n", "⎢ ⎥\n", "⎢-k_q=0,p=0__1⋅s_p=0__1 - k_q=0,p=1__1⋅s_p=1__1 + m_q=0__*1 - m_q=0__1⎥\n", "⎢ ⎥\n", "⎢-k_q=1,p=0__1⋅s_p=0__1 - k_q=1,p=1__1⋅s_p=1__1 + m_q=1__*1 - m_q=1__1⎥\n", "⎢ ⎥\n", "⎢-k_q=0,p=0__2⋅s_p=0__2 - k_q=0,p=1__2⋅s_p=1__2 + m_q=0__*2 - m_q=0__2⎥\n", "⎢ ⎥\n", "⎣-k_q=1,p=0__2⋅s_p=0__2 - k_q=1,p=1__2⋅s_p=1__2 + m_q=1__*2 - m_q=1__2⎦" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Am * xm - bm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have $n(p q + q)$ unknowns and $nq$ equations so we need at least $1 + p$ cycles to solve for the unknowns." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "18" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n * (p*q + q)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 + p" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((6, 18), (6, 1))" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Am.shape, bm.shape" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [], "source": [ "b = bm\n", "A = Am\n", "for step in range(p):\n", " b = b.col_join(bm)\n", " A = A.col_join(Am)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((18, 18), (18, 1))" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.shape, b.shape" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%load_ext version_information" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/json": { "Software versions": [ { "module": "Python", "version": "2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]" }, { "module": "IPython", "version": "3.0.0" }, { "module": "OS", "version": "Linux 3.13.0 49 generic x86_64 with debian jessie sid" }, { "module": "sympy", "version": "0.7.6" } ] }, "text/html": [ "
SoftwareVersion
Python2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
IPython3.0.0
OSLinux 3.13.0 49 generic x86_64 with debian jessie sid
sympy0.7.6
Fri Apr 24 10:54:34 2015 PDT
" ], "text/latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] \\\\ \\hline\n", "IPython & 3.0.0 \\\\ \\hline\n", "OS & Linux 3.13.0 49 generic x86\\_64 with debian jessie sid \\\\ \\hline\n", "sympy & 0.7.6 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Fri Apr 24 10:54:34 2015 PDT} \\\\ \\hline\n", "\\end{tabular}\n" ], "text/plain": [ "Software versions\n", "Python 2.7.9 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n", "IPython 3.0.0\n", "OS Linux 3.13.0 49 generic x86_64 with debian jessie sid\n", "sympy 0.7.6\n", "Fri Apr 24 10:54:34 2015 PDT" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%version_information sympy" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.9" } }, "nbformat": 4, "nbformat_minor": 0 }