Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Evgenij-Gr
Created March 6, 2017 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Evgenij-Gr/fd4daf9ff69a681809ac6d3106ed8f2c to your computer and use it in GitHub Desktop.
Save Evgenij-Gr/fd4daf9ff69a681809ac6d3106ed8f2c to your computer and use it in GitHub Desktop.
Simple demonstration of using SymPy for checking dynamical systems equivariance conditions in simple examples
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Let's consider the following vector field in $\\mathbb{R}^3$:\n",
"\n",
"$$\\left \\lbrace \\begin{array}{ccc}\n",
"\\dot{x} & = & y, \\\\\n",
"\\dot{y} & = & -x, \\\\\n",
"\\dot{z} & = & -z\n",
"\\end{array} \\right .$$\n",
"\n",
"It's quite obvious that $(x, y, z) \\mapsto (x \\cos \\varphi - y \\sin \\varphi, x \\sin \\varphi + y \\cos \\varphi, z)$ is a symmetry of this system for any real $\\varphi$ in a sense that it maps a solution into solution. Recall that $g \\in O(3)$ is a symmetry of a vector field $\\dot{\\mathbf{x}} = v (\\mathbf{x})$ iff\n",
"\n",
"$$g \\cdot v(\\mathbf{x}) \\equiv v(g \\cdot \\mathbf{x}).$$\n",
"\n",
"This is an \"equivarince condition\". That's exactly what we can check using CAS like SymPy. Let's illustrate this:"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import sympy as sp\n",
"\n",
"sp.init_printing()\n",
"\n",
"x, y, z, fi = sp.symbols('x y z varphi')\n",
"\n",
"R_fi = sp.Matrix([[sp.cos(fi), -sp.sin(fi), 0],[sp.sin(fi), sp.cos(fi), 0],[0,0,1]])\n",
"\n",
"u, v, w = sp.symbols('u, v, w')\n",
"vector_field = sp.Matrix([[v], [-u], [-w]])\n",
"X = sp.Matrix([[x], [y], [z]])\n",
"gX = R_fi * X"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The method is very crude and ineffective, but might work for small groups: just check if equivariance condition holds for all elements of group $G$:"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAABoAAABLCAMAAABZRmeuAAAAPFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMA\nMquZdlQQQOkwRInN3SJm77tsdo1uFAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAMtJREFUOBHtVdEW\ngyAIxSTXMrPG///rBDaTM7fnnVO8ZPeKIF4FHIkNUC0pAuDIY7GxMpD5fyCm3IEeo2yo4CP69zxL\nLWXRkFb1NFTeGIxLh9olyZGCcMaLhJpJc22pQJ6nz4QfXitFxpx+oPX6QQWd3lsQNNbYSQPSzrFy\nL3mULfveliFxobZXEdsMCxzLWfTLy6GqWa8K8+D01GkkepvuevJWoo+pucuXRM3z9Sc35TQSrT3F\nStS8UZdERaJfW3bgBo04H9qVlo0IT25QGoNPPQEEAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\left[\\begin{matrix}0\\\\0\\\\0\\end{matrix}\\right]$$"
],
"text/plain": [
"⎡0⎤\n",
"⎢ ⎥\n",
"⎢0⎥\n",
"⎢ ⎥\n",
"⎣0⎦"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R_fi * vector_field.subs([(u, x), (v, y), (w, z)]) - vector_field.subs([(u, gX[0]), (v, gX[1]), (w, gX[2])])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's also consider this system:\n",
"\n",
"$$\\left \\lbrace \\begin{array}{ccc}\n",
"\\dot{x} & = & Ax -6Bx^2 y^2 + By^4 + Bx^4, \\\\\n",
"\\dot{y} & = & Ay + 4Bx^3y - 4 Bxy^3, \\\\\n",
"\\dot{z} & = & -z\n",
"\\end{array} \\right .$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's not obvious from the beginning whether it has some symmetry or not, but I've constructed this example having discrete $\\mathbb{Z}_3$-symmetry in mind, i.e. \n",
"$(x, y, z) \\mapsto (x \\cos \\varphi - y \\sin \\varphi, x \\sin \\varphi + y \\cos \\varphi, z)$ is a symmetry of this system when $\\varphi = \\frac{2 \\pi}{3}$. Let's check it:"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"R_fi = R_fi.subs([(fi, 2*sp.pi/3)])\n",
"A, B = sp.symbols('A B')\n",
"vector_field = sp.Matrix([[A*u-6*B*u**2*v**2+B*u**4+B*v**4], [A*v + 4*B*u**3*v-4*B*u*v**3], [-w]])\n",
"X = sp.Matrix([[x], [y], [z]])\n",
"gX = R_fi * X"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What happens when we check equivariance condition?"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"res = R_fi * vector_field.subs([(u, x), (v, y), (w, z)]) - vector_field.subs([(u, gX[0]), (v, gX[1]), (w, gX[2])])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Well, without simplification it looks a bit ugly"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\nA2/rJrv/B8zB3/aVSsNqAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\left[\\begin{matrix}- \\frac{A x}{2} - A \\left(- \\frac{x}{2} - \\frac{\\sqrt{3} y}{2}\\right) - \\frac{B x^{4}}{2} + 3 B x^{2} y^{2} - \\frac{B y^{4}}{2} - B \\left(- \\frac{x}{2} - \\frac{\\sqrt{3} y}{2}\\right)^{4} + 6 B \\left(- \\frac{x}{2} - \\frac{\\sqrt{3} y}{2}\\right)^{2} \\left(\\frac{\\sqrt{3} x}{2} - \\frac{y}{2}\\right)^{2} - B \\left(\\frac{\\sqrt{3} x}{2} - \\frac{y}{2}\\right)^{4} - \\frac{\\sqrt{3}}{2} \\left(A y + 4 B x^{3} y - 4 B x y^{3}\\right)\\\\- \\frac{A y}{2} - A \\left(\\frac{\\sqrt{3} x}{2} - \\frac{y}{2}\\right) - 2 B x^{3} y + 2 B x y^{3} - 4 B \\left(- \\frac{x}{2} - \\frac{\\sqrt{3} y}{2}\\right)^{3} \\left(\\frac{\\sqrt{3} x}{2} - \\frac{y}{2}\\right) + 4 B \\left(- \\frac{x}{2} - \\frac{\\sqrt{3} y}{2}\\right) \\left(\\frac{\\sqrt{3} x}{2} - \\frac{y}{2}\\right)^{3} + \\frac{\\sqrt{3}}{2} \\left(A x + B x^{4} - 6 B x^{2} y^{2} + B y^{4}\\right)\\\\0\\end{matrix}\\right]$$"
],
"text/plain": [
"⎡ 4 4 4 \n",
"⎢ A⋅x ⎛ x √3⋅y⎞ B⋅x 2 2 B⋅y ⎛ x √3⋅y⎞ ⎛ x\n",
"⎢- ─── - A⋅⎜- ─ - ────⎟ - ──── + 3⋅B⋅x ⋅y - ──── - B⋅⎜- ─ - ────⎟ + 6⋅B⋅⎜- ─\n",
"⎢ 2 ⎝ 2 2 ⎠ 2 2 ⎝ 2 2 ⎠ ⎝ 2\n",
"⎢ \n",
"⎢ 3 \n",
"⎢ A⋅y ⎛√3⋅x y⎞ 3 3 ⎛ x √3⋅y⎞ ⎛√3⋅x y⎞ \n",
"⎢ - ─── - A⋅⎜──── - ─⎟ - 2⋅B⋅x ⋅y + 2⋅B⋅x⋅y - 4⋅B⋅⎜- ─ - ────⎟ ⋅⎜──── - ─⎟ \n",
"⎢ 2 ⎝ 2 2⎠ ⎝ 2 2 ⎠ ⎝ 2 2⎠ \n",
"⎢ \n",
"⎣ 0 \n",
"\n",
" 2 2 4 ⎛ 3 3⎞⎤\n",
" √3⋅y⎞ ⎛√3⋅x y⎞ ⎛√3⋅x y⎞ √3⋅⎝A⋅y + 4⋅B⋅x ⋅y - 4⋅B⋅x⋅y ⎠⎥\n",
" - ────⎟ ⋅⎜──── - ─⎟ - B⋅⎜──── - ─⎟ - ──────────────────────────────⎥\n",
" 2 ⎠ ⎝ 2 2⎠ ⎝ 2 2⎠ 2 ⎥\n",
" ⎥\n",
" 3 ⎛ 4 2 2 4⎞ ⎥\n",
" ⎛ x √3⋅y⎞ ⎛√3⋅x y⎞ √3⋅⎝A⋅x + B⋅x - 6⋅B⋅x ⋅y + B⋅y ⎠ ⎥\n",
"+ 4⋅B⋅⎜- ─ - ────⎟⋅⎜──── - ─⎟ + ────────────────────────────────── ⎥\n",
" ⎝ 2 2 ⎠ ⎝ 2 2⎠ 2 ⎥\n",
" ⎥\n",
" ⎦"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"but performing simple brackets expansion and basic simplification we get the following:"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAABoAAABLCAMAAABZRmeuAAAAPFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMA\nMquZdlQQQOkwRInN3SJm77tsdo1uFAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAMtJREFUOBHtVdEW\ngyAIxSTXMrPG///rBDaTM7fnnVO8ZPeKIF4FHIkNUC0pAuDIY7GxMpD5fyCm3IEeo2yo4CP69zxL\nLWXRkFb1NFTeGIxLh9olyZGCcMaLhJpJc22pQJ6nz4QfXitFxpx+oPX6QQWd3lsQNNbYSQPSzrFy\nL3mULfveliFxobZXEdsMCxzLWfTLy6GqWa8K8+D01GkkepvuevJWoo+pucuXRM3z9Sc35TQSrT3F\nStS8UZdERaJfW3bgBo04H9qVlo0IT25QGoNPPQEEAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\left[\\begin{matrix}0\\\\0\\\\0\\end{matrix}\\right]$$"
],
"text/plain": [
"⎡0⎤\n",
"⎢ ⎥\n",
"⎢0⎥\n",
"⎢ ⎥\n",
"⎣0⎦"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sp.simplify(res.expand())"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2 (SageMath)",
"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.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment