Skip to content

Instantly share code, notes, and snippets.

@ivanistheone
Created January 29, 2015 14:43
Show Gist options
  • Save ivanistheone/74144fee778d1f117c99 to your computer and use it in GitHub Desktop.
Save ivanistheone/74144fee778d1f117c99 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:15b1af9b179cac2d864bac2da3f3d08a79b12cf4c5600a3004321f237640b1ce"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# run me for pretty printing\n",
"from sympy import init_printing\n",
"init_printing()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Taming math and physics using `SymPy`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tutorial based on the [No bullshit guide](http://minireference.com/) series of textbooks by [Ivan Savov](mailto:ivan.savov+SYMPYTUT@gmail.com)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**_Abstract_\u2014Most people consider math and physics to be scary\n",
"beasts from which it is best to keep one\u2019s distance. Computers,\n",
"however, can help us tame the complexity and tedious arithmetic\n",
"manipulations associated with these subjects. Indeed, math and\n",
"physics are much more approachable once you have the power of\n",
"computers on your side.**\n",
"\n",
"**This tutorial serves a dual purpose. On one hand, it serves\n",
"as a review of the fundamental concepts of mathematics for\n",
"computer-literate people. On the other hand, this tutorial serves\n",
"to demonstrate to students how a computer algebra system can\n",
"help them with their classwork. A word of warning is in order.\n",
"Please don\u2019t use `SymPy` to avoid the suffering associated with your\n",
"homework! Teachers assign homework problems to you because\n",
"they want you to learn. Do your homework by hand, but if you\n",
"want, you can check your answers using `SymPy`. Better yet, use\n",
"SymPy to invent extra practice problems for yourself.**"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Contents"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* [Fundamentals of mathematics](#Fundamentals-of-mathematics)\n",
"* [Complex numbers](#Complex-numbers)\n",
"* [Calculus](#Calculus)\n",
"* [Vectors](#Vectors)\n",
"* [Mechanics](#Mechanics)\n",
"* [Linear algebra](#Linear-algebra)"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can use a computer algebra system (CAS) to compute complicated\n",
"math expressions, solve equations, perform calculus procedures,\n",
"and simulate physics systems.\n",
"\n",
"All computer algebra systems offer essentially the same functionality,\n",
"so it doesn\u2019t matter which system you use: there are free\n",
"systems like `SymPy`, `Magma`, or `Octave`, and commercial systems like\n",
"`Maple`, `MATLAB`, and `Mathematica`. This tutorial is an introduction to\n",
"`SymPy`, which is a symbolic computer algebra system written in the\n",
"programming language `Python`. In a symbolic CAS, numbers and\n",
"operations are represented symbolically, so the answers obtained are\n",
"exact. For example, the number $\\sqrt{2}$ is represented in `SymPy` as the\n",
"object `Pow(2,1/2)`, whereas in numerical computer algebra systems\n",
"like `Octave`, the number $\\sqrt{2}$ is represented as the approximation\n",
"$1.41421356237310$ (a `float`). For most purposes the approximation\n",
"is okay, but sometimes approximations can lead to problems:\n",
"`float(sqrt(2))*float(sqrt(2))` $= 2.00000000000000044 \\ne 2$. Because\n",
"SymPy uses exact representations, you\u2019ll never run into such\n",
"problems: `Pow(2,1/2)*Pow(2,1/2)` $= 2$.\n",
"\n",
"This tutorial is organized as follows. We\u2019ll begin by introducing the\n",
"`SymPy` basics and the bread-and-butter functions used for manipulating\n",
"expressions and solving equations. Afterward, we\u2019ll discuss the\n",
"`SymPy` functions that implement calculus operations like differentiation\n",
"and integration. We\u2019ll also introduce the functions used to deal with\n",
"vectors and complex numbers. Later we\u2019ll see how to use vectors and\n",
"integrals to understand Newtonian mechanics. In the last section,\n",
"we\u2019ll introduce the linear algebra functions available in `SymPy`.\n",
"\n",
"This tutorial presents many explanations as blocks of code. Be sure\n",
"to try the code examples on your own by typing the commands into\n",
"`SymPy`. It\u2019s always important to verify for yourself!"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Using SymPy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The easiest way to use `SymPy`, provided you\u2019re connected to the\n",
"Internet, is to visit http://live.sympy.org. You\u2019ll be presented with\n",
"an interactive prompt into which you can enter your commands\u2014right\n",
"in your browser.\n",
"\n",
"If you want to use `SymPy` on your own computer, you must install\n",
"`Python` and the python package `sympy`. You can then open a command\n",
"prompt and start a `SymPy` session using:\n",
"\n",
"```\n",
"you@host$ python\n",
"Python X.Y.Z\n",
"[GCC a.b.c (Build Info)] on platform\n",
"Type \"help\", \"copyright\", or \"license\" for more information.\n",
">>> from sympy import *\n",
">>>\n",
"```\n",
"\n",
"The `>>>` prompt indicates you\u2019re in the Python shell which accepts\n",
"Python commands. The command `from sympy import *` imports all\n",
"the `SymPy` functions into the current namespace. All `SymPy` functions\n",
"are now available to you. To exit the python shell press `CTRL+D`.\n",
"\n",
"I highly recommend you also install `ipython`, which is an improved\n",
"interactive python shell. If you have `ipython` and `SymPy` installed,\n",
"you can start an `ipython` shell with `SymPy` pre-imported using the\n",
"command `isympy`. For an even better experience, you can try `ipython notebook`,\n",
"which is a web frontend for the `ipython` shell.\n",
"\n",
"Each section of this tutorial begins with a python `import` statement\n",
"for the functions used in that section. If you use the statement `from sympy import *`\n",
"in the beginning of your code, you don\u2019t need to\n",
"run these individual import statements, but I\u2019ve included them so\n",
"you\u2019ll know which `SymPy` vocabulary is covered in each section."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Fundamentals of mathematics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let\u2019s begin by learning about the basic `SymPy` objects and the\n",
"operations we can carry out on them. We\u2019ll learn the `SymPy` equivalents\n",
"of many math verbs like \u201cto solve\u201d (an equation), \u201cto expand\u201d (an\n",
"expression), \u201cto factor\u201d (a polynomial)."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Numbers"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import sympify, S, evalf, N, pi"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In `Python`, there are two types of number objects: `int`s and `float`s."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"3 # an int"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$3$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAIom7VJlmdt1E7xDNIS4hGwAA\nAAlwSFlzAAAOxAAADsQBlSsOGwAAAFJJREFUCB1jYBBSMmFgYAxg8E1gYL/CwNvAwLmSYe8BBiAA\nijAwcDcBCUaNaCDJwKA1AURyrWZgFGBgBiq+DSK5DBg4LjKwJTD4FjAwTA21ZAAAM4UOK1ZklQ8A\nAAAASUVORK5CYII=\n",
"prompt_number": 3,
"text": [
"3"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"3.0 # a float"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$3.0$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABoAAAAOBAMAAADDIxFwAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIom7VJlmdt1E7xDN\nqzIhoty3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAo0lEQVQIHWNgEFIyYQCBrWp6DAyMAQz+CSDe\nEYYdAgzsXxj4G4ActgUMTAcYOFcy7D8A5DFfYGD5DaQhKvkvMHB+AXK4m0BC+wMYOL8DjdGIBvHk\nFRj4PoEYWhNAvAAoj2s1kAdRySjAwAzSDTSFBWjZbwiP2YCB7TcDlwEDx0egHNB21gMMbAkM/gXc\nfxgYWhh2PWBgmBpqycDQy8CwqfweAwC8Tid9oMKJvwAAAABJRU5ErkJggg==\n",
"prompt_number": 78,
"text": [
"3.0"
]
}
],
"prompt_number": 78
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Integer objects in Python are a faithful representation of the set of\n",
"integers $\\mathbb{Z} = \\{..., \u22122, \u22121, 0, 1, 2,...\\}$. Floating point numbers are\n",
"approximate representations of the reals $\\mathbb{R}$. Regardless of its absolute\n",
"size, a floating point number is only accurate to 16 decimals.\n",
"\n",
"Special care is required when specifying rational numbers, because\n",
"integer division might not produce the answer you want. In other\n",
"words, Python will not automatically convert the answer to a floating\n",
"point number, but instead round the answer to the closest integer:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"1/7 # int/int gives int"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0.14285714285714285$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMAAAAAPBAMAAABATN1VAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACdElEQVQ4EbXUO2hTURzH8W/euXl5sUsRsdcW\nEbHgpalTCw3oJFJDJzcDDg4VW8RJBAOCDhYai4i6tJOvIm0HQXCJoT6G2mZytNpB6FKtYtXWev2f\n3JvkpCSjZ8kln3P+v/O498Du3qNobQgmDj8D31pPmfCn0EFOl9Jpu9pD2Oh8kdU4NNaVTjdlLphD\no3CO9kLFL5vq5ya+IgNl/PCGmOPYnHIcpwhVZi+BbY2Dwn+aMjPOdwhOEcghMy4tqYDUNAmT2BSX\n4A7h/lU4BAmNeQlPNPbL9Ir10RpzdlEsXiSyLpXhiwq4PUwsT+IHfdAuhaXZoDaxyjyCpWydAxDI\nNmWKaviuIsmf6sGtYA8TXlcBy3P0ugGQ/KgxI6YE6MyH5uwGdFgk/0oHNyBYGFaPUclwjmVIHF+R\nyRFX/6kVeMy4qTOzzZn5wQMwaROSo/C67KMSsGzDwIZJ3DS2RXp3cFIGaBzINI6uMnNMlpm09ADb\nDRiDyLvxp6ruczn/r+pBrcDjqJxbnelozfE8DVsUyVYC/BacJLUpJTlSIJXzKnhMZwPzuTX7f6tD\njtQOuY1KwIqMeAxnRl/LVpSJznoVPE5ZDSyfjjRZ4E5O5NQXE58lWHtNrywsbC4SsbintiWReSAr\nMOkoehVc5iLGLY198plVAnZyLId/XX1o/pzq4b6mTINcB6tqBfGCBddlJfKjccgiVdA49K0Fy2UQ\nzcEN9mR9G7UKWxjX0t153psMMkFQKl216hW24G66563OES2ggQ2LEwVoW3sF8tp0z5zPQJ8zH5bL\nJU+oJJed0VUy4f6oBNSYEcf5pbPxsAUz0b9fTe3/tn9w/x07wyGSRgAAAABJRU5ErkJggg==\n",
"prompt_number": 5,
"text": [
"0.14285714285714285"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To avoid this problem, you can force `float` division by using the\n",
"number `1.0` instead of `1`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"1.0/7 # float/int gives float"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0.14285714285714285$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMAAAAAPBAMAAABATN1VAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACdElEQVQ4EbXUO2hTURzH8W/euXl5sUsRsdcW\nEbHgpalTCw3oJFJDJzcDDg4VW8RJBAOCDhYai4i6tJOvIm0HQXCJoT6G2mZytNpB6FKtYtXWev2f\n3JvkpCSjZ8kln3P+v/O498Du3qNobQgmDj8D31pPmfCn0EFOl9Jpu9pD2Oh8kdU4NNaVTjdlLphD\no3CO9kLFL5vq5ya+IgNl/PCGmOPYnHIcpwhVZi+BbY2Dwn+aMjPOdwhOEcghMy4tqYDUNAmT2BSX\n4A7h/lU4BAmNeQlPNPbL9Ir10RpzdlEsXiSyLpXhiwq4PUwsT+IHfdAuhaXZoDaxyjyCpWydAxDI\nNmWKaviuIsmf6sGtYA8TXlcBy3P0ugGQ/KgxI6YE6MyH5uwGdFgk/0oHNyBYGFaPUclwjmVIHF+R\nyRFX/6kVeMy4qTOzzZn5wQMwaROSo/C67KMSsGzDwIZJ3DS2RXp3cFIGaBzINI6uMnNMlpm09ADb\nDRiDyLvxp6ruczn/r+pBrcDjqJxbnelozfE8DVsUyVYC/BacJLUpJTlSIJXzKnhMZwPzuTX7f6tD\njtQOuY1KwIqMeAxnRl/LVpSJznoVPE5ZDSyfjjRZ4E5O5NQXE58lWHtNrywsbC4SsbintiWReSAr\nMOkoehVc5iLGLY198plVAnZyLId/XX1o/pzq4b6mTINcB6tqBfGCBddlJfKjccgiVdA49K0Fy2UQ\nzcEN9mR9G7UKWxjX0t153psMMkFQKl216hW24G66563OES2ggQ2LEwVoW3sF8tp0z5zPQJ8zH5bL\nJU+oJJed0VUy4f6oBNSYEcf5pbPxsAUz0b9fTe3/tn9w/x07wyGSRgAAAABJRU5ErkJggg==\n",
"prompt_number": 6,
"text": [
"0.14285714285714285"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This result is better, but it\u2019s still only an approximation of the exact\n",
"number $\\frac{1}{7} \\in \\mathbb{Q}$, since a `float` has 16 decimals while the decimal\n",
"expansion of $\\frac{1}{7}$ is infinitely long. To obtain an *exact* representation\n",
"of $\\frac{1}{7}$ you need to create a `SymPy` expression. You can sympify any\n",
"expression using the shortcut function `S()`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"S('1/7') # = Rational(1,7)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{7}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAqBAMAAACXcryGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYy3Yki\nRLuihtmPAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAYklEQVQYGWNggAEhAyCL2dUfRDEw5FODCtEv\naQCbRhbxHwQ+EKOVc0n07t0MDBxA9V8YGFgPMDA4MDBwA9EEsO5rEDMegCnuBjBlDyYZ0iHUOjDF\nDNQMBJxfwRQjhOJRBPIA66UdcVFoS78AAAAASUVORK5CYII=\n",
"prompt_number": 7,
"text": [
"1/7"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note the input to `S()` is specified as a text string delimited by quotes.\n",
"We could have achieved the same result using `S(\u20191\u2019)/7` since a `SymPy`\n",
"object divided by an `int` is a `SymPy` object.\n",
"\n",
"Except for the tricky `Python` division operator, other math operators\n",
"like addition `+`, subtraction `-`, and multiplication `*` work as you would\n",
"expect. The syntax `**` is used in `Python` to denote exponentiation:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"2**10 # same as S('2^10')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$1024$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAPBAMAAACVcstdAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWaJMt0i\nu0SCRuA9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA4ElEQVQYGWXPv0rDQBzA8a8eTYgJNYuLS6A6\n6ZIhD1C0g+CQDA2lWym+R6RLEYRmUemWN+gLCG1nFwfX4iM4NCJBaPo76NXB33Dcfe5+fw50qP5D\ngZeuCtkfJbIcnIHtq1cinI2c3XeIumsYwQvX0BIcCmIJfkAQXkIsRcYGS/jys1CjY+9QfQsOJGse\n8mjQq2CWQ7NCDfYoLzW6bRwMmvQUTveINAp8rASV/+EKJiEneMtOJz6XlnpOGb6n/2ct4NDM6frq\ngrfp0y1wLNi4+rlBPd8VZHX9C85neS9X/2ML8X9Cw761qCIAAAAASUVORK5CYII=\n",
"prompt_number": 8,
"text": [
"1024"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When solving math problems, it\u2019s best to work with `SymPy` objects,\n",
"and wait to compute the numeric answer in the end. To obtain a\n",
"numeric approximation of a `SymPy` object as a `float`, call its `.evalf()`\n",
"method:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pi"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\pi$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJBAMAAAD0ltBnAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAdpmJMlQiZrurEN1E71u8\n6TcAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAA+SURBVAgdY2CQe/fu3SMGZpPAdLEEBlcGM0YHBiBo\n4FwAJFkmcIM4TAV8IN66BXwHgJQ0A68BkGpn4DRgAADO5AwIf9stDwAAAABJRU5ErkJggg==\n",
"prompt_number": 9,
"text": [
"\u03c0"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pi.evalf()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$3.14159265358979$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAAPBAMAAACRq9klAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIom7VJlmdt1E7xDN\nqzIhoty3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACv0lEQVQ4Ea2U20tUURTGf3NzbM7MeAiMiKBh\nYioCU7CHyhcJ6iEIB2keupiHHhKE0B7Eh6SkXhPnJXoJTJTIEjwEUXRBKUgixAlSu4mD4LOXLPJ6\nWnvvGfEP6MA5Z813vu/ba6299sDO5FG2XXOFeNSdq8Wqr7DxZarz4D94BDSoBdEb8XNY7ams4cS7\n6pNJnic/gy9NnaNNzrjqdUduFQ15S/DK8fXyFv8K1kcuGdAIIp6XIARfDKfE87wN6xF7bMLLlHWK\niTUxowzDfYXo3ZQN32GCH/CEQJpqUKARRCuuw2nYazghIediD4ml2THA8Ig4wS1luOt9IcopaB0q\neQwz+R5RiEZuI4ipn/vhpeH4pSf5shH8CwovlKwNE9sNrV+yTH7cFcMTiqgNjUAb9tRwwHAEvM9w\nFeFNiazb8pBLGZbYRcPJpsswKBlm5VO3uz7bJoEGtSB2tS1PzLvibHGqiEiGK7Irhy5qP234gqJh\nDfuyUi/jjlS5ZK079IMGtSDg+kRbue4WOX5H1Rv9o7wOqyRMhoktQwh0Em0NVtZCac7yXC5IBQos\nCo4R/NY9UOQMCz7KyWV5EXmqnirDYH6bYWgRmm5W5iEDf6FFravAgqDRvkZ41S1wOgQvaZ/dxGcT\n0LbK8BlFw5jph2ywSzgNd8XQ0aAR/FTd7YX5WjESjp5fiK1RtrbN8Oz09OqUzlUaHFoTLmNwSlaV\niWzJatAIBqHx9YI4OIZjbSgy0RyRKkpVGaaH0GciOQSlIzTb8UXiacL2vPRQnYzSESPQSUuGAVtz\niP+WinuZtylxqGu1ZIL1LoOMnorkgDXbdLhvHHYnU1+JJax+A2oB5Ur+QBpoOATFMPzJ+iDqe5nj\n0AUNQ2OODL83aaLyCpkmf+a8DI7nyZakGvKgQS3w1U+4xCfkz0Fz8MlQkcpk5fmfr3+ITQ1tVgAc\nvAAAAABJRU5ErkJggg==\n",
"prompt_number": 10,
"text": [
"3.14159265358979"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The method `.n()` is equivalent to `.evalf()`. The global `SymPy`\n",
"function `N()` can also be used to to compute numerical values. You can\n",
"easily change the number of digits of precision of the approximation.\n",
"Enter `pi.n(400)` to obtain an approximation of $\\pi$ to 400 decimals."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Symbols"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import Symbol, symbols"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python is a civilized language so there\u2019s no need to define variables\n",
"before assigning values to them. When you write `a = 3`, you define a\n",
"new name `a` and set it to the value `3`. You can now use the name `a`\n",
"in subsequent calculations.\n",
"\n",
"Most interesting `SymPy` calculations require us to define `symbols`,\n",
"which are the `SymPy` objects for representing variables and unknowns.\n",
"For your convenience, when <live.sympy.org> starts, it runs the\n",
"following commands automatically:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import division\n",
"from sympy import *\n",
"x, y, z, t = symbols('x y z t')\n",
"k, m, n = symbols('k m n', integer=True)\n",
"f, g, h = symbols('f g h', cls=Function)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first statement instructs python to convert `1/7` to `1.0/7` when\n",
"dividing, potentially saving you from any int division confusion. The\n",
"second statement imports all the `SymPy` functions. The remaining\n",
"statements define some generic symbols `x`, `y`, `z`, and `t`, and several\n",
"other symbols with special properties.\n",
"\n",
"Note the difference between the following two statements:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x + 2 # an Add expression"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$x + 2$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAC8AAAAQBAMAAAB0JTvnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAt0lEQVQYGWNgwAQsd3cfwBQFiggzsH1FkeBS\ngHANGRjeYZV4wcBgfwBZBqZjvgBYQkjZVU0BLA+TAHL6BRgYE9ibOCagSbB+Y2BgE2D7yOWAJsFh\nwMDAyMC5ASTMNnPmjJczZwJFgOAumORXAFMMDHA7mC6ARc4fQJdYy8DiwMAloM/AJACWgungucDA\n5MAQv2A/gztEC0zCIy3XAhgwSkLXC1Al5v///wMiAiVhOlAEQRxGByQhABFrIuoATgFYAAAAAElF\nTkSuQmCC\n",
"prompt_number": 13,
"text": [
"x + 2"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p + 2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'p' is not defined",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-14-d62eaef0cf31>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mp\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'p' is not defined"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The name `x` is defined as a symbol, so `SymPy` knows that `x + 2` is an\n",
"expression; but the variable `p` is not defined, so `SymPy` doesn\u2019t know\n",
"what to make of `p + 2`. To use `p` in expressions, you must first define\n",
"it as a symbol:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p = Symbol('p') # the same as p = symbols('p')\n",
"p + 2 # = Add(Symbol('p'), Integer(2))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$p + 2$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAASBAMAAADWL/HSAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARIm7IjJ2qxDdVM1m\n75kH/PNjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAy0lEQVQYGWNgwAR+j00xBRkYOAoY9AWQJbgS\nwDz2BgbeC1jEeScwsH/FIs79AywuZBKW3gCWhpoDZHP+YGBQqFzAZIAmLq/AwLJgOwPPBzTx6UBX\nMfxiYAJqY9q9e+ft3bsLQCr4HgAJxh8MzBBnwc3PA0kyTWDoB8kzMMDEuR4wuDAwcD9gONuAIh7H\nwJDCwMBvwHoVLAxTzzJJ6fkEBgZ5sTwHFHHu////A8U1IYJAEmY+RGAfXJzDAc4Euv8XEgeJufJ3\nAhIPzgQABtIvZb3CiScAAAAASUVORK5CYII=\n",
"prompt_number": 15,
"text": [
"p + 2"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can define a sequence of variables using the following notation:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a0, a1, a2, a3 = symbols('a0:4')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can use any name you want for a variable, but it\u2019s best if you\n",
"avoid the letters `Q,C,O,S,I,N` and `E` because they have special uses\n",
"in `SymPy`: `I` is the unit imaginary number $i \\equiv \\sqrt(-1)$, `E` is the base of\n",
"the natural logarithm, `S()` is the sympify function, `N()` is used to\n",
"obtain numeric approximations, and `O` is used for big-O notation.\n",
"\n",
"The underscore symbol `_` is a special variable that contains the result\n",
"of the last printed value. The variable `_` is analogous to the `ans` button\n",
"on certain calculators, and is useful in multi-step calculations:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"3+3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$6$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXYyEM1Embsi72ZU\n3au6f2Q3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVUlEQVQIHWNgYBBUNGBgcE1gD2BgaGfgaGBg\n+8kABBwLQCR/sFAZA4N/NAPXAQb/LwzsSxj4LzBwf2PgDWDg/s3AtwDEZgaKAxU/ZPA6wMDAWP6Y\nAQCADRI3fgJiQgAAAABJRU5ErkJggg==\n",
"prompt_number": 17,
"text": [
"6"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"_*2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$12$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAPBAMAAAD0aukfAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAbUlEQVQIHWNgAAHO0FUbgBSjMgODCQPPXyAZ\n8pmBwZmBQQkoygZk6jEw+ANVgJj1BnAmUPK9AUSUgYH3D1QtAwOfA5wZCmSBtTGwBcCZogycEyCi\n3AEMbFDmvDNH/RgYWJ2+ezDU////D6QYBgAQhh3Nze/QcQAAAABJRU5ErkJggg==\n",
"prompt_number": 18,
"text": [
"12"
]
}
],
"prompt_number": 18
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Expresions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import simplify, factor, expand, collect"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You define `SymPy` expressions by combining symbols with basic math\n",
"operations and other functions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expr = 2*x + 3*x - sin(x) - 3*x + 42\n",
"simplify(expr)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$2 x - \\sin{\\left (x \\right )} + 42$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAJUAAAAUBAMAAAB2YGIBAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACP0lEQVQ4EY2UTWjTYBjH/yHNUrO0C8yD7DDL\nELxJxOuwvQqTvgPZDtuhO7iDDFoGoqBMzzJwlw31tOuc0slE1B4aBlPE4hd6EZF4deCGaBVxzOfN\n+5HRGs0DfZ//8/H+kudNEyClGaFozHvJG4yhE6Wk6qkgrvQrOaWE9pkCBGUM9k+d7RDlWpy4p+SE\nEto7PgTlLHBTZ5NFvqBqdiDVB5V55kNQbgHVksome0cfk7UguxTL2PIhKE2WzDoYX2QgvszDDpbd\n60NT6sxqTc1fjru5Gvn43ChWMo+OtGZ4uEG/ySeHngbAEI/J1H19IhZZndGS/YFxfA5WeUKb5cNB\nbwXOMA7z8U4CVi1/x1kDtmSTZFlBxCIKmVPBeVxhr2WLcNlFuDArMBfQF1LqLmAz+3uOuO8p5CZZ\nNiIWUcjonhnWuYL1+DbZaolkfdiDSaw19AUU3qCi2IQyhbjUaKw0Gg9IvRXpaHK3wGu/+bLfxptf\nYRLL1ywIJVjUKu7LqkUsQXkDw0Pm234OaYNh+6oZs2hGoFzi6zW+kAlWbnq6uhRAUApwvXfuDjZF\nh1xzAXpCM2bR2efYS7is6+yBAz7oNXI9DFyYPZfdNXfUu6tYizA9GlDNOAtcf1XEIJWPyhZ59jS6\nH1GA5t7eL2tmc+OL7JAuO/fiYqbaPlNtny4uUY4GG2tNHgtJ3pctimUX2yGnyPT/nUN/BmHGshSK\nJcP07i/v9mj63R2dx1Xc/c1RldRefws1NPXWrkb1nP/xjf4DV1iOb5ZL7yUAAAAASUVORK5CYII=\n",
"prompt_number": 20,
"text": [
"2\u22c5x - sin(x) + 42"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `simplify` can be used on any expression to simplify\n",
"it. The examples below illustrate other useful `SymPy` functions that\n",
"correspond to common mathematical operations on expressions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"factor( x**2-2*x-8 )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(x - 4\\right) \\left(x + 2\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAH8AAAAUBAMAAABWoP+5AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB40lEQVQ4EY1UPUsDQRB9d+ZLL+qhkMIqgvZR\nf4ARg4WFHkIqm4igdtqIhYhptBMERdAqla0BCRY2VwhBRFALbRSvsVYQBD8gzmyyuV1zBw5sbnbe\n25fZuZkDjDRCzLTrQE8IDvQz0hsCvwC3AjIyQQwjP+Khk/9iLAim2DxwIaBIIxGddw3rC8ksYDo6\nIHfxPcBa4d2gDIlnQsSAR+AQOANigfpAzziQ3OUzc4ECB8Czh0sgpcH+pkwCmKRlFPwgeTKDaZcF\nIiWsUrC60bfeyEySTZsF8rTijsaQAhRcdhF1MEyZls3FWJYiilXBAgO02tIawxfo+KYKZrFEtXKt\nn8SfUpSFwDYJxIoawxeI3dCFCjgifUQyxKTXtsA2RV7CEwKv5LaXfIaVy03s53J0kozv1/XGAkD3\nCv8qdgVNQGE0MxC1IQG6AvDqKYfZ3Xl6+nwAjsnlKyiMpsAWDBsdBS5iwt1E3GWaatRIzSIqDCnQ\n5SBuw8yiApwUR9E6MO8kMEvLcjSGFEidV+6BaJmzvF6rzqSJqtlp7Q7gelKWKkMKTNdqH0DEC21l\nVqs3YXArMy76OGyYGA4apqTNiDQaJgzJTeuzPs5t2hGNxeMc+kEhqK5tZLRD6kZoG2k1pPr/+qT9\nAgqXalHWmR+DAAAAAElFTkSuQmCC\n",
"prompt_number": 21,
"text": [
"(x - 4)\u22c5(x + 2)"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expand( (x-4)*(x+2) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$x^{2} - 2 x - 8$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAAAUBAMAAAB8EA4WAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVQ4EZ2Sv0vDQBzFX9I0jWnUowVxTCu4\niT9QEEHMIupWHARBqDroIKFFQZ2d7NSOokMrCIIg2FnE/AfN5tRNwUlSUVERY3ppgnd0aW/Ivfd5\n38eXgwD+Me9IS3VwyUak1MF4a1QxtLcuWhnpvfMWoDa6aSl6Ny2TK0n1W4tD1AppMxPymB1KXyQh\nt31pLzATjq5gLdRUjAMvLPHdJbAUcO30qhpo/34G5iwWUbcDDAa4z3WdQPt3mbRvZavY9iYSQ/PD\nOttouSIR0pPLm2wWcffzgLAeO1JKbOK76AcGcKgXuCz3RQCZyA3V4BJqlTFsIEcu2EydKj55u9Bz\nE3Lh5Ng7BYuCOkBwRuU/vgfx11uGfp0m/Ee0m+SVx49AreLBmsUn1F9DMqD9cJngAJE8VDIKsbmS\nO5oN0TgXHaTYwNsVN5Ct3GOBDahb3DKno99xR8qz4SrBLpBMJx64gI6VXfdTmEiNHLAlaLPe3/sH\nIXNOT9RvRLcAAAAASUVORK5CYII=\n",
"prompt_number": 22,
"text": [
" 2 \n",
"x - 2\u22c5x - 8"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a, b = symbols('a b')\n",
"collect(x**2 + x*b + a*x + a*b, x) # collect terms for diff. pows of x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$a b + x^{2} + x \\left(a + b\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAKcAAAAZBAMAAACm+CPaAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpmJdu8QRM1mu90y\nVKvMIHo8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACUUlEQVRIDZ1Vv4vTUBz/tLFpemmabKKCFLzB\nG8Ry3CDoUOqBm26KuES5WxxMQZwUWh2OLh71P6gHijfZQUel/4EdXOUcbnGrCD0d5Py+n30vJDlp\nhpfv9/PrNS8vr0Dhtb4XF/LLkE7U6C/jK/T4Uf1noWAZ0u+WjpbxneAJ5icIlqH9do6rNMwhXmn8\n4T1d2sW63S66s4tSV+6bMdCIdL+rK6uoNa3WaJ4btS6974Db1+1fVX1VBb8/xjPR2zBgz6bYcErq\nDZVQ1e9D8Zypv/z2NjvUXzwkCZSpF1OzLRyAQ4shLsXzrnJ8PMuACTonYDkq01XWe12gdGH1NrzD\nzlQIFL918/T1toDYmIY7hHEnlyh2d/MSUG4CTyJvhmTHlZ+O5N1W7YPf5w7TpuF9QrnTYn/HSYRa\nH+5dlEc4iPFLJMhQJ3bmQSQgNqbhT/SauZNLJEtfSthCMEZ5DtrgF+Gy0CuDwcfBgG0vF96I69mQ\nAd+hx+ROky33kbRQn6EyQjLBC1TlppKTAmGb4vSVhim0wp1cIVmvid6UhVL0AfCHzWvywJeJALJh\nenzhNE3hEJdjVMdIpngXREfYHlruIL6FU7GA2KhWTcH7FMqdXCLZsEvrzF6U1659dvADezJA8r3p\ne5yRELulYToThJNrJNsYrjRprVtwD6+dv4EHHflDlfvR5taagoxQDT+ld8mdZqi7ukatN+GYOchJ\nTYjVadg3tluKtT82HnQ/HSf6NGwfKBa7kZ3wP+jrPJFx9OVJcvGsQ5qLV6yFyfVnEkV/J/8AzoSY\ndvj5N5cAAAAASUVORK5CYII=\n",
"prompt_number": 24,
"text": [
" 2 \n",
"a\u22c5b + x + x\u22c5(a + b)"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To substitute a given value into an expression, call the `.subs()`\n",
"method, passing in a python dictionary object `{ key:val, ... }`\n",
"with the symbol\u2013value substitutions you want to make:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expr = sin(x) + cos(y)\n",
"expr"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\sin{\\left (x \\right )} + \\cos{\\left (y \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAUBAMAAABPB9NaAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACUUlEQVQ4EZ2UT2gTQRTGv82f3U02KSp4rUOE\nXjQaPFjQg0vxIKiwl0VBkL0JUsSDIliQQBEPvQRPRYRWwYOIEFCMFIQQUBAtxkPxIhhFBBEhUaFE\nW+Ob2ZnZJLu9OJDZN+/9vm/fbHYWGB+PZeL4eCG2dtwwpUjjboQ4F2U8UY+SyVFjjDQ2Ii6r1KYX\nJZOjMzKdRJ7UkpaM0kynRoJMWy0VqdZ0XdDxeRltZWOrviFJZ7vWOlUdZmthuJXN02HS2D3jNf5i\n58Md+xjlU9SpWfp2k/osyqaVjfl+tYLZ0ktwCaFlIssMKwEnzwFVnAVuMOcP1SwXmMUxdh3IcJaG\nslmpGA+MBVhMSIBLQCG9jP2CvBWA4RpwFfhFGrsCvMCb4DDJq9wksvGR7tlNGD0hAeaBR0UPVwRp\nr+8Bt7kM/CBNvgYEOMXlRpemgu+fvuf7HdrAJi130V02hAS4T2SecRWR5vNBm9uQqbIJo9CGpHJT\nOV4+QndZFxJhg6XA6AmbJ8j0h2z4pqhvmpCr8lnb6G42hURsCmtILQvyAPB5yIY/4oOpLqbij9gn\nx3wbub6QiEdMQqsjyEMB5viO5KYKxP20uvzUFZsQQ/9TLl4Zd5BtCgmwStV3WHIFeXvmRG1y8GVy\n8HH6d0f0Z36aKh8lJLuNJhrKxvy+t45nr7+CSyi/SL8LrQ/1iOS0HNFhUG+pslGEuoaHYY2WilQV\nusaPpkn3Sxp0NCc8s0+lVrxsKVHS8R/F52C7FqM3yhvN85X+bGm/OCMzDeRKbylOJP/rI/oPquqb\nkBJavNUAAAAASUVORK5CYII=\n",
"prompt_number": 25,
"text": [
"sin(x) + cos(y)"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expr.subs({x:1, y:2})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\cos{\\left (2 \\right )} + \\sin{\\left (1 \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAIkAAAAUBAMAAABL8gNnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJVCLvMs1Edmar\n3bti/yyrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACYElEQVQ4EZ2UTWgTURDHf9tmm7RJNCiKB9HF\n6kWKBItQq6AnD4oaBY+GtnhRL8FD1VIxIMUIggHFm3TxAwQ9FESQXqwH9dBLoOJJtBc/qCLW76oY\n503ebjZpTs7hvXn/+c9/Z2bfLiwyd0KhZG5RpBGwPO43wvaUh4Ob3sLjFtH4sTooPLVUy8eN4Uyx\no8yqekLoxb+ELmPixgbBKdax0Et6pDJ0DNDuW2x3GIs6wmN1z7xA/VHY+ukcHRVSP3AGLNJaRXjQ\nZVRWWl50OwyJeaPCBQtHVNyTIVV4ViVRhmW963H6b5QZ2XPbBK6bhbQ8ZJ16YFXiNyeL+T+cGhq5\n60tEeVpLm4d7hOHcmRxzzixpk/beLIxn4YF6ocoaqHARXvruN4koT1WSRRJF9hdm4OzpQbpM2jPN\nfSHrXvVClasZfD7AG/gd8FQlVmGtB/GvsDT7ak5f/FGTK0WKsPH6SqXnpZKUQPrvLYzKO/glR+Wp\nSvwT47689QVRmV1+6bMEa1FtWlUEsXNx+qqeUfnYQiWsZUOGhzJs7SjmcQiuGVExq3KA5EJERTvX\nWjorZi7sHJJxXvFJTUiOmdoJkOqbpiti0xGVhum6x2nPDRc4J5d5iRnMZnBnensq0C0nY7aWXRle\nm3ZsR8Kz96UtK7d44xbc7u3lzm13tpqA9JGoVquict4cxazK5cl75dHqo9Hq033fp2r9tj35OS30\ngtIaFr3ZBnFFSM2q2FOwhTz0Fgew3ZOedcKvcUUTo3YMeS2/Rmm+Zq3+DFG9gOcUo2jg560TsAK8\neQ94+k6ag/zHH/Mf2oOdWUPEPRYAAAAASUVORK5CYII=\n",
"prompt_number": 26,
"text": [
"cos(2) + sin(1)"
]
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expr.subs({x:1, y:2}).n()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0.425324148260754$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAKoAAAAPBAMAAACGiUnsAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC00lEQVQ4Ea1TPWtTURh+bm6aNN9BFxVpbi0W\n1BYuphVRqQFBsIMNdXEQeouDQ1GyuBUSKChSh1BddGk7SIcqxkFEqxgkLiW00cmtoU4VUWM1tR8a\nn/Oem/gHPMPhPuf5uOe857zArr5+6DEMTB15ClyLD2dwJ/nMhUCb5SoAajo+9jYZc6AfRteZNC6+\nSSZtbRQNrmBPXpsmYRRxuoLHjXUELGRTGgLtBcA/K6JJwEI4oxnjKrrhyxi3MNRoNIpipIoa7wxM\nh59AdB7hOIIzuLyUR3QDsZyGwKcC9vfUXI0/hYCjmZCFBQwCx3AICEOMkoNQEX4x4O4YgjmEf6JI\nf+QREo6GCJzlXqMiosYswMhpZkUd8iWQjdsA66iMUDmIFRHZEGSPwVdrpnIlm9IQpq+VSk1kO266\nzAvl2wFWMtxGtZlKDRIWIn8U680TsYY1lM4f5Icx4UKca6WKZvlHn8vUL6xWjO9MrQIhrolRNNM2\n2taVqgOSumLjCaYrCBzvVKuERrWVKhqzMaoZo57CXIDmERZA/UmMopm23FRbp95WjlCO04kKJ0IT\nrVTRjH/Y0ozRiOPwXu6VqcY3isUommYF/GlJ9ViK9GxyCs7yg/B6K1U03iK+uswvYOidrkDUoUMZ\ndQ5vy69uazckdZVPxIH5O5BHiMuEht1KFU0wjzbN4AZTU7ytbEaetBh1TqgAr3o04+Xy1hL8Fu4F\nHXhqsZpKVdBfLi8/rMrLEk2C4pIwWGRqZYFTHIkiD6eMOsc7A49DIce8NNuahw/BCRbQvqn6c40E\ngfteqeFe8VwzI6yr6oJultbi8ZVR5+Am9qWNOgG2EZhI9uTYrIN5bwrZqkASsX+p24iMwusyYduY\nQ3vGeMAiWFBdPshfMocF/fJWrhonGyUf2zmHqVOdwPsDr6AhzNc7Kc9ivUQxNbjU1dtkjvakYQx8\nTgP3M2TFKBqC/z/+AsLXDlDGHZZyAAAAAElFTkSuQmCC\n",
"prompt_number": 27,
"text": [
"0.425324148260754"
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note how we used `.n()` to obtain the expression\u2019s numeric value"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Solving equations"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import solve"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `solve` is the main workhorse in `SymPy`. This incredibly\n",
"powerful function knows how to solve all kinds of equations. In fact\n",
"`solve` can solve pretty much any equation! When high school students\n",
"learn about this function, they get really angry\u2014why did they spend\n",
"five years of their life learning to solve various equations by hand,\n",
"when all along there was this `solve` thing that could do all the math\n",
"for them? Don\u2019t worry, learning math is never a waste of time.\n",
"\n",
"The function `solve` takes two arguments. Use `solve(expr,var)` to\n",
"solve the equation `expr==0` for the variable `var`. You can rewrite any\n",
"equation in the form `expr==0` by moving all the terms to one side\n",
"of the equation; the solutions to $A(x) = B(x)$ are the same as the\n",
"solutions to $A(x) \u2212 B(x) = 0$.\n",
"\n",
"For example, to solve the quadratic equation $x^2 + 2x \u2212 8 = 0$, use"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"solve( x**2 + 2*x - 8, x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ -4, \\quad 2\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAUBAMAAADYerbFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEEJm77yJm\nVKv5dZHXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA20lEQVQoFWMQMmEgBA6rMYQhqWFpQOJAmDs6\npzAA1SCrYpqAror9AUN8ApoqKQxVfAUMXAtQVXEfxlDFpcDA9wVVFSszhirm7xiqTmOqArqT6TuK\nWewCWFXlB6CoYmXAqkoPEhLFSiBgwnAFqyqOBpTwYg/AqkoC6DSkUOV99+79OgGgGArgbWDYjawK\nKMmFERIMHgwM0miq+Ccw1BugGMWtGtqngKqKdf6/A0zqKKqY////j6YKLH8bRRWEg+R6qGwAMarY\nMXwJ1IVhFg8Wo4CqhFSwiaOICakBACWsMVQgLbAoAAAAAElFTkSuQmCC\n",
"prompt_number": 29,
"text": [
"[-4, 2]"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this case the equation has two solutions so `solve` returns a list.\n",
"Check that $x = 2$ and $x = \u22124$ satisfy the equation $x^2 + 2x \u2212 8 = 0$.\n",
"\n",
"The best part about `solve` and `SymPy` is that you can obtain symbolic\n",
"answers when solving equations. Instead of solving one specific\n",
"quadratic equation, we can solve all possible equations of the form\n",
"$ax^2 + bx + c = 0$ using the following steps:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a, b, c = symbols('a b c')\n",
"solve( a*x**2 + b*x + c, x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ \\frac{1}{2 a} \\left(- b + \\sqrt{- 4 a c + b^{2}}\\right), \\quad - \\frac{1}{2 a} \\left(b + \\sqrt{- 4 a c + b^{2}}\\right)\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAd0AAAAyBAMAAADrdhy+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhCrmXbNZiK7\nRN38cqFhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAH6klEQVRoBe1aa4iUVRh+Z2a/ncu3M7uZSqXo\nJMGWRG0XMvCHAxn+6IdjPzSpnIFoM6FcKryE5RiVdsON0pwK/exXGuQEmXTBnaASI3CNCOrPTlpS\nFLqtl8xL0/uey/edM/Pddt3FZDvgd97L877vec453+WMC9PrQzBOWrRe74DL5945TuiCMfeODpg4\nXtgSzxaF7035/wDzMR6Ew9d4aPnF5zvmg3D4Amy8+HzHfBDefHeO+uZeGCajNukpK0xIGIxR5ChP\nvoneMGmGhUmHSanxfWFY+X3BP3CvJ9+DY7C5n/cdEXeqfNOTQgSEhCSKDOjF1wj1lorXh9MGk1bw\n4FS+C3J++LXDqV2HN1kuL76tRb9S0veZFML15slgnMq32w9uVv28zb4+tmG9+M6vNEc0Wx5pNvla\nfAnwSIVvy1m/ZK39ft5mH19BL76bmwOaLWZvs83XMp/NsS9E4Zss+iE/9nO6+FrY5vLga/pOrcwW\nDz/FnfuIarIkQz17hW9fxROFjqf8nLqPF99CRg++8Ro5g9riIIDtj1Zae1FJddgWL0Hh+7QXhuwG\n5QvXRPHthFb4rpi+2ZIJIiUp+fWP+zk1X6bCbkbzvGZ1UdRBXOHit03xLlsMEkTxvn4EKnzVsL6c\noxmf1xxFlQzNPk91qfJ90wAy/ZzqBNURIJsnEOBZfIka3dKjaqqsFI9k0eHBd5ca4/XciFoq6g9V\n0WT27Iuxx8XDmsNfSQ2S36v4TDU4U1U1TXaKszvKg69267TLrRMraam0KU5M1Xyk3C4sx6nPlOi6\nkS4hW7xGQLu4zEZGXPca68RlXVXVSLaH6hRP0Px58NUWayAvstlJuP6iMLPuk7dVjclihGm2sp3M\nNKfShPI08EWzi+t8E5YSZ+6oKhoT5VCV4jF653jw/UuNv0EqMonQa9JOfdaTb5RwqR4Cwfwu1oW6\ntLMQu7jON6OmiCarqkqyHKpSvIWW2oPvaTV+8wbxIJZJAPLoT5QUUKqCfM3HVk0CiG54ljvECJNL\n13fBt/AdGQsWd4W5tpcIZRe3+Rpk3kAX2d4jvns61+Gort2QY1Y5VKW4cQY97nyZi8Xhxfg7X6ho\nSWBvFnVtiu8B5HuwkhwE8zCUGVrev4VNxtmW1275koycA3cHXdncOMUlX/MQBdaUaKOEfNNTYBvA\n3q5kL/NIvmpxWkR3viZNhWz4ZG3PMkUmSe/oQP0dCaA+i3yNqyBehUgWHiCL/byak4ehSL0+SCaR\niMTA1mchxCku+f74KppTWbzIFgXku8CCNQAToLWLmeVQ1eL0s7Pg2+6crWhcbKsbW49i+y0X74VC\nFrdpubz1ynK5iG6I0Xz8gv8kJpZDvvGT9BRemycEXFcu/1Qu09tgNRj2D9z8nmQA+7KYyhx9HcAZ\nQ52c7F4XxZ1sAHMs3FtURAbeSnyx7K80AmrKUNXi9FByX98W4iNbsgcG9EkDmIacsxKA/d2AfCNV\nKORgqm0WK/IGpNlLgexufG18gzDfQoNTXK4vRGoANytYI0t8p4JxgkYgmlxftbg3X20/t1tyzWQS\nfI/2Q5KvI89/W3f3n0txF8xR1lLev2fktCOUNkrY1mch0ilu803gR+kmJUmsu3v55OeGIDaopJdD\nVYqzXea+vsZpJV97P96YrMkkOO4qzFIgJE6FQhfsj1Vwa8S4S4zwPN1bojEOUgnoCyUEOMVtvsY5\niPXosZGqcRzaemfj7IC+FZXibBHd+YJ9w2HeVqtNpHf4xs/CW3pJOIenvdSRKKwA4wnuEiNcBvts\nKLsnC7227iewZ5tT3OYLayvJih7YXoUt8H4xGy/CohxzyaEqxf3ev5OVfMaqJ4Umk+CbdihdVCAo\nXl9fZiy95qNXIDrzXeERI1y03rKhA/0oZuhJF9wiRcQ4xR2+fdnv9ejogVPWwmfuWtoPM3aWuEsO\nVSmepsOZXF9z5Tc5jmTX/YrsiDIJWg40TrGDsiVnhLZpV57E2bauC3vWfKEY2vRt4GRrG2zcW0qU\nEJWhSmeKHt6S70KIEn3ZrpaC1hvONhoI8VPUvVowU3jebLODLEYRbqT1Fy3aISXWO9nSp4qax01R\nhirdLJ/k+yDAZdKBPb6m/VvmhL/fw3uE7EbJ3duah4jCkZ8g3aDHcm7WIFumiAjJF1+oy3NORMFy\nZFcpUXU1Bxj5d2rKA4Uv1lZlGrWPWi3kZU0LqzBOku+2vMa3rRg2y7Bw7EjmGZE8qfGFrzyRI3Kw\ns6jkixmO5cUZA+UQP6yNpCZ+Hfq3zElxyCLYdn/scL2rKcDhmx4SZwwy4+t7LFrECsg6kOWHLAbD\n75fRbFdRMocv3s74HYRnDNZG8X/mREbq1imyq3hEHLKYMxG0G1xTeBkT7FHo8F0J/IzB8ZGcV9yF\n2NkU+ySI94hDFsdM9IEO28X3ls030UOfwHjG4C01qnMrkgYu2HoQhywesEPEjUrHd6zNdxaYu9kZ\nQyTfMipF9CQfVHS9UcNjwKfskCUcyVIjYuS6OYXFSr74i3ViNztjiJRLciPP7RFpHPZwSPM8gJf4\nIYtbjJ+l58L7JV0sh+S7d0bno/yMIVKbv194jYYMbVaDoUE1D81YUeOHLOHZG7AhGhL4qV9zp+S7\nrV7/B/gZQ0R96Bc9It/9AVFJ/EGnxg9ZAmnmAkJCu41+DpV8Qwde4sD/+V7iCxgw/HG4vuPt74HH\n2d97/wsKDVkvv1rNcAAAAABJRU5ErkJggg==\n",
"prompt_number": 31,
"text": [
"\u23a1 _____________ \u239b _____________\u239e \u23a4\n",
"\u23a2 \u2571 2 \u239c \u2571 2 \u239f \u23a5\n",
"\u23a2-b + \u2572\u2571 -4\u22c5a\u22c5c + b -\u239db + \u2572\u2571 -4\u22c5a\u22c5c + b \u23a0 \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500, \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a3 2\u22c5a 2\u22c5a \u23a6"
]
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this case `solve` calculated the solution in terms of the symbols\n",
"`a`, `b`, and `c`. You should be able to recognize the expressions in the\n",
"solution\u2014it\u2019s the quadratic formula $x_{1,2} = \\frac{-b\\pm\\sqrt{b^2-4ac}}{2a}$.\n",
"\n",
"To solve a specific equation like $x^2 + 2x \u2212 8 = 0$, we can substitute\n",
"the coefficients $a = 1$, $b = 2$, and $c = \u22128$ into the general solution to\n",
"obtain the same result:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"gen_sol = solve( a*x**2 + b*x + c, x)\n",
"[ gen_sol[0].subs({'a':1,'b':2,'c':-8}),\n",
" gen_sol[1].subs({'a':1,'b':2,'c':-8}) ]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ 2, \\quad -4\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAUBAMAAADYerbFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEIpm7EKvv\nVGZvmWXoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA2UlEQVQoFWMQMmEgBB6rMYQxsHfMdMCj0IMB\nqCaMYTUD6zc8qjQhqnYxMJzBrYrxJETVIQaG/bitrLOEqLJfgE9VAFQV0Db9Bbis5CuAq2L7iksR\nw0IGuCqmDThVBSBUdWAo4jJSAgJlB14HuCrGBgxVMIGlDHBVNxjYC2DCaPTt3bv/bASHPUsDAyMu\nVUBN0FAtCo3YxLDeAM0UOPcnNFT////EwKQFF0ZlRP7fB7YRInodVRKFB0oTEBCAIo7KgaviEkCV\nQOHBVfGhCKNxwhiEVNCEMLlCagA31TIizNVMhwAAAABJRU5ErkJggg==\n",
"prompt_number": 32,
"text": [
"[2, -4]"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To solve a *system of equations*, you can feed `solve` with the list of\n",
"equations as the first argument, and specify the list of unknowns you\n",
"want to solve for as the second argument. For example, to solve for $x$\n",
"and $y$ in the system of equations $x + y = 3$ and $3x \u2212 2y = 0$, use"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"solve([x + y - 3, 3*x - 2*y], [x, y])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left \\{ x : \\frac{6}{5}, \\quad y : \\frac{9}{5}\\right \\}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAJEAAAAyBAMAAACufiRQAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEImZRO/dIma7q80y\ndlRAyO8oAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADEElEQVRIDc1Wv4sTQRR+u/n945JFOIsc4QJi\nc3gknh6oEZP/IBFEiwPB5hoRAuqhjW4j2Mhdo6CNkcPK4lJY2RgsbCyyeoWgHrnG3kNR76LEmTeT\nzczuZDZJ5RQz733f977MTmZnB4C0QyXaT91uVwel4YuNQTjVGN+3eN16QWFgLh5ToDJkLC3gHNau\nMDy2L/OYGS+hrIBlaNaOXaJI7IDhyT2ZxyxRgscKWIaeA2wiUmnjkG3JPGa1cZauB1BkahuH+SYO\ncvdQTpWZQZal26bU3RIKlE69N9tVZHXdCpkTqriFysno2XBZZ4IcebTXNo10Tn0Lli2Ua7qUkynu\nUl7jBD8B1qtUpG0PvhTbVKBzukqcbCoKaFs4cZ0T2SpjzAngFf6SzqlD1ilgOgD3GulfgU7JghH8\n33225uxAJzhypo0iXWeeOMlo3dPpDPzcf+zUKfinOyGS3cCCsfaN3jpVR34V+/ynGx8cEkWbmCo7\nY9uBm3RTe0WZ31Rv4uYyCvFr0RZJZ2k3opmZOnQp5xNtNQh6tEo50zL3MjTVtTuh1ogzOXkBYO4Z\n1hqQ2hBMsn3aBABDK+LA3yEoir46cPg4p7LOUDMqqlnpP2ruLalebjOuw0e1kqFlmKkr+RB5Ogjh\nJytjdWHGUqoE8AkkmkI6DNmBRw41gNruU7hFA+lvMch3SGynoWbTXBKRPMxWr1slcW4nf8omo2er\nrMrTzC1WGn4RQOIbRUH5tqTep88RzrcxyljCOy4C4B/f+ZLI8jjS7xdIaEpUsmX8EAEu0n8RUgsf\naU1eLISonXBEgIv0TklWYYuFEN45K+VcNJaTVOhLxnO6v932VXqB5ECkO30TVkxaXK8J5q5I50SU\nj5TVHpCJApzYJvRUelMm0jm9GFyNvKVi7op0TuSSVbHEKlXsinROZN/jm60ycDFXpHO6DnE8bdwq\nVeCK+AvHDWVpbGkz8OHAFfEba6Qlm0yR8eMkobrZT2bHjkxIf5+szK+mF3NsXcdPToSsnefy+EHw\n4uqcMytufa6pEwZy72wq+QfhKL0FuKzWegAAAABJRU5ErkJggg==\n",
"prompt_number": 33,
"text": [
"{x: 6/5, y: 9/5}"
]
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `solve` is like a Swiss Army knife you can use to solve\n",
"all kind of problems. Suppose you want to *complete the square* in the\n",
"expression $x^2 \u2212 4x + 7$, that is, you want to find constants $h$ and $k$\n",
"such that $x^2 \u22124x + 7 = (x\u2212h)^2 + k$. There is no special \u201ccomplete the\n",
"square\u201d function in `SymPy`, but you can call solve on the equation\n",
"$(x \u2212 h)^2 + k \u2212 (x^2 \u2212 4x + 7) = 0$ to find the unknowns $h$ and $k$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"h, k = symbols('h k')\n",
"solve( (x-h)**2 + k - (x**2-4*x+7), [h,k] )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ \\left ( 2, \\quad 3\\right )\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAUBAMAAADYerbFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEIma7mVTv\nEKvunM/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABRklEQVQoFYWSsUoDQRCGv5zmNoELCXmCFBor\n0UJszRsoQlKIhVhaHYJgGUhnlUoRm2tsAoLYCDYRCyuFQHoVGysRBLUIEmd3k3Nzh/jDzezMfrc7\n7AzlJdjnT+VCaFVpgGqjOse1FLlXP4EXSTc0NRXyQPYzSamIbpP+mDqAV7hLUpkBxQrZ0uisObiB\nt1oC8295XKRwbSlVgZVempKf5EaWLZWJJIaFnnGuKcxK1LFUvql3/A9tJ6TWzyRuWco713vek7YJ\nbW7BhaUCWZqDtZtUcA+rDjUqzoVUSH4QU+bGKyQ5qeK3obZ/q5+OyCSpoI33FVefjWC3vvGs39BV\nrkm3BKf2LL8irzocvuPNuxDsdA4lITNjui0dsrocLxyvO2Mo6bbV2njh+Ljb+VHdBakipXhyZAqN\ncilEEkfyNSjP/DvR5eoPUDFKONrKDYEAAAAASUVORK5CYII=\n",
"prompt_number": 34,
"text": [
"[(2, 3)]"
]
}
],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"((x-2)**2+3).expand() # verify"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$x^{2} - 4 x + 7$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGoAAAAWBAMAAADa7xQeAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdElEQVQ4EWNggIDcvQJQFgkUmwPzBBKUQ5Vy\nOPB8IUNXAMtX0nUxMHB9JEcXhwI5unIxNPFcwBACCpywTUtLgEmwYyrh2ACTRKbr////bwATCGOI\ngTFhtB6KLi4FiPgVBgZmmAqeWas2wthQmqUSq64EBoYcmEq+//8/wNhQmo0Tqy4GBlYFoAohZVc1\nEI0OSoC6GJVMgpIgEjAXMjBwAwUYE9ibOCagawGKKwB1iTFUKHSi60oHCrAJsH3kcoDIIJNsDEBd\niQz5AksgonC7GEFeYQTJwgDjjA4g6DwA5K8BiQswzAZLsc2cOePlzJkGIA4TxGH8CmAZVIIxAWLa\nJ5gw3C5oNJ4/AJNBormMje0fKzDw/IGJwXXJg2zkEtBnYBKAySHTfBsYFjJ9YFCEiMF1nb8AFIhf\nsJ/BHVkxnM2/gfUX9weWAjRd60G6hJWErkMl4OrBDLb9nwuNFHXLoaJwu/wWoKrDy4PrwqsKXZLR\nAUkEAHK8SkTQJRapAAAAAElFTkSuQmCC\n",
"prompt_number": 35,
"text": [
" 2 \n",
"x - 4\u22c5x + 7"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Learn the basic `SymPy` commands and you\u2019ll never need to suffer\n",
"another tedious arithmetic calculation painstakingly performed by\n",
"hand again!"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Rational functions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import together, apart"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By default, `SymPy` will not combine or split rational expressions.\n",
"You need to use `together` to symbolically calculate the addition of\n",
"fractions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a, b, c, d = symbols('a b c d')\n",
"a/b + c/d"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{a}{b} + \\frac{c}{d}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADQAAAAlBAMAAAD/3NfmAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpmJdu8QRM1mu90y\nVKvMIHo8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABMElEQVQoFcWTv0vDQBTHPyb0EpXa4iqIoEM3\nC3Z0CFVwVkH8sYSCi4NxcS8iEhCkq7gEJzcFd6mri/EvaIcsbhXB4lD0nUNtcnVx6Qced/f9kMcj\nl8DY/MIWBpXVJhwX3Y5hZmK3jtrBigy1yVSM9cGkl1USCrmIoClrilykj0GZll5TSCgEMTf5YkpA\noQExrjf+YGcMVptaE5Usz65lFUuXnpH9I8j/3WWE6kujL8wOw/PtMGzLtvATyuaXEU7IwV5/jsEx\nnjYkvugrNXjbPYl1mTjyUekagn0nb0FqCO4cuEk1NtR05VnC4Ey9ZZWzzq0PLZ/3rNpvUJKshDLU\nos+9qBMcY/xdVFfUp/5Z0kibfEeiLtI5jeoxUX+BV67TQk6nXLXLUKtmH4LDlcfk6BtTvlESzfJX\nZwAAAABJRU5ErkJggg==\n",
"prompt_number": 37,
"text": [
"a c\n",
"\u2500 + \u2500\n",
"b d"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"together(a/b + c/d)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{b d} \\left(a d + b c\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGgAAAAqBAMAAACtogP1AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWa73USJ\nIjJt8O9gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJUlEQVRIDe2Tv0scQRTHv3cTPdfb8w5LQZIm\nJBYhSxQs7yy0E08wv0CipLAxGAvjQgK6jQZSiY2VeIJYJXBY2rhNQkgRroiQfyFFMHKFQkR9M/N2\nbvYS4dbaV+y++c77vt15+1ngutHtJXaK4bHkJuD1jUmP+mYQeg4TDxeCCL6fUXLlvaPWvJVbM0rX\netnklIj1Ci9HbVnmGatNvhDbzZR4ORiTabFiCQeeWqSmtWZ6uCxoma6fTAZ803lk4h70onesIkpz\nFWv9RueRiXuQ+M4qorRdnv3w80sPucm5Y70XmRZmxgF3Zg54HDc5AZB9gGVgr+bUYyZx4hVruW34\nwPu4qZMG9ijAc4j7aJuPmVJ15MN0iCGgBxcmqCZdBaY87KKtjs6QBNf3397z/RJkj2JIexRH8tII\naeqDOEd6DUXKZfCZMmUcFPqU0mSi1xNnSP2hpritCowpH2Cq/0xp+7zDNxqEOIYz31ssYCNVUyo/\nKV+lc55Sj38G4ZaBRXwohZnpjh1Xd2LTrcApYwLiBTAZf1K2Agy8+j1SFSPff8zGTOLJM5rL11US\nlwy9v+7KGhsj7YkGwSu6SWwiehUANrBcJvTRGiYJLNObVQA4zRWNWpPJX4PpdStStX5CufxvbJLK\n9NLHk9Hi767oPfxyVFCm1i6KXiJ7y2utXlUpeonspwk8ht6PSUxMr/ibxMT0EtkJQtKryU5gUvQq\nshOYFL2K7NZNl/QXiMGAjuXAAAAAAElFTkSuQmCC\n",
"prompt_number": 38,
"text": [
"a\u22c5d + b\u22c5c\n",
"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
" b\u22c5d "
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternately, if you have a rational expression and want to divide the\n",
"numerator by the denominator, use the `apart` function:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"apart( (x**2+x+4)/(x+2) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$x - 1 + \\frac{6}{x + 2}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAAsBAMAAAC3YtoDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABzklEQVRIDb2UPUvDUBSGT2Kb1rS1oQXBxX4I\n3cQqog6iWURH8Q+oHbqJbjqKk53sZoNCK7gK7iLmH1gQcSrUTRdpxW+Emja5N7mxMT0teIfkPee8\nzzkJuTcA2JVNqVjE4h9aDuUtIVZeQuAcy5h+74upu1CBaheQiYSPM7dmhFaxQxgooSkKxOoQuqcR\nWoR3wfeKpijgz4PvnUZo0VftaXpQe/cqeqgJTMFwyYzQSqjMohkcIPbwZQGiN3VjnBjHzdXd/P/h\nkZGFlO0ZEdO5Nd+ethOZhcAFSaiLMkMDAuegv/Xv4gr72sqpzUY6LihK4VFR0loi3Gi/as1aXLsw\nCzEd4FplWC1A4KI0BrzENkDgq6UrWGRpzPRoMnK3xeKhuc9pPdPdpqXd/sI9lQuVGtsLTm6fb2aj\nIHTzzyRPNA7w5NzcsULwB4B51dHlWCB4Ueoc55KTKxm9I8G16MC2XxxHDsJOPGfHvW+OflthHTal\nUzvuT9tcjqEER62a5RQCVBztvwvPJEXfnS+TlPs9+E08FD8Dj0ySLvcTvgYJ3UPwYBl4WU+5Xb1f\ngZrHOFgEX8puzLhxRp2bSIxuG5rgxUbjo0PcaiO4NYfQzCn8AY6JclfxnQzuAAAAAElFTkSuQmCC\n",
"prompt_number": 39,
"text": [
" 6 \n",
"x - 1 + \u2500\u2500\u2500\u2500\u2500\n",
" x + 2"
]
}
],
"prompt_number": 39
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Exponentials and logarithms"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Euler\u2019s constant $e = 2.71828\\dots$ is defined one of several ways,\n",
"\n",
"$$\n",
"e \\equiv \\lim_{n\\rightarrow\\infty}\\left(1+\\frac{1}{n}\\right)^n\n",
" \\equiv \\lim_{\\epsilon\\rightarrow 0}(1+\\epsilon)^{1/\\epsilon}\n",
" \\equiv \\sum_{n=0}^{\\infty}\\frac{1}{n!},\n",
"$$\n",
"\n",
"and is denoted `E` in `SymPy`. Using `exp(x)` is equivalent to `E**x`.\n",
"\n",
"The functions `log` and `ln` both compute the logarithm base $e$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"log(E**3) # same as ln(E**3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$3$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAIom7VJlmdt1E7xDNIS4hGwAA\nAAlwSFlzAAAOxAAADsQBlSsOGwAAAFJJREFUCB1jYBBSMmFgYAxg8E1gYL/CwNvAwLmSYe8BBiAA\nijAwcDcBCUaNaCDJwKA1AURyrWZgFGBgBiq+DSK5DBg4LjKwJTD4FjAwTA21ZAAAM4UOK1ZklQ8A\nAAAASUVORK5CYII=\n",
"prompt_number": 40,
"text": [
"3"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By default, `SymPy` assumes the inputs to functions like `exp` and `log` are\n",
"complex numbers, so it will not expand certain logarithmic expressions.\n",
"However, indicating to `SymPy` that the inputs are positive real numbers\n",
"will make the expansions work:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y = symbols('x y')\n",
"log(x*y).expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\log{\\left (x y \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEMAAAAUBAMAAAAkb50PAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMqvNiRDvuyJ2RN1U\nmWaBK2/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABj0lEQVQoFWWSv0sCYRjHv6eep+dp5T9gY9Ry\nQ0O05NBiIBwSgbRYYzSEiw1RNxWUxRFC3CBKa4OOCRFujRkObeVWbQlZJIR9X3/l5Qvvvc/3+3x4\nnvfe9wX+D19j1HmlCM+POoyPHNplAvKmwwIWHFrWKdMOC6GaU8fGkYDpRNbGkRMnAXex22jVXgEu\n428XTOc5k+fHOUvOWzg0EGTjNKRrKJbawq2f6X3+QTRUCegeLYUCEOJ+0whEITVdZcyRwA3gMTwt\nzcwGdWQArSyQSBX4CKZ6yBarwL0DGF4L34D0LpD7IvDla8rbogoRYMLip2RIzQEiqvz4crlJkWUj\nICLCOvwpQC2LKt4a1LZWpMvB7WpGAX6DCWW6t90MpA24o+rilCmQODtUD3AGPKLUAIJRhDszOF2e\nBZY6nzUiV0DCTj4xmYg9m4C7254JQKnK2QrX0QuoU4+c9h3lC+fwGl263KYW19gf6yy4J+LdvhFo\nKBbPSO9LLvKyHe+2HTwp1X6grZh/yDDyNYYhAz7MXziiXjyh9HSUAAAAAElFTkSuQmCC\n",
"prompt_number": 41,
"text": [
"log(x\u22c5y)"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a, b = symbols('a b', positive=True)\n",
"log(a*b).expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\log{\\left (a \\right )} + \\log{\\left (b \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAIgAAAAUBAMAAACkMGhZAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMqvNiRDvuyJ2RN1U\nmWaBK2/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACSUlEQVQ4EZVUv2sUQRT+Lnt7u9m7W2L+gVgm\nChI9BYmIJ6SJcCAosRC5qNioyKGFFiqLTYqoXBGQCAeHhY3NYRVB5DoLizswjYWwYKEWQgKJSlDj\n92Zn93bnTOGDt/N+fO/b92ZnBzDFDaPIFzMx5D9WET8Axg8byUXtjzCZliGg28C5a0RMAvalNJL2\nUe3b09nEENAKgEPEnKHezGL9fuzPaaPUjAwDiG8M/6LmmTdyxSAqAea1sRvJKuBtEWMvDJEsxRyw\n2pG5C4nbYRNUYEaRnF05BTyrfX3CSIvqrn24ApT7ggBSJGngKNPWVKsLfBSS3CqcJjt7M8qS+9Tn\ngbUO+NM0KQOSDNAJgfoR+yfwSUiKVeQ2RjrYLyWvOeQNlBss7oifJskAi12gdxqbwDshmaC7WV6I\nSK5yji0Um0BunQz5SuXY5UplL00DWGgD72GTZEJyPbo/3A37OpEgSaGB+pgmYWQwTgYoJMfh8SMr\nEunkt7u8zEI1Tr2KHi2vI36aJAOUcf5I13ghnRT68LZLbSlQG1vv4lYp+MfGZoBOCGxjnk9u7G3k\nLsKqejN7AlBq/HBN/2WeW1MVf9CJAcz3gQO4R8Aaxncm8Wh2H3Bi5zvD0ps9dfLBU3Kp8RISEyjT\nXmiFLDlIjcTp2g9f0Rwc+yWdiTfWAILHXokcXS1vuX6m+tKOkjm92oE2oiUGqh9QQvIDajk/BtwV\n+44OmFeBDiMBOkEUkqtAiz27UiMPsKgDMUa7yZIAeSkpid+aIGi4YeT9x/X4F7aapm1P/DD/AAAA\nAElFTkSuQmCC\n",
"prompt_number": 42,
"text": [
"log(a) + log(b)"
]
}
],
"prompt_number": 42
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Polynomials"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let\u2019s define a polynomial $P$ with roots at $x = 1$, $x = 2$, and $x = 3$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P = (x-1)*(x-2)*(x-3)\n",
"P"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(x - 3\\right) \\left(x - 2\\right) \\left(x - 1\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMEAAAAUBAMAAADGn0QzAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAChklEQVQ4EY2Vv2sUQRTHv7v3a+9uL54RLbTZ\nBLU+/QPMimBhIYchlQQ2EKMg4lmEFCbkbKwsAlaKxVWKVQ5ELCJki2AQCRgbsbvG2kOCWhye35nZ\nY2ePmcRXzL75vjefNz92ZwEngMWmEn3SEodbVxEnsGVIxAlT1Nl600ZNAZyGKePk7CVgX0WMCBmS\niMvG8fB+wg9lKJ/MNJPnf8Z2BztKMyLgvYBEuM3MyKSz3sYv4J3snTMl1GKUN1BtiZgZsTc/YIyI\nommGeN3xD4CPkr0g27GmHKH2F/6GkM0IlEQFIk6NDR11uUvId9hzopGkP/MDUQHXhGZByApELDNl\nd+30Q7lejfGhCxSaFEps/JX9V2rLtIwi5zgn+haErEDERY7vureLoTaW7plbMTc4BJALgE8431qk\nn7FNzuGsUCwIWcENcQeoxtWBV8+Mpvgc8CKKxTbwHtvxo7EE3KPwWIgWhKxABEE+8g2R6V9doi32\nhA88izHR57PcAWJcERJ2RMLSdenLLfwhXA2hZ8gKRDAMHGuJVrPjwEw7rQD81oLKFbuPUQUDQr1L\nrMAlMrEnWs2GsahQiSiJXcIE35useU1wGi+FaEaoCkTwmLx4HaU4A3gK3K/DDSmKk35S6mOVvmbf\ngQfpSRsQqoIb4i2w2Z7BpDaY7jQ87kuhS7faROVPru8E9FNz7m7NR8BNoZgRqgIRXOfeyu6NQKSm\nVpmb7fCL61HhOv2vq8vTaVB4+eFwGAHy0M2IwreDLxJh+eQlT32sC9I3Ng6LWG8NOYII87Ulo4fd\nfCrhsJsvRVxQrqFNbu9c3RBTUnJ7H4Gw/z4StNOwVkjQRyCcwAaYSgJj71ma/l9/0X/7iJkngBNf\nsQAAAABJRU5ErkJggg==\n",
"prompt_number": 43,
"text": [
"(x - 3)\u22c5(x - 2)\u22c5(x - 1)"
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To see the expanded version of the polynomial, call its `expand` method:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P.expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$x^{3} - 6 x^{2} + 11 x - 6$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAKsAAAAWBAMAAABNknGBAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACGUlEQVQ4EZWSP2gTURzHv5ekd9fkrjlaELqk\n1wrdiiJSFym3iGtw6CQ0PcHJYDbdKk52K4LYaIcITk51lupNri0EkQ5KOtopKS2aIsTfvcvL3XvP\nu6Y3vN+fz+/35Xe/94Do89vO0FNNfS+dqdXJjN2wd5Nx0te9/FYyvoRv14xuWrnpWadp7MJ8+rRm\ntXB2YXtaQSVII0Cxl86ySe5lBjfdDJiNlCU8XAx4R507Y1ndfxTXWeexH3qzVZvfv3EgItrKEWXY\nIRNAe4VDnq0Ehd/cj+weSrvDzCruR17RjexMm5bNjmFF0pQO8InHpmeEA8TfRPymrDcfPkaAyyIX\n3iE74g7urXncAyz/QSKifKkzglODwfBNjyX7OWqcvnpn0R1pcKe8438DJKbKags37/m8J7L9r0tV\n2nDNeG5uiYSiudeYaslMlb2Cp+6m0Kz1GzgGdEfvFT2BhMFcD/aRzFTZdTx23gvN2sDBTwcaJvmN\n0+jbL+jbDIDyMxhnAtObze1fzeb1UGR0ZQ7eMtG4EX+ADdoCyi4j4kF7MejJiUydFjgR+wDayUaD\nkvuBTCjOd2hamf1H1vorN6+waYvONeQcmcGi3XZkpsq+y3UxLzbv026BtdYX3BUBi5ZRaclMkZ04\nL3UL4R8nvnxNo5cwszD9XQKsRv9xW2Fc1l7p30J4aDfml54kJJlbbwdyKjvmstlVl6aaN27LP2bZ\niw2PmOSKAAAAAElFTkSuQmCC\n",
"prompt_number": 44,
"text": [
" 3 2 \n",
"x - 6\u22c5x + 11\u22c5x - 6"
]
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When the polynomial is expressed in it\u2019s expanded form $P(x) =\n",
"x^3 \u2212 6x^2 + 11x \u2212 6$, we can\u2019t immediately identify its roots. This is\n",
"why the factored form $P(x) = (x \u2212 1)(x \u2212 2)(x \u2212 3)$ is preferable. To\n",
"factor a polynomial, call its `factor` method or simplify it:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P.factor()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(x - 3\\right) \\left(x - 2\\right) \\left(x - 1\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMEAAAAUBAMAAADGn0QzAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAChklEQVQ4EY2Vv2sUQRTHv7v3a+9uL54RLbTZ\nBLU+/QPMimBhIYchlQQ2EKMg4lmEFCbkbKwsAlaKxVWKVQ5ELCJki2AQCRgbsbvG2kOCWhye35nZ\nY2ePmcRXzL75vjefNz92ZwEngMWmEn3SEodbVxEnsGVIxAlT1Nl600ZNAZyGKePk7CVgX0WMCBmS\niMvG8fB+wg9lKJ/MNJPnf8Z2BztKMyLgvYBEuM3MyKSz3sYv4J3snTMl1GKUN1BtiZgZsTc/YIyI\nommGeN3xD4CPkr0g27GmHKH2F/6GkM0IlEQFIk6NDR11uUvId9hzopGkP/MDUQHXhGZByApELDNl\nd+30Q7lejfGhCxSaFEps/JX9V2rLtIwi5zgn+haErEDERY7vureLoTaW7plbMTc4BJALgE8431qk\nn7FNzuGsUCwIWcENcQeoxtWBV8+Mpvgc8CKKxTbwHtvxo7EE3KPwWIgWhKxABEE+8g2R6V9doi32\nhA88izHR57PcAWJcERJ2RMLSdenLLfwhXA2hZ8gKRDAMHGuJVrPjwEw7rQD81oLKFbuPUQUDQr1L\nrMAlMrEnWs2GsahQiSiJXcIE35useU1wGi+FaEaoCkTwmLx4HaU4A3gK3K/DDSmKk35S6mOVvmbf\ngQfpSRsQqoIb4i2w2Z7BpDaY7jQ87kuhS7faROVPru8E9FNz7m7NR8BNoZgRqgIRXOfeyu6NQKSm\nVpmb7fCL61HhOv2vq8vTaVB4+eFwGAHy0M2IwreDLxJh+eQlT32sC9I3Ng6LWG8NOYII87Ulo4fd\nfCrhsJsvRVxQrqFNbu9c3RBTUnJ7H4Gw/z4StNOwVkjQRyCcwAaYSgJj71ma/l9/0X/7iJkngBNf\nsQAAAABJRU5ErkJggg==\n",
"prompt_number": 45,
"text": [
"(x - 3)\u22c5(x - 2)\u22c5(x - 1)"
]
}
],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"P.simplify()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(x - 3\\right) \\left(x - 2\\right) \\left(x - 1\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMEAAAAUBAMAAADGn0QzAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAChklEQVQ4EY2Vv2sUQRTHv7v3a+9uL54RLbTZ\nBLU+/QPMimBhIYchlQQ2EKMg4lmEFCbkbKwsAlaKxVWKVQ5ELCJki2AQCRgbsbvG2kOCWhye35nZ\nY2ePmcRXzL75vjefNz92ZwEngMWmEn3SEodbVxEnsGVIxAlT1Nl600ZNAZyGKePk7CVgX0WMCBmS\niMvG8fB+wg9lKJ/MNJPnf8Z2BztKMyLgvYBEuM3MyKSz3sYv4J3snTMl1GKUN1BtiZgZsTc/YIyI\nommGeN3xD4CPkr0g27GmHKH2F/6GkM0IlEQFIk6NDR11uUvId9hzopGkP/MDUQHXhGZByApELDNl\nd+30Q7lejfGhCxSaFEps/JX9V2rLtIwi5zgn+haErEDERY7vureLoTaW7plbMTc4BJALgE8431qk\nn7FNzuGsUCwIWcENcQeoxtWBV8+Mpvgc8CKKxTbwHtvxo7EE3KPwWIgWhKxABEE+8g2R6V9doi32\nhA88izHR57PcAWJcERJ2RMLSdenLLfwhXA2hZ8gKRDAMHGuJVrPjwEw7rQD81oLKFbuPUQUDQr1L\nrMAlMrEnWs2GsahQiSiJXcIE35useU1wGi+FaEaoCkTwmLx4HaU4A3gK3K/DDSmKk35S6mOVvmbf\ngQfpSRsQqoIb4i2w2Z7BpDaY7jQ87kuhS7faROVPru8E9FNz7m7NR8BNoZgRqgIRXOfeyu6NQKSm\nVpmb7fCL61HhOv2vq8vTaVB4+eFwGAHy0M2IwreDLxJh+eQlT32sC9I3Ng6LWG8NOYII87Ulo4fd\nfCrhsJsvRVxQrqFNbu9c3RBTUnJ7H4Gw/z4StNOwVkjQRyCcwAaYSgJj71ma/l9/0X/7iJkngBNf\nsQAAAABJRU5ErkJggg==\n",
"prompt_number": 46,
"text": [
"(x - 3)\u22c5(x - 2)\u22c5(x - 1)"
]
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall that the roots of the polynomial $P(x)$ are defined as the\n",
"solutions to the equation $P(x) = 0$. We can use the `solve` function\n",
"to find the roots of the polynomial:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"roots = solve(P,x)\n",
"roots"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ 1, \\quad 2, \\quad 3\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGMAAAAUBAMAAABrMp7fAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEVO8Qq5lm\nIrurE6D6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABF0lEQVQoFWMQMmEgBfAYJTCEYdfAu/udA7oM\nb2hcAQMrREvFBHRZhlkMrN/QBW8zsP+BaOFcvR5Ty0oGhg50LfIFDJ9gtshjamliYFjvgKYnI4Hz\nMx4t9hMwtTDAHcbAgMUWoAX6mHZPCsBjCwMD21c0dzEwXNWegFcL0wIMLQysbXi17MbUAQzFCdB4\nweYXxg0YWu4yMLwvwKOlmoH3Apqm/xPwamHZwMCIrqUPGIoXELYAIwkFXAqNXsQw3wBF7AwD+0eo\n93f1Wx1gUJqAIm3///8nBiZNFDG23fsSYCEGkmBHdwZIsBZEoAKow0CCrKgyEF4ApiCSlomYsgyc\nApiCSFoOYMoy8GARA2oRUsEijluIUSkBADifSkf5V5C+AAAAAElFTkSuQmCC\n",
"prompt_number": 47,
"text": [
"[1, 2, 3]"
]
}
],
"prompt_number": 47
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# let's check if P equals (x-1)(x-2)(x-3)\n",
"simplify( P - (x-roots[0])*(x-roots[1])*(x-roots[2]) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVElEQVQIHWNgEDIxZWBgSGeQmMDAsoCBOYGB\n+wAD+0cG/gMMvN8Z5BUYeP8xzDdgYP3MMF8BREJEgLLs3xm4NzCwfATpYkpgYGhnkApgYBB+d5QB\nAPogE3QldevOAAAAAElFTkSuQmCC\n",
"prompt_number": 48,
"text": [
"0"
]
}
],
"prompt_number": 48
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Equality checking"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the last example, we used the `simplify` function to check whether\n",
"two expressions were equal. This way of checking equality works\n",
"because $P = Q$ if and only if $P \u2212 Q = 0$. This is the best way to\n",
"check if two expressions are equal in `SymPy` because it attempts all\n",
"possible simplifications when comparing the expressions. Below is\n",
"a list of other ways to check whether two quantities are equal with\n",
"example cases where they fail:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p = (x-5)*(x+5)\n",
"q = x**2 - 25"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p == q # fail"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 50,
"text": [
"False"
]
}
],
"prompt_number": 50
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p - q == 0 # fail"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 51,
"text": [
"False"
]
}
],
"prompt_number": 51
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify(p - q) == 0"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 52,
"text": [
"True"
]
}
],
"prompt_number": 52
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sin(x)**2 + cos(x)**2 == 1 # fail"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 53,
"text": [
"False"
]
}
],
"prompt_number": 53
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify( sin(x)**2 + cos(x)**2 - 1) == 0"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 54,
"text": [
"True"
]
}
],
"prompt_number": 54
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Trigonometry"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import sin, cos, tan, trigsimp, expand_trig"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 55
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The trigonometric functions `sin` and `cos` take inputs in radians:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sin(pi/6)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{2}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAqBAMAAACXcryGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAcElEQVQYGWNggAEhAyCL2dUfRDEw5FODCtEv\naQCbRhbxHwQ+EKV1atRqoDpmB4bzFxgYWAwYmBQYGJgeMLD8ZmBg/wymgNJ8n8Fm3T8App6ASdYA\nMJUKJhkDGGYCGVsZGDIZGDjfnAl5ANQOdMMDBgC/syNtm3aMLwAAAABJRU5ErkJggg==\n",
"prompt_number": 56,
"text": [
"1/2"
]
}
],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cos(pi/6)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{\\sqrt{3}}{2}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAvBAMAAAACzbekAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInarRM2ZVBDdiWbv\nuzJCz3LGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABEElEQVQoFWNggAL5/yAA4zGYwFkgBmMACpet\nAIXbicJjSGdgXLUWroJjAoMYA/tvmBKuDQz6BQw/YVygVh8Hjq8wrjaIAVbM4gBkTQBxOxcACR2g\nA5gUgAypaQ1A5zR9YWDgBPIYGLiOAAmOvwwMu8BchjMNQDpfgGEGkBJkYLgPcod8AvcCIPW/AcJl\n/sHZAOSeZWCYLwCk+X6VAUmG3Qzsn0A0Q0wEiGRJy3UA0Qz1CWAKRrCCtNAcgOMCTlDdOsa0uw+Q\nDG1m4AKGJxxYMDCcgXMYGE4yMNg/QPDjG1C4QIn5DQhZYMD9QuYxcBqgcNNQeEwJKNwyBkak0OVL\nYGBC4kquWmaJpDr+/39IIgIA361IMdjdwjAAAAAASUVORK5CYII=\n",
"prompt_number": 57,
"text": [
" ___\n",
"\u2572\u2571 3 \n",
"\u2500\u2500\u2500\u2500\u2500\n",
" 2 "
]
}
],
"prompt_number": 57
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For angles in degrees, you need a conversion factor of $\\frac{\\pi}{180}[\\mathrm{rad}/^\\circ]$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sin(30*pi/180) # 30 deg = pi/6 rads"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{2}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAqBAMAAACXcryGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAcElEQVQYGWNggAEhAyCL2dUfRDEw5FODCtEv\naQCbRhbxHwQ+EKV1atRqoDpmB4bzFxgYWAwYmBQYGJgeMLD8ZmBg/wymgNJ8n8Fm3T8App6ASdYA\nMJUKJhkDGGYCGVsZGDIZGDjfnAl5ANQOdMMDBgC/syNtm3aMLwAAAABJRU5ErkJggg==\n",
"prompt_number": 58,
"text": [
"1/2"
]
}
],
"prompt_number": 58
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The inverse trigonometric functions $\\sin^{\u22121}(x) \\equiv \\arcsin(x)$ and\n",
"$\\cos^{\u22121}(x) \\equiv \\arccos(x)$ are used as follows:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"asin(1/2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0.523598775598299$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAKoAAAAOBAMAAABN1ZpJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACwUlEQVQ4ET2US2gTURSGv8n7MUmGClJEyDTi\nQlQoTQuihQTcFamhbtw1ouBG2qLuG+jChYUOFUS7aQVRKxTjQlyIMBbFB2iDC5daBAU31dhHrLbG\nc++dGph/5s//nTNn7jygo7cP9RtxhsaYPvgIrhUfB7aj+BqslZ4GpxeLxe7o5L5i0YCatvb1eyZO\nFp5UQONaOE+np7o+aK9i+ZQaSZfxsrG3mfEIwUtOttttPyKypRMje8rJeRPvJbyNpXAtROYIV6Up\nZ9952A6puWyLXM3YOWyXy3CdA2ATktP7OjHyBhZN/AzuYytcC2mfeFN19WVL1bDXMwvkq9rmqoR/\ncAw66YY+whCu6MTIBpRMfA+WKho3NTmfTGuna6wpXcXICqiT5Otk1/n0kF4xmWURPprT69j6A98r\nOh51pKvGTU3eJfNX8c8H96tdQga3JoxNyazb2O3jZQnSKqUegJq+I7M2gpgpR+OmZrab6KriHzLb\nkN2nbpJHuoyVy4+tSeWGI4Gal3A5ADVdgtFyEGdW1WrF1kzNrBt0lWlqUjcpG0dVf7EjXGoRfzu1\nIPP/UEFeiQElji3HS2MmJuHL06hwLf9XAEKbsrmqLHVLRGxk5dQ6J8j+dshWVfBViQa1DH4pVUxM\nQf7XuBa5W3F1t2y9hnyGpEe6FVjsJvMwPEairvpdDcCdmCXHxFlXxQrXkq4TUYeyyqEmcZebuaZ0\nNRZivrp0u0zeF8jaCsCdmAtBfFENo3AjkTlCVTmUNyhRZQi+peokNrWNzDPsqVnTHsOuQNGfAWjo\nAS+6aeKoS9bTuKnhCnsq1gbyng54yYnioVqkzPiyttkz1jn44DAoj7DqGpeuBlQ0X53dZRPfKPa8\nQuOmhl0rL/Sdn+7vIiYveo33haegLD2Fhgy4KF8XZsaka/KuiE60hAuHg3i03f4V4KrmHzhAGu2i\nkzv/AAAAAElFTkSuQmCC\n",
"prompt_number": 59,
"text": [
"0.523598775598299"
]
}
],
"prompt_number": 59
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"acos(sqrt(3)/2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{\\pi}{6}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAlBAMAAABrOn4UAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdpmJMlQiZrurEN1E\n782PMUhmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAm0lEQVQYGWNgkP////8nBgZmk8B0sQQGBlcG\nM0YHBhBo4FwAolgmcIMoBqYC/gUgev0C/gMgWpqB1wBEtzNwgmkQmwIAdAUQfCDFBGNhB5DydQeY\nHoDoJgaOBiDF8w3EYWDguACh+Z8Y6oBY658z8AaA6F8MTLeANP8GBvY/QJr7AQP7dyDNeQHCZwHK\ng7VOZlgLUs/ArDSFgQEAifooW+P3UnUAAAAASUVORK5CYII=\n",
"prompt_number": 60,
"text": [
"\u03c0\n",
"\u2500\n",
"6"
]
}
],
"prompt_number": 60
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall that $\\tan(x) \\equiv \\frac{\\sin(x)}{\\cos(x)}$. The inverse function of $\\tan(x)$ is $\\tan^{\u22121}(x) \\equiv \\arctan(x) \\equiv$ `atan(x)`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tan(pi/6)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{\\sqrt{3}}{3}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAvBAMAAAACzbekAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInarRM2ZVBDdiWbv\nuzJCz3LGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA/ElEQVQoFWNggAL5/yAA4zGYwFkgBmMACpet\nAIXbicJjSGdgXLUWroJjAoMYA/tvmBKuDQz6BQw/YVygVh8Hjq8wrjaIAVbM4gBkTQBxOxcACR2g\nA5gUgAypaQ1A5zR9YWDgBPIYGLiOAAmOvwwMu8BchjMNQDpfgGEGkBJkYLgPcod8AvcCIPW/AcJl\n/sHZAOSeZWCYLwCk+X6VAUmG3Qzsn0A0Q0wEiGRJy3UA0Qz1CWAKRrCCtNAcgOMCTlDdOuT4ARqO\nHD9ALnL8ALnI8QN2CSIywVxw/IBZIAIcP3AeNH6Q+OD4gfJh8QPlwuIHyoXFD5QLjx8IHx4/AFHW\nSnCoinNeAAAAAElFTkSuQmCC\n",
"prompt_number": 61,
"text": [
" ___\n",
"\u2572\u2571 3 \n",
"\u2500\u2500\u2500\u2500\u2500\n",
" 3 "
]
}
],
"prompt_number": 61
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"atan( 1/sqrt(3) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{\\pi}{6}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAlBAMAAABrOn4UAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdpmJMlQiZrurEN1E\n782PMUhmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAm0lEQVQYGWNgkP////8nBgZmk8B0sQQGBlcG\nM0YHBhBo4FwAolgmcIMoBqYC/gUgev0C/gMgWpqB1wBEtzNwgmkQmwIAdAUQfCDFBGNhB5DydQeY\nHoDoJgaOBiDF8w3EYWDguACh+Z8Y6oBY658z8AaA6F8MTLeANP8GBvY/QJr7AQP7dyDNeQHCZwHK\ng7VOZlgLUs/ArDSFgQEAifooW+P3UnUAAAAASUVORK5CYII=\n",
"prompt_number": 62,
"text": [
"\u03c0\n",
"\u2500\n",
"6"
]
}
],
"prompt_number": 62
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `acos` returns angles in the range $[0, \\pi]$, while `asin` and `atan` return angles in the range $[\u2212\\frac{\\pi}{2},\\frac{\\pi}{2}]$.\n",
"\n",
"Here are some trigonometric identities that `SymPy` knows:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sin(x) == cos(x - pi/2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 63,
"text": [
"True"
]
}
],
"prompt_number": 63
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify( sin(x)*cos(y)+cos(x)*sin(y) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\sin{\\left (x + y \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAFsAAAAUBAMAAAAQFlwTAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABoklEQVQoFX2TO0jDUBSG//SRtE1bVHAtoUIX\nqYqDgi6lOAgqZAk6STZBRFxEUChZxMGlOIrQIjgKBUXFSQq6GofiaBVxcakPkKpY783jJrdUz5D7\nn/985z7CvUB7HLcbLJ9ylLDPLMgrnm5TyYptCN9eIex4nsOUqDLJxAxTVAQVf1r1J7be5iweX7Rr\ncjdjZINJKng8XITQl1dPf9B72DOgkHrABMT0846zroOLWQXnOhImFgAD88CWIn8RXMoBS5hUNokm\n4eDxYBmDQEjFrg4FBWAdeCf1yBBwhWt93KJd/CihYo00G4h89IPiq8ArQWJFQMesBcc1be5A0+rE\niSm0KjQgXrZMipNmF7eV1eEetaQLLxZ+glDTh9PNgJbscPEaAmUgamAYePTh9KgjgQYyPF6AVLeO\nOqZjg+7E2UzcRPRNasg5WOHOfosScRIX2MtPF1Otp1TrfvSzbq0nPmSyEzbt/hksV+8qQLjLsb3h\nr0tQI8iZh7mKv2IimZNEUhWbZKhaCfeRbIDzEMlJCrkcKu/SrOPziKZvSKnjTP8+vl/k+l85fSdB\npwAAAABJRU5ErkJggg==\n",
"prompt_number": 64,
"text": [
"sin(x + y)"
]
}
],
"prompt_number": 64
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"e = 2*sin(x)**2 + 2*cos(x)**2\n",
"trigsimp(e)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$2$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOBAMAAAAPuiubAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAIpm7MhCriUTv3c12VLge\nopIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABOSURBVAgdY2BUMnZgYAhjYH/BwJDKwDCTgWEWA0Oe\nA8O+ABAJBOsCgATHcxCTKwFEKoEIHgUQeYmBUYCBRYGBR4BBqrwoi4Fh37t3rxgAK5QOlzv7snYA\nAAAASUVORK5CYII=\n",
"prompt_number": 65,
"text": [
"2"
]
}
],
"prompt_number": 65
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"trigsimp(log(e))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\log{\\left (2 \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAAUBAMAAADbzbjtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMqvNiRDvuyJ2RN1U\nmWaBK2/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABUklEQVQoFW2SsUoDQRBA3+VyucslkZgf0EYQ\nLbSwskmKNAqBIGJjoxY2Wsg1aSyuj4pFQNIFvyBlbDSdlXg/ELBTC8FAVIjIObubICQO3OzMvN2Z\nudmFKbkwkRdZCmsT1DvB69XyJEJwDiagHbJFcoizKiCYgG+wAIew8Q/swBGs5NmZhl4bilUF7ZZO\nu93chOvK65XsTUei4K5KTqwAq4N76X9wm5ao+yQKfwAz0lFApoTVT7RZVuFMV+t5yEqBgDnxB7k9\nA1MtBXvyWe8KPor/5fWdYxXWUBc2UJ388RqNvII67QNeiK/TpiL8YbalkGnIikiHuqEa1j52yV+f\nDRVMRlAvV6S5XIlCvMh5eUn+PP6UuE5WjONvsHUZdQC365zdKEPGZ6Q+NuBezGflyuCNqMGPZFeS\nnCrbDU1EX5kxccrNii4il61lvGnER8vfM/kFvLRPVx7iV6UAAAAASUVORK5CYII=\n",
"prompt_number": 66,
"text": [
"log(2)"
]
}
],
"prompt_number": 66
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"trigsimp(log(e), deep=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\log{\\left (2 \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAAUBAMAAADbzbjtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMqvNiRDvuyJ2RN1U\nmWaBK2/dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABUklEQVQoFW2SsUoDQRBA3+VyucslkZgf0EYQ\nLbSwskmKNAqBIGJjoxY2Wsg1aSyuj4pFQNIFvyBlbDSdlXg/ELBTC8FAVIjIObubICQO3OzMvN2Z\nudmFKbkwkRdZCmsT1DvB69XyJEJwDiagHbJFcoizKiCYgG+wAIew8Q/swBGs5NmZhl4bilUF7ZZO\nu93chOvK65XsTUei4K5KTqwAq4N76X9wm5ao+yQKfwAz0lFApoTVT7RZVuFMV+t5yEqBgDnxB7k9\nA1MtBXvyWe8KPor/5fWdYxXWUBc2UJ388RqNvII67QNeiK/TpiL8YbalkGnIikiHuqEa1j52yV+f\nDRVMRlAvV6S5XIlCvMh5eUn+PP6UuE5WjONvsHUZdQC365zdKEPGZ6Q+NuBezGflyuCNqMGPZFeS\nnCrbDU1EX5kxccrNii4il61lvGnER8vfM/kFvLRPVx7iV6UAAAAASUVORK5CYII=\n",
"prompt_number": 67,
"text": [
"log(2)"
]
}
],
"prompt_number": 67
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify(sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{2} \\cos{\\left (4 x \\right )} + \\frac{1}{2}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAHwAAAAqBAMAAACD5yJnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACg0lEQVRIDe2VS2gTURSG/3SSGSevFkVQXPio\noisdJO4KBq2iGxMhFRQXg6VWQbALISBiAiLajc5G0E2ZVRe6MBR0pwbUohBp3LhNFoIIhabUx8JH\n/O88kjRxbGfc9sDM/e+557vnzpk7d4D/tfVasBlCg+SkI5lgeCq3ZKW9HAyHvIavlc7/xrW3TW7f\nleJf2fud3snOjqUjh74f63G2HapJHcs6jrDRHlmVUgSQNJ1YaWJVUDvoppDnTNcx64iQ7nr+3X7m\nsHrLdIP2O2KVuFpnfFwxHQpK1VZe+IHKSUizl6p4ummckXKWt0ni0vnjH7jyiOjTPHB1O2aM5wam\nJRNJhkWLPIl04kO4o38C1jm188CVCWwtzQMvng1CJp4c4NpB/CXmtM3MWqeT1oU3hTWAg1xcbBHo\nLy9MGwzrqwJbBK7hqsBijEE8n7++O59PU/ZbIIVtNZ0z/6LbHCp8pYu4VBY48I2XjbPtyi6GhLWy\nn9Zwl5m5+NDwcGanjtgPMZ6oi7snzmfHwC6g9l5HuGiXjmswsUFuYHTF0ql7EDdmSrjG0z9q8DGz\nTMVHSSxGGyqni5RF3zM7UqfeQj37qpp4c+Edw6zFxh9/uXF0dOw2+0pJwL34vTOP7IGuu9i0HTbl\n6Fbp1JGHnFFKY67aEdaS1ifT6oEbzzLJcEQKcb6osIa+bY5nWSMK0LbeD/YwsIO1rSNsvZl2qK2s\n46LlXD6ZcO8FMiUoSx44VjisCprAaUn7VymkP1vQRHyt7I9yoxM/LfXR7ftsk2kBuAeBTxgYsYgx\n35wNyFnRhrJ4EGiCjVC5NZ4AF4Pg/IPIBtT5Sq4eBJ+qvD7BL4mHTiC80Gz+xh9G66hxV0aajwAA\nAABJRU5ErkJggg==\n",
"prompt_number": 68,
"text": [
"cos(4\u22c5x) 1\n",
"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\n",
" 2 2"
]
}
],
"prompt_number": 68
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `trigsimp` does essentially the same job as `simplify`.\n",
"\n",
"If instead of simplifying you want to expand a trig expression, you\n",
"should use `expand_trig`, because the default `expand` won\u2019t touch trig\n",
"functions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expand(sin(2*x)) # = (sin(2*x)).expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\sin{\\left (2 x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAUBAMAAAAgmk0yAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZklEQVQoFW2SPUvDUBSGn9R+mlaq4FqCQhdR\nxEFBEaQ4CCp0c7PZBBFxkYKCdBEHB4ujODmJIGQQ7SiCTor9A4UqUgQH6wdotRjvbVNzKz1Dcs55\nn+Q9ybnwP07UxrRTaAduV19BL6SjTqPDqida1SV8FsuEK07Dn3SVRjYLJThqlBeNxL1vwyE8N2wW\n64re+UfoGUiZLuHLovUmkmc/dB93DRiC8+Rr8I7p73naFRaRPAuQYR62DP1biIEJSYSqLDFlbII3\nyZ6JwQaswbvQgoOSCBa54tYcg7YMwY8+JLEKr0Jrz0qiACZzMtPK+C/tvCTSClEfRj4giVO8FYWo\nuYyjW2gvkghlGIIHhZCTank81rCnTLw26ajJurRwXMLia3PXN4+ht0BZF3TknP3ETDZml2L23chX\nsfZWUrb96b+P908KF19UXJpD/HU1cmpRz8Xm1GixuYClAq22L06QEs28I/w/hb9LVlzg/tSmiQAA\nAABJRU5ErkJggg==\n",
"prompt_number": 69,
"text": [
"sin(2\u22c5x)"
]
}
],
"prompt_number": 69
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"expand_trig(sin(2*x)) # = (sin(2*x)).expand(trig=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$2 \\sin{\\left (x \\right )} \\cos{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAIMAAAAUBAMAAABc0JOuAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACbElEQVQ4EY2UTWgTURSFz3Rmmjj56eAP2C50\nKEJ3EnFbTLaC0gGlQewiFQSRYmJAWlA0O1EEK1hRV3Gt0ooulC4yFmoXRo2CC0U0rgQtGtrYBlHi\neTOZP4zQBzPv3PvdOfPuY94A3YdUd/JJvSt3MT4TS4N7M52q/VZHcNriynFXhGYP9/IVo4i0OnSk\n4Jc9cOVRV4RmD6tzwHHgVojaQdJwcxHLVYHZxzgH3AbymQB1pOZtgTr9DwR8jCNAxfQstvpWA/5z\nj33pqQCOlUR21gQOfHwupXPKk13VCZFa4DX2bPuSBQxSqkPFGrLVKSgvltm8jdXq+BV20WMwjq6z\nJgUNsRy0YewUPexjqpC8p7H+G8P+mnJNuQPZOgSUHYwsvlp3gaSw1HK0mUEccg7yNPrqAO4DETPy\nM0G79wznkWhqBSjNSyYsB+MMLpivgUSZsVgpZod1yLSYQ5/F8CZXgViKCiOUK2KuAeva6lORI4aJ\nh0IqDSBuCJWtrECmRcqzgKOERfQ3Kz6VgFX1bNugFhaAyNoWbyDpkEz8KMm+BRvhezPifjmwipVt\nSLaYs7HSFDhahmIgriNhobcu+xbczoT5CnHT2c55hpsMRFsfgFN8jhhv4w0s2ts5MFk8yYIZyDq7\ncBspAldraexg6RCv/jpOK9cRK7wzsYcxcfSP3BCHraeASrv9i4nzL6eU/Nrh/NrB9A3WcPWj1bHd\nLMEjXuqxJR2bJ0/g4vKXEmPR3MTiwnfKWIa3bsP/gqVyF+5jBD7UcKF/jjZwzMKPepHo2B7dD7uH\nxWH/z/D+KV5xqNDDsh7KBwP3z7aBH99fTv+a9LX/Ob4AAAAASUVORK5CYII=\n",
"prompt_number": 70,
"text": [
"2\u22c5sin(x)\u22c5cos(x)"
]
}
],
"prompt_number": 70
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Hyperbolic trigonometric functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The hyperbolic sine and cosine in `SymPy` are denoted `sinh` and `cosh`\n",
"respectively and `SymPy` is smart enough to recognize them when\n",
"simplifying expressions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify( (exp(x)+exp(-x))/2 )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\cosh{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEUAAAAUBAMAAAApce1IAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJVCLvMs1Edmar\n3bti/yyrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABY0lEQVQoFX2SMUgCURzGf6dep6ZPSXAKEqql\nyYiGLMiGpoZujyijrQaHEAoiob0cmlrUWsIWCZoianFxSYigLcewIQkhiobe1d0zzHrD8fF9v3v/\nD94f/jgLtn/emRuPcdvS67YImJ1Q9Np2vE6kZTsZ4TBnKkkoZQvF3KkkqlQHo9dU4s1B39gQWuI4\nx9bcCaJSqlqpPwZaqXIoB7li6KtkzG2ThlYniHhiyWoryhDhsnAPvVm8WebTt7CzmcKPWCYkY4JJ\nGGU6PAueGgPyVqMFofhDw0RkCRUk0yNLhNmTCqNJXlqeN8nUI/sviHqbgXebUfcMh7nKOYw1C+PV\nYnw1qw/JFcgfFAiUHcbqPONvUvzqrK/hNjNpdj0phOkw7hi+lmjqEnXFoX9kHH1wKuebPJ0wbj42\nnte/B2jV4tGFlN60/HQ97bdY7Jpb5j9vqv4Rpi1/74Zi1I4pWEVt8WNXPwHhbVif38thLwAAAABJ\nRU5ErkJggg==\n",
"prompt_number": 71,
"text": [
"cosh(x)"
]
}
],
"prompt_number": 71
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify( (exp(x)-exp(-x))/2 )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\sinh{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEMAAAAUBAMAAAAkb50PAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABTElEQVQoFX2SvUvDUBTFf6lt0horKohbCQpd\nRBEHBV1KcRBU6OYikk0QBxcpKJQs4uBSHMXJXSki6iiCruZPUBEXl/oB4gfW95L3UiXFN5x7cu7J\nPQ/ehdbnWMkzqhr7ivQtKGKvKtJZC4nxpQTzUJGU6mCWlBKVimJzkXIRMUW0ZTtqLIfM7taKstie\nFkhVMQaKpdNveg96hh2oHEkk4YPZ/7gjUrI+S+CxCFuO/QnlgkSsAqww7WxCssSui4OYvw6vGkmP\nwBXX7iS0eaTfBsV8WINnjbRXwWVezMOoY142fGkpB5YQA0vwHVhOSL7HLDII40lOyXiMwn3MIq87\nlqiTD6474bIhU/4EdfhkXqy6LZzZc/aKs9Vc4yHXuB3/uAkxmG7e5YemRFCqS0Cr03yAs1Ztqf3z\njPoXq6ZYfBm0JVqpyKs7zfprMX8AjMdZ2fDTyJwAAAAASUVORK5CYII=\n",
"prompt_number": 72,
"text": [
"sinh(x)"
]
}
],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall that $x = \\cosh(\\mu)$ and $y = \\sinh(\\mu)$ are defined as $x$ and $y$\n",
"coordinates of a point on the the hyperbola with equation $x^2 \u2212 y^2 = 1$\n",
"and therefore satisfy the identity $\\cosh^2 x \u2212 \\sinh^2 x = 1$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"simplify( cosh(x)**2 - sinh(x)**2 )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$1$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPBAMAAAArJJMAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAVO8Qq5l2zWYZcMvdAAAACXBIWXMAAA7EAAAOxAGV\nKw4bAAAAHUlEQVQIHWNgAANGZQYGk5DJQDYbqQSr03QPsBkAJYgIYEZbtZEAAAAASUVORK5CYII=\n",
"prompt_number": 73,
"text": [
"1"
]
}
],
"prompt_number": 73
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Complex numbers"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import I, re, im, Abs, arg, conjugate"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 75
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ever since Newton, the word \u201cnumber\u201d has been used to refer to one\n",
"of the following types of math objects: the naturals $\\mathbb{N}$, the integers\n",
"$\\mathbb{Z}$, the rationals $\\mathbb{Q}$, and the real numbers $\\mathbb{R}$. Each set of numbers is\n",
"associated with a different class of equations. The natural numbers\n",
"$\\mathbb{N}$ appear as solutions of the equation $m + n = x$, where $m$ and $n$ are\n",
"natural numbers (denoted $m, n \\in \\mathbb{N}$). The integers $\\mathbb{Z}$ are the solutions\n",
"to equations of the form $x + m = n$, where $m, n \\in \\mathbb{N}$. The rational\n",
"numbers $\\mathbb{Q}$ are necessary to solve for $x$ in $mx = n$, with $m, n \\in \\mathbb{Z}$.\n",
"The solutions to $x^2 = 2$ are irrational (so $\\not\\in \\mathbb{Q}$) so we need an even\n",
"larger set that contains *all* possible numbers: real set of numbers $\\mathbb{R}$.\n",
"A pattern emerges where more complicated equations require the\n",
"invention of new types of numbers.\n",
"\n",
"Consider the quadratic equation $x^2 = \u22121$. There are no real solutions\n",
"to this equation, but we can define an imaginary number $i =\n",
"\\sqrt{-1}$ (denoted `I` in `SymPy`) that satisfies this equation:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"I*I"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$-1$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAPBAMAAAAMihLoAAAAJFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAEM3dMlTvq5l2ZtVdCTcAAAAJcEhZcwAA\nDsQAAA7EAZUrDhsAAAAqSURBVAgdY2DAClgTEcLi7RsRHAZOMjlCxiCgwkC2ATA3cJRtqoKxwTQA\nC0AL2ft3JesAAAAASUVORK5CYII=\n",
"prompt_number": 76,
"text": [
"-1"
]
}
],
"prompt_number": 76
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"solve( x**2 + 1 , x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left [ - i, \\quad i\\right ]$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAUBAMAAADGs4Z2AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEEKu7Zpnv\nIlQKjy8mAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApklEQVQoFWMQMmHACxarMYQhFHBMQLChLKBQ\nGIqSBZhKFqAqwVAAFkAxhSpKCjdiGAMSQrYoIAdDCUgISQnvg83oSsBCICXFSiBgws7wEV0JWAjJ\nFAa+7+hKwELISpgbCtDVgISQldQ/CEBXAhJCVpLPu4D9M6oioBCKEo5VDAxKqHaBhJBNARnAdwHV\nGCAPXQkrhgoMJYWElSzApkRIBVMUWURIDQAucyi9RmiSEAAAAABJRU5ErkJggg==\n",
"prompt_number": 77,
"text": [
"[-\u2148, \u2148]"
]
}
],
"prompt_number": 77
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The solutions are $x = i$ and $x = \u2212i$, and indeed we can verify that\n",
"$i^2 + 1 = 0$ and $(\u2212i)^2 + 1 = 0$ since $i^2 = \u22121$.\n",
"\n",
"The complex numbers $\\mathbb{C}$ are defined as $\\{a + bi| a, b \\in \\mathbb{R}\\}$. Complex numbers contain a real part and an imaginary part:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"z = 4 + 3*I\n",
"z"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$4 + 3 i$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADUAAAAQBAMAAABEqSrGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMpndu3bvImbNiRBU\nq0Qb3U6NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA3ElEQVQYGWNgYGAQAmJkULXKB8i9AhYyQZZg\nYGBXYDjfwMBwAyTKmgKVOwqhWf8w8BtAhSqmoMrx5THsnwAVWoAmBxQGmQkCHAUYctxWDNxBAUC5\nrQzocuyLtRm4+BKAcgsw5BgYlj2oYQJaySMAkVs5c6bZzJlzgYqBgC17Az/QzF0M6PrYCxhY/jCc\n38DAcPbu3W9XIaqh/uP/DZKbyw0WRPM7mwMD83fuP1xguS8QbQxQfRwNDOcD+D5UgESX/AcHHQNM\njuGRkh8wOBugOiAUVB+KGIyzHcaA0gDZVjtuA4Fx6gAAAABJRU5ErkJggg==\n",
"prompt_number": 79,
"text": [
"4 + 3\u22c5\u2148"
]
}
],
"prompt_number": 79
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"re(z)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$4$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAPBAMAAAAv0UM9AAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAMpndu3bvImbNiRBUq9OB\nhjcAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABESURBVAgdY2BgYBACYgYGExDBmgIiK6aAyAUgkqMA\nRG5lAJELQCSPAIjcxQAiz969++wqUIIBrIvhCYi55N0NEMXAAABbkhBrtxdTYQAAAABJRU5ErkJg\ngg==\n",
"prompt_number": 80,
"text": [
"4"
]
}
],
"prompt_number": 80
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"im(z)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$3$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAIom7VJlmdt1E7xDNIS4hGwAA\nAAlwSFlzAAAOxAAADsQBlSsOGwAAAFJJREFUCB1jYBBSMmFgYAxg8E1gYL/CwNvAwLmSYe8BBiAA\nijAwcDcBCUaNaCDJwKA1AURyrWZgFGBgBiq+DSK5DBg4LjKwJTD4FjAwTA21ZAAAM4UOK1ZklQ8A\nAAAASUVORK5CYII=\n",
"prompt_number": 81,
"text": [
"3"
]
}
],
"prompt_number": 81
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The *polar* representation of a complex number is $z \\equiv |z|\u2220\u03b8 \u2261 |z|e^{i\u03b8}$. For a complex number $z = a + bi$, the quantity $|z| = \\sqrt{a^2 + b^2}$ is known as the absolute value of $z$, and $\u03b8$ is its *phase* or its *argument*:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Abs(z)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$5$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOBAMAAAAPuiubAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzXYQMplU74mrIma7\nRN0SDTw+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAATklEQVQIHWNgVGYJY2Bg//+/gYGBsVOLgYGB\nE4jh5G5VBwYGHgOuv2DBc2AyfgHDRAaG/gsMhQwM8QYMAQwMDxkYljJwVzEwcEVMNWAAADWrDnXF\n0pOGAAAAAElFTkSuQmCC\n",
"prompt_number": 82,
"text": [
"5"
]
}
],
"prompt_number": 82
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"arg(z)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\operatorname{atan}{\\left (\\frac{3}{4} \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAFUAAAAyBAMAAADfKoqLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZnaJVN0imavvMkQQ\nzbsZbzSbAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAClklEQVRIDYWWPWzTQBTH/8UfIYmTAAOwlFrK\nAlMiMbCRLAxlIJnIBpGQYM2CgIVEMBCxtANSC0goMCEBSlamWkiIbomYmJAXBgYoIMqXQOHuvTu7\n9VffcPd///fz2c7d+QJkhDFRxc0MSJVOaaQ40yqtNwaAffJ0U9QX0xjtL3vAFZhfRV6uazO5dx4K\nv9bEtuice8mMdss9oV5OnH/SWNZuct/yyKdngJX9EB0e4jVR5o/kAdld4Oqljke5ujL5Cstn35Cv\nCCx51CU344ny7xM1dZMxcm9QexnYakpVmlGe3KyTPfcUuy/j5QpyuoBHwMWuFDbnUsZCjXMQ5jeu\n8X1inDTKq2QXr91U7/ghESMz70dqDZ0XtQj6aS+QLJbU+HgTKQBjN2IFxpFIAWg1I5a+kfkzUhBz\nOopYlQFwqOri6PawSeLF2pPjLkG1LnVhU/Fhnsd1QKwiFhdcmyeoEWXzM5gPsOERS+IjwBPU98Ih\nSeXbQKHa70qWxSeA52mFgMpcBklrFc777ngkWRafd7NEcSPYchvj514HLouAjT2D1Ualjtaz0Tv0\nWARs0rvlfTQee1fRYxGwtdGO+0sp6vad6qu32H+7S+Lp/O653wNZCqZfJjIq0QXCtmxbeqkUFDOt\nh8WIGrvK0Ps5MCKgSINbnvC5GFtM4TXWjLW9qNjYDxOyuS+sjZJieSJDYIda+MvJYc2KHZ0Whe9U\ncVzF2mo7J/K8xw0oNutbgj6NcFazYrmkx8ZE1Jy6ZqduOgqrJ4rmcLiyTlTNy2D1D5H3Ccr4RIn6\nGg8k9qSI7DMAfLYYW78OCLYknyg9dpXluZgR9p+wSOdimMbVmdCiczFM4yo3CLxjgUoTt3Rh7/8E\nyMmpk7HpyfY/CE+t6PceeeoAAAAASUVORK5CYII=\n",
"prompt_number": 83,
"text": [
"atan(3/4)"
]
}
],
"prompt_number": 83
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The complex conjugate of $z = a + bi$ is the number $\\bar{z} = a \u2212 bi$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"conjugate( z )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$4 - 3 i$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADUAAAAPBAMAAAC2KZqIAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMpndu3bvImbNiRBU\nq0Qb3U6NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAyElEQVQYGWNgYGAQAmJkULXKB8i9AhYyQZZg\nYGBXYDjfwMBwAyTKmoIqx/qHgd8AKlQxBVWOL49h/wSo0AI0OaAwyEwQ4CjAkOO2YuAOCgDKbWVA\nl2NfrM3AxZcAlFuAIcfAsOxBDRPQSh4BiNxOYxCYCFQMBGzZG/iBZu5iQNfHXsDA8ofh/AYGhrN3\n7367ClENJfl/g+TmcoO5aH5nc2Bg/s79hwss9wVFGwNHA8P5AL4PFSDRJf/BQYdQ8EjJDxicDQgB\nLCwAmbwv5PTBgvkAAAAASUVORK5CYII=\n",
"prompt_number": 84,
"text": [
"4 - 3\u22c5\u2148"
]
}
],
"prompt_number": 84
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Complex conjugation is important for computing the absolute value\n",
"of $z$ $\\left(|z|\\equiv\\sqrt{z\\bar{z}}\\right)$ and for division by $z$ $\\left(\\frac{1}{z}\\equiv\\frac{\\bar{z}}{|z|^2}\\right)$."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Euler\u2019s formula"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import expand"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 90
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Euler\u2019s formula](https://en.wikipedia.org/wiki/Euler's_formula) shows an important relation between the exponential function $e^x$ and the trigonometric functions $sin(x)$ and $cos(x)$:\n",
"\n",
"$$e^{ix} = \\cos x + i \\sin x.$$\n",
"\n",
"To obtain this result in `SymPy`, you must specify that the number $x$ is\n",
"real and also tell `expand` that you\u2019re interested in complex expansions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = symbols('x', real=True)\n",
"exp(I*x).expand(complex=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$i \\sin{\\left (x \\right )} + \\cos{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAJYAAAAUBAMAAACdV9kCAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAq7tmEHaZiUTvIlTN\nMt36g2k3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAChElEQVQ4EZ1UTWgTQRT+zG6yaZJdi39IQYh6\nsggGpAoisgqlCD2k0KSgBxcEe83BVhHBXES8VC+KiMISRSyCBNGDHmzqSWSV9uBNaRC8VA+xalst\nJb43uzObJtmLA7vve99875s3w84CXceDgD3SdbaVTOX8THM5bvET85Yf+Z3KBniTG4DIUJEzfQy2\n+pm5Ilkg4wZYr4Vkd/RO0sMStMVDKp8IUDqvqA1Ac2RqRCgWpQAnAxTlZblSqt+UiM7os8KpuoKZ\nsg+jvJ4qJd5CL1Jv5umBWuUHPt3+OMKdxh1AL/RdpQ0mCPKQXvr4ZBVDhYuihPgiPYMjj8eo7ByM\nJPV2AqhjFviST/2lyVgOGMKx/HdAq1FOQ3pNV8275iJieVEC7KVVS9pXqwYcxZMEhes28tgN7AN+\nUqFVBc7jiv2KPOqU05BeHtLrVgnmuigBvgGGbfxKu8Br2JupPWvpFNhrP/CbCnvKgI03hGA26GV4\n3od7ntdLPSxTukBLrYgS4A5xyGSJxQIwY1N6uemw157Qy0e+FwmDvpK81EwZWBIlwgvgdoTXrA48\nhLba4sV7pG2wIFnnt/JSfS2LErFHcpljyRT0NQN4wV9/2Bef/fN4A6OdZ++RbY+D5KooEWefts8g\nbvPZJxt0j1/a6OcNBns0SLwWa/C1TZR4SdUXpnO4ZN5HpiRKgEngRvUA+F8wTg1RxbWBw+X55rb5\n5q5nf3rFxvTto8WDJMjMsVPope8Yc/Howk5RQvwUcLwweJY88J51nSO8Q/K7lt9Eu9ZyJdNyWSQl\nYufd1lXNBiE0R+ZRdzvmBgq9JqVRsV9ODEvQFlPZgFCmbYIwrUioTCUh43/9o/8Bg1egZlYaEigA\nAAAASUVORK5CYII=\n",
"prompt_number": 86,
"text": [
"\u2148\u22c5sin(x) + cos(x)"
]
}
],
"prompt_number": 86
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"re( exp(I*x) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\cos{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADkAAAAUBAMAAADFBIheAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJVCLvMs1Edmar\n3bti/yyrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABOUlEQVQoFWNgwADRUJGtGDJAAdYHUFGeACzS\nHDBBxgYsspvgYlZwFoJxFc4Ug7PgDNYLcCbHBAYGIWMVBkarxRMYqrxXACW4FBgYGFcdnQU0lkmB\ngTWFoSygNoDhFeMDBl6gLN8GBgZhhr0LbjAwcDcwcDQw+BdcZmCor0xk4ALK8jowMBgy2Au4MjCw\nXGCQB5rE/oWBgd/g/iuQX9iAlgkw9AFZDOwfGOYvACr6CZR9INz/CSrLwPALKgvXqyrAsB+oD2Qy\nA/t3kCznBZC9DA5JDAzzpyxg4AG6COQqR64PDAvBrmLNZmAOKCtgaGZJZOALYGBgVmDg/ML3gRWo\niMmAgUFGy5SBVdlmAqf1akuIcYynFi7aDWRyFAAJNIAIyVg0GRAXfyyALAcDrDEIj324MqhqCIWU\ncgBCYEPSNlhnwgAAAABJRU5ErkJggg==\n",
"prompt_number": 87,
"text": [
"cos(x)"
]
}
],
"prompt_number": 87
},
{
"cell_type": "code",
"collapsed": false,
"input": [
" im( exp(I*x) )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\sin{\\left (x \\right )}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAAUBAMAAADbzbjtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABKUlEQVQoFWNgQAdboALeUJpxEUIFdwGUzbcB\nwmD8g5BkhYoxsAUgBGEsXxiD4RCcBWd0w1lZEBa3IFyEuwHOZJ3AwKjsFLD9H4PoWiE9BaA40wUG\nBjal15OAZvJeYEhnYGhgiGNgaFfg/g2UZHdgYMhh8FBoZWBgCWCYlcCgwFDHwFDFwPAFKMlhwMBw\njOF8gjUDA3MDA8d3bQaQZCkDwyegJNcEBoYEhnAgi4HxAwPb0f8XQJLlCEkICyS5jYHlJ5IkyFgG\nxo8gnZwNDEYMDE+QJEEOMmP6wKAGdpBVAkM1yEyosTwXGDg/s3/gBqrhPcAwx8lngtz/Z3L/H5r/\negA2i+2Rmq4L0FhWASCBChDBtwNVAsTDG/DsG6AasEUZPLLhqpBNR0omACUOR3UP731RAAAAAElF\nTkSuQmCC\n",
"prompt_number": 88,
"text": [
"sin(x)"
]
}
],
"prompt_number": 88
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basically, $\\cos(x)$ is the real part of $e^{ix}$, and $\\sin(x)$ is the imaginary part of $e^{ix}$. Whaaat? I know it\u2019s weird, but weird things are bound to happen when you input imaginary numbers to functions.\n",
"\n",
"Euler\u2019s formula is often used to rewrite the functions `sin` and `cos` in\n",
"terms of complex exponentials. For example,"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(cos(x)).rewrite(exp)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{e^{i x}}{2} + \\frac{1}{2} e^{- i x}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGsAAAAvBAMAAAAWWClFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEIl2mSJE3e9UMqtm\nzbsXyEShAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABz0lEQVRIDcWUsUvDQBSHXxpr25TSIHVyMNpZ\nFFpdWrEgLi1IFAU3uzlaBEFwETdBUHDQSTr4BxRxcBEVV4fuNZObg7SCiw6aay5Ncncv9UTwhuTd\n776PF9LXAHSXWnLuklfNlBT+AR8sAGTLhbpk68ioruo3saqktnQKGjwJpDNdEHrRs12+e1taKVe3\noZrSqYPW1jgP5kK1RNNYj9QiMpqSzZvKpTkykx2T0TbMqMHzNEEfMnoAmbq8ljzM3aMW/0rcmU83\ncAl4zZ35tCGluXDc1qbcDXdHX4nahIzJ4W7Aat7M54t3LsTdK0et4OFfzzzXkQbnr/bSQTzzDnOC\nuYDOPDFwDZ35cA2deZE2lFsgcb/FPOTgNiz3U8g5o60dK2VW+/IvcjhhWTuW1SJl96gN1w/F0G8D\nQcliun06ad8ro731FRyA0fYB1J+YjDYLym9+AHX+UdxsZfHFf9DrxuR+xq6VBkxWfdkwrdnch5Ay\nqUN8j8nCcorGa5D8EGhYTtFUR6xhudch1vFqf4XllNk0/LBXYzkldj0yUGG5Aw2UAnBvg+UUyPfA\nYIHlDpUowWqQD88pewEwLdKw3GGjW+OVmkDDcoqm7H+/SMNygG8xM3T3wvA/OgAAAABJRU5ErkJg\ngg==\n",
"prompt_number": 89,
"text": [
" \u2148\u22c5x -\u2148\u22c5x\n",
"\u212f \u212f \n",
"\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\n",
" 2 2 "
]
}
],
"prompt_number": 89
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compare this expression with the definition of hyperbolic cosine."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Calculus"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Calculus is the study of the properties of functions. The operations of\n",
"calculus are used to describe the limit behaviour of functions, calculate\n",
"their rates of change, and calculate the areas under their graphs. In\n",
"this section we\u2019ll learn about the `SymPy` functions for calculating\n",
"limits, derivatives, integrals, and summations."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Infinity"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import oo"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 91
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The infinity symbol is denoted `oo` (two lowercase `o`s) in `SymPy`. Infinity\n",
"is not a number but a process: the process of counting forever. Thus,\n",
"$\\infty + 1 = \\infty$, $\\infty$ is greater than any finite number, and $1/\\infty$ is an\n",
"infinitely small number. `Sympy` knows how to correctly treat infinity\n",
"in expressions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"oo+1"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\infty$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAALBAMAAABv+6sJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvZom7mXYyzVQi\n3UQ6SGZXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAaklEQVQIHWNgYBBgAAIQwaj82YGBIayogYGB\nbQLHLwapDQxTGRg8GRj2J6xkYGA5wACUYP0LJBgcQEyGfBDRAGYm/wNqd2BwZGDgiDE+wMBxgIGd\ngSGcYb4dgytQolxtAwNjvXEAUDncNgBJUBUwaYAbUgAAAABJRU5ErkJggg==\n",
"prompt_number": 92,
"text": [
"\u221e"
]
}
],
"prompt_number": 92
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"5000 < oo"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\mathrm{True}$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAACoAAAAPBAMAAABgjEDtAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA782r3SJ2ZjIQmUS7\nVIlAnjihAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAv0lEQVQYGWNg/GQs72z0hQEV8Acw5BcwNKIK\nMsxiAIkyo4mGg0XZJqAKR4BFOUCi0Q2c3QFwWaAJ3Iq5j0LXH+A9n8DAuvwxWAooysC4dn4B0wEG\n/gSGLRO4JUEaQKJMDgwMPGBROQYGMaAgRNQAKsrxq7zcHC66ACrK/hckBARgExbA1H4DiyFEmQ8w\nxCcwODEwTIOpZQGqZRdguHiSob+AYSUDA/caeZkV3Of/XGBgeJc2RWQCp1XeBKghaBQAM0c287zN\nvm0AAAAASUVORK5CYII=\n",
"prompt_number": 93,
"text": [
"True"
]
}
],
"prompt_number": 93
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"1/oo"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVElEQVQIHWNgEDIxZWBgSGeQmMDAsoCBOYGB\n+wAD+0cG/gMMvN8Z5BUYeP8xzDdgYP3MMF8BREJEgLLs3xm4NzCwfATpYkpgYGhnkApgYBB+d5QB\nAPogE3QldevOAAAAAElFTkSuQmCC\n",
"prompt_number": 94,
"text": [
"0"
]
}
],
"prompt_number": 94
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Limits"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy import limit"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 95
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We use limits to describe, with mathematical precision, infinitely large\n",
"quantities, infinitely small quantities, and procedures with infinitely\n",
"many steps.\n",
"\n",
"The number $e$ is defined as the limit $e \\equiv \\lim_{n\\rightarrow\\infty}\\left(1+\\frac{1}{n}\\right)^n$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit( (1+1/n)**n, n, oo) # = 2.71828182845905"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$e$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAEIl2mSJE3e9UMqtmzXCQ\nkgMAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAA4SURBVAgdY2BgVDYJYGBID2BVYGDtZBBZwMDdY3yQ\ngYFvAwMQ8CmASA4gacDAfIFBBKjSxOYAAwDWpwf9jP6jxwAAAABJRU5ErkJggg==\n",
"prompt_number": 96,
"text": [
"\u212f"
]
}
],
"prompt_number": 96
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This limit expression describes the annual growth rate of a loan with\n",
"a nominal interest rate of 100% and infinitely frequent compounding.\n",
"Borrow $1000 in such a scheme, and you\u2019ll owe $2718.28 after one year.\n",
"\n",
"Limits are also useful to describe the behaviour of functions. Consider\n",
"the function $f(x) = \\frac{1}{x}$. The `limit` command shows us what happens to $f(x)$ near $x = 0$ and as $x$ goes to infinity:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit( 1/x, x, 0, dir=\"+\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\infty$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAALBAMAAABv+6sJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvZom7mXYyzVQi\n3UQ6SGZXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAaklEQVQIHWNgYBBgAAIQwaj82YGBIayogYGB\nbQLHLwapDQxTGRg8GRj2J6xkYGA5wACUYP0LJBgcQEyGfBDRAGYm/wNqd2BwZGDgiDE+wMBxgIGd\ngSGcYb4dgytQolxtAwNjvXEAUDncNgBJUBUwaYAbUgAAAABJRU5ErkJggg==\n",
"prompt_number": 97,
"text": [
"\u221e"
]
}
],
"prompt_number": 97
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit( 1/x, x, 0, dir=\"-\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$-\\infty$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAACMAAAALBAMAAAAHCCkxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMqvvZom7mXZU\nIkRJD0iWAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAfklEQVQIHWNggAMBEAtMQIUYw74VMDB0Lt0A\nV8LA6cD9iUHoAIMHQqiEgeH8BBUGBvYLDELGIKDCANTA8RmkC6gdCkC8+SAChCEAxJr2j4GBsQAm\nwlDIwMDdm3aBgfsCXIiLgaGLwT+PoQIuwsC4KvIAA+P6tAaEENThAgwMAMSLGqu/gFQwAAAAAElF\nTkSuQmCC\n",
"prompt_number": 98,
"text": [
"-\u221e"
]
}
],
"prompt_number": 98
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit( 1/x, x, oo)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVElEQVQIHWNgEDIxZWBgSGeQmMDAsoCBOYGB\n+wAD+0cG/gMMvN8Z5BUYeP8xzDdgYP3MMF8BREJEgLLs3xm4NzCwfATpYkpgYGhnkApgYBB+d5QB\nAPogE3QldevOAAAAAElFTkSuQmCC\n",
"prompt_number": 99,
"text": [
"0"
]
}
],
"prompt_number": 99
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As $x$ becomes larger and larger, the fraction $\\frac{1}{x}$ becomes smaller and smaller. In the limit where $x$ goes to infinity, $\\frac{1}{x}$ approaches zero: $\\lim_{x\\rightarrow\\infty}\\frac{1}{x} = 0$. On the other hand, when $x$ takes on smaller and smaller positive values, the expression $\\frac{1}{x}$ becomes infinite: $\\lim_{x\\rightarrow0^+}\\frac{1}{x} = \\infty$. When $x$ approaches 0 from the left, we have $\\lim_{x\\rightarrow0^-}\\frac{1}{x}=-\\infty$. If these calculations are not clear to you, study the graph of $f(x) = \\frac{1}{x}$.\n",
"\n",
"Here are some other examples of limits:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit(sin(x)/x, x, 0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$1$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPBAMAAAArJJMAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAVO8Qq5l2zWYZcMvdAAAACXBIWXMAAA7EAAAOxAGV\nKw4bAAAAHUlEQVQIHWNgAANGZQYGk5DJQDYbqQSr03QPsBkAJYgIYEZbtZEAAAAASUVORK5CYII=\n",
"prompt_number": 100,
"text": [
"1"
]
}
],
"prompt_number": 100
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit(sin(x)**2/x, x, 0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$0$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVElEQVQIHWNgEDIxZWBgSGeQmMDAsoCBOYGB\n+wAD+0cG/gMMvN8Z5BUYeP8xzDdgYP3MMF8BREJEgLLs3xm4NzCwfATpYkpgYGhnkApgYBB+d5QB\nAPogE3QldevOAAAAAElFTkSuQmCC\n",
"prompt_number": 101,
"text": [
"0"
]
}
],
"prompt_number": 101
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"limit(exp(x)/x**100,x,oo) # which is bigger e^x or x^100 ?\n",
" # exp f >> all poly f for big x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\infty$$"
],
"metadata": {},
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAALBAMAAABv+6sJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvZom7mXYyzVQi\n3UQ6SGZXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAaklEQVQIHWNgYBBgAAIQwaj82YGBIayogYGB\nbQLHLwapDQxTGRg8GRj2J6xkYGA5wACUYP0LJBgcQEyGfBDRAGYm/wNqd2BwZGDgiDE+wMBxgIGd\ngSGcYb4dgytQolxtAwNjvXEAUDncNgBJUBUwaYAbUgAAAABJRU5ErkJggg==\n",
"prompt_number": 102,
"text": [
"\u221e"
]
}
],
"prompt_number": 102
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Limits are used to define the derivative and the integral operations."
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Derivatives"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment