{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The Jupyter notebook cheat sheet\n", "This document will be available to you during tests and exams" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Table of Contents\n", "\n", "[Numeric](#Numeric)\n", "\n", "[Basic plotting functions](#Basic-plotting-functions)\n", "\n", "[Symbolic manipulation](#Symbolic-manipulation)\n", "\n", "[Equation solving](#Equation-solving)\n", "\n", "[Matrix math](#Matrix-math)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tbcontrol\n", "tbcontrol.expectversion('0.1.2')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Numeric " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy\n", "import scipy" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "a = numpy.array([1, 2, 3])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "t = numpy.linspace(0, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic plotting functions" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotfuncs = [plt.plot, \n", " plt.stem,\n", " plt.scatter, \n", " plt.semilogx, \n", " plt.semilogy, \n", " plt.loglog]\n", "\n", "for i, func in enumerate(plotfuncs, 1):\n", " plt.subplot(2, 3, i)\n", " func([1, 2, 3], [2, 1, 2])\n", " plt.title(func.__name__)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symbolic manipulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Imports" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import sympy\n", "sympy.init_printing()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Symbol definitions" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "s = sympy.Symbol('s') # A single symbol\n", "tau, K_c = sympy.symbols('tau K_c', positive=True) # we can use real=True or complex=True for other kinds of variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Example controller and system" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "Gc = K_c*((tau*s + 1) / (tau*s))\n", "GvGpGm = 5 / ((10*s + 1)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Working with rational functions and polynomials" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We often want nice rational functions, but sympy doesn't make expressions rational by default" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\frac{5 K_{c} \\left(s \\tau + 1\\right)}{s \\tau \\left(10 s + 1\\right)^{2}} + 1$$" ], "text/plain": [ "5⋅K_c⋅(s⋅τ + 1) \n", "─────────────── + 1\n", " 2 \n", "s⋅τ⋅(10⋅s + 1) " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chareq = GvGpGm*Gc + 1\n", "chareq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `cancel` function forces this to be a fraction. `collect` collects terms." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\frac{5 K_{c} + 100 s^{3} \\tau + 20 s^{2} \\tau + s \\left(5 K_{c} \\tau + \\tau\\right)}{100 s^{3} \\tau + 20 s^{2} \\tau + s \\tau}$$" ], "text/plain": [ " 3 2 \n", "5⋅K_c + 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅(5⋅K_c⋅τ + τ)\n", "────────────────────────────────────────────\n", " 3 2 \n", " 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅τ " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chareq = chareq.cancel().collect(s)\n", "chareq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In some cases we can factor equations:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\frac{5 K_{c} + 100 s^{3} \\tau + 20 s^{2} \\tau + s \\left(5 K_{c} \\tau + \\tau\\right)}{s \\tau \\left(10 s + 1\\right)^{2}}$$" ], "text/plain": [ " 3 2 \n", "5⋅K_c + 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅(5⋅K_c⋅τ + τ)\n", "────────────────────────────────────────────\n", " 2 \n", " s⋅τ⋅(10⋅s + 1) " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chareq.factor(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtain the numerator and denominator:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left ( 5 K_{c} + 100 s^{3} \\tau + 20 s^{2} \\tau + s \\left(5 K_{c} \\tau + \\tau\\right), \\quad 100 s^{3} \\tau + 20 s^{2} \\tau + s \\tau\\right )$$" ], "text/plain": [ "⎛ 3 2 3 2 ⎞\n", "⎝5⋅K_c + 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅(5⋅K_c⋅τ + τ), 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅τ⎠" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.numer(chareq), sympy.denom(chareq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you want them both, you can use" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left ( 5 K_{c} + 100 s^{3} \\tau + 20 s^{2} \\tau + s \\left(5 K_{c} \\tau + \\tau\\right), \\quad 100 s^{3} \\tau + 20 s^{2} \\tau + s \\tau\\right )$$" ], "text/plain": [ "⎛ 3 2 3 2 ⎞\n", "⎝5⋅K_c + 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅(5⋅K_c⋅τ + τ), 100⋅s ⋅τ + 20⋅s ⋅τ + s⋅τ⎠" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chareq.as_numer_denom()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convert to polynomial in s" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "numer = sympy.poly(sympy.numer(chareq), s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we have a polynomial, it is easy to obtain coefficients:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left [ 100 \\tau, \\quad 20 \\tau, \\quad 5 K_{c} \\tau + \\tau, \\quad 5 K_{c}\\right ]$$" ], "text/plain": [ "[100⋅τ, 20⋅τ, 5⋅K_c⋅τ + τ, 5⋅K_c]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numer.all_coeffs()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calculate the Routh Array" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "from tbcontrol.symbolic import routh" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}100 \\tau & 5 K_{c} \\tau + \\tau\\\\20 \\tau & 5 K_{c}\\\\- 25 K_{c} + \\tau \\left(5 K_{c} + 1\\right) & 0\\\\5 K_{c} & 0\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 100⋅τ 5⋅K_c⋅τ + τ⎤\n", "⎢ ⎥\n", "⎢ 20⋅τ 5⋅K_c ⎥\n", "⎢ ⎥\n", "⎢-25⋅K_c + τ⋅(5⋅K_c + 1) 0 ⎥\n", "⎢ ⎥\n", "⎣ 5⋅K_c 0 ⎦" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "routh(numer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get a function which can be used numerically, use `lambdify`:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "f = sympy.lambdify((K_c, tau), K_c + tau)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA4AAAASCAYAAABrXO8xAAAABHNCSVQICAgIfAhkiAAAAOlJREFUOI3N0r1KQ0EQBeDPkEJQEIyg2AipLARBUlgINhY2Fj6Eb2CvjUWw1ldJEdIIVkIiIoJFqoCIf2AliiEWu4vhcpV7wcKBZYbZOcw5h+GPookOBnjDC3o4QG18cCID/EAXN3jAFNbRwF2sB3kbJ39gcoQRTstKWI3AdmpUCgJ3Yr5KjazGFPuYxoygbyOCtvD424b7SC29FuYLsiMO7+JWcHWtDBiW8I7rskDCIYwwR3FXYTHmYfZjGQs5gIrvAzhPzerYwDaOcYY+ngVzNlEXnN7Lo7KCE1ziCZ94xQUOMVtQ0n+LLxK6LQuL4DX5AAAAAElFTkSuQmCC\n", "text/latex": [ "$$3$$" ], "text/plain": [ "3" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(1, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Functions useful for discrete systems" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "z, q = sympy.symbols('z, q')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAgCAYAAACrdt7+AAAABHNCSVQICAgIfAhkiAAAAjBJREFUaIHt2E+ITWEYx/HPHRYzjETEalLEimaJBWPFQimxsxI2ZqVJMvmzVBaoKRtq2LCwuVkhO+xJiUgpJvlTlIg0Fu87Ofd0zplz7x1zbjrfOr33/ft7nve+5z3P+1LTM2zDbbzDNPZVa06gr0LtxXiM0Qpt6FnqFdKr1BOSop6QFPWEpKgnJMXCCrUHsS6RX4NhfMabKgyqmhHhc5t+Jqszqaampk0aMZ2u1Iqa/4NleI+1VRsyB9zCsW4HOY9rifx83We0o3MFF0qMuUmId5amK8pGqotwOArOMF/3GWV1+rAbzRJjPsFrHChqdEJ2oHQG+4UZbeT0na/7jCKdLfjkb/Rd5I+YPiwSW4LViecipoTw+hLudWjoXFKkcw7XE/kif2AXfmKgjPBJ4Z3dEPNNrftHO4bOJUU6z7A3py7tD2EfmZb6SGTtIeM4Kpw1nseyfvwoY3EBZ2Uv4eQz0uHY64XD4Z2Muix/4HtMW1ZI+rR7CkewHS8T5R+Fz243TODmLG06PeXuwX18S5Xn+QPLY/ohb9DT0aCsOGMMTwsMqvqVeYBDqbIif8T2b/OExoVVsFXrRtQf6zfiN1Yk+gwK9xfD0dCx+HsoT6RDZtNZiV9Y1YY/hA34apZgA19kv9M7Eu0eaY0FRnL6TJb1tCSz6RyMts1Qxp8BfMXmbgzbiRdY0M0g/4AmjrfZZxR3syrace6VMPtTwj/QKwzhhvCPl2UYl4VArqampnP+ABH/nAYOydleAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\frac{1}{z \\left(1 - \\frac{1}{z}\\right)}$$" ], "text/plain": [ " 1 \n", "─────────\n", " ⎛ 1⎞\n", "z⋅⎜1 - ─⎟\n", " ⎝ z⎠" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gz = z**-1/(1 - z**-1)\n", "Gz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Write in terms of positive powers of $z$:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAAABHNCSVQICAgIfAhkiAAAAPpJREFUWIXt1j9KA0EUgPFfxE7tUwpKbD2BxgtYeQarYC0G/xzBIgewtPck6a0EtRMthHSx2BSbsGE22dndIPPBY1mWefMxMzvv8Y84wQs+MMVFjKRbFcbuYIxBDJHYbMQK1UISCpGEQmxXGLuLw9z7Po7xhbcKedemL/vdF+OpDZlEa3Rmz2mrFokNpVT/1ORNvXL/dK34oruvQa5U/7SHbi4e8Wm+PDQqlOdGttdHNciwotAQ7+gt+f6geGvz0V9XaLHa3+ISp3hdkmyE58CEUar93SzRQYxkAYIrNMQVzvErO9TwjUkkidL9Uwc/is/CWSQZUv+UaIg/SoFF55mIgdgAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{1}{z - 1}$$" ], "text/plain": [ " 1 \n", "─────\n", "z - 1" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gz.cancel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Write in terms of negative powers of $z$:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADYAAAAjCAYAAADfXvn1AAAABHNCSVQICAgIfAhkiAAAAYxJREFUWIXt2LFK5FAUxvGfi1ZuaSVoIe5aOYiFpQqCIDZbWPoIW2zhA4i1aKEPoGJhZ2G1sFhau8U2giAi2tgIFiroWCSKBGcc5t4k45I/XAiH5LvnJLkn9wsVuTGCQ9zhFHO4x0yZSYXyDTdYwzDmcYU6+krMK5jf2MnEtnERKtwdKhDAAGYxnok/4G+o+JdQgQDG8Yh/mXgNx6HiZRb2lM7f8yY2hQkRCiuTfkkn3MAQfuBE0ji+l5hXFBZxjlvs41d6XOablAsrOIoh1Gl3piZCR6TzChv1yRtH4ZxJulKrY7eULFsgu/M4lbTgVrmMmEtUuiLp1CPpVPyPTOJAsgzqWHjvpE5r963QK/nW/Sxy0qLdcMMnFpMy3HAhheXmhpuQ+xp7ccPrmXgzN7zs4w3AdLsJxfo10MwN/2lwzSb2PtA9bzehWIW9dcMPaezFDa82uOY6HR1NkW74K8bSUcdSejwYeZ5XinLD095fj1uR52lINDfcDnnuPKK54XbIs7DKDVdUVHw+ngGIzGtnneNhQwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{q}{q - 1}$$" ], "text/plain": [ " -q \n", "─────\n", "q - 1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Gz.subs({z: q**-1}).cancel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inversion of the $z$ transform" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from tbcontrol.symbolic import sampledvalues" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZsAAAAVCAYAAACQVUPkAAAABHNCSVQICAgIfAhkiAAAAvZJREFUeJzt3b+LHGUcx/HXSaqIJv4oLBRCJPonqNicCukEC1vByiLBKmJj4V0nFuJPsNJF/APSaqEnothpp0kQYhMR0mhI/IEai5n1Nnszucnt3e19dz8vGB6Y59nlfWzxsDe7s0REROyjVVyfOH6Ya01ERFRzrxv3kevjids6Fn+BdbzbMXc/PsAl/ImLeBN37Wru7J7FO/gSv2n+4I/nWtStSid1Wqt0Uqe1Sid1Whe185pm/1jHT32LVtsnWuuZfxC/tGvO4jV8ZvNd0D3D+/fcd5quK/jewX0hq3RSp7VKJ3Vaq3RSp3UZOjdMvLOZtOrmm80n7fyLU+ffaM+/PzBgPzyBE1ix+XcdxBeySid1Wqt0Uqe1Sid1Wpehc8PEZnNo4IOO46Tm32bvTc29ihfwHM7g6sDn3EufzztgoCqd1Gmt0kmd1iqd1Gldus6uazZdnmzHT/Hv1NwVfIXDeHSXuiIiYoEM3WwebsfzPfMX2vGh2XIiImIRDd1sjrTjrz3z4/NHZ8uJiIhFNHSz2c5KO3Z+8iAiIpbb0M1m/M7lSM/8nVPrIiIi/jd0sznXjn3XZE60Y981nYiIWGJDN5vxx99OdjzmDjyO3/HNLnVFRMQCGbrZ/Kj52PMxnJ6aW8ft+MjW79iMNNdxnt9p4D4ZqdFJndaRGp3UaR2p0Umd1pEandRq3WLolzrhFL7G23hKc+uCRzTfMD2PVzoeM97M/p6hcSeeaQ+4rx0f07xYcBkvTayv0kmd1iqd1Gmt0kmd1iqdzKd1J53bWnXz29XAA/gQP+MvzY3W3sLdPeu/1dy8bb9v1Llm651HJ4+LU+urdFKntUondVqrdFKntUon82ldc+udYxt2eG+0W3UU/+D1XXq+vVKlkzqtVTqp01qlkzqtVTqp1Tq2YZvNZnzM+ns2T+MPm2+9DqoqndRprdJJndYqndRprdJJndbe37NZmVh0zI0Xni7r/k2biIiILofx8tS5tTl0RERERERE7IH/AMAkchx+7ub0AAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left [ 0, \\quad 1, \\quad 1, \\quad 1, \\quad 1, \\quad 1, \\quad 1, \\quad 1, \\quad 1, \\quad 1\\right ]$$" ], "text/plain": [ "[0, 1, 1, 1, 1, 1, 1, 1, 1, 1]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sampledvalues(Gz, z, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Equation solving" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Symbolic" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left \\{ x : - a, \\quad y : a + 2, \\quad z : -2\\right \\}$$" ], "text/plain": [ "{x: -a, y: a + 2, z: -2}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x, y, z, a = sympy.symbols('x, y, z, a')\n", "residuals = [x + y - 2, y + z - a, x + y + z]\n", "unknowns = [x, y, z]\n", "sympy.solve(residuals, unknowns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numeric sympy" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}-2.21910714891375\\\\2.21910714891375\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-2.21910714891375⎤\n", "⎢ ⎥\n", "⎣2.21910714891375 ⎦" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "residuals = [2*x**2 - 2*y**2, sympy.sin(x) + sympy.log(y)]\n", "unknowns = [x, y]\n", "sympy.nsolve(residuals, unknowns, [1, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numeric" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "import scipy.optimize" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def residuals(unknowns):\n", " x, y = unknowns\n", " return [2*x**2 - 2*y**2, numpy.sin(x) + numpy.log(y)]" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "starting_point = [1, 3]" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left [ -16, \\quad 1.9400832734760063\\right ]$$" ], "text/plain": [ "[-16, 1.9400832734760063]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "residuals(starting_point)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-2.21910715, 2.21910715])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scipy.optimize.fsolve(residuals, starting_point)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix math " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Symbolic" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "G11, G12, G21, G22 = sympy.symbols('G11, G12, G21, G22')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creation" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}G_{11} & G_{12}\\\\G_{21} & G_{22}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡G₁₁ G₁₂⎤\n", "⎢ ⎥\n", "⎣G₂₁ G₂₂⎦" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = sympy.Matrix([[G11, G12], [G21, G22]])\n", "G" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Determinant, inverse, transpose" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left ( G_{11} G_{22} - G_{12} G_{21}, \\quad \\left[\\begin{matrix}\\frac{G_{22}}{G_{11} G_{22} - G_{12} G_{21}} & - \\frac{G_{12}}{G_{11} G_{22} - G_{12} G_{21}}\\\\- \\frac{G_{21}}{G_{11} G_{22} - G_{12} G_{21}} & \\frac{G_{11}}{G_{11} G_{22} - G_{12} G_{21}}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}G_{11} & G_{21}\\\\G_{12} & G_{22}\\end{matrix}\\right]\\right )$$" ], "text/plain": [ "⎛ ⎡ G₂₂ -G₁₂ ⎤ ⎞\n", "⎜ ⎢───────────────── ─────────────────⎥ ⎟\n", "⎜ ⎢G₁₁⋅G₂₂ - G₁₂⋅G₂₁ G₁₁⋅G₂₂ - G₁₂⋅G₂₁⎥ ⎡G₁₁ G₂₁⎤⎟\n", "⎜G₁₁⋅G₂₂ - G₁₂⋅G₂₁, ⎢ ⎥, ⎢ ⎥⎟\n", "⎜ ⎢ -G₂₁ G₁₁ ⎥ ⎣G₁₂ G₂₂⎦⎟\n", "⎜ ⎢───────────────── ─────────────────⎥ ⎟\n", "⎝ ⎣G₁₁⋅G₂₂ - G₁₂⋅G₂₁ G₁₁⋅G₂₂ - G₁₂⋅G₂₁⎦ ⎠" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.det(), G.inv(), G.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Math operations: Multiplication, addition, elementwise multiplication:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\left ( \\left[\\begin{matrix}G_{11}^{2} + G_{12} G_{21} & G_{11} G_{12} + G_{12} G_{22}\\\\G_{11} G_{21} + G_{21} G_{22} & G_{12} G_{21} + G_{22}^{2}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}2 G_{11} & 2 G_{12}\\\\2 G_{21} & 2 G_{22}\\end{matrix}\\right], \\quad \\left[\\begin{matrix}G_{11}^{2} & G_{12}^{2}\\\\G_{21}^{2} & G_{22}^{2}\\end{matrix}\\right]\\right )$$" ], "text/plain": [ "⎛⎡ 2 ⎤ ⎡ 2 2⎤⎞\n", "⎜⎢ G₁₁ + G₁₂⋅G₂₁ G₁₁⋅G₁₂ + G₁₂⋅G₂₂⎥ ⎡2⋅G₁₁ 2⋅G₁₂⎤ ⎢G₁₁ G₁₂ ⎥⎟\n", "⎜⎢ ⎥, ⎢ ⎥, ⎢ ⎥⎟\n", "⎜⎢ 2 ⎥ ⎣2⋅G₂₁ 2⋅G₂₂⎦ ⎢ 2 2⎥⎟\n", "⎝⎣G₁₁⋅G₂₁ + G₂₁⋅G₂₂ G₁₂⋅G₂₁ + G₂₂ ⎦ ⎣G₂₁ G₂₂ ⎦⎠" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G*G, G+G, G.multiply_elementwise(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numeric" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creation" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "G = numpy.matrix([[1, 2], [3, 4]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Determinant, inverse, transpose" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-2.0000000000000004, matrix([[-2. , 1. ],\n", " [ 1.5, -0.5]]), matrix([[1, 3],\n", " [2, 4]]))" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.linalg.det(G), G.I, G.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Math operations: Multiplication, addition, elementwise multiplication:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(matrix([[ 7, 10],\n", " [15, 22]]), matrix([[2, 4],\n", " [6, 8]]), array([[ 1, 4],\n", " [ 9, 16]]))" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G*G, G+G, G.A*G.A" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }