├── .ipynb_checkpoints └── transcript-checkpoint.ipynb ├── README.md ├── custom.css ├── demos ├── .ipynb_checkpoints │ ├── Awesome Calculator - 1-checkpoint.ipynb │ ├── Awesome Calculator - 2-checkpoint.ipynb │ ├── Awesome Calculator - 3-checkpoint.ipynb │ ├── Awesome Calculator - 4-checkpoint.ipynb │ ├── Awesome Calculator - 5-checkpoint.ipynb │ ├── Awesome Calculator - 6-checkpoint.ipynb │ ├── Awesome Calculator - 7-checkpoint.ipynb │ ├── Gradient Descent-checkpoint.ipynb │ ├── Interactive Barnsley Fern-checkpoint.ipynb │ ├── Interactive Mandelbrot Set-checkpoint.ipynb │ ├── Interactive Notebook Demo-checkpoint.ipynb │ ├── Maps using Basemap - demo-checkpoint.ipynb │ ├── Projectile Motion -checkpoint.ipynb │ ├── Scientific Calculator-checkpoint.ipynb │ ├── Simple Linear Regression-checkpoint.ipynb │ ├── SymPy Basics - 1-checkpoint.ipynb │ ├── SymPy Basics - 2-checkpoint.ipynb │ ├── SymPy Basics - 3-checkpoint.ipynb │ └── Uniform and Non-uniform Random numbers-checkpoint.ipynb ├── Awesome Calculator - 1.ipynb ├── Awesome Calculator - 2.ipynb ├── Awesome Calculator - 3.ipynb ├── Awesome Calculator - 4.ipynb ├── Awesome Calculator - 5.ipynb ├── Awesome Calculator - 6.ipynb ├── Awesome Calculator - 7.ipynb ├── Fibonacci Miles and Kilometers.ipynb ├── Gradient Descent.ipynb ├── Interactive Barnsley Fern.ipynb ├── Interactive Mandelbrot Set.ipynb ├── Interactive Notebook Demo.ipynb ├── Maps using Basemap - demo.ipynb ├── Projectile Motion .ipynb ├── Scientific Calculator.ipynb ├── Simple Linear Regression.ipynb ├── SymPy Basics - 1.ipynb ├── SymPy Basics - 2.ipynb ├── SymPy Basics - 3.ipynb └── Uniform and Non-uniform Random numbers.ipynb ├── py-files ├── projectile_animation.py └── startup_math.py ├── slides.pdf └── transcript.ipynb /.ipynb_checkpoints/transcript-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Book: Doing Math With Python\n", 8 | "\n", 9 | "\n", 10 | "\n", 11 | "- Most of what I am going to discuss today\n", 12 | "\n", 13 | "- In addition: Descriptive statistics, Sets and Probability, Random numbers\n", 14 | "\n", 15 | "Published by [No Starch Press](https://www.nostarch.com/doingmathwithpython) in August, 2015.\n", 16 | "\n", 17 | "*Translations*: Simplified Chinese, Japanese, French and Korean." 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "slideshow": { 24 | "slide_type": "notes" 25 | } 26 | }, 27 | "source": [ 28 | "# Why \"Math with Python?\"\n", 29 | "\n", 30 | "Today, I am presenting an idea, a hypothesis or even making a statement - Python can lead to a more enriching learning and teaching experience in the classroom.\n", 31 | "\n", 32 | "Let me explain where I am coming from. When I think back about when I was learning to program and learning all other subjects in standards 7-10. I think it's true today as well. Programming and other subjects such as Math, Science are taught in a disconnected fashion. Programming seems to be all about finding the sum of a series or generating fibonacci numbers. Make no mistake, these exercises are what builds up the programming logic. Some students get really excited about being able to do these, but a lot of them don't. It's a lot like not everyone gets interested in solving puzzles - i don't, i never took to them.\n", 33 | "\n", 34 | "I think I know of a way we could excite more students! Show them how you can write programs to do your homework, or experiment without having to go the science lab or setup elaborate experimental setups. This is my goal for today - in the following slides and notebooks, I will hypothesise on a way of connecting Python programming and other subjects. That will show that programming is a way to get real work done, not something to learn for the sake of it.\n", 35 | "\n", 36 | "I do not have any direct connection to the classroom, so those among you who have are the ones who are going to tell me how my ideas sound.\n", 37 | "\n" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": { 43 | "slideshow": { 44 | "slide_type": "notes" 45 | } 46 | }, 47 | "source": [ 48 | "# How?\n", 49 | "\n", 50 | "We need some tools to help us on our quest. The Python community has some giant shoulders we can stand upon - Python 3, SymPy and matplotlib.\n", 51 | "\n", 52 | "We will see how we can use the Python programming language in three different capacities to explore Math.\n", 53 | "\n" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": { 59 | "slideshow": { 60 | "slide_type": "subslide" 61 | } 62 | }, 63 | "source": [ 64 | "# Scientific calculator\n", 65 | "\n", 66 | "Who uses Python as a calculator? I do! Specifically, I use Python 3 because of 1/2=0 messes up my monthly expenditure calculation. Besides the usual addition and subtraction, we have of course the [math](https://docs.python.org/3/library/math.html) module and more recently the [statistics](https://docs.python.org/3/library/statistics.html) module which makes Python a worthy scientific calculator.\n", 67 | "\n", 68 | "\n", 69 | "- `fabs()`, `abs()`, `sin()`, `cos()`, `gcd()`, `log()` and more (See [math](https://docs.python.org/3/library/math.html))\n", 70 | "\n", 71 | "- Descriptive statistics (See [statistics](https://docs.python.org/3/library/statistics.html#module-statistics))\n", 72 | "\n", 73 | "\n", 74 | "- Develop your own functions: unit conversion, finding correlation, .., anything really\n", 75 | "\n", 76 | "- Use PYTHONSTARTUP to extend the battery of readily available mathematical functions\n", 77 | "\n", 78 | "\n", 79 | "But then, there's more! You are not limited to the functions from those libraries, you can write your own custom functions and make them available whenever you start your Python interpreter. How?\n", 80 | "\n", 81 | "Use PYTHONSTARTUP!\n", 82 | "\n", 83 | "```python\n", 84 | "$ PYTHONSTARTUP=~/work/dmwp/oreilly-webcast-2016/startup_math.py idle3 -s\n", 85 | "```\n", 86 | "\n" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": { 92 | "slideshow": { 93 | "slide_type": "subslide" 94 | } 95 | }, 96 | "source": [ 97 | "\n", 98 | "#### Unit conversion functions\n", 99 | "\n", 100 | "```python\n", 101 | "\n", 102 | ">>> unit_conversion()\n", 103 | "1. Kilometers to Miles\n", 104 | "2. Miles to Kilometers\n", 105 | "3. Kilograms to Pounds\n", 106 | "4. Pounds to Kilograms\n", 107 | "5. Celsius to Fahrenheit\n", 108 | "6. Fahrenheit to Celsius\n", 109 | "Which conversion would you like to do? 6\n", 110 | "Enter temperature in fahrenheit: 98\n", 111 | "Temperature in celsius: 36.66666666666667\n", 112 | ">>> \n", 113 | "\n", 114 | "```" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": { 120 | "slideshow": { 121 | "slide_type": "subslide" 122 | } 123 | }, 124 | "source": [ 125 | "#### Finding linear correlation\n", 126 | "\n", 127 | "```python\n", 128 | ">>> \n", 129 | ">>> x = [1, 2, 3, 4]\n", 130 | ">>> y = [2, 4, 6.1, 7.9]\n", 131 | ">>> find_corr_x_y(x, y)\n", 132 | "0.9995411791453812\n", 133 | "\n", 134 | "```" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": { 140 | "slideshow": { 141 | "slide_type": "notes" 142 | } 143 | }, 144 | "source": [ 145 | "# Really awesome Calculator\n", 146 | "\n", 147 | "So, that was Python and it's standard libraries. When you bring in third party libraries to the mix, Python becomes a seriously fancy calculator.\n", 148 | "\n", 149 | "[SymPy](http://www.sympy.org/en/index.html) - a pure Python symbolic math library\n", 150 | "\n", 151 | "You can give it algebraic expressions to a function and a graph will be created for you.\n", 152 | "\n", 153 | "You can give an equation and out comes the solutions for that equation.\n", 154 | "\n", 155 | "We can even solve calculus problems.\n", 156 | "\n", 157 | "Let's see a few examples." 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": { 163 | "slideshow": { 164 | "slide_type": "notes" 165 | } 166 | }, 167 | "source": [ 168 | "I will pause for a moment now. We have seen how Python can be a super awesome calculator. What does that buy us? We have now been able to show that you can make computer programs literally do your homework. Write a program to do your work once and you will never have to make those lengthy calculations yourselves. Can we use Python to do more? \n", 169 | "\n", 170 | "Let's continue." 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": { 176 | "slideshow": { 177 | "slide_type": "slide" 178 | } 179 | }, 180 | "source": [ 181 | "

Can we do more than write smart calculators?

\n", 182 | "\n" 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": { 188 | "slideshow": { 189 | "slide_type": "slide" 190 | } 191 | }, 192 | "source": [ 193 | "\n", 194 | "# More than smart calculators\n", 195 | "\n", 196 | "Our tools\n", 197 | " \n", 198 | "- matplotlib\n", 199 | "\n", 200 | "- basemap\n", 201 | "\n", 202 | "- Interactive Jupyter Notebooks\n" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "slideshow": { 209 | "slide_type": "notes" 210 | } 211 | }, 212 | "source": [ 213 | "Python can be more than a super powerful calculator. We can use it to enhance the learning experience of other subjects. Next, I have three examples including a demo. \n", 214 | "\n", 215 | "First up, a video of a projectile motion. This program uses matplotlib's animation API to create a basic animation of a projectile motion - a fairly common subject introduced in introductory Physics. The program which is linked asks for the angle of projection and speed and then draws the trajectory of the projectile. Just by running the program multiple times, we can see how the trajectory changes. We don't have to go outside and start throwing balls..\n" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": { 221 | "slideshow": { 222 | "slide_type": "subslide" 223 | } 224 | }, 225 | "source": [ 226 | "\n", 227 | "##### Bringing Science to life\n", 228 | "\n", 229 | "*Animation of a Projectile motion* [(Python Source)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/py-files/projectile_animation.py)\n", 230 | "\n", 231 | "\n" 232 | ] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "metadata": { 237 | "slideshow": { 238 | "slide_type": "subslide" 239 | } 240 | }, 241 | "source": [ 242 | "##### Exploring Fractals in Nature\n", 243 | "\n", 244 | "Next, we will put Jupyter Notebook's interactive widgets to good effect by drawing a Barnsley Fern. Then, we will play with the Mandelbrot Set.\n", 245 | "\n", 246 | "\n", 247 | "*Interactively drawing a Barnsley Fern* [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Interactive%20Barnsley%20Fern.ipynb)\n", 248 | "\n", 249 | "*Playing with Mandelbrot Set*[(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Interactive%20Mandelbrot%20Set.ipynb)\n", 250 | "\n" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "slideshow": { 257 | "slide_type": "subslide" 258 | } 259 | }, 260 | "source": [ 261 | "\n", 262 | "##### The world is your graph paper\n", 263 | "\n", 264 | "Next, with the help of basemap, we can draw places on a world map like we would draw points on a graph paper.\n", 265 | "\n", 266 | "*Showing places on a digital map* [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Maps%20using%20Basemap%20-%20demo.ipynb)" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": { 272 | "slideshow": { 273 | "slide_type": "notes" 274 | } 275 | }, 276 | "source": [ 277 | "I know I would be excited if someone was showing me all these interesting ways to play with these things when I was learning about complex numbers, probability and geography!\n", 278 | "\n", 279 | "\n", 280 | "Okay, so that's great. We have successfully used Python to make the learning experience of young learners more fun and immediately applicable. Can we derive more benefit from doing that? Like something for the future? We all love doing things for the future, don't we?\n", 281 | "\n", 282 | "I think yes, i think if we teach young learners the things we have discussed today, it is a great base for someone wanting to go into data science or machine learning.\n", 283 | "\n", 284 | "Statistics and visualising data are two very key factors of data science.\n", 285 | "\n", 286 | "Differential calculus and specifically the gradient descent method is a simple but useful optimization method used in Machine Learning. Let's see a demo of using gradient descent to find the minimum value of a function.\n", 287 | "\n", 288 | "Now, let's apply gradient descent as an optimizer in a Linear Regression problem." 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": { 294 | "slideshow": { 295 | "slide_type": "slide" 296 | } 297 | }, 298 | "source": [ 299 | "# Great base for the future\n", 300 | "\n", 301 | "*Statistics and Graphing data* -> *Data Science*\n", 302 | "\n", 303 | "*Differential Calculus* -> *Machine learning*\n" 304 | ] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": { 309 | "slideshow": { 310 | "slide_type": "subslide" 311 | } 312 | }, 313 | "source": [ 314 | "### Application of differentiation\n", 315 | "\n", 316 | "Use gradient descent to find a function's minimum value [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Gradient%20Descent.ipynb)" 317 | ] 318 | }, 319 | { 320 | "cell_type": "markdown", 321 | "metadata": { 322 | "collapsed": true, 323 | "slideshow": { 324 | "slide_type": "subslide" 325 | } 326 | }, 327 | "source": [ 328 | "### Predict the college admission score based on high school math score\n", 329 | "\n", 330 | "Use gradient descent as the optimizer for single variable linear regression model [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Simple%20Linear%20Regression.ipynb)\n", 331 | "\n" 332 | ] 333 | }, 334 | { 335 | "cell_type": "markdown", 336 | "metadata": { 337 | "collapsed": true, 338 | "slideshow": { 339 | "slide_type": "subslide" 340 | } 341 | }, 342 | "source": [ 343 | "## Advanced libraries\n", 344 | "\n", 345 | "- [scipy](https://scipy.org)\n", 346 | "\n", 347 | "- [numpy](http://www.numpy.org/)\n", 348 | "\n", 349 | "- [scikit-learn](http://scikit-learn.org/stable/)\n", 350 | "\n", 351 | "- [pandas](http://pandas.pydata.org/)\n", 352 | "\n", 353 | "- [Statsmodels](http://statsmodels.sourceforge.net/)\n", 354 | "\n" 355 | ] 356 | }, 357 | { 358 | "cell_type": "markdown", 359 | "metadata": { 360 | "slideshow": { 361 | "slide_type": "notes" 362 | } 363 | }, 364 | "source": [ 365 | "And in the end, I would like to talk about my book \"Doing Math with Python\". My idea was attractive enough to get it published by No Starch Press which makes me hope that I am probably onto something. I discuss all of the topics I discuss today in my talk. In addition, I discuss sets, probability and random numbers and descriptive statistics.\n", 366 | "\n", 367 | "It's being translated into several non-English languages.\n", 368 | "\n", 369 | "The reviews/feedback so far has been really positive. I don't have any first hand involvement in teaching, so it's very appreciative of people to share their viewpoints with me." 370 | ] 371 | }, 372 | { 373 | "cell_type": "markdown", 374 | "metadata": { 375 | "slideshow": { 376 | "slide_type": "subslide" 377 | } 378 | }, 379 | "source": [ 380 | "#### Comments on \"Doing Math with Python\"\n", 381 | "\n", 382 | "\n", 383 | "> Saha does an excellent job providing a clear link between Python and upper-level math concepts, and demonstrates how Python can be transformed into a mathematical stage. This book deserves a spot on every geometry teacher’s bookshelf.\n" 384 | ] 385 | }, 386 | { 387 | "cell_type": "markdown", 388 | "metadata": { 389 | "slideshow": { 390 | "slide_type": "subslide" 391 | } 392 | }, 393 | "source": [ 394 | "\n", 395 | "> Outstanding guide to using Python to do maths. Working back through my undergrad maths using Python.\n" 396 | ] 397 | }, 398 | { 399 | "cell_type": "markdown", 400 | "metadata": { 401 | "slideshow": { 402 | "slide_type": "subslide" 403 | } 404 | }, 405 | "source": [ 406 | "\n", 407 | "> Saha does an excellent job providing a clear link between Python and upper-level math concepts, and demonstrates how Python can be transformed into a mathematical stage." 408 | ] 409 | }, 410 | { 411 | "cell_type": "markdown", 412 | "metadata": { 413 | "slideshow": { 414 | "slide_type": "fragment" 415 | } 416 | }, 417 | "source": [ 418 | "\n", 419 | "> This book is highly recommended for the high school or college student and anyone who is looking for a more natural way of programming math and scientific functions" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": { 425 | "slideshow": { 426 | "slide_type": "fragment" 427 | } 428 | }, 429 | "source": [ 430 | "> As a teacher I highly recommend this book as a way to work with someone in learning both math and programming\n" 431 | ] 432 | }, 433 | { 434 | "cell_type": "markdown", 435 | "metadata": { 436 | "slideshow": { 437 | "slide_type": "slide" 438 | } 439 | }, 440 | "source": [ 441 | "\n", 442 | "# Dialogue\n", 443 | "\n", 444 | "- [Doing Math with Python](http://doingmathwithpython.github.io/)\n", 445 | "\n", 446 | "- Twitter: @echorand\n", 447 | "\n", 448 | "- Email: amitsaha.in@gmail.com\n", 449 | " \n" 450 | ] 451 | } 452 | ], 453 | "metadata": { 454 | "kernelspec": { 455 | "display_name": "Python [Root]", 456 | "language": "python", 457 | "name": "Python [Root]" 458 | }, 459 | "language_info": { 460 | "codemirror_mode": { 461 | "name": "ipython", 462 | "version": 3 463 | }, 464 | "file_extension": ".py", 465 | "mimetype": "text/x-python", 466 | "name": "python", 467 | "nbconvert_exporter": "python", 468 | "pygments_lexer": "ipython3", 469 | "version": "3.5.2" 470 | } 471 | }, 472 | "nbformat": 4, 473 | "nbformat_minor": 0 474 | } 475 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Slides and demos for the talk at PyCon AU'2016 Education Seminar 2 | 3 | 4 | 5 | To play with the demos locally: 6 | 7 | - Download the [zip](https://github.com/doingmathwithpython/pycon-au-2016/archive/master.zip) archive 8 | - Install [Anaconda (Python 3)](http://doingmathwithpython.github.io/pages/software-installation.html) 9 | - Unzip the file downloaded above 10 | - From the command line, go the directory where the unzipped files are and start `jupyter-notebook` 11 | 12 | Alternatively, you can play with it on [![Binder](http://mybinder.org/badge.svg)](http://mybinder.org:/repo/doingmathwithpython/pycon-au-2016). 13 | -------------------------------------------------------------------------------- /custom.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-lines {font-size: 14pt;} 2 | .output {font-size: 14pt;} 3 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 1-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false, 8 | "slideshow": { 9 | "slide_type": "skip" 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 4, 20 | "metadata": { 21 | "collapsed": false, 22 | "slideshow": { 23 | "slide_type": "subslide" 24 | } 25 | }, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "Enter an expression in x to graph: x**2 + 2*x + 1\n" 32 | ] 33 | }, 34 | { 35 | "data": { 36 | "image/png": "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\nTqrk9a2v4f8AAAAASUVORK5CYII=\n", 37 | "text/plain": [ 38 | "" 39 | ] 40 | }, 41 | "metadata": {}, 42 | "output_type": "display_data" 43 | }, 44 | { 45 | "data": { 46 | "text/plain": [ 47 | "" 48 | ] 49 | }, 50 | "execution_count": 4, 51 | "metadata": {}, 52 | "output_type": "execute_result" 53 | } 54 | ], 55 | "source": [ 56 | "# Create graphs from algebraic expressions\n", 57 | "\n", 58 | "from sympy import Symbol, plot\n", 59 | "\n", 60 | "x = Symbol('x')\n", 61 | "\n", 62 | "expr = input('Enter an expression in x to graph: ')\n", 63 | "\n", 64 | "plot(expr)\n" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": null, 70 | "metadata": { 71 | "collapsed": true 72 | }, 73 | "outputs": [], 74 | "source": [] 75 | } 76 | ], 77 | "metadata": { 78 | "anaconda-cloud": {}, 79 | "kernelspec": { 80 | "display_name": "Python [Root]", 81 | "language": "python", 82 | "name": "Python [Root]" 83 | }, 84 | "language_info": { 85 | "codemirror_mode": { 86 | "name": "ipython", 87 | "version": 3 88 | }, 89 | "file_extension": ".py", 90 | "mimetype": "text/x-python", 91 | "name": "python", 92 | "nbconvert_exporter": "python", 93 | "pygments_lexer": "ipython3", 94 | "version": "3.5.2" 95 | } 96 | }, 97 | "nbformat": 4, 98 | "nbformat_minor": 0 99 | } 100 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 2-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "# Solve equations\n", 12 | "\n", 13 | "from sympy import solve, Symbol\n", 14 | "\n", 15 | "x = Symbol('x')\n", 16 | "\n", 17 | "solve(x**2 + 1)\n" 18 | ] 19 | } 20 | ], 21 | "metadata": { 22 | "kernelspec": { 23 | "display_name": "Python 3", 24 | "language": "python", 25 | "name": "python3" 26 | }, 27 | "language_info": { 28 | "codemirror_mode": { 29 | "name": "ipython", 30 | "version": 3 31 | }, 32 | "file_extension": ".py", 33 | "mimetype": "text/x-python", 34 | "name": "python", 35 | "nbconvert_exporter": "python", 36 | "pygments_lexer": "ipython3", 37 | "version": "3.5.1" 38 | } 39 | }, 40 | "nbformat": 4, 41 | "nbformat_minor": 0 42 | } 43 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 3-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Enter the inequality to solve: sin(x) + 1 <= 0\n", 15 | "{-pi/2, 3*pi/2}\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "# Solve inequalities\n", 21 | "\n", 22 | "'''\n", 23 | "isolve.py\n", 24 | "\n", 25 | "Single variable inequality solver\n", 26 | "'''\n", 27 | "\n", 28 | "from sympy import Symbol, sympify, SympifyError\n", 29 | "from sympy import solve_poly_inequality, solve_rational_inequalities\n", 30 | "from sympy import solve_univariate_inequality, Poly\n", 31 | "from sympy.core.relational import Relational, Equality\n", 32 | "\n", 33 | "def isolve(ineq_obj):\n", 34 | " x = Symbol('x')\n", 35 | "\n", 36 | " expr = ineq_obj.lhs\n", 37 | " \n", 38 | " rel = ineq_obj.rel_op\n", 39 | " \n", 40 | " if expr.is_polynomial():\n", 41 | " p = Poly(expr, x)\n", 42 | " return solve_poly_inequality(p, rel)\n", 43 | " elif expr.is_rational_function():\n", 44 | " p1, p2 = expr.as_numer_denom()\n", 45 | " num = Poly(p1)\n", 46 | " denom = Poly(p2)\n", 47 | " return solve_rational_inequalities([[((num, denom), rel)]])\n", 48 | " else:\n", 49 | " return solve_univariate_inequality(ineq_obj , x, relational=False)\n", 50 | "\n", 51 | "ineq = input('Enter the inequality to solve: ')\n", 52 | "try:\n", 53 | " ineq_obj = sympify(ineq)\n", 54 | "except SympifyError:\n", 55 | " print('Invalid inequality')\n", 56 | "else:\n", 57 | " # We check if the input expression is an inequality here\n", 58 | " if isinstance(ineq_obj, Relational) and not isinstance(ineq_obj, Equality):\n", 59 | " print(isolve(ineq_obj))\n", 60 | " else:\n", 61 | " print('Invalid inequality')" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": null, 67 | "metadata": { 68 | "collapsed": true 69 | }, 70 | "outputs": [], 71 | "source": [] 72 | } 73 | ], 74 | "metadata": { 75 | "kernelspec": { 76 | "display_name": "Python [Root]", 77 | "language": "python", 78 | "name": "Python [Root]" 79 | }, 80 | "language_info": { 81 | "codemirror_mode": { 82 | "name": "ipython", 83 | "version": 3 84 | }, 85 | "file_extension": ".py", 86 | "mimetype": "text/x-python", 87 | "name": "python", 88 | "nbconvert_exporter": "python", 89 | "pygments_lexer": "ipython3", 90 | "version": "3.5.2" 91 | } 92 | }, 93 | "nbformat": 4, 94 | "nbformat_minor": 0 95 | } 96 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 4-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHoAAAAiCAYAAACQhM1+AAAABHNCSVQICAgIfAhkiAAABexJREFU\neJzt2nuM3FUVwPFPu1se3WLBBZSnpYKCFqxSHm1JpA2VdxCjkSoJKxIIKgaFPyC8Gx6pBEgLIRES\n5BECIUQehYCRaBUoD8H4QEIQdHlEYyOoVI0ssMsf5/fL/ObOb3bntzPb3cX5JpOZOXPv+Z079/7O\nOffcH126ZHwRj+MFnFWQH4o38f1JsKlLRWa20OZefB27YZuCfCdsh09OgF1VmDXJ1+80X2qj7yX4\nbLsGDOLiRLYnettV3AZfwcmTeP1Os7e4scbLVvgpPt6OEYMaJ3oyWY61FfscamqHm1X4aps69hKh\ntqcobMV1l7GlcNmHYGF7do2LuViNcyr2myrhphnH4P42dfwRr+Fr41UwqHZHL8BPMIKbC22Ox+/x\nd1yAFbhc3HlPYgm2xvn4AdbhVsypaMtqnFl5BMFkh5tmHIjbOqTrYDw/3s6DGl33M+onGvqxCQ/i\nmwX5WrwiJnjHTNYrFsVlFezoE+63v0Kf6cAaHNkhXT14C/vmgvG67px/l8jeyF7zcVNB/hx2x2+x\nMZO9ixexqMI1jxaL7o2Ktk52uBmNHiwTiVQneA8bcEQumEgX9hvh2nOGsvdnk3ZDYhJaZYUYRBnH\nYzH+kencHjPwbZGkXIUv4BYMZO1Xidi9RoSXZcJrHCDqBk8U9Pdk13+4INsfJ4qxzsMpOA3bYhdc\nJP7nd/FyE7uX49GsTUor+sv0/sE4F/SgRte9XqPrztum8gE1Y1Md6yvY8YwYaMo++FkiO6HEjjTc\njBZqBpO+K9XnE3vhWrGYZHpfFLnIUgyrFZm+UWJzzo+y9ilV9KecLxYu2nfdk8E8/LNEvp+I/cWi\nzjqNLj4NN6OFmo9hh4Jsp6T/90Tmn3uuPuFNNuBVXK22qF5SXszYKpOXeakq+lPeFLsTTM+Jnqt8\noh8VE/26yF7PwGzNV3xKs1DTV3gfUc9q/KfwfQkeyT6/hrPVFtpz+FzJdY/GQyW6q+pPGVbYS1eZ\n6F6NMX1WiayZfFbyXpRXKWOOKLf7LzgId4rCyFrxZ6xsUe/bY/y+rXDxRV4pfN4HO+PnTfpvUttt\nFFmJ25v0qaI/pR//arEtOE4kUCNidf0Cn8evMtmQiI19SdshPCbc3V3ClYyIuHepiDEbxMobxtMi\nkRqLjaL2nrKf+CNydhNJ11vqk731Gt3dYIlsQH1OMdvoe/fviMUyuyCbX/jcj1OTPnPFuFthLP0p\nV4v/fdrylHDLKQMaS5s9ws1/pCBbb3wTLdG/tagJ5HvV+8Tiz5mJ6wvfl4vFWORkzat7VfWnPIBz\ni42nG4/hU01+O1t98rSryFL/VpA1CyuthJqNInmCo7LrfVocRsxX7/7PU1/p2gO/S65xAu4oH0pl\n/UVminrBI01+nxasEHvElBPF4K8SlbZLcZ1w4ZSHm1ZCzZ9xYaZjC7UixPYiS78ye/WJUPFDsSVa\nUbDtExpPlD4qwmAzquhPOUDUvKcsO4zdxJYi09xlgm2ZaM7EtyZI922iSDRlGWix3SoRv6Yzj4u7\nttPkIWJKP5Ax0GK7OWJf+uGJM2VC2VNU4jrNLFGe3ey1/EViP3sSbhQDHI2BCroX48emZ0J5ocgp\nOs0qkd03MKNM2CG2EAnBwfirSBCuz96LLFBLcBaJWjRxArNG7LGbcaTISK/pjMmbjXWiUFJ2+tcO\n+eHJhLEYX05kaXY8Qwxsj1H0DHTWrC45xb3jUnFa8hmx5ejD4WIv96cx9DyFG4Qrze/AeerrsCOi\nIL9AbFm6bEby+PYh4QJvFpWjM8R+bRP+24KeYbFnvUK4bCKjTPv+T/3pUpfNRH5HD6lVWRbjnuzz\nSaJGe43W4vkiUQQ4TBTU0z5zxKNDzbhnlN+6dJhn1RKmuaM1TFgoMuz8AGG5eGwop1fc0VP1Ccz/\nC44VBft5eEdts/3dFvv3iHJdMeb3iqPD3bPvy/Drdg3tMj7yg+mlonjej1+KR08X4m71B9/NWCIS\nr2LRflgc5p+e6T1OlP2qPtTXpUuXLl26dOnygeV9jaBOz4Z0uE0AAAAASUVORK5CYII=\n", 13 | "text/latex": [ 14 | "$$\\lim_{x \\to 0^+}\\left(\\frac{1}{x} \\sin{\\left (x \\right )}\\right)$$" 15 | ], 16 | "text/plain": [ 17 | " sin(x)\n", 18 | " lim ──────\n", 19 | "x─→0⁺ x " 20 | ] 21 | }, 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Limits\n", 29 | "\n", 30 | "from sympy import Symbol, Limit, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "init_printing()\n", 35 | "\n", 36 | "Limit(sin(x)/x, x, 0)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 3, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAASCAYAAACNdSR1AAAABHNCSVQICAgIfAhkiAAAAF5JREFU\nKJFjYKAC4GJgYLhEjEJTBgaG0wwMDP/RJViQ2JoMDAw9DAwMrxkYGP6S4owF2ExmIsWEUcVUV8wB\npblwaRRjYGDYycDAcIUBEnv/GSBRv5+BgSGaFBfQGAAA/84M5lOscPUAAAAASUVORK5CYII=\n", 49 | "text/latex": [ 50 | "$$1$$" 51 | ], 52 | "text/plain": [ 53 | "1" 54 | ] 55 | }, 56 | "execution_count": 3, 57 | "metadata": {}, 58 | "output_type": "execute_result" 59 | } 60 | ], 61 | "source": [ 62 | "Limit(sin(x)/x, x, 0).doit()" 63 | ] 64 | } 65 | ], 66 | "metadata": { 67 | "kernelspec": { 68 | "display_name": "Python 3", 69 | "language": "python", 70 | "name": "python3" 71 | }, 72 | "language_info": { 73 | "codemirror_mode": { 74 | "name": "ipython", 75 | "version": 3 76 | }, 77 | "file_extension": ".py", 78 | "mimetype": "text/x-python", 79 | "name": "python", 80 | "nbconvert_exporter": "python", 81 | "pygments_lexer": "ipython3", 82 | "version": "3.5.2" 83 | } 84 | }, 85 | "nbformat": 4, 86 | "nbformat_minor": 0 87 | } 88 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 5-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGIAAAAeCAYAAADXRcu0AAAABHNCSVQICAgIfAhkiAAABKdJREFU\naIHt2XuIFVUcwPGPmu3aWlpaZPYwX2WRlWKlBplhZBJSFikZPUkoBDP/CAojK8jCIusfIyqR6PGH\nBBIFqRFqD8qSsKAXVkZR4KO0oFC3P34z7Oz1zjpz9+7m4v3C5c6cOb/zOzPnnN/jHBr0OBbgT4z4\nvztypDMCP9Qg17fO/TgcuK5GuYdxYWeVz8fzJWVuwO2dVXyYcTberFG2Ge8qaVWOwiO4C/dgE64v\nIT8Vy8soxBTsxMKSct3JEtzYCflR4lv2KSrwgvALcAL2YWBB2QH4BMeU6CDMQStWlJTrTj5Dv062\n8RpuLlJxLPZmFE7FhyUULdU2iGUZKVbj4chFWFWHdi7BV0UqLsQ7mfvHhKM5voBsizAvg8r2rgfw\nDKbXoZ0+IgI9Ly3onVNxF35NrvtjFtbhpgJKZojoakfJzjXhLFyKC0rKdgd9cLlwtp1lPz7AVWlB\nngl4FZOFze6HV4Qj3VxAybRESTWuxUQx0E0YjF4iGBiFZbgSK3FrUn8JhojZ+JH4GC2YgPscbDL7\nJH1IV/R4zBW+ZxjuxDzh74biIfEd9uH7Dt5rKjYk9SopoqOy7S918YT7NOlEJWOwvqJsNl6uIp8t\nG4Q9eAt3ZMqXq57XzBGrmBjcZ8VgS9r9BpPERDsgBhNuq9JWlpcSmUrK6MjyoJhYyDdNnWEYdlcp\nH4uTcGymbI2DTdjeivsdyW84XsyUb8UZOLGi/pBMG/fifjFTiZW0S6zYn/CUtkH/Tn6y1Zw8q7bS\ny+jIslNEl+iagRig+kBsEAPxs4g85ovwttpsqcYWbS8L/yb/LZmyloo6S/FX5n4S1ibX27FI20TY\ninE5umfg7Yq2a9GR5YBMLtEVA9Ga0+4vuFjE0FOEadkuTEkR/ilQZ6AwYyk/Zq7H4BS8lyO7R0yU\naswRfrIaZXRkGYQ/0pv0g7XW4ZeyWySAlYwVH3MeTsPpeF0kb00FOl6EXdr8QyVXiFWUNS/DM9cD\nVJ+5A0RftxbQfygdWQZhW3qTDkSvOvxStqk+EOOEc07ZLvahDiiesR+Kv7W9Uz88oS1Wn4YvkjqS\neosysufLOM8Ms7A6R19ZHVlG43OZivVmI87JebZIe+d6qogwfsuU9XVwWJ1Xlv1P+V0416sTfeeK\njbrh2pu3B7TPks8UH7GS2SKcr0ZZHSm9Rb60tsqzg6j1/GGaiJErmZt0bJnI1B/Fc8JMwWVif6pV\nLO/1mClyl7Rso4iK3hBRR6tYgYszeo4WidJgEWU9mfxaRH6yQoSb0zIyo3Pe82S838G7ltGRZQK+\n7aDddtR6/tAkbO3QGmQPNxbg7i5od5VIYgtRy/lDyhJhO3s6m8SsryepCcw9MOvo/GGy2HJ4WpiY\necKB5UUE/UWUUc1p9xRGimy+nvQVWy8dbm3knT8cp21rYSY+Tq5XChuax0QxWF0REHQHi8WkqydL\nxJ5VLh2dPzQLBwiPi3S+KNPFFkBPZI38nKRWDnnOUvT8YbPw+GT2SRp0ntRsdHT+cI0YqGFi5WxJ\n6t3Sbb08Akgz4mYR068T5mlo8myz2H8Zj6+TZ/tF5rha+0SsQYMGDRo0aNAF/Afddw8rAYd0/wAA\nAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\frac{d}{d x}\\left(\\frac{1}{x} \\sin{\\left (x \\right )}\\right)$$" 15 | ], 16 | "text/plain": [ 17 | "d ⎛sin(x)⎞\n", 18 | "──⎜──────⎟\n", 19 | "dx⎝ x ⎠" 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Derivative\n", 29 | "\n", 30 | "from sympy import Symbol, Derivative, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "init_printing()\n", 35 | "\n", 36 | "Derivative(sin(x)/x, x)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJYAAAAhCAYAAAA7zlIvAAAABHNCSVQICAgIfAhkiAAABR1JREFU\neJzt2meIHVUUwPHfGqPRtUWNWGMMsWGJGo0lSiyxK6JBbEEswaCSEDWgoMQQsK2KFUEQYvSDWBBR\nREFQwRgLCVaQCIpiIxJrQOzrh3PfvnmTebvvrbtO9jl/GKbcuWfOnHPn3nPPHSoqKjqOzfEUxpet\nSEVrnFW2Ai0wG4vQiwmlalLREnvhmbKVaIOObFgblK3AMHA+HitbiZI4Gt/j6pL16MiGdRqeLVuJ\nktgBY7Fn2Yp0GlPxaNlKtMlQD4WTsOEQyqvAPTi5bCXapCNjrE5iFN438r7WoWpYG4sh8EgcMATy\n/hV5JxyAhfgRv4oY7CGsSOWHYi5Wp7pb4Wasysg4E4fjB/Gy26ILV6byUTgeL2bqTMEsdSPPxpwk\nfyfcmJ73Jz5p8i7H4rV0T55W5DeTO1xcIBoB3IpluH+AOv3ZdnfciROwFBdl6iwW8dc9eBPHoBuH\n4Bq8kXlG3j+t2m5PTfxzBH4WM4saj+DzdHy6aEDjMuV74zMcmDl/OSf3XDycOT8Pm2XOd8d9wkDS\nvR8nfabhb/HycHFe6QxL0v152pG/PtOKbYlOIH9tG6zF87g0c/1e4b8sWf+0a7t1/NMlGs3zuet3\n4Yn0oDWYn68ovoJ30/E5+FBklGt0iy+pRn4q/EC6p8aTeCsd74I7hGHgKPVGnGVM0qGroKwd+esz\nrdgWXrVuwyIa0EcabXSZ6ImynUXWP+3abh3/HJYesLhAIeKlenFSQdkVqWwKdsS3+EnMzubmlO7G\nVbn6u+bOv8JNTfQYq/GLqzETtzSp0478PJPxjmi0rWxLWpQ7GAaybY1XNW9Y+fzeRRpjvLx/2rVd\nn39qMVZN8JdNKkxM+6L45Y+0n4SVIg67DqeIsfl20UU+Jsbltbn6n2eO9xYGfKWJHmuxXcH188Ty\nSBHtyM/znuIesgy+1r9tW+G3Acrz/mnXdn3+qSVIv077sU0qfJP2RU6tdYWrsb9Qfo7oKsfjcTwo\ngs0fNMZXeY7D71ieuTYxc7wlvsvV2TI958N+5LYqf7joHYJtINsOBf35pxXb9fmn1rCWi97q2AKB\nZ+Il/KI4ozsl1V2Gg0RAWeMLXCKCvK2SjGy2fxP0YL90frxIGfySzjfAgsz9k8WsJstMPF2g12Dk\nDxddLWyjMA/Xpi1fPpBth4KsfwZjuz7/1IT8mZScjjMyN45LAr8Sgd6lYtpaYzcxdb1QfZhcoHHs\n31nMJFan829FsE106Quwj1g8nqixu75eYyZ9t/RyWc7VfChoV36ZnCoWz3vEkDel4J6BbAujFefy\niq6Pzu2p+2cwtuvzT34WNVXEKj+K4e833CYCRiLqvzyV/4VNcTc+SOWzRMC3tciD9Yqv6TbxhcFG\nomd8UeRhetSHt0ViJvKr6HafFb0l7JGemc2TbC+Gg+mKaUd+2cwXtulJ23KNf2kMZNvpYpZ2sIh7\nl4kU0QyRmzwoXX8bZ4vZ/AwR/nwmJh6L1f2zQnu2K/LPiGW+mJV2AhurpxJeEIFyRUm8LnqlTmKa\nmPlVlMQk6yZ0Rzpb4Iaylfi/s1DEHZ3EHBFIjxbxT0UJPKf/nNhI4xyxVrtG5JP2LVedf0fR2lrF\n8DBNLOpOFisU3ThRTOk/LVGvihHMFuprnGeoL+QuFSmTiopBMUbkh4h/r6pZX8WQs1L8YEesrVVU\nDJrTxX9OE0T2u7aEMq8shYabKnj/b7hYrP2tEou7f4nF3Kc1rvNVVFRUVFRUVFRUNOUfjXRPTj1R\n2RMAAAAASUVORK5CYII=\n", 49 | "text/latex": [ 50 | "$$\\frac{1}{x} \\cos{\\left (x \\right )} - \\frac{1}{x^{2}} \\sin{\\left (x \\right )}$$" 51 | ], 52 | "text/plain": [ 53 | "cos(x) sin(x)\n", 54 | "────── - ──────\n", 55 | " x 2 \n", 56 | " x " 57 | ] 58 | }, 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "output_type": "execute_result" 62 | } 63 | ], 64 | "source": [ 65 | "Derivative(sin(x)/x, x).doit()" 66 | ] 67 | } 68 | ], 69 | "metadata": { 70 | "kernelspec": { 71 | "display_name": "Python 3", 72 | "language": "python", 73 | "name": "python3" 74 | }, 75 | "language_info": { 76 | "codemirror_mode": { 77 | "name": "ipython", 78 | "version": 3 79 | }, 80 | "file_extension": ".py", 81 | "mimetype": "text/x-python", 82 | "name": "python", 83 | "nbconvert_exporter": "python", 84 | "pygments_lexer": "ipython3", 85 | "version": "3.5.2" 86 | } 87 | }, 88 | "nbformat": 4, 89 | "nbformat_minor": 0 90 | } 91 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 6-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFsAAAAxCAYAAAC1WdWlAAAABHNCSVQICAgIfAhkiAAABMVJREFU\neJzt21uMXVMcx/EP05YxxKAIWi2patNQVSXa0AsVPEg8CJIGVdHELaF9kEiQJh406k7iqURERTwQ\nRAgm0qBSl6qSoFrqEnVty6i21MN/nczumTMzex9nejIz+/uy9ll7r7V++3/W+q//+e99KBlQ3IRf\n8QFObLKWQc1s7MJ0fIGVzZUzuHkPL6MV67GiuXIGL2dgN65stpChwMPC2Ec2W8hQ4Busa7aIgcS+\ndbY7AaOVG2Ih6jX2nFSuapSQoUC9xp6dyvcbJaSkZ37AdgxvtpDBzngRhaxutpCBRj1u5OxUftRI\nIUOB/2PsjxspZChQj7HPTOXaRgop6c7hwl/vTsclBSg6syuzejN+apCGWSJFe0uD+utvlokM51Zc\nUKRhUWNPT2UjXchROMTAyYUvwn1ow7v9OVCHcCH3NrjfcRjW4D77k+X4sD8HaMEfwthX9edAA4AN\nYnYXoshsmiCWDqwpOlAP7IexYrP9w8CI3ccIzR1FGxYx9rRU7sKnmIp5YqaPxTVYiHYcgzvE05uL\nxcb6mzDuSOyD60X2cBnOwxNixVyMJcKXPyD84mzxRU8TPvOdKm0tmItX0uc82oale1nfx33PwXX4\nKmlYh3/xVuaavLbIzSOpszXCSA8Jo8Hj+FxsoDOSmEWYiDeq+rksXZ9ldVXdYdiGl7AgU/8gNtbQ\ndjkOTMd5tcH8Gn1lWYCfhQGJCbBNPNyuUGS83KwSxl6OR3W5FHhWV7p1NO4RBrsUn+CgzLVtYjZn\n6dD9C9iIzzI3AdeqHeNnw8a82uAsTFGbydgpZmyWb+0ZIBQZLxct6BQ3eoPwW1m+w1012h0tYvIt\neBI3qv1jqENtYz9dVXeVrqVaoQ03Zz7n1UaEnAt6OPeicH3ZzObYNP5F9YyXN86eIJ6gE0v+68y5\nicKob9Zo9714MLxC/Hh5EJvEss/D3zmuaRdLu0JebVK7I3ro83y8KmZ3hVm6++vc4+U19imp3Kl7\nxHAOduDtTN3xqTxZGGyhWFLH4hk8JjbLRvCbLn9dTW/a4GD8UqPdOLGaqzfimWLP+r2qn1zj5TX2\n5FSuFT50KU5KdXNFBrAz0+fidHyq2BArbMLVYna05xy7Lzp13UdrAW3EfdX6Fbglld9k6vYTxqzM\n2luKjpfX2JXOVuHC1MEk4V6Ot+dyv0345wqL7emnR4nd+sdM3XDdw9Ce6rJlhc3Yvw5tx6mdKv5S\nrODKrGwRr260Je1HiNxQofGyO31vfCvixfli41iqa/ndKXbk7WIJvYDX0rl5YgM5NJ3fLWb03WKW\nzxS79WnCRa0UsfXtYlXsFG9dXZLqzxWb2kYRFS1J44wQ8fDqAtrG4x89x7/jcL9IOg1L/UwRMfQG\n3JruJ+94uWjXlVadWKRhSXFmCEP/Iv9KKKlBHp89KZUrhdFL6qSIsd/q9aqSPslj7ErYV75qthf4\nFX8qX8jpd8YIP12duSupg77cyNRU9pRbKClAX8Y+PZWv97eQkkh9bjWwHsYOSFrxF55rtpDBQm9u\nZI5I7jy/l7QMKR4QGbAR6fNTIld8QNMUDWLWiQxYq0j0/y2ybyUNoiVzPEUk0teK1wp24AqRhixp\nMCPFM7dO8a/dUc2VU1JSUlJSxX82PB3Q/EZSIQAAAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\int x \\sin{\\left (x \\right )}\\, dx$$" 15 | ], 16 | "text/plain": [ 17 | "⌠ \n", 18 | "⎮ x⋅sin(x) dx\n", 19 | "⌡ " 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Indefinite integral of x*sin(x)\n", 29 | "\n", 30 | "from sympy import Symbol, Integral, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "# This initializes the SymPy printing system\n", 35 | "init_printing()\n", 36 | "\n", 37 | "Integral(x*sin(x))" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": { 44 | "collapsed": false 45 | }, 46 | "outputs": [ 47 | { 48 | "data": { 49 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAATCAYAAACgLP7RAAAABHNCSVQICAgIfAhkiAAAA8RJREFU\naIHt2VuIVlUUB/DfpGblRGM6kt1MyUqii073CLtoRBDhQ2ggMakZFT1EPSSBxUCBUdEFiihyrIfo\nsSIQAhlIzCIqLIqiYMpuY5h2QRyt7GHtj858c+a7zJzTyPT94eOcs9faa//XYp219tkfLbTQICaN\nN4EW6uJKfIiDeHc8iRwxnotPQEwpweZsTMeZJdhuYRzxAk4qwe7pmFyC3aYw7gQmGKYop7p8VYLN\nptFKlsMbU3EaOvEHPh5PMkUmSxdW4pBwcA1uR4cozQ/i66R7PtZjL/aLvdOL+CBj72LcjYHEswOP\n4IuMzjJcij0isDPRhruSfBKWYnOTPCfjzwzfMlHLh/l4HNdiE7qTfo/YyzyF7bgK03Ah7jV0I3zY\nxWA+nhFOQi++xGW4HH8nJ6Sx38Quv4KX8U3m+QaRFJ2ZsQXox8LM85YqHivS2hXcjPZR8rx1uJt1\n0SuC3yga8YF4ibJjM/A73sLqzPjTIkZZFBaDor6G7sH9IlOJLN+DbfgWTyRSbdiId9CXmb8b76X7\n9qTzHH7O6HyO15MMzsUsHJvReTPZqmC2KN/N8iT2CQuVi0Z8YKgPknw35uGlzPinmGPoS1ZKDM7D\nR6IvNvLbmJk7p8rW93g4Z41LEsmePAIJy5POdTmyO5OsCydiF37FK6JlZYM0TQQmi0Z5Ep+rq0eQ\nbZIfk1/w2Qiyrhw79XyooM/watOPV6vGuv3bWig3BoVggSC8JEe2IsnW1pi/rsb825JseXqei+ex\nM43vF2WX6L1rRsmT6NnraszPQ6/m2hC1faigT36yVI91G5oshcagjEO5a3BAlLUK5qXrD+k6vcb8\nH9N1Vo5sRroOiBI+KDZmp+BUvCYCP1WU1vYcG43whOMMbwdFo54PY0WhMSgiWY7GozgnPS/FDuzL\nrHFfut+G73B1jp1lOEH07H3yTyy70vytWCQqVQU7sUps0DqSjax/zfAk2vL2HA5Fop4PY0WhMSgi\nWa5PC5yNs0RmDmbkD4h+THyKrcJi3JjR6UzEfxKZvFb0ytkZnbniE/GWZEdaN9vjTxY7+4H0vAtH\njYJnZb0dNfwuCvV8IA76qo85RhrLXikwBm3GjpkiWyvl6iE8K3rvAbyBt6vmXJT09oq2M4gNYqNX\nwRW4I+n8hWPwJD5J8pVis3Z8WuuQeBs3iDcUjhRVbHOTPM9IazZ7xtCb7PY3qF/Ph8V4DBeIPxK3\nirOV9aIqHcT7uCmNLxEtvl98gPT472PQQoPo1fwGt4X/KRYp57+hFlpooYUJin8A+iwov09eSSAA\nAAAASUVORK5CYII=\n", 50 | "text/latex": [ 51 | "$$- x \\cos{\\left (x \\right )} + \\sin{\\left (x \\right )}$$" 52 | ], 53 | "text/plain": [ 54 | "-x⋅cos(x) + sin(x)" 55 | ] 56 | }, 57 | "execution_count": 2, 58 | "metadata": {}, 59 | "output_type": "execute_result" 60 | } 61 | ], 62 | "source": [ 63 | "Integral(x*sin(x)).doit()" 64 | ] 65 | } 66 | ], 67 | "metadata": { 68 | "kernelspec": { 69 | "display_name": "Python 3", 70 | "language": "python", 71 | "name": "python3" 72 | }, 73 | "language_info": { 74 | "codemirror_mode": { 75 | "name": "ipython", 76 | "version": 3 77 | }, 78 | "file_extension": ".py", 79 | "mimetype": "text/x-python", 80 | "name": "python", 81 | "nbconvert_exporter": "python", 82 | "pygments_lexer": "ipython3", 83 | "version": "3.5.2" 84 | } 85 | }, 86 | "nbformat": 4, 87 | "nbformat_minor": 0 88 | } 89 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Awesome Calculator - 7-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "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\nxX/2NkXO0A8XVAAAAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\int_{0}^{2} x \\sin{\\left (x \\right )}\\, dx$$" 15 | ], 16 | "text/plain": [ 17 | "2 \n", 18 | "⌠ \n", 19 | "⎮ x⋅sin(x) dx\n", 20 | "⌡ \n", 21 | "0 " 22 | ] 23 | }, 24 | "execution_count": 1, 25 | "metadata": {}, 26 | "output_type": "execute_result" 27 | } 28 | ], 29 | "source": [ 30 | "# Definite integral of x*sin(x), 0<=x<=2\n", 31 | "\n", 32 | "from sympy import Symbol, Integral, sin, init_printing\n", 33 | "\n", 34 | "x = Symbol('x')\n", 35 | "\n", 36 | "init_printing()\n", 37 | "\n", 38 | "Integral(x*sin(x), (x, 0, 2))" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": { 45 | "collapsed": false 46 | }, 47 | "outputs": [ 48 | { 49 | "data": { 50 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI0AAAATCAYAAACtMo6WAAAABHNCSVQICAgIfAhkiAAABDBJREFU\naIHt2WuoVUUUwPGfptxSIyPTHvZQrIjITElLtIdlFFHhh9JAypKsiIqyL1FJT6MP0pMe9LpmREZv\n6flBpMQeJgUFZV+yjMrMipKwqOzD2ps7bo/n7nPPPt4bnT9c9pk1s2fWrDuz1prZtGnTi0zEC3gd\nn+Ax7N+rGgUDcXBS7k7PfXHZzlKuJCfiJ1zTZD99yhbj8RaGZuUheBs/FJTc2eyC6zEoK5fV83Sc\n28MxB/bwvXqch614uIk+esMWdXkVYwqyo8VEn2nFgCW5HGOTciN6PoddezDmI1rjYcdgQBPv94Yt\n6rIZX2N4Qf4zfqx6sJLshqUFWSN6XqVnO6xT73rXWlRqi/4VKfUlRmBwQf6HULg3mI7VBVkjer6D\n01qjWkN04DBMwbge9lGpLZpxdynHYnd8n8j2y5RaUWg7DgvwC7aIhfsoPkzaTMIV2JDpOBQLsTZp\nMwPHiZ3RgWHoJ9wwnCySvJ7q+Q2OqDXZFlBvLodgEU7FYszJ2t8iEtV78B5OEgvgGMzHu0n//xlb\nLMTfmJzIJuNXcRrIeRJfJeUzxeLYO5EdjnUi5ubl5YXxZonQkPO8chOtpSeR0H5R4v0inRoLT2Xm\nQmyqVLYXfhO5ydxEfq+wVUqltqgqPBUZLTzFHViVyfrhCeHqViRtN+H97PeQrM2D2Ji0+QwvZ3VE\nQjdc7JScZVlfOUOEq21Uz5xBYoG3mjJzIXKQlE3Z32g8nsg/xUG23XSV2iINT0eJldyvm85zPsKF\nNeQdeFqcIm5I5JNwqO0TsquT32eIHfR5jX7X4kpMEAtvuHCbr+ADkfHPT9pvxJ519N+RnjnDsv53\nxGJhsyIHivuPP2vUzcWagqzMXOrxsTjx5OTjDta18Vpti6ZZIuJtkVlicvPqvHtd1uaUGnUXZ3Uz\ns/IocW+xPpNvEfcZOTeK2N+onjkzxamhUTo1fnrqbi6Ed+4syNbVkM3J+kh1qNQWVYenm0TsW5DI\nzs+e32bPeiv+u+xZPAYSHohIjscKd3sJDhC7e6kwfEfW7g1M7YGeOdPwUh1dq6LMXJqlUltUuWhm\nZ/3dWpBPyZ6rhIubVuPdGdhHxPLfxRGzyITs/ZXiNnNWUrceF+EfXTecqzHS9je03elJnCI22zZB\nbxVl5tIsldqiqiP38bgLb+KpRD5AV7z9SxhjGc4WiS2RsE3Hi1l5Hu7EQ7o8zyhxpDwn6weuFW41\nj9sjxY7ZkIx/Ny4QR/qyevbHpbi5xLyrosxcBtr+/7UjWfrM6XO22JQNVOuvuIon4jWReC0Sx7w9\nCm2mZvUP4D7xIe3IpH62+I6yCLfjNtwv3HuRs3QdN8voOUL9ENodnRrLabqbywnCU2wVSe5ysenW\nJLKV4s7mWfFhc6u4vEtDDjvfFm1K0qnvfUZo08cZrzVfutu0adPmf8S/B5Y7C3BCsQYAAAAASUVO\nRK5CYII=\n", 51 | "text/latex": [ 52 | "$$- 2 \\cos{\\left (2 \\right )} + \\sin{\\left (2 \\right )}$$" 53 | ], 54 | "text/plain": [ 55 | "-2⋅cos(2) + sin(2)" 56 | ] 57 | }, 58 | "execution_count": 2, 59 | "metadata": {}, 60 | "output_type": "execute_result" 61 | } 62 | ], 63 | "source": [ 64 | "Integral(x*sin(x), (x, 0, 2)).doit()" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": { 71 | "collapsed": false 72 | }, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKEAAAASCAYAAAAzD75tAAAABHNCSVQICAgIfAhkiAAABDdJREFU\naIHt2luIVVUYB/Bf5lheshA1CcPMzHoppTJC6qUg6qHEhxAS6qmwCyQpllBJId0o6UJGBQ0VVBRh\nlEFEGvVQWFBRRAVBpkk10n1quoz18O1D2906Z/beZ5/x5fxhWOz1/df+f2udb92+PfTRx0HGIW3q\np+AdnFLzvRfgYXyI3/EH9ufsO/FQm7ZrMYDba/p2B17Ep5nufFyEJ7Enxzset2AEo5iK9fimpu6i\nzOdd+AczsQ7fFnhldZvmle1Hk7q14+AMvCsGsi6uz9qn/vbj/Dbt5mEYG9vYy/hW1BvFTQXOfOzD\nilzdKjFYE2voHikCfFWubgM+xqQauk3zyvajad3KcXAytmFQzJRugnALjhUr2oRc/TLc16HdI5nu\nxi5825W9ZyvuwakJzlZ8X/BtspjVl9fQ3YTvHPgDzMBfWF1Dt2le2X40rVs3Dsic7SYIH0zUTcMr\nwtkUVmCldBBW8e2NMXybJIJjZ8L2GV6uofs5XkrUf4TtFXWb5hUxKN2PXuiWioMJCVITuCZRdxdu\nFmeDIqbhQjzTI3/ymCFWrJGE7Scsrfi+I7AQXyVse3FaRd2meWXRC91ScZA6N/QCy0TAv9fGfqP2\nF5GqmJS9b6Y4dyzADWK1giH8hsMTbY/BLDEuf5fUm5eVPydsw5iOwyroNs0r24/x0E3GQa9WwiLu\nF7fWFBbjV3zRkNbReEocitfhBbyFOZl9FM+K210+OzBHDCIx28tielb+mbANZ+VRFXSb5pXFeOgm\n42A8gvBcsf9/mbBNwBpxgWgKJ2J37vlpsWVuyNWtFwfrK7LniWLr+CB7Hq2g1+KmzlkDWXloRd2m\neWXRS922cTAeQXiVuJGlcKU4KKdWkbooDsCo2EIuztUN4Uwxe+8VF6FHxfY9Iga4LIY62KZm5S8V\ndZvmVelLr3Q7xUESg7q7HbcwILbaTQnbHDyQqO/mdvym2HqL2CN9kC5iN16vqDtVDH4q5bAdP3Sp\n2zRvUPXftlvdTnHQ85VwqfiR9iVs5+EkkXNq/W3LbCuz5xWJdp2wRGy9RcwU+cNOmIW5eK6i5jDe\nF/mwIk7w3xbVrW7TvLJoQrdTHLTFoM6zZaH2+b48Lsves3osYobjdLcSPi8CLo8lGT//1eQ6kVye\nm6tbK1bM1K1vLN1b8bUDD+oLMv7VNXSb5pXtR690O8ZBu5Ww9aIpCds5Iim5tU3bPGZnZdkz30Ch\nTKGTb3dis0iJEEGxBm+L/FQL00SaoZVGWCJu0pdov2130t0iZnr+s921+ESclarqNs0r249e6ZaO\ng9l4VXzvbH3fG8IOXJrjLRIf5dv9A0Iey/EjTh+DNz3T2ZvpjojAWV7RNzhbbAlPiIlym//Pzsm4\nG4+L1fM1nJXwq4ruYnGc2IzHRGqouEWX1W2aV7YfTeu2UDYO+uijjz766KOPg4N/ARbH5SH22Sg0\nAAAAAElFTkSuQmCC\n", 77 | "text/latex": [ 78 | "$$1.74159109991997$$" 79 | ], 80 | "text/plain": [ 81 | "1.74159109991997" 82 | ] 83 | }, 84 | "execution_count": 3, 85 | "metadata": {}, 86 | "output_type": "execute_result" 87 | } 88 | ], 89 | "source": [ 90 | "# Convert this into a floating point \"single\" result\n", 91 | "Integral(x*sin(x), (x, 0, 2)).doit().evalf()" 92 | ] 93 | } 94 | ], 95 | "metadata": { 96 | "kernelspec": { 97 | "display_name": "Python 3", 98 | "language": "python", 99 | "name": "python3" 100 | }, 101 | "language_info": { 102 | "codemirror_mode": { 103 | "name": "ipython", 104 | "version": 3 105 | }, 106 | "file_extension": ".py", 107 | "mimetype": "text/x-python", 108 | "name": "python", 109 | "nbconvert_exporter": "python", 110 | "pygments_lexer": "ipython3", 111 | "version": "3.5.2" 112 | } 113 | }, 114 | "nbformat": 4, 115 | "nbformat_minor": 0 116 | } 117 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Interactive Barnsley Fern-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "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\nq3kwSVJvdHUNy4h4FvBC4JaVxnotOkmqTunyLjaZXA28tXgHfpiJiQkADhz4IVdf/T1mZy9n4Vp0\n+/Zt7GvRSdJKms0mzWazJ+sqdUrYiDgS+BTwmcx8/xJjDm7z3rFjN1dddTGPv6TRHBdd9B6uvHJ8\n7aklaQNYj1PCXg58bani7uS16CSpWmWmCp4JXAScExF3RMTtEXHucj/jtegkqVqVXElneno/27df\nwtTUbha2eY+Ous1bktoN5GXQNtu16CSpWwNZ3pKk5XkNS0naZCxvSaohy1uSaqin5b1jx26mp/f3\ncpWSpEX0dIclPOyUQEkqaYB2WA4xNbWbsbE9vV2tJOlxKtjm7WHwklS1Csrbw+AlqWo9btnWYfCT\nkzt7u1pJ0uP0tLwvuug97qyUpHXg4fGS1CcDNNtEkrQeLG9JqiHLW5JqyPKWpBqyvCWphixvSaqh\nI/sdQJL6ZeFyjTMz84yM1Otyjc7zlrQpDcKF0p3nLUldGhvb01bcULezolrekjalmZl5DhX3gvqc\nFXXF8o6ID0XE/RFx93oEkqT1MDKyBZjrWFqfs6KWSXkF8PKqg0jSepqc3Mno6DiHCrxeZ0UttcMy\nIk4GPpmZpy4zxh2WkmplYbbJ7Ow8w8PrP9tkLTssLW9J6pO1lHdP53lPTEwcvN1oNGg0Gr1cvSTV\nWrPZpNls9mRdvvOWpD5Zj3neUXxJkgZAmamCHwG+ADwnIr4TEW+oPpYkaTkeHi9JfeLh8ZK0yVje\nklRDlrck1ZDlLUk1ZHlLUg1Z3pJUQ5a3JNWQ5S1JNWR5S1INWd6SVEOWtyTVUE/Le8eO3UxP7+/l\nKiVJi+jpiangYUZHx9m7d9e6XkpIkupogE5MNcTU1G7Gxvb0drWSpMepYJv3ELOz871frSTpoArK\ne47hYfeDSlKVetyyc4yOjjM5ubO3q5UkPU5Py/uii97jzkpJWgdeBk2S+mSAZptIktaD5S1JNWR5\nS1INlSrviDg3Iu6NiG9ExNurDiVJWt6K5R0RW4BLgZcDPwtcGBHPqzpYLzSbzX5HOIyZyhnETDCY\nucxUziBmWosy77xPB76Zmfsz81Hgo8AFiw0ctBNTDeIvy0zlDGImGMxcZipnEDOtRZnyHgHua7v/\n3WLZYa666mK2b79koApckjYiT0wlSTW04kE6EXEGMJGZ5xb33wFkZv5RxziP0JGkLq32IJ0y5X0E\n8HXg3wDfA24FLszMe1bzgJKktTtypQGZ+dOIeDPwOVqbWT5kcUtSf/Xs3CaSpPXT1Q7LMgfrRMQH\nIuKbEXFnRLywNzFXnykinhsRX4iIn0TE26rO00Wu10bEXcXXTRHxggHI9MtFnjsi4taIOLPfmdrG\n/auIeDQiXt3vTBFxVkT8MCJuL75+r9+ZijGN4nf3lYi4vupMZXJFxMVFptsj4ssR8VhEPLHPmU6I\niE8UHfXliNhZZZ6SmZ4YER8v/vvbFxHbVlxpZpb6olX03wJOBo4C7gSe1zHmPODa4vbPA/vKrn81\nXyUzPRn4l8Ak8LYq83SZ6wxga3H73AF5rY5tu/0C4J5+Z2ob9zfAp4BX9zsTcBbwifX4W+oi01bg\nq8BIcf/Jg5CrY/wvAf+n35mA/wS8a+F1Ah4Ajuxzpj8Gxorbzy3zOnXzzrvMwToXAB8GyMxbgK0R\n8dQuHqNbK2bKzB9k5m3AYxXmWE2ufZn5UHF3H0vMnV/nTI+03T0OqPp6dmUPANsFXA3834rzdJNp\nVTMEKsz0WuBjmTkDrb/7AcnV7kLgLwcgUwLHF7ePBx7IzCr7oUymbcB1AJn5deBZEfGU5VbaTXmX\nOVinc8zMImN6qfQBROus21y/Dnym0kQlM0XEqyLiHuCTwBv7nSkihoFXZeafsT6FWfZ395LiY/e1\npT7iVp/pOcCJEXF9RHwxIl5XcaayuQCIiGNofcL82ABkuhTYFhGzwF3AWwcg013AqwEi4nTgJOAZ\ny610xdkmqlZEnA28AXhpv7MAZOY1wDUR8VLgncD2Pkd6H9C+jXA93/Eu5TbgpMx8JCLOA66hVZ79\ndCTwIuAcYAi4OSJuzsxv9TfWQa8EbsrMH/Y7CK3zNN2RmedExCiwNyJOzcyH+5jpD4H3R8TtwJeB\nO4CfLvcD3ZT3DK3/Gyx4RrGsc8wzVxjTS2Uy9UOpXBFxKvBB4NzMPDAImRZk5k0R8eyIODEzH+xj\nphcDH42IoLV98ryIeDQzP9GvTO3/kWfmZyLiTwfgdfou8IPM/Anwk4i4ETiN1rbWqnTzN/WrVL/J\nBMplegPwLoDMnIqIaeB5wJf6lSkzf0zbJ90i098tu9YuNrofwaGN7k+gtdH9+R1jzufQDsszqH4n\n3IqZ2saOA79dZZ4uX6uTgG8CZwxQptG22y8C7ut3po7xV1D9Dssyr9NT226fDnx7ADI9D9hbjD2W\n1ru3bf3OVYzbSmun4DFV5unitboMGF/4XdLapHFinzNtBY4qbr8J2LPiersMcS6toy2/CbyjWPab\nwG+0jbm0CHoX8KJ1+GUtm6ntl/ND4EHgO8BxA5Drz4s/6NtpfUS6dQAy/UfgK0WmzwMv6XemjrGX\nU3F5l3ydfqt4ne4AvgD8fL8zFfcvpjXj5G5gV9WZusj1euAj65Gn5O/v6cBni9fpblpHjPc70xnF\n9++htXN+60rr9CAdSaohL4MmSTVkeUtSDVneklRDlrck1ZDlLUk1ZHlLUg1Z3pJUQ5a3JNXQPwJq\nc9g8E5reKQAAAABJRU5ErkJggg==\n", 13 | "text/plain": [ 14 | "" 15 | ] 16 | }, 17 | "metadata": {}, 18 | "output_type": "display_data" 19 | } 20 | ], 21 | "source": [ 22 | "#P165 of \"Doing Math with Python\": Interactive version of drawing the Barnsley Fern\n", 23 | "\n", 24 | "%matplotlib inline\n", 25 | "\n", 26 | "from ipywidgets import interact\n", 27 | "import ipywidgets as widgets\n", 28 | "\n", 29 | "import random\n", 30 | "import matplotlib.pyplot as plt\n", 31 | "\n", 32 | "def transformation_1(p):\n", 33 | " x = p[0]\n", 34 | " y = p[1]\n", 35 | " x1 = 0.85*x + 0.04*y\n", 36 | " y1 = -0.04*x + 0.85*y + 1.6\n", 37 | " return x1, y1\n", 38 | "\n", 39 | "def transformation_2(p):\n", 40 | " x = p[0]\n", 41 | " y = p[1]\n", 42 | " x1 = 0.2*x - 0.26*y\n", 43 | " y1 = 0.23*x + 0.22*y + 1.6\n", 44 | " return x1, y1\n", 45 | "\n", 46 | "def transformation_3(p):\n", 47 | " x = p[0]\n", 48 | " y = p[1]\n", 49 | " x1 = -0.15*x + 0.28*y\n", 50 | " y1 = 0.26*x + 0.24*y + 0.44\n", 51 | " return x1, y1\n", 52 | "\n", 53 | "def transformation_4(p):\n", 54 | " x = p[0]\n", 55 | " y = p[1]\n", 56 | " x1 = 0\n", 57 | " y1 = 0.16*y\n", 58 | " return x1, y1\n", 59 | "\n", 60 | "def get_index(probability):\n", 61 | " r = random.random()\n", 62 | " c_probability = 0\n", 63 | " sum_probability = []\n", 64 | " for p in probability:\n", 65 | " c_probability += p\n", 66 | " sum_probability.append(c_probability)\n", 67 | " for item, sp in enumerate(sum_probability):\n", 68 | " if r <= sp:\n", 69 | " return item\n", 70 | " return len(probability)-1\n", 71 | "\n", 72 | "def transform(p):\n", 73 | " # list of transformation functions\n", 74 | " transformations = [transformation_1, transformation_2,\n", 75 | " transformation_3, transformation_4]\n", 76 | " probability = [0.85, 0.07, 0.07, 0.01]\n", 77 | " # pick a random transformation function and call it\n", 78 | " tindex = get_index(probability)\n", 79 | " t = transformations[tindex]\n", 80 | " x, y = t(p)\n", 81 | " return x, y\n", 82 | "\n", 83 | "def draw_fern(n):\n", 84 | " # We start with (0, 0)\n", 85 | " x = [0]\n", 86 | " y = [0]\n", 87 | " x1, y1 = 0, 0\n", 88 | " for i in range(n):\n", 89 | " x1, y1 = transform((x1, y1))\n", 90 | " x.append(x1)\n", 91 | " y.append(y1)\n", 92 | " \n", 93 | " # Plot the points\n", 94 | " plt.plot(x, y, 'o')\n", 95 | " plt.title('Fern with {0} points'.format(n))\n", 96 | " plt.show()\n", 97 | " \n", 98 | "# Allow interaction via the interact() function and an Integer slider widget\n", 99 | "i = interact(draw_fern, n=widgets.IntSlider(min=0, max=10000,step=1,value=10))" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": null, 105 | "metadata": { 106 | "collapsed": true 107 | }, 108 | "outputs": [], 109 | "source": [] 110 | } 111 | ], 112 | "metadata": { 113 | "kernelspec": { 114 | "display_name": "Python 3", 115 | "language": "python", 116 | "name": "python3" 117 | }, 118 | "language_info": { 119 | "codemirror_mode": { 120 | "name": "ipython", 121 | "version": 3 122 | }, 123 | "file_extension": ".py", 124 | "mimetype": "text/x-python", 125 | "name": "python", 126 | "nbconvert_exporter": "python", 127 | "pygments_lexer": "ipython3", 128 | "version": "3.5.2" 129 | } 130 | }, 131 | "nbformat": 4, 132 | "nbformat_minor": 0 133 | } 134 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Interactive Mandelbrot Set-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "metadata": { 7 | "collapsed": false, 8 | "slideshow": { 9 | "slide_type": "-" 10 | } 11 | }, 12 | "outputs": [ 13 | { 14 | "data": { 15 | "image/png": "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\n", 16 | "text/plain": [ 17 | "" 18 | ] 19 | }, 20 | "metadata": {}, 21 | "output_type": "display_data" 22 | } 23 | ], 24 | "source": [ 25 | "# Interactive version of the \"Mandelbrot Set\" - solution to challenge in \n", 26 | "# \"Doing Math with Python\", chapter 6\n", 27 | "%matplotlib inline\n", 28 | "'''\n", 29 | "mandelbrot.py\n", 30 | "\n", 31 | "Draw a Mandelbrot set\n", 32 | "\n", 33 | "Using \"Escape time algorithm\" from:\n", 34 | "http://en.wikipedia.org/wiki/Mandelbrot_set#Computer_drawings\n", 35 | "\n", 36 | "Thanks to http://www.vallis.org/salon/summary-10.html for some important\n", 37 | "ideas for implementation.\n", 38 | "\n", 39 | "'''\n", 40 | "from ipywidgets import interact\n", 41 | "import ipywidgets as widgets\n", 42 | "\n", 43 | "\n", 44 | "import matplotlib.pyplot as plt\n", 45 | "import matplotlib.cm as cm\n", 46 | "\n", 47 | "# Subset of the complex plane we are considering\n", 48 | "x0, x1 = -2.5, 1\n", 49 | "y0, y1 = -1, 1\n", 50 | "\n", 51 | "def initialize_image(x_p, y_p):\n", 52 | " image = []\n", 53 | " for i in range(y_p):\n", 54 | " x_colors = []\n", 55 | " for j in range(x_p):\n", 56 | " x_colors.append(0)\n", 57 | " image.append(x_colors)\n", 58 | " return image\n", 59 | "\n", 60 | "def mandelbrot_set(n, max_iterations):\n", 61 | " image = initialize_image(n, n)\n", 62 | " \n", 63 | " # Generate a set of equally spaced points in the region\n", 64 | " # above\n", 65 | " dx = (x1-x0)/(n-1)\n", 66 | " dy = (y1-y0)/(n-1)\n", 67 | " x_coords = [x0 + i*dx for i in range(n)]\n", 68 | " y_coords = [y0 + i*dy for i in range(n)]\n", 69 | "\n", 70 | " for i, x in enumerate(x_coords):\n", 71 | " for k, y in enumerate(y_coords):\n", 72 | " z1 = complex(0, 0)\n", 73 | " iteration = 0\n", 74 | " c = complex(x, y)\n", 75 | " while (abs(z1) < 2 and iteration < max_iterations):\n", 76 | " z1 = z1**2 + c\n", 77 | " iteration += 1\n", 78 | " image[k][i] = iteration\n", 79 | " return image\n", 80 | "\n", 81 | "\n", 82 | "def draw_mandelbrot(n, max_iterations):\n", 83 | " image = mandelbrot_set(n, max_iterations)\n", 84 | " plt.imshow(image, origin='lower', extent=(x0, x1, y0,y1),\n", 85 | " cmap=cm.Greys_r, interpolation='nearest')\n", 86 | " plt.show()\n", 87 | " \n", 88 | "\n", 89 | "# Allow interaction via the interact() function and an Integer slider widget\n", 90 | "i = interact(draw_mandelbrot, \n", 91 | " n=widgets.IntSlider(min=100, max=600,step=1,value=10), \n", 92 | " max_iterations=widgets.IntSlider(min=100, max=10000,step=1,value=10),\n", 93 | " # This keyword argument adds a button so that the drawing happens\n", 94 | " # only when the button is clicked\n", 95 | " __manual=True\n", 96 | " )" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": null, 102 | "metadata": { 103 | "collapsed": true 104 | }, 105 | "outputs": [], 106 | "source": [] 107 | } 108 | ], 109 | "metadata": { 110 | "kernelspec": { 111 | "display_name": "Python 3", 112 | "language": "python", 113 | "name": "python3" 114 | }, 115 | "language_info": { 116 | "codemirror_mode": { 117 | "name": "ipython", 118 | "version": 3 119 | }, 120 | "file_extension": ".py", 121 | "mimetype": "text/x-python", 122 | "name": "python", 123 | "nbconvert_exporter": "python", 124 | "pygments_lexer": "ipython3", 125 | "version": "3.5.2" 126 | } 127 | }, 128 | "nbformat": 4, 129 | "nbformat_minor": 0 130 | } 131 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Interactive Notebook Demo-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "1719\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# Demo of using interative elements in a Notebook\n", 20 | "# To learn more: https://ipywidgets.readthedocs.io/en/latest/\n", 21 | "\n", 22 | "from ipywidgets import interact\n", 23 | "import ipywidgets as widgets\n", 24 | "\n", 25 | "\n", 26 | "def called(m):\n", 27 | " print(m)\n", 28 | " \n", 29 | "# Allow interaction via the interact() function and an Integer slider widget\n", 30 | "i = interact(called, m=widgets.IntSlider(min=0, max=10000,step=1,value=10))" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": null, 36 | "metadata": { 37 | "collapsed": true 38 | }, 39 | "outputs": [], 40 | "source": [] 41 | } 42 | ], 43 | "metadata": { 44 | "anaconda-cloud": {}, 45 | "kernelspec": { 46 | "display_name": "Python [Root]", 47 | "language": "python", 48 | "name": "Python [Root]" 49 | }, 50 | "language_info": { 51 | "codemirror_mode": { 52 | "name": "ipython", 53 | "version": 3 54 | }, 55 | "file_extension": ".py", 56 | "mimetype": "text/x-python", 57 | "name": "python", 58 | "nbconvert_exporter": "python", 59 | "pygments_lexer": "ipython3", 60 | "version": "3.5.2" 61 | }, 62 | "widgets": { 63 | "state": { 64 | "e79f7a52d627426d9ea107543454e65f": { 65 | "views": [ 66 | { 67 | "cell_index": 0 68 | } 69 | ] 70 | } 71 | }, 72 | "version": "1.2.0" 73 | } 74 | }, 75 | "nbformat": 4, 76 | "nbformat_minor": 0 77 | } 78 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Scientific Calculator-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Scientific calculator" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 13, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [ 17 | { 18 | "data": { 19 | "text/plain": [ 20 | "2" 21 | ] 22 | }, 23 | "execution_count": 13, 24 | "metadata": {}, 25 | "output_type": "execute_result" 26 | } 27 | ], 28 | "source": [ 29 | "# Demo of some functions from the math module\n", 30 | "# Please see: https://docs.python.org/3/library/math.html\n", 31 | "\n", 32 | "import math\n", 33 | "\n", 34 | "# Find the greatest common divisor of 100 and 98\n", 35 | "\n", 36 | "math.gcd(100, 98)\n" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 14, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/plain": [ 49 | "16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000" 50 | ] 51 | }, 52 | "execution_count": 14, 53 | "metadata": {}, 54 | "output_type": "execute_result" 55 | } 56 | ], 57 | "source": [ 58 | "# Find the factorial\n", 59 | "\n", 60 | "math.factorial(89)" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "### Validate simple known results\n", 68 | "\n", 69 | "$$ sin^2{\\theta} + cos^2{\\theta} = 1 $$\n" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 15, 75 | "metadata": { 76 | "collapsed": false 77 | }, 78 | "outputs": [ 79 | { 80 | "data": { 81 | "text/plain": [ 82 | "1.0" 83 | ] 84 | }, 85 | "execution_count": 15, 86 | "metadata": {}, 87 | "output_type": "execute_result" 88 | } 89 | ], 90 | "source": [ 91 | "theta = 60 # degrees\n", 92 | "\n", 93 | "theta_radians = math.radians(theta)\n", 94 | "\n", 95 | "math.sin(theta_radians)**2 + math.cos(theta_radians)**2" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 16, 101 | "metadata": { 102 | "collapsed": false 103 | }, 104 | "outputs": [ 105 | { 106 | "data": { 107 | "text/plain": [ 108 | "8.375" 109 | ] 110 | }, 111 | "execution_count": 16, 112 | "metadata": {}, 113 | "output_type": "execute_result" 114 | } 115 | ], 116 | "source": [ 117 | "# Demo of the statistics module\n", 118 | "# Please see: https://docs.python.org/3/library/statistics.html#module-statistics\n", 119 | "\n", 120 | "import statistics\n", 121 | "\n", 122 | "# Find the mean and median\n", 123 | "\n", 124 | "data = [1, 2.3, 10.1, 20.1]\n", 125 | "\n", 126 | "statistics.mean(data)\n" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 17, 132 | "metadata": { 133 | "collapsed": false 134 | }, 135 | "outputs": [ 136 | { 137 | "data": { 138 | "text/plain": [ 139 | "6.199999999999999" 140 | ] 141 | }, 142 | "execution_count": 17, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "# Find the median\n", 149 | "\n", 150 | "statistics.median(data)\n" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "### Extending the battery\n", 158 | "\n", 159 | "- Develop your own functions: unit conversion, finding correlation, .., anything really\n", 160 | "\n", 161 | "- Use PYTHONSTARTUP to extend the battery of readily available mathematical functions when you start the Python interpreter\n", 162 | "\n", 163 | "```python\n", 164 | "$ PYTHONSTARTUP=~/pycon-au-2016/py-files/startup_math.py idle3 -s\n", 165 | "```" 166 | ] 167 | } 168 | ], 169 | "metadata": { 170 | "kernelspec": { 171 | "display_name": "Python [Root]", 172 | "language": "python", 173 | "name": "Python [Root]" 174 | }, 175 | "language_info": { 176 | "codemirror_mode": { 177 | "name": "ipython", 178 | "version": 3 179 | }, 180 | "file_extension": ".py", 181 | "mimetype": "text/x-python", 182 | "name": "python", 183 | "nbconvert_exporter": "python", 184 | "pygments_lexer": "ipython3", 185 | "version": "3.5.2" 186 | } 187 | }, 188 | "nbformat": 4, 189 | "nbformat_minor": 0 190 | } 191 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/Simple Linear Regression-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "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\nrXrceD17J6rBqKKiorrlUChEKBSKU3NaT05ODrt27aJTp07hW5rNyM/P58EHH2xyn5SUFN599926\nJ3BeeOGFvP32263Svuuvv56srCxmzJgRdR0akRNpfWaGmbFnTzWDBv2QioraurL6SktLKS0tjdtx\now39nWbW0913mlkvYFekvBKof5p4WqSsUfVDv7ncnYKC+5g1686owymWOsyMP/zhD1x88cUt2kdE\npKG1a9cz8ux3+LeUg7xzShfWru3D2LGfvYTa8IR4+vTpMR2zucM7Fvk6YimQH1meDCypV/5NM/u8\nmeUC/YG1MbWwgXhc9Ii1jsausm/evJlQKESPHj3IyMhg/PjxAAwfPhx350tf+hKpqak89dRTRw2h\n5Obmcv/993PWWWfRvXt3brrpJnbt2sUVV1xBamoqI0aMYO/evXXbjxs3jt69e5OWlkYoFKr7q+GR\nRx7hySefZPbs2aSmpjJ69Ggg/Njma6+9loyMDPLy8pgzZ05dXdXV1eTn55Oens4ZZ5zBq6++GtW/\niYi0THlZGbWLH6FkzR+ZsXo1JWv+yOFnHo7qvd0tcrwnsgELgSrgELANuB5IA1YCG4HlQI962xcA\n7wJvAyOOUe+xniB3lIceesIHDfq6Dxhwj0OtDxhwjw8a9HV/6KEnmvtwurjUkZOT43/605+OKh8/\nfrzPnDnT3d0PHTrkL7/8ct3PzMy31HsPb8OnZObk5Pj555/v77//vldVVXlGRoYPHTrU169f74cO\nHfKvfe1rPmPGjLrtS0pKfP/+/V5TU+O33367n3322XU/y8/Pr3sap7t7bW2tDx061H/84x/7p59+\n6mVlZZ6Xl+fLly93d/e7777bv/rVr/qePXt8+/btfsYZZxz3CZ5N/Y5EpPmifX0rQXlHbm1trS9a\n9JxnZU11cM/KmupPPbXsM++dPZ541JGTk+Pdu3f3tLQ079Gjh6elpfmjjz7qkydP9u985zu+ffv2\no/YxM9+8eXPdemOhv3Dhwrr1sWPH+s0331y3PmfOHL/mmmsabc+HH37oZuYfffSRux8d+q+88opn\nZ2d/Zp9Zs2b5DTfc4O7u/fr1q/sAcHd/+OGHFfoibeBHodBnAv/I148uvviY+8Ua+h3mjtyGFz32\n7DnY6EWP1q4DYMmSJezevZsPP/yQ3bt3c+ONNzJ79mxqa2sZNmwYZ555JiUlJS2qs2fPnnXLXbp0\n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\nP4u5grrFFg9GAAAAAElFTkSuQmCC\n", 13 | "text/plain": [ 14 | "" 15 | ] 16 | }, 17 | "metadata": {}, 18 | "output_type": "display_data" 19 | } 20 | ], 21 | "source": [ 22 | "%matplotlib inline\n", 23 | "\n", 24 | "# Using gradient descent for linear regression\n", 25 | "# Ideas from https://spin.atomicobject.com/2014/06/24/gradient-descent-linear-regression/\n", 26 | "\n", 27 | "# We will attempt to predict the college admission test score based\n", 28 | "# on the high school math score (following on Chapter 3 of \"Doing Math with Python\")\n", 29 | "\n", 30 | "# Known data\n", 31 | "x_data = [83, 85, 84, 96, 94, 86, 87, 97, 97, 85]\n", 32 | "y_data = [85, 87, 86, 97, 96, 88, 89, 98, 98, 87]\n", 33 | "\n", 34 | "from sympy import Symbol, Derivative\n", 35 | "import matplotlib.pyplot as plt\n", 36 | "\n", 37 | "# Assumed linear model\n", 38 | "# x = math score in high school\n", 39 | "# y = admission test score\n", 40 | "\n", 41 | "# y = m*x + c\n", 42 | "def estimate_y(x, m, c):\n", 43 | " y_estimated = m*x + c\n", 44 | " return y_estimated\n", 45 | "\n", 46 | "def estimate_theta(m_current, c_current, max_iterations=50000):\n", 47 | " learning_rate = 0.0001\n", 48 | " m_gradient = 0\n", 49 | " c_gradient = 0\n", 50 | " N = len(x_data)\n", 51 | " \n", 52 | " m = Symbol('m')\n", 53 | " c = Symbol('c')\n", 54 | " y = Symbol('y')\n", 55 | " x = Symbol('x')\n", 56 | " # Error term\n", 57 | " error_term = (y - (m*x+c))**2\n", 58 | " # Error function = 1/n*sum(error_term)\n", 59 | " for i in range(max_iterations):\n", 60 | " for i in range(0, N):\n", 61 | " m_gradient += (1/N)*Derivative(error_term, m).doit().subs({x:x_data[i], y:y_data[i], m:m_current, c:c_current})\n", 62 | " c_gradient += (1/N)*Derivative(error_term, c).doit().subs({x:x_data[i], y:y_data[i], m:m_current, c:c_current})\n", 63 | "\n", 64 | " m_new = m_current - (learning_rate * m_gradient)\n", 65 | " c_new = c_current - (learning_rate * c_gradient)\n", 66 | " if abs(m_new - m_current) < 1e-5 or abs(c_new - c_current) < 1e-5:\n", 67 | " break\n", 68 | " else:\n", 69 | " m_current = m_new\n", 70 | " c_curret = c_new\n", 71 | " return m_new, c_new\n", 72 | " \n", 73 | "m, c = estimate_theta(1, 1)\n", 74 | "\n", 75 | "# Let's try and unknown set of data \n", 76 | "# This data set is different and widely spread, \n", 77 | "# but they are very similarly correlated\n", 78 | "x_data = [63, 61, 98, 76, 74, 59, 40, 87, 71, 75]\n", 79 | "y_data = [65, 62, 99, 78, 75, 60, 42, 89, 71, 77]\n", 80 | "\n", 81 | "y_estimated = [estimate_y(x, m, c) for x in x_data]\n", 82 | "plt.plot(x_data, y_data, 'ro')\n", 83 | "plt.plot(x_data, y_estimated, 'b*')\n", 84 | "plt.legend(['Actual', 'Estimated'], loc='best')\n", 85 | "plt.show()\n" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "metadata": { 92 | "collapsed": true 93 | }, 94 | "outputs": [], 95 | "source": [] 96 | } 97 | ], 98 | "metadata": { 99 | "anaconda-cloud": {}, 100 | "kernelspec": { 101 | "display_name": "Python [Root]", 102 | "language": "python", 103 | "name": "Python [Root]" 104 | }, 105 | "language_info": { 106 | "codemirror_mode": { 107 | "name": "ipython", 108 | "version": 3 109 | }, 110 | "file_extension": ".py", 111 | "mimetype": "text/x-python", 112 | "name": "python", 113 | "nbconvert_exporter": "python", 114 | "pygments_lexer": "ipython3", 115 | "version": "3.5.2" 116 | } 117 | }, 118 | "nbformat": 4, 119 | "nbformat_minor": 0 120 | } 121 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/SymPy Basics - 1-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "2*x\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# One of the basic ideas in SymPy is that of a\n", 20 | "# Symbol object. If we want to tell Python that\n", 21 | "# treat \"x\" as \"x\", we create a Symbol object to\n", 22 | "# passing 'x' as an argument\n", 23 | "\n", 24 | "from sympy import Symbol\n", 25 | "\n", 26 | "x = Symbol('x')\n", 27 | "\n", 28 | "y = Symbol('x')\n", 29 | "\n", 30 | "print(x+y)" 31 | ] 32 | } 33 | ], 34 | "metadata": { 35 | "kernelspec": { 36 | "display_name": "Python [Root]", 37 | "language": "python", 38 | "name": "Python [Root]" 39 | }, 40 | "language_info": { 41 | "codemirror_mode": { 42 | "name": "ipython", 43 | "version": 3 44 | }, 45 | "file_extension": ".py", 46 | "mimetype": "text/x-python", 47 | "name": "python", 48 | "nbconvert_exporter": "python", 49 | "pygments_lexer": "ipython3", 50 | "version": "3.5.2" 51 | } 52 | }, 53 | "nbformat": 4, 54 | "nbformat_minor": 0 55 | } 56 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/SymPy Basics - 2-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "5\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# Next, we may want to \"evaluate\" the value of an algebraic expression\n", 20 | "\n", 21 | "from sympy import Symbol\n", 22 | "\n", 23 | "x = Symbol('x')\n", 24 | "\n", 25 | "expr = 2*x + 3*x**2\n", 26 | "\n", 27 | "# now evaluate expr using subs() method\n", 28 | "\n", 29 | "expr_val = expr.subs({x:1})\n", 30 | "\n", 31 | "print(expr_val)" 32 | ] 33 | } 34 | ], 35 | "metadata": { 36 | "kernelspec": { 37 | "display_name": "Python 3", 38 | "language": "python", 39 | "name": "python3" 40 | }, 41 | "language_info": { 42 | "codemirror_mode": { 43 | "name": "ipython", 44 | "version": 3 45 | }, 46 | "file_extension": ".py", 47 | "mimetype": "text/x-python", 48 | "name": "python", 49 | "nbconvert_exporter": "python", 50 | "pygments_lexer": "ipython3", 51 | "version": "3.5.2" 52 | } 53 | }, 54 | "nbformat": 4, 55 | "nbformat_minor": 0 56 | } 57 | -------------------------------------------------------------------------------- /demos/.ipynb_checkpoints/SymPy Basics - 3-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Enter an expression: 2*x**2 + 3*x + 1\n", 15 | "(x + 1)*(2*x + 1)\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "# To allow user to input expressions, we use the input()\n", 21 | "# function and then we convert the expression (a string)\n", 22 | "# to a form understandable by SymPy using sympify() function\n", 23 | "\n", 24 | "from sympy import sympify\n", 25 | "\n", 26 | "# This is a string\n", 27 | "expr = input('Enter an expression: ')\n", 28 | "\n", 29 | "# Now this is in a form understood by SymPy\n", 30 | "\n", 31 | "expr_sympified = sympify(expr)\n", 32 | "\n", 33 | "# Let's factorize this expression\n", 34 | "\n", 35 | "from sympy import factor\n", 36 | "\n", 37 | "print(factor(expr_sympified))\n", 38 | "\n", 39 | "\n", 40 | "\n" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "collapsed": true 48 | }, 49 | "outputs": [], 50 | "source": [] 51 | } 52 | ], 53 | "metadata": { 54 | "anaconda-cloud": {}, 55 | "kernelspec": { 56 | "display_name": "Python [Root]", 57 | "language": "python", 58 | "name": "Python [Root]" 59 | }, 60 | "language_info": { 61 | "codemirror_mode": { 62 | "name": "ipython", 63 | "version": 3 64 | }, 65 | "file_extension": ".py", 66 | "mimetype": "text/x-python", 67 | "name": "python", 68 | "nbconvert_exporter": "python", 69 | "pygments_lexer": "ipython3", 70 | "version": "3.5.2" 71 | } 72 | }, 73 | "nbformat": 4, 74 | "nbformat_minor": 0 75 | } 76 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false, 8 | "slideshow": { 9 | "slide_type": "skip" 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 4, 20 | "metadata": { 21 | "collapsed": false, 22 | "slideshow": { 23 | "slide_type": "subslide" 24 | } 25 | }, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "Enter an expression in x to graph: x**2 + 2*x + 1\n" 32 | ] 33 | }, 34 | { 35 | "data": { 36 | "image/png": "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\nTqrk9a2v4f8AAAAASUVORK5CYII=\n", 37 | "text/plain": [ 38 | "" 39 | ] 40 | }, 41 | "metadata": {}, 42 | "output_type": "display_data" 43 | }, 44 | { 45 | "data": { 46 | "text/plain": [ 47 | "" 48 | ] 49 | }, 50 | "execution_count": 4, 51 | "metadata": {}, 52 | "output_type": "execute_result" 53 | } 54 | ], 55 | "source": [ 56 | "# Create graphs from algebraic expressions\n", 57 | "\n", 58 | "from sympy import Symbol, plot\n", 59 | "\n", 60 | "x = Symbol('x')\n", 61 | "\n", 62 | "expr = input('Enter an expression in x to graph: ')\n", 63 | "\n", 64 | "plot(expr)\n" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": null, 70 | "metadata": { 71 | "collapsed": true 72 | }, 73 | "outputs": [], 74 | "source": [] 75 | } 76 | ], 77 | "metadata": { 78 | "anaconda-cloud": {}, 79 | "kernelspec": { 80 | "display_name": "Python [Root]", 81 | "language": "python", 82 | "name": "Python [Root]" 83 | }, 84 | "language_info": { 85 | "codemirror_mode": { 86 | "name": "ipython", 87 | "version": 3 88 | }, 89 | "file_extension": ".py", 90 | "mimetype": "text/x-python", 91 | "name": "python", 92 | "nbconvert_exporter": "python", 93 | "pygments_lexer": "ipython3", 94 | "version": "3.5.2" 95 | } 96 | }, 97 | "nbformat": 4, 98 | "nbformat_minor": 0 99 | } 100 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "text/plain": [ 13 | "[-1]" 14 | ] 15 | }, 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "output_type": "execute_result" 19 | } 20 | ], 21 | "source": [ 22 | "# Solve equations\n", 23 | "\n", 24 | "from sympy import solve, Symbol\n", 25 | "\n", 26 | "x = Symbol('x')\n", 27 | "\n", 28 | "solve(x**2 + 2*x + 1)\n" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": { 35 | "collapsed": true 36 | }, 37 | "outputs": [], 38 | "source": [] 39 | } 40 | ], 41 | "metadata": { 42 | "kernelspec": { 43 | "display_name": "Python 3", 44 | "language": "python", 45 | "name": "python3" 46 | }, 47 | "language_info": { 48 | "codemirror_mode": { 49 | "name": "ipython", 50 | "version": 3 51 | }, 52 | "file_extension": ".py", 53 | "mimetype": "text/x-python", 54 | "name": "python", 55 | "nbconvert_exporter": "python", 56 | "pygments_lexer": "ipython3", 57 | "version": "3.5.2" 58 | } 59 | }, 60 | "nbformat": 4, 61 | "nbformat_minor": 0 62 | } 63 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Enter the inequality to solve: sin(x) + 1 <= 0\n", 15 | "{-pi/2, 3*pi/2}\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "# Solve inequalities\n", 21 | "\n", 22 | "'''\n", 23 | "isolve.py\n", 24 | "\n", 25 | "Single variable inequality solver\n", 26 | "'''\n", 27 | "\n", 28 | "from sympy import Symbol, sympify, SympifyError\n", 29 | "from sympy import solve_poly_inequality, solve_rational_inequalities\n", 30 | "from sympy import solve_univariate_inequality, Poly\n", 31 | "from sympy.core.relational import Relational, Equality\n", 32 | "\n", 33 | "def isolve(ineq_obj):\n", 34 | " x = Symbol('x')\n", 35 | "\n", 36 | " expr = ineq_obj.lhs\n", 37 | " \n", 38 | " rel = ineq_obj.rel_op\n", 39 | " \n", 40 | " if expr.is_polynomial():\n", 41 | " p = Poly(expr, x)\n", 42 | " return solve_poly_inequality(p, rel)\n", 43 | " elif expr.is_rational_function():\n", 44 | " p1, p2 = expr.as_numer_denom()\n", 45 | " num = Poly(p1)\n", 46 | " denom = Poly(p2)\n", 47 | " return solve_rational_inequalities([[((num, denom), rel)]])\n", 48 | " else:\n", 49 | " return solve_univariate_inequality(ineq_obj , x, relational=False)\n", 50 | "\n", 51 | "ineq = input('Enter the inequality to solve: ')\n", 52 | "try:\n", 53 | " ineq_obj = sympify(ineq)\n", 54 | "except SympifyError:\n", 55 | " print('Invalid inequality')\n", 56 | "else:\n", 57 | " # We check if the input expression is an inequality here\n", 58 | " if isinstance(ineq_obj, Relational) and not isinstance(ineq_obj, Equality):\n", 59 | " print(isolve(ineq_obj))\n", 60 | " else:\n", 61 | " print('Invalid inequality')" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": null, 67 | "metadata": { 68 | "collapsed": true 69 | }, 70 | "outputs": [], 71 | "source": [] 72 | } 73 | ], 74 | "metadata": { 75 | "kernelspec": { 76 | "display_name": "Python [Root]", 77 | "language": "python", 78 | "name": "Python [Root]" 79 | }, 80 | "language_info": { 81 | "codemirror_mode": { 82 | "name": "ipython", 83 | "version": 3 84 | }, 85 | "file_extension": ".py", 86 | "mimetype": "text/x-python", 87 | "name": "python", 88 | "nbconvert_exporter": "python", 89 | "pygments_lexer": "ipython3", 90 | "version": "3.5.2" 91 | } 92 | }, 93 | "nbformat": 4, 94 | "nbformat_minor": 0 95 | } 96 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 4.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "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\n", 13 | "text/latex": [ 14 | "$$\\lim_{x \\to 0^+}\\left(\\frac{1}{x} \\sin{\\left (x \\right )}\\right)$$" 15 | ], 16 | "text/plain": [ 17 | " sin(x)\n", 18 | " lim ──────\n", 19 | "x─→0⁺ x " 20 | ] 21 | }, 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Limits\n", 29 | "\n", 30 | "from sympy import Symbol, Limit, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "init_printing()\n", 35 | "\n", 36 | "Limit(sin(x)/x, x, 0)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 3, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAASCAYAAACNdSR1AAAABHNCSVQICAgIfAhkiAAAAF5JREFU\nKJFjYKAC4GJgYLhEjEJTBgaG0wwMDP/RJViQ2JoMDAw9DAwMrxkYGP6S4owF2ExmIsWEUcVUV8wB\npblwaRRjYGDYycDAcIUBEnv/GSBRv5+BgSGaFBfQGAAA/84M5lOscPUAAAAASUVORK5CYII=\n", 49 | "text/latex": [ 50 | "$$1$$" 51 | ], 52 | "text/plain": [ 53 | "1" 54 | ] 55 | }, 56 | "execution_count": 3, 57 | "metadata": {}, 58 | "output_type": "execute_result" 59 | } 60 | ], 61 | "source": [ 62 | "Limit(sin(x)/x, x, 0).doit()" 63 | ] 64 | } 65 | ], 66 | "metadata": { 67 | "kernelspec": { 68 | "display_name": "Python 3", 69 | "language": "python", 70 | "name": "python3" 71 | }, 72 | "language_info": { 73 | "codemirror_mode": { 74 | "name": "ipython", 75 | "version": 3 76 | }, 77 | "file_extension": ".py", 78 | "mimetype": "text/x-python", 79 | "name": "python", 80 | "nbconvert_exporter": "python", 81 | "pygments_lexer": "ipython3", 82 | "version": "3.5.2" 83 | } 84 | }, 85 | "nbformat": 4, 86 | "nbformat_minor": 0 87 | } 88 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 5.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGIAAAAeCAYAAADXRcu0AAAABHNCSVQICAgIfAhkiAAABKdJREFU\naIHt2XuIFVUcwPGPmu3aWlpaZPYwX2WRlWKlBplhZBJSFikZPUkoBDP/CAojK8jCIusfIyqR6PGH\nBBIFqRFqD8qSsKAXVkZR4KO0oFC3P34z7Oz1zjpz9+7m4v3C5c6cOb/zOzPnnN/jHBr0OBbgT4z4\nvztypDMCP9Qg17fO/TgcuK5GuYdxYWeVz8fzJWVuwO2dVXyYcTberFG2Ge8qaVWOwiO4C/dgE64v\nIT8Vy8soxBTsxMKSct3JEtzYCflR4lv2KSrwgvALcAL2YWBB2QH4BMeU6CDMQStWlJTrTj5Dv062\n8RpuLlJxLPZmFE7FhyUULdU2iGUZKVbj4chFWFWHdi7BV0UqLsQ7mfvHhKM5voBsizAvg8r2rgfw\nDKbXoZ0+IgI9Ly3onVNxF35NrvtjFtbhpgJKZojoakfJzjXhLFyKC0rKdgd9cLlwtp1lPz7AVWlB\nngl4FZOFze6HV4Qj3VxAybRESTWuxUQx0E0YjF4iGBiFZbgSK3FrUn8JhojZ+JH4GC2YgPscbDL7\nJH1IV/R4zBW+ZxjuxDzh74biIfEd9uH7Dt5rKjYk9SopoqOy7S918YT7NOlEJWOwvqJsNl6uIp8t\nG4Q9eAt3ZMqXq57XzBGrmBjcZ8VgS9r9BpPERDsgBhNuq9JWlpcSmUrK6MjyoJhYyDdNnWEYdlcp\nH4uTcGymbI2DTdjeivsdyW84XsyUb8UZOLGi/pBMG/fifjFTiZW0S6zYn/CUtkH/Tn6y1Zw8q7bS\ny+jIslNEl+iagRig+kBsEAPxs4g85ovwttpsqcYWbS8L/yb/LZmyloo6S/FX5n4S1ibX27FI20TY\ninE5umfg7Yq2a9GR5YBMLtEVA9Ga0+4vuFjE0FOEadkuTEkR/ilQZ6AwYyk/Zq7H4BS8lyO7R0yU\naswRfrIaZXRkGYQ/0pv0g7XW4ZeyWySAlYwVH3MeTsPpeF0kb00FOl6EXdr8QyVXiFWUNS/DM9cD\nVJ+5A0RftxbQfygdWQZhW3qTDkSvOvxStqk+EOOEc07ZLvahDiiesR+Kv7W9Uz88oS1Wn4YvkjqS\neosysufLOM8Ms7A6R19ZHVlG43OZivVmI87JebZIe+d6qogwfsuU9XVwWJ1Xlv1P+V0416sTfeeK\njbrh2pu3B7TPks8UH7GS2SKcr0ZZHSm9Rb60tsqzg6j1/GGaiJErmZt0bJnI1B/Fc8JMwWVif6pV\nLO/1mClyl7Rso4iK3hBRR6tYgYszeo4WidJgEWU9mfxaRH6yQoSb0zIyo3Pe82S838G7ltGRZQK+\n7aDddtR6/tAkbO3QGmQPNxbg7i5od5VIYgtRy/lDyhJhO3s6m8SsryepCcw9MOvo/GGy2HJ4WpiY\necKB5UUE/UWUUc1p9xRGimy+nvQVWy8dbm3knT8cp21rYSY+Tq5XChuax0QxWF0REHQHi8WkqydL\nxJ5VLh2dPzQLBwiPi3S+KNPFFkBPZI38nKRWDnnOUvT8YbPw+GT2SRp0ntRsdHT+cI0YqGFi5WxJ\n6t3Sbb08Akgz4mYR068T5mlo8myz2H8Zj6+TZ/tF5rha+0SsQYMGDRo0aNAF/Afddw8rAYd0/wAA\nAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\frac{d}{d x}\\left(\\frac{1}{x} \\sin{\\left (x \\right )}\\right)$$" 15 | ], 16 | "text/plain": [ 17 | "d ⎛sin(x)⎞\n", 18 | "──⎜──────⎟\n", 19 | "dx⎝ x ⎠" 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Derivative\n", 29 | "\n", 30 | "from sympy import Symbol, Derivative, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "init_printing()\n", 35 | "\n", 36 | "Derivative(sin(x)/x, x)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJYAAAAhCAYAAAA7zlIvAAAABHNCSVQICAgIfAhkiAAABR1JREFU\neJzt2meIHVUUwPHfGqPRtUWNWGMMsWGJGo0lSiyxK6JBbEEswaCSEDWgoMQQsK2KFUEQYvSDWBBR\nREFQwRgLCVaQCIpiIxJrQOzrh3PfvnmTebvvrbtO9jl/GKbcuWfOnHPn3nPPHSoqKjqOzfEUxpet\nSEVrnFW2Ai0wG4vQiwmlalLREnvhmbKVaIOObFgblK3AMHA+HitbiZI4Gt/j6pL16MiGdRqeLVuJ\nktgBY7Fn2Yp0GlPxaNlKtMlQD4WTsOEQyqvAPTi5bCXapCNjrE5iFN438r7WoWpYG4sh8EgcMATy\n/hV5JxyAhfgRv4oY7CGsSOWHYi5Wp7pb4Wasysg4E4fjB/Gy26ILV6byUTgeL2bqTMEsdSPPxpwk\nfyfcmJ73Jz5p8i7H4rV0T55W5DeTO1xcIBoB3IpluH+AOv3ZdnfciROwFBdl6iwW8dc9eBPHoBuH\n4Bq8kXlG3j+t2m5PTfxzBH4WM4saj+DzdHy6aEDjMuV74zMcmDl/OSf3XDycOT8Pm2XOd8d9wkDS\nvR8nfabhb/HycHFe6QxL0v152pG/PtOKbYlOIH9tG6zF87g0c/1e4b8sWf+0a7t1/NMlGs3zuet3\n4Yn0oDWYn68ovoJ30/E5+FBklGt0iy+pRn4q/EC6p8aTeCsd74I7hGHgKPVGnGVM0qGroKwd+esz\nrdgWXrVuwyIa0EcabXSZ6ImynUXWP+3abh3/HJYesLhAIeKlenFSQdkVqWwKdsS3+EnMzubmlO7G\nVbn6u+bOv8JNTfQYq/GLqzETtzSp0478PJPxjmi0rWxLWpQ7GAaybY1XNW9Y+fzeRRpjvLx/2rVd\nn39qMVZN8JdNKkxM+6L45Y+0n4SVIg67DqeIsfl20UU+Jsbltbn6n2eO9xYGfKWJHmuxXcH188Ty\nSBHtyM/znuIesgy+1r9tW+G3Acrz/mnXdn3+qSVIv077sU0qfJP2RU6tdYWrsb9Qfo7oKsfjcTwo\ngs0fNMZXeY7D71ieuTYxc7wlvsvV2TI958N+5LYqf7joHYJtINsOBf35pxXb9fmn1rCWi97q2AKB\nZ+Il/KI4ozsl1V2Gg0RAWeMLXCKCvK2SjGy2fxP0YL90frxIGfySzjfAgsz9k8WsJstMPF2g12Dk\nDxddLWyjMA/Xpi1fPpBth4KsfwZjuz7/1IT8mZScjjMyN45LAr8Sgd6lYtpaYzcxdb1QfZhcoHHs\n31nMJFan829FsE106Quwj1g8nqixu75eYyZ9t/RyWc7VfChoV36ZnCoWz3vEkDel4J6BbAujFefy\niq6Pzu2p+2cwtuvzT34WNVXEKj+K4e833CYCRiLqvzyV/4VNcTc+SOWzRMC3tciD9Yqv6TbxhcFG\nomd8UeRhetSHt0ViJvKr6HafFb0l7JGemc2TbC+Gg+mKaUd+2cwXtulJ23KNf2kMZNvpYpZ2sIh7\nl4kU0QyRmzwoXX8bZ4vZ/AwR/nwmJh6L1f2zQnu2K/LPiGW+mJV2AhurpxJeEIFyRUm8LnqlTmKa\nmPlVlMQk6yZ0Rzpb4Iaylfi/s1DEHZ3EHBFIjxbxT0UJPKf/nNhI4xyxVrtG5JP2LVedf0fR2lrF\n8DBNLOpOFisU3ThRTOk/LVGvihHMFuprnGeoL+QuFSmTiopBMUbkh4h/r6pZX8WQs1L8YEesrVVU\nDJrTxX9OE0T2u7aEMq8shYabKnj/b7hYrP2tEou7f4nF3Kc1rvNVVFRUVFRUVFRUNOUfjXRPTj1R\n2RMAAAAASUVORK5CYII=\n", 49 | "text/latex": [ 50 | "$$\\frac{1}{x} \\cos{\\left (x \\right )} - \\frac{1}{x^{2}} \\sin{\\left (x \\right )}$$" 51 | ], 52 | "text/plain": [ 53 | "cos(x) sin(x)\n", 54 | "────── - ──────\n", 55 | " x 2 \n", 56 | " x " 57 | ] 58 | }, 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "output_type": "execute_result" 62 | } 63 | ], 64 | "source": [ 65 | "Derivative(sin(x)/x, x).doit()" 66 | ] 67 | } 68 | ], 69 | "metadata": { 70 | "kernelspec": { 71 | "display_name": "Python [Root]", 72 | "language": "python", 73 | "name": "Python [Root]" 74 | }, 75 | "language_info": { 76 | "codemirror_mode": { 77 | "name": "ipython", 78 | "version": 3 79 | }, 80 | "file_extension": ".py", 81 | "mimetype": "text/x-python", 82 | "name": "python", 83 | "nbconvert_exporter": "python", 84 | "pygments_lexer": "ipython3", 85 | "version": "3.5.2" 86 | } 87 | }, 88 | "nbformat": 4, 89 | "nbformat_minor": 0 90 | } 91 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 6.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFsAAAAxCAYAAAC1WdWlAAAABHNCSVQICAgIfAhkiAAABMVJREFU\neJzt21uMXVMcx/EP05YxxKAIWi2patNQVSXa0AsVPEg8CJIGVdHELaF9kEiQJh406k7iqURERTwQ\nRAgm0qBSl6qSoFrqEnVty6i21MN/nczumTMzex9nejIz+/uy9ll7r7V++3/W+q//+e99KBlQ3IRf\n8QFObLKWQc1s7MJ0fIGVzZUzuHkPL6MV67GiuXIGL2dgN65stpChwMPC2Ec2W8hQ4Busa7aIgcS+\ndbY7AaOVG2Ih6jX2nFSuapSQoUC9xp6dyvcbJaSkZ37AdgxvtpDBzngRhaxutpCBRj1u5OxUftRI\nIUOB/2PsjxspZChQj7HPTOXaRgop6c7hwl/vTsclBSg6syuzejN+apCGWSJFe0uD+utvlokM51Zc\nUKRhUWNPT2UjXchROMTAyYUvwn1ow7v9OVCHcCH3NrjfcRjW4D77k+X4sD8HaMEfwthX9edAA4AN\nYnYXoshsmiCWDqwpOlAP7IexYrP9w8CI3ccIzR1FGxYx9rRU7sKnmIp5YqaPxTVYiHYcgzvE05uL\nxcb6mzDuSOyD60X2cBnOwxNixVyMJcKXPyD84mzxRU8TPvOdKm0tmItX0uc82oale1nfx33PwXX4\nKmlYh3/xVuaavLbIzSOpszXCSA8Jo8Hj+FxsoDOSmEWYiDeq+rksXZ9ldVXdYdiGl7AgU/8gNtbQ\ndjkOTMd5tcH8Gn1lWYCfhQGJCbBNPNyuUGS83KwSxl6OR3W5FHhWV7p1NO4RBrsUn+CgzLVtYjZn\n6dD9C9iIzzI3AdeqHeNnw8a82uAsTFGbydgpZmyWb+0ZIBQZLxct6BQ3eoPwW1m+w1012h0tYvIt\neBI3qv1jqENtYz9dVXeVrqVaoQ03Zz7n1UaEnAt6OPeicH3ZzObYNP5F9YyXN86eIJ6gE0v+68y5\nicKob9Zo9714MLxC/Hh5EJvEss/D3zmuaRdLu0JebVK7I3ro83y8KmZ3hVm6++vc4+U19imp3Kl7\nxHAOduDtTN3xqTxZGGyhWFLH4hk8JjbLRvCbLn9dTW/a4GD8UqPdOLGaqzfimWLP+r2qn1zj5TX2\n5FSuFT50KU5KdXNFBrAz0+fidHyq2BArbMLVYna05xy7Lzp13UdrAW3EfdX6Fbglld9k6vYTxqzM\n2luKjpfX2JXOVuHC1MEk4V6Ot+dyv0345wqL7emnR4nd+sdM3XDdw9Ce6rJlhc3Yvw5tx6mdKv5S\nrODKrGwRr260Je1HiNxQofGyO31vfCvixfli41iqa/ndKXbk7WIJvYDX0rl5YgM5NJ3fLWb03WKW\nzxS79WnCRa0UsfXtYlXsFG9dXZLqzxWb2kYRFS1J44wQ8fDqAtrG4x89x7/jcL9IOg1L/UwRMfQG\n3JruJ+94uWjXlVadWKRhSXFmCEP/Iv9KKKlBHp89KZUrhdFL6qSIsd/q9aqSPslj7ErYV75qthf4\nFX8qX8jpd8YIP12duSupg77cyNRU9pRbKClAX8Y+PZWv97eQkkh9bjWwHsYOSFrxF55rtpDBQm9u\nZI5I7jy/l7QMKR4QGbAR6fNTIld8QNMUDWLWiQxYq0j0/y2ybyUNoiVzPEUk0teK1wp24AqRhixp\nMCPFM7dO8a/dUc2VU1JSUlJSxX82PB3Q/EZSIQAAAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\int x \\sin{\\left (x \\right )}\\, dx$$" 15 | ], 16 | "text/plain": [ 17 | "⌠ \n", 18 | "⎮ x⋅sin(x) dx\n", 19 | "⌡ " 20 | ] 21 | }, 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "output_type": "execute_result" 25 | } 26 | ], 27 | "source": [ 28 | "# Indefinite integral of x*sin(x)\n", 29 | "\n", 30 | "from sympy import Symbol, Integral, sin, init_printing\n", 31 | "\n", 32 | "x = Symbol('x')\n", 33 | "\n", 34 | "# This initializes the SymPy printing system\n", 35 | "init_printing()\n", 36 | "\n", 37 | "Integral(x*sin(x))" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": { 44 | "collapsed": false 45 | }, 46 | "outputs": [ 47 | { 48 | "data": { 49 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAATCAYAAACgLP7RAAAABHNCSVQICAgIfAhkiAAAA8RJREFU\naIHt2VuIVlUUB/DfpGblRGM6kt1MyUqii073CLtoRBDhQ2ggMakZFT1EPSSBxUCBUdEFiihyrIfo\nsSIQAhlIzCIqLIqiYMpuY5h2QRyt7GHtj858c+a7zJzTyPT94eOcs9faa//XYp219tkfLbTQICaN\nN4EW6uJKfIiDeHc8iRwxnotPQEwpweZsTMeZJdhuYRzxAk4qwe7pmFyC3aYw7gQmGKYop7p8VYLN\nptFKlsMbU3EaOvEHPh5PMkUmSxdW4pBwcA1uR4cozQ/i66R7PtZjL/aLvdOL+CBj72LcjYHEswOP\n4IuMzjJcij0isDPRhruSfBKWYnOTPCfjzwzfMlHLh/l4HNdiE7qTfo/YyzyF7bgK03Ah7jV0I3zY\nxWA+nhFOQi++xGW4HH8nJ6Sx38Quv4KX8U3m+QaRFJ2ZsQXox8LM85YqHivS2hXcjPZR8rx1uJt1\n0SuC3yga8YF4ibJjM/A73sLqzPjTIkZZFBaDor6G7sH9IlOJLN+DbfgWTyRSbdiId9CXmb8b76X7\n9qTzHH7O6HyO15MMzsUsHJvReTPZqmC2KN/N8iT2CQuVi0Z8YKgPknw35uGlzPinmGPoS1ZKDM7D\nR6IvNvLbmJk7p8rW93g4Z41LEsmePAIJy5POdTmyO5OsCydiF37FK6JlZYM0TQQmi0Z5Ep+rq0eQ\nbZIfk1/w2Qiyrhw79XyooM/watOPV6vGuv3bWig3BoVggSC8JEe2IsnW1pi/rsb825JseXqei+ex\nM43vF2WX6L1rRsmT6NnraszPQ6/m2hC1faigT36yVI91G5oshcagjEO5a3BAlLUK5qXrD+k6vcb8\nH9N1Vo5sRroOiBI+KDZmp+BUvCYCP1WU1vYcG43whOMMbwdFo54PY0WhMSgiWY7GozgnPS/FDuzL\nrHFfut+G73B1jp1lOEH07H3yTyy70vytWCQqVQU7sUps0DqSjax/zfAk2vL2HA5Fop4PY0WhMSgi\nWa5PC5yNs0RmDmbkD4h+THyKrcJi3JjR6UzEfxKZvFb0ytkZnbniE/GWZEdaN9vjTxY7+4H0vAtH\njYJnZb0dNfwuCvV8IA76qo85RhrLXikwBm3GjpkiWyvl6iE8K3rvAbyBt6vmXJT09oq2M4gNYqNX\nwRW4I+n8hWPwJD5J8pVis3Z8WuuQeBs3iDcUjhRVbHOTPM9IazZ7xtCb7PY3qF/Ph8V4DBeIPxK3\nirOV9aIqHcT7uCmNLxEtvl98gPT472PQQoPo1fwGt4X/KRYp57+hFlpooYUJin8A+iwov09eSSAA\nAAAASUVORK5CYII=\n", 50 | "text/latex": [ 51 | "$$- x \\cos{\\left (x \\right )} + \\sin{\\left (x \\right )}$$" 52 | ], 53 | "text/plain": [ 54 | "-x⋅cos(x) + sin(x)" 55 | ] 56 | }, 57 | "execution_count": 2, 58 | "metadata": {}, 59 | "output_type": "execute_result" 60 | } 61 | ], 62 | "source": [ 63 | "Integral(x*sin(x)).doit()" 64 | ] 65 | } 66 | ], 67 | "metadata": { 68 | "kernelspec": { 69 | "display_name": "Python 3", 70 | "language": "python", 71 | "name": "python3" 72 | }, 73 | "language_info": { 74 | "codemirror_mode": { 75 | "name": "ipython", 76 | "version": 3 77 | }, 78 | "file_extension": ".py", 79 | "mimetype": "text/x-python", 80 | "name": "python", 81 | "nbconvert_exporter": "python", 82 | "pygments_lexer": "ipython3", 83 | "version": "3.5.2" 84 | } 85 | }, 86 | "nbformat": 4, 87 | "nbformat_minor": 0 88 | } 89 | -------------------------------------------------------------------------------- /demos/Awesome Calculator - 7.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAA7CAYAAABxLwS8AAAABHNCSVQICAgIfAhkiAAABdBJREFU\neJztnGtsFUUYhh9sudQiFC1oVaAgIASlIlQijUARDGKiknhNiIAYideo8ENjogZjjMaq4CUx/EBj\njBjjH6OGaNTGEBBFvCCaiEgF1HgBBLRWi60/3tmcPbvn2Nk9Z8+epvMkzXT37Oy83W9n5pv5vlNw\n9Dr6JXz/GcBMYCjQBDwIfJBwm44CGAw87Du+CmgHTktHjsOGKUAXcIY5HgJ0I+M5ypR+aHj0huDJ\nyGhTU1PkiMyLQEvaIhz2XA88SvKOj8OS24GDwHbgzByfL0RGAxgE1JdGliMfzcAx5NbvAjYFPp8F\nLAdOMT+XA+eXUqAjzEfAW0AVsBvY4PtsLHAEOR/+nyEl1ujwMQMZYUnaQhz2PI2MdnLaQhz27AV2\npi2iL3JczHrjgZGEHQ9HCYhrtLmm3FosIQ574hqt2ZSfFEuII3l+AjqA/mkLcdgxAXmN29IW0leJ\nMzzOMuVnxRTisKcQo31RTCEOe+IYzds73FFMIY7kGE5mD3F4ylr6LFF7mtfLfgF+LbKWQpmDQkR3\npazDhhYUFTkCXBy1clSjzTRlOQ6NdcAwcsf0yo2VwBNANfBh0o21oqHx8aQbisk4oDJtEZasBz5N\nupEK4A9ktKVJN9YH2IN6W2SivJUTUXcG+DxOYwkyEKUxDEcvVrmvIUcjva1xKkcxWqMpjwFfxWks\nB9OAxaj31gM3ACuAGpTUej+KiAMsQo7QIWSkWpQodAuKOrQAFwEvoJFgEbAazXVr0NzRjF68RjSv\nbPFpqQDmAxsj6qtEz2Q3+ZkL3Ax8Z9rfiXJCg9nWUZ6HFc+YmxWrl40HniKTofU88A1ydprQH7XS\nfDYJeC9Q/xpTx8+2wLmTgKPAmyhXxWMt0Baoey3Kio6jb1nor8uwHPiNTEJTndG0PXBdlPas2YqM\ntj5qxTw8S2a4BXiVTKhnJPAYeugAVwNfAif4rq8mnEfZStiQbcDXZKfv3Uh4rRlcKkTRdwG5k3Ab\ngE7Ue/zsJ+zMRWnPigqUh98N3Bql4v8wOnD8A/BQnmtPRWvDwyjp9TZyL+5byW20lwPnlpIZgkAP\n684C9A0juyd7vIGGc380pN60fWnc9mzXaRNRxhUUb3f/e9/vk5Bh3s9z7Y8okWgDWkSvBfahIc2G\nv3v4vAYNWXH1HQVG5LjnAuBt1Ns85pB7PrNuz9Zo55iyk2Q8swuBf4DNvnNjfb9PQQ9+BRoqRgGv\nAM8hp6RQDpE9n0XVNxQ4EKgzDo1QWwLnZyO/4PfAPazbszVagyl3oOBnoVShNPGzzfF8FDVo9+la\n5bv+XOR4eOxDWctd6I0ulHayn0VUfQ2EdzYOm3Kv79xAZBCvB3nzaKT2bI3m3axYOSELjYjJaOgd\nS/YQdi+au/ysInseOx15Vz/7zvUnvIzJd85fgubMQTH1jSEcqvoWjUpeD6lAaYfVRvcIMvu3kdqz\n/ULEfrROWEZ4oo9DLXqzvCHlAeQ9daBh4XXgHd/1i9FEfaK5phv1sEdQr5uNvKvpaAjfhNZm96Fe\n2omyoa805+ch56ENecOrgQFoPbUxor4JwL/kXj+NA55Em8OV5h5T0fprD3A3MlzU59EjNWTCMZOi\nVHSkRxMy2AHcV5XKAps5bbIpNyHjOVImitHcfyUoE2yM5rn7LgW8F3EQ+BOXmNprGI3mseAOuyNF\nehoep5ky356bIwV6Mtp5pnw3aSGO4tGK0rx6S7JMn6cK+At4zXduOgqLLAHWoW0aRxlxCXJCrjPH\nA1DMp84cNwIfp6DL4WMN2qkeYI5fQnGm483xfLK/Y90PZT6NKZVAh/A7IvNQ2KACBRqvQHl5Xkyn\nnuxAXzcy6lmJq3Rk4XcwNqPYVA0KV+xCoQ+PWjIG9OggO9nGUQL8Pe0e5OLvRjGcBWQH4g4T3uUf\njNLDHGXKXLJzHitRT+sNX3jos1SirKhR5riZcMKlowRURLi2C+U83ISSJi8D7iCcheRwOBwOh8Nh\nxX/2NkXO0A8XVAAAAABJRU5ErkJggg==\n", 13 | "text/latex": [ 14 | "$$\\int_{0}^{2} x \\sin{\\left (x \\right )}\\, dx$$" 15 | ], 16 | "text/plain": [ 17 | "2 \n", 18 | "⌠ \n", 19 | "⎮ x⋅sin(x) dx\n", 20 | "⌡ \n", 21 | "0 " 22 | ] 23 | }, 24 | "execution_count": 1, 25 | "metadata": {}, 26 | "output_type": "execute_result" 27 | } 28 | ], 29 | "source": [ 30 | "# Definite integral of x*sin(x), 0<=x<=2\n", 31 | "\n", 32 | "from sympy import Symbol, Integral, sin, init_printing\n", 33 | "\n", 34 | "x = Symbol('x')\n", 35 | "\n", 36 | "init_printing()\n", 37 | "\n", 38 | "Integral(x*sin(x), (x, 0, 2))" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": { 45 | "collapsed": false 46 | }, 47 | "outputs": [ 48 | { 49 | "data": { 50 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI0AAAATCAYAAACtMo6WAAAABHNCSVQICAgIfAhkiAAABDBJREFU\naIHt2WuoVUUUwPGfptxSIyPTHvZQrIjITElLtIdlFFHhh9JAypKsiIqyL1FJT6MP0pMe9LpmREZv\n6flBpMQeJgUFZV+yjMrMipKwqOzD2ps7bo/n7nPPPt4bnT9c9pk1s2fWrDuz1prZtGnTi0zEC3gd\nn+Ax7N+rGgUDcXBS7k7PfXHZzlKuJCfiJ1zTZD99yhbj8RaGZuUheBs/FJTc2eyC6zEoK5fV83Sc\n28MxB/bwvXqch614uIk+esMWdXkVYwqyo8VEn2nFgCW5HGOTciN6PoddezDmI1rjYcdgQBPv94Yt\n6rIZX2N4Qf4zfqx6sJLshqUFWSN6XqVnO6xT73rXWlRqi/4VKfUlRmBwQf6HULg3mI7VBVkjer6D\n01qjWkN04DBMwbge9lGpLZpxdynHYnd8n8j2y5RaUWg7DgvwC7aIhfsoPkzaTMIV2JDpOBQLsTZp\nMwPHiZ3RgWHoJ9wwnCySvJ7q+Q2OqDXZFlBvLodgEU7FYszJ2t8iEtV78B5OEgvgGMzHu0n//xlb\nLMTfmJzIJuNXcRrIeRJfJeUzxeLYO5EdjnUi5ubl5YXxZonQkPO8chOtpSeR0H5R4v0inRoLT2Xm\nQmyqVLYXfhO5ydxEfq+wVUqltqgqPBUZLTzFHViVyfrhCeHqViRtN+H97PeQrM2D2Ji0+QwvZ3VE\nQjdc7JScZVlfOUOEq21Uz5xBYoG3mjJzIXKQlE3Z32g8nsg/xUG23XSV2iINT0eJldyvm85zPsKF\nNeQdeFqcIm5I5JNwqO0TsquT32eIHfR5jX7X4kpMEAtvuHCbr+ADkfHPT9pvxJ519N+RnjnDsv53\nxGJhsyIHivuPP2vUzcWagqzMXOrxsTjx5OTjDta18Vpti6ZZIuJtkVlicvPqvHtd1uaUGnUXZ3Uz\ns/IocW+xPpNvEfcZOTeK2N+onjkzxamhUTo1fnrqbi6Ed+4syNbVkM3J+kh1qNQWVYenm0TsW5DI\nzs+e32bPeiv+u+xZPAYSHohIjscKd3sJDhC7e6kwfEfW7g1M7YGeOdPwUh1dq6LMXJqlUltUuWhm\nZ/3dWpBPyZ6rhIubVuPdGdhHxPLfxRGzyITs/ZXiNnNWUrceF+EfXTecqzHS9je03elJnCI22zZB\nbxVl5tIsldqiqiP38bgLb+KpRD5AV7z9SxhjGc4WiS2RsE3Hi1l5Hu7EQ7o8zyhxpDwn6weuFW41\nj9sjxY7ZkIx/Ny4QR/qyevbHpbi5xLyrosxcBtr+/7UjWfrM6XO22JQNVOuvuIon4jWReC0Sx7w9\nCm2mZvUP4D7xIe3IpH62+I6yCLfjNtwv3HuRs3QdN8voOUL9ENodnRrLabqbywnCU2wVSe5ysenW\nJLKV4s7mWfFhc6u4vEtDDjvfFm1K0qnvfUZo08cZrzVfutu0adPmf8S/B5Y7C3BCsQYAAAAASUVO\nRK5CYII=\n", 51 | "text/latex": [ 52 | "$$- 2 \\cos{\\left (2 \\right )} + \\sin{\\left (2 \\right )}$$" 53 | ], 54 | "text/plain": [ 55 | "-2⋅cos(2) + sin(2)" 56 | ] 57 | }, 58 | "execution_count": 2, 59 | "metadata": {}, 60 | "output_type": "execute_result" 61 | } 62 | ], 63 | "source": [ 64 | "Integral(x*sin(x), (x, 0, 2)).doit()" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": { 71 | "collapsed": false 72 | }, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKEAAAASCAYAAAAzD75tAAAABHNCSVQICAgIfAhkiAAABDdJREFU\naIHt2luIVVUYB/Bf5lheshA1CcPMzHoppTJC6qUg6qHEhxAS6qmwCyQpllBJId0o6UJGBQ0VVBRh\nlEFEGvVQWFBRRAVBpkk10n1quoz18O1D2906Z/beZ5/x5fxhWOz1/df+f2udb92+PfTRx0HGIW3q\np+AdnFLzvRfgYXyI3/EH9ufsO/FQm7ZrMYDba/p2B17Ep5nufFyEJ7Enxzset2AEo5iK9fimpu6i\nzOdd+AczsQ7fFnhldZvmle1Hk7q14+AMvCsGsi6uz9qn/vbj/Dbt5mEYG9vYy/hW1BvFTQXOfOzD\nilzdKjFYE2voHikCfFWubgM+xqQauk3zyvajad3KcXAytmFQzJRugnALjhUr2oRc/TLc16HdI5nu\nxi5825W9ZyvuwakJzlZ8X/BtspjVl9fQ3YTvHPgDzMBfWF1Dt2le2X40rVs3Dsic7SYIH0zUTcMr\nwtkUVmCldBBW8e2NMXybJIJjZ8L2GV6uofs5XkrUf4TtFXWb5hUxKN2PXuiWioMJCVITuCZRdxdu\nFmeDIqbhQjzTI3/ymCFWrJGE7Scsrfi+I7AQXyVse3FaRd2meWXRC91ScZA6N/QCy0TAv9fGfqP2\nF5GqmJS9b6Y4dyzADWK1giH8hsMTbY/BLDEuf5fUm5eVPydsw5iOwyroNs0r24/x0E3GQa9WwiLu\nF7fWFBbjV3zRkNbReEocitfhBbyFOZl9FM+K210+OzBHDCIx28tielb+mbANZ+VRFXSb5pXFeOgm\n42A8gvBcsf9/mbBNwBpxgWgKJ2J37vlpsWVuyNWtFwfrK7LniWLr+CB7Hq2g1+KmzlkDWXloRd2m\neWXRS922cTAeQXiVuJGlcKU4KKdWkbooDsCo2EIuztUN4Uwxe+8VF6FHxfY9Iga4LIY62KZm5S8V\ndZvmVelLr3Q7xUESg7q7HbcwILbaTQnbHDyQqO/mdvym2HqL2CN9kC5iN16vqDtVDH4q5bAdP3Sp\n2zRvUPXftlvdTnHQ85VwqfiR9iVs5+EkkXNq/W3LbCuz5xWJdp2wRGy9RcwU+cNOmIW5eK6i5jDe\nF/mwIk7w3xbVrW7TvLJoQrdTHLTFoM6zZaH2+b48Lsves3osYobjdLcSPi8CLo8lGT//1eQ6kVye\nm6tbK1bM1K1vLN1b8bUDD+oLMv7VNXSb5pXtR690O8ZBu5Ww9aIpCds5Iim5tU3bPGZnZdkz30Ch\nTKGTb3dis0iJEEGxBm+L/FQL00SaoZVGWCJu0pdov2130t0iZnr+s921+ESclarqNs0r249e6ZaO\ng9l4VXzvbH3fG8IOXJrjLRIf5dv9A0Iey/EjTh+DNz3T2ZvpjojAWV7RNzhbbAlPiIlym//Pzsm4\nG4+L1fM1nJXwq4ruYnGc2IzHRGqouEWX1W2aV7YfTeu2UDYO+uijjz766KOPg4N/ARbH5SH22Sg0\nAAAAAElFTkSuQmCC\n", 77 | "text/latex": [ 78 | "$$1.74159109991997$$" 79 | ], 80 | "text/plain": [ 81 | "1.74159109991997" 82 | ] 83 | }, 84 | "execution_count": 3, 85 | "metadata": {}, 86 | "output_type": "execute_result" 87 | } 88 | ], 89 | "source": [ 90 | "# Convert this into a floating point \"single\" result\n", 91 | "Integral(x*sin(x), (x, 0, 2)).doit().evalf()" 92 | ] 93 | } 94 | ], 95 | "metadata": { 96 | "kernelspec": { 97 | "display_name": "Python 3", 98 | "language": "python", 99 | "name": "python3" 100 | }, 101 | "language_info": { 102 | "codemirror_mode": { 103 | "name": "ipython", 104 | "version": 3 105 | }, 106 | "file_extension": ".py", 107 | "mimetype": "text/x-python", 108 | "name": "python", 109 | "nbconvert_exporter": "python", 110 | "pygments_lexer": "ipython3", 111 | "version": "3.5.2" 112 | } 113 | }, 114 | "nbformat": 4, 115 | "nbformat_minor": 0 116 | } 117 | -------------------------------------------------------------------------------- /demos/Interactive Mandelbrot Set.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "metadata": { 7 | "collapsed": false, 8 | "slideshow": { 9 | "slide_type": "-" 10 | } 11 | }, 12 | "outputs": [ 13 | { 14 | "data": { 15 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAADgCAYAAADlhtpvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3W+MJOWdH/Dvr6q6erqnZ9jp2dnZXRZGJ9YBgbAAIdjz\nxeIc+wDb0eGTUAJ+4bMj5XgRv4sSX3SW8sIvQvIqsqzTySfLsiVbJCLyHbEPBVsnWbKiI/gM+LwC\njAXegz0WWGaH3Zme6T9VT15MP7VP11T13+r60/X9SKud6a6teqZ2+vnV83v+iVIKRERUTlbWBSAi\nouwwCBARlRiDABFRiTEIEBGVGIMAEVGJMQgQEZVYIkFARL4lIu+KyC+HHPN1EXldRF4SkbuSuC4R\nEc0mqZbAtwE8FPemiHwawC1KqY8AeALAXyR0XSIimkEiQUAp9TMAV4Yc8giA7/aPfR7ADSKymcS1\niYhoemn1CdwI4C3j+4v914iIKENO1gUIExGuY0FENCGllEzz79JqCVwEcJPx/Zn+a0RUECIy9Hsq\npiSDgPT/RHkGwBcAQETOAdhRSr2b4LWJaA6GVfxcfHIxJJIOEpHvA/h9AOsi8o8A/jMAF4BSSn1T\nKfU3IvIZEfkNgD0AX0riukQ0X0opiAiUUqz0F5Tk7T+WfQJE+aKDAOVb3vsEiIgohxgEiCiWiMD3\nfXYCLzAGASKKJSKwbZvpoAXGIEBEgfATPzuEF1/uJosRUfrMyt+yrKDit6zD50Tf9wdGCtHiYEuA\niAae+C3LguM4cBwHvV4PKysrwev6b/YRLA4OESUqiXGe4kUElmWh1+sNvO44DkQEnuexJZBTHCJK\nREPpdM4o4QCgX2Plv5gYBIhKQEQiA4B+8jffd5zorsJxWhFMExUPgwDRghtWMZutg6WlpdiUkeM4\nA6/HnZOtheJhECBacOFhnvqJXf+xLAvHjh1Dq9WC53nwPO/IOXq9Hur1Omzbjnzi56ih4mLHMFGJ\n6MpbV/6+70dW+qPokULA0b6GvNUpZcGOYSIayrIsWJaFer0Oz/Pw0ksvoVarTX0ujQGg2NgSICqR\nuCGg0zh9+jQqlQrefvttzizOgWlbAgwCRCWjc/rTpIGi6FZB3uqSsmE6iIjGIiK4/fbbEzlXrVbj\nsNCCY0uAqATCFbXv+4mc17ZtOI6DTqeTyPloemwJEFEkHQD0pLCkAoA+d6/XGxhySsXCIEBUAkop\n+L6P5eXluV+HioXpIKISSbpTGACq1Sq63S4DQMaYDiKiocyJYklhACg+BgGiktBLPpgTvWal5xsk\neU5KF3cWIyoJXWErpYINY5KSZGczpYvhm4hmwlRQsbElQJShLNbdSeo6TAEtBv4vEqVs1mWYRSTY\nAzjqfOPwfR+2baNarU78bwGg0WgAGB5QxgkS8woknLMwPgYBohSYyy3rik9/P00+Xa8IGj6X+b75\nWtTXSil0u13Ytj32dU+ePAnLstBqtSLPbYrrhDYnlimlEt243vzZmKYaD4MAUQrMJ1Pf9wcqq2n0\ner2gYzeqZWFWrCKC5eVliEhQ4Z85cyY4Xik1ViCwbRvvvfde7LX0MtXmeeMqdzOAJVlhs+KfHPsE\niFKiK/9ZduEKP13r84VH+ogI6vU69vb2AADXrl0LlpBuNpvY29ubuAUSnmB2+vRpuK6LnZ0dXLt2\nDbZtD1T85sY14Z9XX9u2bXiel8jOZPpecKTSZDhjmCgl4ZSM+dkLp4uGzeg1z3PixAlcunQJKysr\n2NvbQ61Ww/7+flAR3n333XjxxReT/lFG0pX76uoqdnd3AVz/GR3HCVoeIoKDg4NEn+DLutUl9xMg\nyrGonL2uqHWlH86Vxz3R6g5hAOh2uwAOO2pbrVawX/DOzk6i8wCmVavV0G63sbW1hQsXLhxZcdRx\nnMiWAk1u2iDAdBDRnIXz/zpl4fs+VlZW0Gq14LpuUKHHBQAdHDzPO5LD10/bebO/vw/gsLJvNptY\nX18feL/X68FxnLHWMtJ9GvrYqMARda8ZYIZjECCas2GV1bVr11CpVNBut4P3LMsK0jqa4zhB7n9r\nawuXLl0CgOCpP+/iWiW33HLLQMAzK/kwHQCH0SmnYak3GsQgQJQBc+kG3QLQ1tbWsLOzM1B5rays\nYHt7GysrKxARfPaznwUAPP3006mXPQmrq6sABlsw+uedZt4EcLSlReNhnwBRyvSTquM4Ay0A0/Ly\nctAS0E/Hi1yxWZaFSqUCy7LQbrcHgoC5GY5uNYVHSIU72fX7i3zPwriUNFEBmGmKuAAAAKdOnQIA\nLC0t4fTp0wtfmfm+j3a7jU984hMABmcS6wreDJq6T0XvjaC/1sfq981OdIrGlgBRiizLCiZnhdNA\nUcfqsf1loecaLC0tBS0h3RIYdR/MyWfarJPyioQtAaIC0JWRUgobGxuxx+mhk2UKAACCp/per4e1\ntbXYyXAm13Vjl8/g8hGjsSVAlAH9lD+qNVBmulVQr9dHDoHVLawyy7QlICIPi8irIvJrEflKxPsP\niMiOiPyi/+erSVyXqKh0haVHydBRnufhxIkTODg4yLooC23mloCIWAB+DeCTAP4JwAsAHlNKvWoc\n8wCAf6+U+sMxzlfucE6lER7LnuTm74tk2NwBTafP4tYqKoMsWwL3AXhdKXVBKdUF8BSARyKO4+Le\nRAY9KezUqVMMAEOMuje2bQejg8oaAGaRRBC4EcBbxvdv918L+10ReUlEfiQitydwXaLCMTsw9eJp\nFy9ezLhUxaY7fxkAppPW6KC/B3CzUuouAN8A8FcpXZcoVcM2R9FDHfUxH/vYx9gCmJC5ZtLp06e5\nxWUCkriDFwHcbHx/pv9aQCm1q5Rq9b9+FkBFRJoJXJsoF8w19ONYlgXbtlGpVAAAP/3pT1Mp2yLx\nPC+4j3r9JD79zyaJIPACgLMisiUiLoDHADxjHiAim8bX9+GwQ3o7gWsTZSpqoTJzSWjzfc/zsLKy\ngna7vfAzgOdJ748MMAAkYeYgoJTyAHwZwHMAzgN4Sin1iog8ISJ/0j/sURH5lYi8COC/A/jXs16X\nKA90pW/b9pFWwPr6OtbX14NgUK1WceXKlYxKuli+/e1vo1KpcDP5BHCyGNEMotJA+ms9y1VvrFKv\n19HpdAY2VaHpmX0s7FvhshFEmdAjUyzLCrZNNDeBB65vrHL27FkGgAT5vo9qtRq5VhCNjy0Bohnp\nCUrDnkrX19fxwQcfZFC6xRfehCdvdVpauMcwUcb0rFWmJtKlA0CtVkOn0yltpzvTQUQZ08MXuYZ9\nunQLgMF3OgwCRAnRe+DqXDWlR/fFjNsKYN/BdQwClJoyzO7UP+O5c+cyLkm5fPKTnzwyLwOI/53L\nWxo8S+wTIJpBrVbDwcFBMF9gaWkJSqkgRUHp0fsPjNpZzOxEXiTsGKbSCm80nhbXdYOOYL3cMces\nZ0v3yei0UK/XO7LhjB7NtWjYMUy5Nq8cbBYBQO8KpvsAGo0GbrjhBgDAY489lmpZ6KhOpzMwV0NP\nKgOye2DIM7YEKDU6ZZKULJ/o9DIQnU6HT/45MmwDGh0MdMpo0QICWwKUe+MEgEmChA4AWYz0UEqh\n3W4DAO6///7Ur0/R4gKA4zgDAQBg57DGIECpiRq9MStzkxbz7zToCuXnP/85nnzyydSuS5PzfZ+b\nzsRgOogyY1bY+vdw2ia6DjDh0SFx10mKPvcidjQWlZkSchwH9XodrVZr4dN206aDOLWRMqMr5Lix\n3Pr1cStYvZAbMJgW0HvPJskccfKpT30q0XPTbHTHPXD4O3Ht2rWMS5RvbAlQ5qJGbpidyOP8jobT\nQKPGis9aXr25OcDlCvLIDAJlwY5hKiwzFSQiwWYh+okuaq1+8/tarYZqtRp0/pn70Eadf1Z6VJLn\neQwAOVWpVIJtPGk4tgQoF3R6xfd91Go11Ov1oBmvx3ubWzfq7/W/Ndfvr1QqkZVzeKnnSdNN4XPp\nVSu73e7E/57SoXd8K0OwZp8AFZqu0F3XPbLxil4OQAtX5uFK3Bw6qgPH8vIyDg4Ojrw3i4ODg1JU\nLkXH/6PhmA6izOkne8uyInfeqtVqwXEiAtd10e12g7z8xz/+8YHj19bWgnSNftq/evUqOp1OIikh\n27axsbGBjY2Nmc5D8xfVyuMKooOYDqLMhD+M1Wo1cmEv13XheR5c151p4a9KpRK0DMynQ70M8Th0\nH8W4x1M2dL+Q2R+UZCswj9gxTIUTHtMfl1s/ceJEbICYRLfbRa/Xw5133gkRwebmJjY3Nyeaeawn\nHbmuO1NZaL7W1tawtraGW2+9Fc1mM3idrYCj2BKgzJlDRLPI35rzFEZ9HnRZbdtmh3CBmIMF8lbn\nJYUtASosc26AZVk4fvx4qtfXm8TrkSTDnhYty0Kz2WQAyDnbtgeGCnNGdzyODqLM6TkBOl9/+fLl\n1MuwurqKK1eujNz9zPd97O3tpVQqmtZtt90GAAObzy9qX8CsmA6iuYta8tkcvuk4DlzXxfnz57G1\ntZVRKQ+ZHYpRnw3btlGr1bgUQc4tLy8DAFqtVsYlSQ/nCVBu6aew8JOYTrt4nofd3d2sijdA7xIG\nHB1Fosv7ta99LZOy0fh0a81c3oOisSVAqbJtG5ZlwfM8VKtVHBwc4NixY9je3s66aAP0FoXhIJDE\nKCWav7W1NQDAzs5OxiVJDzuGqTB6vR7W1tbQarVgWVbuAgBw2EegWy9mZ3HUZDbKn93dXezu7nJI\n6BjYEqCJJLGlox6Fk/cRNs1mE71ebyBVVZZ1aBZFtVpFt9stRYcwWwKUiiQ+THpJh7zb3t4+MjO4\nCOUuO3P1UN/3j6wqS4PYMUyp0J2seihoo9HIukhjabVaRxawo3wLLz9OwzEI0MSmGW9tLgNdtKdp\nji8vlrynGfOG6SCayKyVYRGH662urmZdBJqAHhkExG9dStexY5imMmzz9qgn56zXB5rVLBvQUHos\nyxrYaD5v9ds8sWOYUmWmd8whlObfSW3nmAebm5sL87MsqnvvvRdKKfR6vdgZ33QUWwI0tbhKUbcE\nHMc5Mrqm0Wjg6tWraRQvUXoNmiK2YspEDzwoo2lbAgwCNDO9/o/ebEUvCAfgSBAocjrFTDNQvujd\n5srcic+1g2juzA9YuBXg+37sblvNZnMhpu8zHZRfutVZ1gAwCwYBmoruE9CWlpZij93e3ka1Wi38\nlowMAvnEReJmk0jHsIg8LCKvisivReQrMcd8XUReF5GXROSuJK5L8xFX2YU7gzXLskauAtputxMt\nYxYYBPKJAWA2MwcBEbEAfAPAQwDuAPC4iNwWOubTAG5RSn0EwBMA/mLW65ZRWtPfRzWp9UqgOhiM\n+4Rf9Hy6uRwBZa9arTIwJyCJlsB9AF5XSl1QSnUBPAXgkdAxjwD4LgAopZ4HcIOIbCZw7dLIwy+7\nLoPO/zuOA8cpT0aRm8vnR6VS4YquCUniE3wjgLeM79/GYWAYdszF/mvvJnD9XClTx9QipHgmceXK\nlayLUGp6DacyfcbSUJ7HuJTM64ldD7vMMqUSnvVbrVYBlCcYrK2tMRBkyPzdr1QqhR9okBdJpIMu\nArjZ+P5M/7XwMTeNOIaGyMPTjy6DZVnBkLwyfRCZfsiPbrfL9FxCkggCLwA4KyJbIuICeAzAM6Fj\nngHwBQAQkXMAdpRSC5cKmre0WgGjWjOe5wVbL+qZweMo+rruXJ0yX9rtdi4ejopu5nSQUsoTkS8D\neA6HQeVbSqlXROSJw7fVN5VSfyMinxGR3wDYA/ClWa9L8xP3wYrbeN33fTQajaHDRHXqqMhY4eRT\nErvdlRmXjaCxDZsxbFnWWDOGi/xhjVoLifKhXq/j4OCg1IGay0bQ3JkfsHCLwLKsYFbwsLWDiqzM\nFUze6SUjyrx20LS4lDRNzZw53Ov1gg299XK+UYq6QUutVsu6CDREp9Nh5T8lBgGaWnj5CP0h1H/r\nQGB+OPf29lIsYXKOHTuWdRFoBL2fAE2GfQI0Fe4sRnnEncUmx5YATUxX8nGzN4e9VsQPZbPZzLoI\nNCbf97G6uhr8bnKP4dHYEqCJ6Cf6aX5vdIdx0TqLHccJWgBsCeRfWXcXY0uAUjNtADCfzorUQVzG\nCqXIuNrrZBgEKBW6ItVP0qP2H8iLer3OIFAw4dnsZVrpdhoMAjSRJBbI0513eddsNo9UIEUod9mZ\ny3tkvehiETBE0kRmzYnrrQB1Z2teZ+E2m018+OGHbAUUlE4JeZ7H/8MR2BKg1DmOgytXrqBerw8E\nhDy5evXqwAgoXZFw5cpiaDQaaDQaDABj4OggSoWeWBb1+5a3uQN68xIgenmMl19+GXfccUdWxaMJ\nlGkTeo4OotzSQ/bMDjvgegVr2zYajQYuXLiQZTGDsmjhgKW/P3fuXKplosktLy9jeXm5NAFgFmwJ\nUOb0E7ZeACyLPgK9a5ieXDRsOe1qtYr9/f00i0cT0i21N954A51OB77vL/zictO2BBgEKBfMUUfN\nZhOXL19O9fq2bQ+MJIn7XNi2jWPHjqVePpqMbtHp/8+4FN8iYRCgwsp6XSFzaYFRnwddVtu2udNY\ngVQqlYVfT4j7CVDhxc1BOHPmDLa3t9FqtRK5zkc/+lGcP38eJ06cCK6r0wWj6JRVEvMlaH6OHz8O\nANjY2MD7778f9EcNG6BQVmwJUGbCFWlcrt11XXieB9d1Z8rFVyqVoCIwWxy2bY/dD2FZVmb9FjQ+\nnQ4yd8LTncSLGgQ4OogKJ7wKaVx6xXVdKKXQbrdh2zbq9TqA6xOCHnjggYHj9VMgcDgnQVcI3W43\nMuU0SYWuK5LNzU2cPHly7H9H6fI8L5gopkemUTS2BCgXdKvAcRx0Op2B93Snnn6K10/jZmVufsj1\n8fqJT0SwvLyMg4MD+L4Pz/OG7ocwbnnzNr+BjuI8gdHYEqBc0JVyp9NBrVbD+vo6XNcNWgGm8JNd\neM348DBPpRR2d3cHKuwkcvtLS0tcsbIAuN7TcGwJUC6YcwUcx0G32x3YzcvM7YZn8S4tLUEpFaQA\novYsmPXJ36RbGmwF5Fe1WgWAI63KRcYholRY5hBR8+l9kg1swk/04UAx7nnGLa+ZZmAwyJ9Rk/4W\nEdNBVFjhStp86p80XWNZ1pH0UNKjQcJLYHz+859P7Nw0O6boJsOWAGUmKkUzbYVtjv+O2+TevE5S\n9LnL0vlYBOZG847joF6vo9VqLXyLjS0Byr3wk/2wzerHpUcKAfEVcRLXGUZE8Oijj87l3DQ5s7Lv\n9Xq4evUqg/QQbAlQrkzTEshq8o8Oavfeey+ef/751K9P43McZ+4PA1ljxzDlntnZmwTLsjJ7wtOr\niXY6nYVPMxSJmQoK061Gc85J3uq/WTAdRLk2j/V2xl3vJ2nmZDWlFFZXV3H8+HFYloXHH3889fLQ\ndVGVuuM4wfBj8/1FCgCzYEuACi+rJzrXdYMZyPoJlLOIs2VZFhzHCVqIvV4vCADmMYvYR8CWAJVW\nVg8ynU4nGI6oJ6dVq1XUarVMylN25hpR5sTBMD2RjA4xCFBqoj6QRbe/vz8wv6HT6aDdbh9Z1I7m\n68EHH4x8PaqVyF3hBjEdRJQg3UdRqVTQbrczLk15mIsMjmPROoUBpoOIMqeXk7AsiwEgZZ7nBR3A\n41i0ADALBgGihOj1hLjhTLp0HwxXC50OgwDRjPTT57BRQevr62kVp3Ta7TaWl5fRbrf5hD8FBgGi\nGfm+D8dxUKlUYp9Gr1y5grvuuivlki2+er0OEUGr1WIAmBI7holmYC6DHX5Np4VqtRra7Tbq9To6\nnU6p1rifJz1pj3MzDk3bMewkXRCiMjG3vDSXlwaAjY0NAAg6ifXYdZrd9773PVQqFXS73YWc+JWm\nmVoCIrIG4H8A2ALwWwD/Sin1YcRxvwXwIQAfQFcpdd+Qc7IlQIVh7mMcx1wmu9ls4vLly2kVb2G5\nroter8cUkCGrIaJ/CuAnSqlbAfwtgP8Uc5wP4PeVUncPCwBERRNei8ZcoCw8bt22bVy7dg3VanUh\nJ86lxbKsoEWVxdpRi2bW38RHAHyn//V3AHwu5jhJ4FpEuRXeFS2KXmeo2+0CAGcVT0EPw/U8DydP\nngTAQDCrWdNB20qpZtz3xutvANgB4AH4plLqL4eck+07Wli678Dcp5j9BLMJLxBXVnPrGBaRHwPY\nNF8CoAB8NaocMaf5PaXUOyKyAeDHIvKKUupnE5eWqOB0J6ZOFS0tLeHGG2/ExYsXMy5ZcZkjtBZ5\n05h5GRkElFJ/EPeeiLwrIptKqXdF5CSA92LO8U7/7/dF5AcA7gPAIECl5vs+9vf3sb+/P3QzlLIb\ndW/0khG+7w+M0qLxzJqnfwbAF/tf/zGAvw4fICJ1EWn0v14G8CCAX814XaJC0+mgRqPBlNAQJ0+e\nHCvnryt+vdEPjW/WPoEmgP8J4CYAF3A4RHRHRE4B+Eul1L8Ukd8B8AMcpoocAN9TSj055Jz8H6SF\nZ1kWLMsKOonpKL0yaL1ex+7u7tBj2S/APYaJCkE/1VqWhbW1Nbz//vuRxzmOU+qF6FzXRaPRwM7O\nDizLGnov9JwB4PD+lnXyGIMAUQHoJ1bbtke2AnRroUzBQD/9Ly0tBZu/6OUhRt0HPffCrNN00M1b\nPTcP3E+AqAB0ZTTqafXs2bMADp9yt7a25l6uvHjooYcAYGA/Bn3PXNc9cry5YF/URjE6qFA8tgSI\nUqYXPXMcJ3bzmeXl5eBJWI+OWeQ0h2VZqFQqwYY84Y3hdZpH79hmzrgOV/5KqeD9Rb5nYVxAjqhA\n9EiWKOvr6zg4OAiO6/V6WFtbAwCsrKxgY2MD99xzDwDg6aefTqfACVtdXQWAoMNXKYVutxs5Esis\nyLvdbmTax/xeDxOl8bAlQJSy8PLHejVMzbKsgZw4cNhRrPPiW1tbuHTpEgCgWq1iZ2cn3R8gQbfc\ncgvefPPNoAIfNSfADBJxdVdUIMlbPTcP7Bgmyqlw56T+3vd9rKysoNVqwXGcgSfhqCdZc8VSnQsv\nyhBTx3Fw7NgxrK+v47XXXjvy3jjzJPTPrY+Nqrui7nXe6rh5YccwUU6ZFZI5RNSyLOzt7UFEBjaa\n0fsTxJ0naveyRqMBy7LgOA6OHz8Ox8lHprdWq8GyLNx0003Y3t7Gm2++OfC+nuk7Dp0aG7Y0RPi9\nsgSAWTAIEKUgLn8NDD71jzN6SG9OE7WSZrVaxfb2djCc8u67707mB5iQDlSVSgUAcOHChaASd10X\ntVoNtVotcsTPrLiq6GSYDiJKkW4NjLP0dNy/D4+M0X0FZovDcRxUq1Xs7e0BwMC6Os1mEyKCDz74\nYKaf5fTp03BdFzs7O7h27Rps24bjOEGntjnPIWrsPoCR6Z1J6HtR1k5hjg4iyrkkRq0opYKlqPX3\nccfpzddFBCsrKwCup1/OnDlzJJiMysvHjbnXE+A8z0OlUhkIcHGLuelrJxUA9Dny9lBbBGwJEKVA\nj13Xs4U9z5t6NquIBGkW8yk7PLberBTN1kc4XTLJRu0nT57Ee+9dXyzY3E0tTAeNcOCLun5SFXiZ\nOoLDODqIqCDCFfKkKQxzdFCv15uq4htnwtowjUYjaGnEGaflM68x/WVaLkJjECAqoHHGvc+Dbdsz\nr0kUN2mLssEhokQFFLUh/bwlNXrG7Jug4mIQIKKZMBAUG4MAUUk4jhNMKEt6eeqoyW1UDPyfIyoJ\nvfVikh2xemZyWcfmLwIGAaKSmHaC2jDtdhuVSoUpoQJjECBacLqCFhE0Go1EN7U3U0sMBMXEIEBU\nAnq5Cb2MxDyvQ8XCIEC04MxF6cxdt5I6t+M4mQx1pWQwCBCVgFlJiwjuvPPORM7rum4wa5mKiTOG\niUomvLPZrDhzOB+4iigRjaT7BpKYJ3D69OlgZBADQHExHURUEnp9/6WlJQDA+fPn0Wg0pjqX4zi4\ndOkS3nrrrdjVSakYmA4iKhFzuKhewXOatJDZuaz7GczvKX1cQI6IhgpX1HoGseu6aDabI/99o9FA\npVKBZVmRewBwdFAxsSVAtODCaZrwZ962bfi+j6WlpWBvgXDrwNwQPm4jGfYNZIstASKKNKxiNivu\ng4ODI6kdLTwMNO6c7BcoHo4OIiqBuM7bcApHb1ofZdSTPlsBxcSWAFFJjJuu0SuDhl/jU/5iYhAg\nKolxn9RFBK7rwnVdAMDa2hp83w/6BHTHMC0GpoOIaKBS12sMAYOtAr2dJPcOWCwcHUREgXDKSAeH\nvNUTdBRHBxHRzKKGfTL1s9gYBIgolp5UxkCwuBgEiCiW3n+A6aDFxSBARFRiDAJERCU2UxAQkUdF\n5Fci4onIPUOOe1hEXhWRX4vIV2a5JhGlxxwtxE7ixTRrS+AfAPwRgJ/GHSAiFoBvAHgIwB0AHheR\n22a8LhGlINwXEDV8lIptpsliSqnXAECG/zbcB+B1pdSF/rFPAXgEwKuzXJuI5se2bQCDq4lGrT/E\nlUOLL40+gRsBvGV8/3b/NSLKKc/zYjebMTetZwAovpEtARH5MYBN8yUACsCfKaX+97wKRkRE8zcy\nCCil/mDGa1wEcLPx/Zn+a3HXY6KRiCglSaaD4irvFwCcFZEtEXEBPAbgmQSvS0REU5p1iOjnROQt\nAOcA/FBEnu2/fkpEfggASikPwJcBPAfgPICnlFKvzFZsIiJKQu5WESUiovRkOmNYRP6biLwiIi+J\nyP8SkdWY434rIi+LyIsi8v/SLmecCcqfy8lyE0z2y+v9L/RkRRFZE5HnROQ1Efk/InJDzHG5uf/j\n3EsR+bqIvN7/XNyVdhmHGVV+EXlARHZE5Bf9P1/NopxRRORbIvKuiPxyyDGT3/vwcK80/wD4FACr\n//WTAP5LzHFvAFjLsqzTlh+HgfY3ALYAVAC8BOC2rMveL9utAD4C4G8B3DPkuLze/5Hlz/n9/68A\n/mP/668AeDLP93+cewng0wB+1P/6fgB/l3W5Jyz/AwCeybqsMeX/5wDuAvDLmPenuveZtgSUUj9R\nSultiv4OhyOHoghyuM7RmOUPJssppboA9GS5zCmlXlNKvY74Tn0tr/d/nPLn9v7jsBzf6X/9HQCf\nizkuL/eLZeDfAAACRklEQVR/nHv5CIDvAoBS6nkAN4jIJvJh3N+FXI5QVEr9DMCVIYdMde/z8Iul\n/RsAz8a8pwD8WEReEJF/m2KZJhFX/kWYLFeE+x8nz/f/hFLqXQBQSl0CcCLmuLzc/3HuZfiYixHH\nZGXc34Xf7adTfiQit6dTtERMde/nvsfwOJPNROTPAHSVUt+POc3vKaXeEZENHH4YXulHxblLqPyZ\nSWiyX67vf54NKX9UrjlulEZm97+E/h7AzUqploh8GsBfAfhnGZdpruYeBNSIyWYi8kUAnwHwL4ac\n453+3++LyA9w2KxL5UOQQPknmiyXtFHlH/Mcub3/Y8jt/e938m0qpd4VkZMA3os5R2b3P2Sce3kR\nwE0jjsnKyPIrpXaNr58VkT8XkaZSajulMs5iqnuf9eighwH8BwB/qJRqxxxTF5FG/+tlAA8C+FV6\npYw3TvlRnMlykXnQPN//kCJOVnwGwBf7X/8xgL8OH5Cz+z/OvXwGwBcAQETOAdjRKa8cGFl+M4cu\nIvfhcBh9ngKAIP53fbp7n3Fv9+sALgD4Rf/Pn/dfPwXgh/2vfweHvfgv4nDp6j/NssyTlr///cMA\nXusfn6fyfw6HOcR9AO8AeLZg939k+XN+/5sAftIv23MAjuX9/kfdSwBPAPgT45hv4HAUzssYMuos\nj+UH8O9wGGRfBPB/AdyfdZmNsn8fwD8BaAP4RwBfSuLec7IYEVGJ5Wl0EBERpYxBgIioxBgEiIhK\njEGAiKjEGASIiEqMQYCIqMQYBIiISuz/A5SBnK5axWauAAAAAElFTkSuQmCC\n", 16 | "text/plain": [ 17 | "" 18 | ] 19 | }, 20 | "metadata": {}, 21 | "output_type": "display_data" 22 | } 23 | ], 24 | "source": [ 25 | "# Interactive version of the \"Mandelbrot Set\" - solution to challenge in \n", 26 | "# \"Doing Math with Python\", chapter 6\n", 27 | "%matplotlib inline\n", 28 | "'''\n", 29 | "mandelbrot.py\n", 30 | "\n", 31 | "Draw a Mandelbrot set\n", 32 | "\n", 33 | "Using \"Escape time algorithm\" from:\n", 34 | "http://en.wikipedia.org/wiki/Mandelbrot_set#Computer_drawings\n", 35 | "\n", 36 | "Thanks to http://www.vallis.org/salon/summary-10.html for some important\n", 37 | "ideas for implementation.\n", 38 | "\n", 39 | "'''\n", 40 | "from ipywidgets import interact\n", 41 | "import ipywidgets as widgets\n", 42 | "\n", 43 | "\n", 44 | "import matplotlib.pyplot as plt\n", 45 | "import matplotlib.cm as cm\n", 46 | "\n", 47 | "# Subset of the complex plane we are considering\n", 48 | "x0, x1 = -2.5, 1\n", 49 | "y0, y1 = -1, 1\n", 50 | "\n", 51 | "def initialize_image(x_p, y_p):\n", 52 | " image = []\n", 53 | " for i in range(y_p):\n", 54 | " x_colors = []\n", 55 | " for j in range(x_p):\n", 56 | " x_colors.append(0)\n", 57 | " image.append(x_colors)\n", 58 | " return image\n", 59 | "\n", 60 | "def mandelbrot_set(n, max_iterations):\n", 61 | " image = initialize_image(n, n)\n", 62 | " \n", 63 | " # Generate a set of equally spaced points in the region\n", 64 | " # above\n", 65 | " dx = (x1-x0)/(n-1)\n", 66 | " dy = (y1-y0)/(n-1)\n", 67 | " x_coords = [x0 + i*dx for i in range(n)]\n", 68 | " y_coords = [y0 + i*dy for i in range(n)]\n", 69 | "\n", 70 | " for i, x in enumerate(x_coords):\n", 71 | " for k, y in enumerate(y_coords):\n", 72 | " z1 = complex(0, 0)\n", 73 | " iteration = 0\n", 74 | " c = complex(x, y)\n", 75 | " while (abs(z1) < 2 and iteration < max_iterations):\n", 76 | " z1 = z1**2 + c\n", 77 | " iteration += 1\n", 78 | " image[k][i] = iteration\n", 79 | " return image\n", 80 | "\n", 81 | "\n", 82 | "def draw_mandelbrot(n, max_iterations):\n", 83 | " image = mandelbrot_set(n, max_iterations)\n", 84 | " plt.imshow(image, origin='lower', extent=(x0, x1, y0,y1),\n", 85 | " cmap=cm.Greys_r, interpolation='nearest')\n", 86 | " plt.show()\n", 87 | " \n", 88 | "\n", 89 | "# Allow interaction via the interact() function and an Integer slider widget\n", 90 | "i = interact(draw_mandelbrot, \n", 91 | " n=widgets.IntSlider(min=100, max=600,step=1,value=10), \n", 92 | " max_iterations=widgets.IntSlider(min=100, max=10000,step=1,value=10),\n", 93 | " # This keyword argument adds a button so that the drawing happens\n", 94 | " # only when the button is clicked\n", 95 | " __manual=True\n", 96 | " )" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": null, 102 | "metadata": { 103 | "collapsed": true 104 | }, 105 | "outputs": [], 106 | "source": [] 107 | } 108 | ], 109 | "metadata": { 110 | "kernelspec": { 111 | "display_name": "Python 3", 112 | "language": "python", 113 | "name": "python3" 114 | }, 115 | "language_info": { 116 | "codemirror_mode": { 117 | "name": "ipython", 118 | "version": 3 119 | }, 120 | "file_extension": ".py", 121 | "mimetype": "text/x-python", 122 | "name": "python", 123 | "nbconvert_exporter": "python", 124 | "pygments_lexer": "ipython3", 125 | "version": "3.5.2" 126 | } 127 | }, 128 | "nbformat": 4, 129 | "nbformat_minor": 0 130 | } 131 | -------------------------------------------------------------------------------- /demos/Interactive Notebook Demo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "1719\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# Demo of using interative elements in a Notebook\n", 20 | "# To learn more: https://ipywidgets.readthedocs.io/en/latest/\n", 21 | "\n", 22 | "from ipywidgets import interact\n", 23 | "import ipywidgets as widgets\n", 24 | "\n", 25 | "\n", 26 | "def called(m):\n", 27 | " print(m)\n", 28 | " \n", 29 | "# Allow interaction via the interact() function and an Integer slider widget\n", 30 | "i = interact(called, m=widgets.IntSlider(min=0, max=10000,step=1,value=10))" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": null, 36 | "metadata": { 37 | "collapsed": true 38 | }, 39 | "outputs": [], 40 | "source": [] 41 | } 42 | ], 43 | "metadata": { 44 | "anaconda-cloud": {}, 45 | "kernelspec": { 46 | "display_name": "Python [Root]", 47 | "language": "python", 48 | "name": "Python [Root]" 49 | }, 50 | "language_info": { 51 | "codemirror_mode": { 52 | "name": "ipython", 53 | "version": 3 54 | }, 55 | "file_extension": ".py", 56 | "mimetype": "text/x-python", 57 | "name": "python", 58 | "nbconvert_exporter": "python", 59 | "pygments_lexer": "ipython3", 60 | "version": "3.5.2" 61 | }, 62 | "widgets": { 63 | "state": { 64 | "e79f7a52d627426d9ea107543454e65f": { 65 | "views": [ 66 | { 67 | "cell_index": 0 68 | } 69 | ] 70 | } 71 | }, 72 | "version": "1.2.0" 73 | } 74 | }, 75 | "nbformat": 4, 76 | "nbformat_minor": 0 77 | } 78 | -------------------------------------------------------------------------------- /demos/Scientific Calculator.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Scientific calculator" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 13, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [ 17 | { 18 | "data": { 19 | "text/plain": [ 20 | "2" 21 | ] 22 | }, 23 | "execution_count": 13, 24 | "metadata": {}, 25 | "output_type": "execute_result" 26 | } 27 | ], 28 | "source": [ 29 | "# Demo of some functions from the math module\n", 30 | "# Please see: https://docs.python.org/3/library/math.html\n", 31 | "\n", 32 | "import math\n", 33 | "\n", 34 | "# Find the greatest common divisor of 100 and 98\n", 35 | "\n", 36 | "math.gcd(100, 98)\n" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 14, 42 | "metadata": { 43 | "collapsed": false 44 | }, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/plain": [ 49 | "16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000" 50 | ] 51 | }, 52 | "execution_count": 14, 53 | "metadata": {}, 54 | "output_type": "execute_result" 55 | } 56 | ], 57 | "source": [ 58 | "# Find the factorial\n", 59 | "\n", 60 | "math.factorial(89)" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "### Validate simple known results\n", 68 | "\n", 69 | "$$ sin^2{\\theta} + cos^2{\\theta} = 1 $$\n" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 15, 75 | "metadata": { 76 | "collapsed": false 77 | }, 78 | "outputs": [ 79 | { 80 | "data": { 81 | "text/plain": [ 82 | "1.0" 83 | ] 84 | }, 85 | "execution_count": 15, 86 | "metadata": {}, 87 | "output_type": "execute_result" 88 | } 89 | ], 90 | "source": [ 91 | "theta = 60 # degrees\n", 92 | "\n", 93 | "theta_radians = math.radians(theta)\n", 94 | "\n", 95 | "math.sin(theta_radians)**2 + math.cos(theta_radians)**2" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 16, 101 | "metadata": { 102 | "collapsed": false 103 | }, 104 | "outputs": [ 105 | { 106 | "data": { 107 | "text/plain": [ 108 | "8.375" 109 | ] 110 | }, 111 | "execution_count": 16, 112 | "metadata": {}, 113 | "output_type": "execute_result" 114 | } 115 | ], 116 | "source": [ 117 | "# Demo of the statistics module\n", 118 | "# Please see: https://docs.python.org/3/library/statistics.html#module-statistics\n", 119 | "\n", 120 | "import statistics\n", 121 | "\n", 122 | "# Find the mean and median\n", 123 | "\n", 124 | "data = [1, 2.3, 10.1, 20.1]\n", 125 | "\n", 126 | "statistics.mean(data)\n" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 17, 132 | "metadata": { 133 | "collapsed": false 134 | }, 135 | "outputs": [ 136 | { 137 | "data": { 138 | "text/plain": [ 139 | "6.199999999999999" 140 | ] 141 | }, 142 | "execution_count": 17, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "# Find the median\n", 149 | "\n", 150 | "statistics.median(data)\n" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "### Extending the battery\n", 158 | "\n", 159 | "- Develop your own functions: unit conversion, finding correlation, .., anything really\n", 160 | "\n", 161 | "- Use PYTHONSTARTUP to extend the battery of readily available mathematical functions when you start the Python interpreter\n", 162 | "\n", 163 | "```python\n", 164 | "$ PYTHONSTARTUP=~/pycon-au-2016/py-files/startup_math.py idle3 -s\n", 165 | "```" 166 | ] 167 | } 168 | ], 169 | "metadata": { 170 | "kernelspec": { 171 | "display_name": "Python [Root]", 172 | "language": "python", 173 | "name": "Python [Root]" 174 | }, 175 | "language_info": { 176 | "codemirror_mode": { 177 | "name": "ipython", 178 | "version": 3 179 | }, 180 | "file_extension": ".py", 181 | "mimetype": "text/x-python", 182 | "name": "python", 183 | "nbconvert_exporter": "python", 184 | "pygments_lexer": "ipython3", 185 | "version": "3.5.2" 186 | } 187 | }, 188 | "nbformat": 4, 189 | "nbformat_minor": 0 190 | } 191 | -------------------------------------------------------------------------------- /demos/Simple Linear Regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "image/png": "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\nrXrceD17J6rBqKKiorrlUChEKBSKU3NaT05ODrt27aJTp07hW5rNyM/P58EHH2xyn5SUFN599926\nJ3BeeOGFvP32263Svuuvv56srCxmzJgRdR0akRNpfWaGmbFnTzWDBv2QioraurL6SktLKS0tjdtx\now39nWbW0913mlkvYFekvBKof5p4WqSsUfVDv7ncnYKC+5g1686owymWOsyMP/zhD1x88cUt2kdE\npKG1a9cz8ux3+LeUg7xzShfWru3D2LGfvYTa8IR4+vTpMR2zucM7Fvk6YimQH1meDCypV/5NM/u8\nmeUC/YG1MbWwgXhc9Ii1jsausm/evJlQKESPHj3IyMhg/PjxAAwfPhx350tf+hKpqak89dRTRw2h\n5Obmcv/993PWWWfRvXt3brrpJnbt2sUVV1xBamoqI0aMYO/evXXbjxs3jt69e5OWlkYoFKr7q+GR\nRx7hySefZPbs2aSmpjJ69Ggg/Njma6+9loyMDPLy8pgzZ05dXdXV1eTn55Oens4ZZ5zBq6++GtW/\niYi0THlZGbWLH6FkzR+ZsXo1JWv+yOFnHo7qvd0tcrwnsgELgSrgELANuB5IA1YCG4HlQI962xcA\n7wJvAyOOUe+xniB3lIceesIHDfq6Dxhwj0OtDxhwjw8a9HV/6KEnmvtwurjUkZOT43/605+OKh8/\nfrzPnDnT3d0PHTrkL7/8ct3PzMy31HsPb8OnZObk5Pj555/v77//vldVVXlGRoYPHTrU169f74cO\nHfKvfe1rPmPGjLrtS0pKfP/+/V5TU+O33367n3322XU/y8/Pr3sap7t7bW2tDx061H/84x/7p59+\n6mVlZZ6Xl+fLly93d/e7777bv/rVr/qePXt8+/btfsYZZxz3CZ5N/Y5EpPmifX0rQXlHbm1trS9a\n9JxnZU11cM/KmupPPbXsM++dPZ541JGTk+Pdu3f3tLQ079Gjh6elpfmjjz7qkydP9u985zu+ffv2\no/YxM9+8eXPdemOhv3Dhwrr1sWPH+s0331y3PmfOHL/mmmsabc+HH37oZuYfffSRux8d+q+88opn\nZ2d/Zp9Zs2b5DTfc4O7u/fr1q/sAcHd/+OGHFfoibeBHodBnAv/I148uvviY+8Ua+h3mjtyGFz32\n7DnY6EWP1q4DYMmSJezevZsPP/yQ3bt3c+ONNzJ79mxqa2sZNmwYZ555JiUlJS2qs2fPnnXLXbp0\n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\nP4u5grrFFg9GAAAAAElFTkSuQmCC\n", 13 | "text/plain": [ 14 | "" 15 | ] 16 | }, 17 | "metadata": {}, 18 | "output_type": "display_data" 19 | } 20 | ], 21 | "source": [ 22 | "%matplotlib inline\n", 23 | "\n", 24 | "# Using gradient descent for linear regression\n", 25 | "# Ideas from https://spin.atomicobject.com/2014/06/24/gradient-descent-linear-regression/\n", 26 | "\n", 27 | "# We will attempt to predict the college admission test score based\n", 28 | "# on the high school math score (following on Chapter 3 of \"Doing Math with Python\")\n", 29 | "\n", 30 | "# Known data\n", 31 | "x_data = [83, 85, 84, 96, 94, 86, 87, 97, 97, 85]\n", 32 | "y_data = [85, 87, 86, 97, 96, 88, 89, 98, 98, 87]\n", 33 | "\n", 34 | "from sympy import Symbol, Derivative\n", 35 | "import matplotlib.pyplot as plt\n", 36 | "\n", 37 | "# Assumed linear model\n", 38 | "# x = math score in high school\n", 39 | "# y = admission test score\n", 40 | "\n", 41 | "# y = m*x + c\n", 42 | "def estimate_y(x, m, c):\n", 43 | " y_estimated = m*x + c\n", 44 | " return y_estimated\n", 45 | "\n", 46 | "def estimate_theta(m_current, c_current, max_iterations=50000):\n", 47 | " learning_rate = 0.0001\n", 48 | " m_gradient = 0\n", 49 | " c_gradient = 0\n", 50 | " N = len(x_data)\n", 51 | " \n", 52 | " m = Symbol('m')\n", 53 | " c = Symbol('c')\n", 54 | " y = Symbol('y')\n", 55 | " x = Symbol('x')\n", 56 | " # Error term\n", 57 | " error_term = (y - (m*x+c))**2\n", 58 | " # Error function = 1/n*sum(error_term)\n", 59 | " for i in range(max_iterations):\n", 60 | " for i in range(0, N):\n", 61 | " m_gradient += (1/N)*Derivative(error_term, m).doit().subs({x:x_data[i], y:y_data[i], m:m_current, c:c_current})\n", 62 | " c_gradient += (1/N)*Derivative(error_term, c).doit().subs({x:x_data[i], y:y_data[i], m:m_current, c:c_current})\n", 63 | "\n", 64 | " m_new = m_current - (learning_rate * m_gradient)\n", 65 | " c_new = c_current - (learning_rate * c_gradient)\n", 66 | " if abs(m_new - m_current) < 1e-5 or abs(c_new - c_current) < 1e-5:\n", 67 | " break\n", 68 | " else:\n", 69 | " m_current = m_new\n", 70 | " c_curret = c_new\n", 71 | " return m_new, c_new\n", 72 | " \n", 73 | "m, c = estimate_theta(1, 1)\n", 74 | "\n", 75 | "# Let's try and unknown set of data \n", 76 | "# This data set is different and widely spread, \n", 77 | "# but they are very similarly correlated\n", 78 | "x_data = [63, 61, 98, 76, 74, 59, 40, 87, 71, 75]\n", 79 | "y_data = [65, 62, 99, 78, 75, 60, 42, 89, 71, 77]\n", 80 | "\n", 81 | "y_estimated = [estimate_y(x, m, c) for x in x_data]\n", 82 | "plt.plot(x_data, y_data, 'ro')\n", 83 | "plt.plot(x_data, y_estimated, 'b*')\n", 84 | "plt.legend(['Actual', 'Estimated'], loc='best')\n", 85 | "plt.show()\n" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "metadata": { 92 | "collapsed": true 93 | }, 94 | "outputs": [], 95 | "source": [] 96 | } 97 | ], 98 | "metadata": { 99 | "anaconda-cloud": {}, 100 | "kernelspec": { 101 | "display_name": "Python [Root]", 102 | "language": "python", 103 | "name": "Python [Root]" 104 | }, 105 | "language_info": { 106 | "codemirror_mode": { 107 | "name": "ipython", 108 | "version": 3 109 | }, 110 | "file_extension": ".py", 111 | "mimetype": "text/x-python", 112 | "name": "python", 113 | "nbconvert_exporter": "python", 114 | "pygments_lexer": "ipython3", 115 | "version": "3.5.2" 116 | } 117 | }, 118 | "nbformat": 4, 119 | "nbformat_minor": 0 120 | } 121 | -------------------------------------------------------------------------------- /demos/SymPy Basics - 1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "2*x\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# One of the basic ideas in SymPy is that of a\n", 20 | "# Symbol object. If we want to tell Python that\n", 21 | "# treat \"x\" as \"x\", we create a Symbol object to\n", 22 | "# passing 'x' as an argument\n", 23 | "\n", 24 | "from sympy import Symbol\n", 25 | "\n", 26 | "x = Symbol('x')\n", 27 | "\n", 28 | "y = Symbol('x')\n", 29 | "\n", 30 | "print(x+y)" 31 | ] 32 | } 33 | ], 34 | "metadata": { 35 | "kernelspec": { 36 | "display_name": "Python [Root]", 37 | "language": "python", 38 | "name": "Python [Root]" 39 | }, 40 | "language_info": { 41 | "codemirror_mode": { 42 | "name": "ipython", 43 | "version": 3 44 | }, 45 | "file_extension": ".py", 46 | "mimetype": "text/x-python", 47 | "name": "python", 48 | "nbconvert_exporter": "python", 49 | "pygments_lexer": "ipython3", 50 | "version": "3.5.2" 51 | } 52 | }, 53 | "nbformat": 4, 54 | "nbformat_minor": 0 55 | } 56 | -------------------------------------------------------------------------------- /demos/SymPy Basics - 2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "5\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# Next, we may want to \"evaluate\" the value of an algebraic expression\n", 20 | "\n", 21 | "from sympy import Symbol\n", 22 | "\n", 23 | "x = Symbol('x')\n", 24 | "\n", 25 | "expr = 2*x + 3*x**2\n", 26 | "\n", 27 | "# now evaluate expr using subs() method\n", 28 | "\n", 29 | "expr_val = expr.subs({x:1})\n", 30 | "\n", 31 | "print(expr_val)" 32 | ] 33 | } 34 | ], 35 | "metadata": { 36 | "anaconda-cloud": {}, 37 | "kernelspec": { 38 | "display_name": "Python [Root]", 39 | "language": "python", 40 | "name": "Python [Root]" 41 | }, 42 | "language_info": { 43 | "codemirror_mode": { 44 | "name": "ipython", 45 | "version": 3 46 | }, 47 | "file_extension": ".py", 48 | "mimetype": "text/x-python", 49 | "name": "python", 50 | "nbconvert_exporter": "python", 51 | "pygments_lexer": "ipython3", 52 | "version": "3.5.2" 53 | } 54 | }, 55 | "nbformat": 4, 56 | "nbformat_minor": 0 57 | } 58 | -------------------------------------------------------------------------------- /demos/SymPy Basics - 3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Enter an expression: 2*x**2 + 3*x + 1\n", 15 | "(x + 1)*(2*x + 1)\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "# To allow user to input expressions, we use the input()\n", 21 | "# function and then we convert the expression (a string)\n", 22 | "# to a form understandable by SymPy using sympify() function\n", 23 | "\n", 24 | "from sympy import sympify\n", 25 | "\n", 26 | "# This is a string\n", 27 | "expr = input('Enter an expression: ')\n", 28 | "\n", 29 | "# Now this is in a form understood by SymPy\n", 30 | "\n", 31 | "expr_sympified = sympify(expr)\n", 32 | "\n", 33 | "# Let's factorize this expression\n", 34 | "\n", 35 | "from sympy import factor\n", 36 | "\n", 37 | "print(factor(expr_sympified))\n", 38 | "\n", 39 | "\n", 40 | "\n" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "collapsed": true 48 | }, 49 | "outputs": [], 50 | "source": [] 51 | } 52 | ], 53 | "metadata": { 54 | "anaconda-cloud": {}, 55 | "kernelspec": { 56 | "display_name": "Python [Root]", 57 | "language": "python", 58 | "name": "Python [Root]" 59 | }, 60 | "language_info": { 61 | "codemirror_mode": { 62 | "name": "ipython", 63 | "version": 3 64 | }, 65 | "file_extension": ".py", 66 | "mimetype": "text/x-python", 67 | "name": "python", 68 | "nbconvert_exporter": "python", 69 | "pygments_lexer": "ipython3", 70 | "version": "3.5.2" 71 | } 72 | }, 73 | "nbformat": 4, 74 | "nbformat_minor": 0 75 | } 76 | -------------------------------------------------------------------------------- /py-files/projectile_animation.py: -------------------------------------------------------------------------------- 1 | from matplotlib import pyplot as plt 2 | from matplotlib import animation 3 | import math 4 | g = 9.8 5 | 6 | 7 | def get_intervals(u, theta): 8 | t_flight = 2*u*math.sin(theta)/g 9 | intervals = [] 10 | start = 0 11 | interval = 0.001 12 | while start < t_flight: 13 | intervals.append(start) 14 | start = start + interval 15 | return intervals 16 | 17 | def update_position(i, circle, intervals, u, theta): 18 | t = intervals[i] 19 | x = u*math.cos(theta)*t 20 | y = u*math.sin(theta)*t - 0.5*g*t*t 21 | circle.center = x, y 22 | return circle, 23 | 24 | def create_animation(u, theta): 25 | intervals = get_intervals(u, theta) 26 | xmin = 0 27 | xmax = u*math.cos(theta)*intervals[-1] 28 | ymin = 0 29 | t_max = u*math.sin(theta)/g 30 | ymax = u*math.sin(theta)*t_max - 0.5*g*t_max**2 31 | fig = plt.gcf() 32 | ax = plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax)) 33 | circle = plt.Circle((xmin, ymin), 1.0) 34 | ax.add_patch(circle) 35 | anim = animation.FuncAnimation(fig, update_position, 36 | fargs=(circle, intervals, u, theta), 37 | frames=len(intervals), interval=1, 38 | repeat=False, blit=True) 39 | plt.title('Projectile Motion') 40 | plt.xlabel('X') 41 | plt.ylabel('Y') 42 | plt.show() 43 | 44 | if __name__ == '__main__': 45 | try: 46 | u = float(input('Enter the initial velocity (m/s): ')) 47 | theta = float(input('Enter the angle of projection (degrees): ')) 48 | except ValueError: 49 | print('You entered an invalid input') 50 | else: 51 | theta = math.radians(theta) 52 | create_animation(u, theta) 53 | -------------------------------------------------------------------------------- /py-files/startup_math.py: -------------------------------------------------------------------------------- 1 | def print_menu(): 2 | print('1. Kilometers to Miles') 3 | print('2. Miles to Kilometers') 4 | print('3. Kilograms to Pounds') 5 | print('4. Pounds to Kilograms') 6 | print('5. Celsius to Fahrenheit') 7 | print('6. Fahrenheit to Celsius') 8 | 9 | def km_miles(): 10 | km = float(input('Enter distance in kilometers: ')) 11 | miles = km / 1.609 12 | 13 | print('Distance in miles: {0}'.format(miles)) 14 | 15 | def miles_km(): 16 | miles = float(input('Enter distance in miles: ')) 17 | km = miles * 1.609 18 | 19 | print('Distance in kilometers: {0}'.format(km)) 20 | 21 | def kg_pounds(): 22 | kg = float(input('Enter weight in kilograms: ')) 23 | pounds = kg * 2.205 24 | 25 | print('Weight in pounds: {0}'.format(pounds)) 26 | 27 | def pounds_kg(): 28 | pounds = float(input('Enter weight in pounds: ')) 29 | kg = pounds / 2.205 30 | 31 | print('Weight in kilograms: {0}'.format(kg)) 32 | 33 | def cel_fahren(): 34 | celsius = float(input('Enter temperature in celsius: ')) 35 | fahrenheit = celsius* (9 / 5) + 32 36 | print('Temperature in fahrenheit: {0}'.format(fahrenheit)) 37 | 38 | def fahren_cel(): 39 | fahrenheit = float(input('Enter temperature in fahrenheit: ')) 40 | celsius = (fahrenheit - 32)*(5/9) 41 | print('Temperature in celsius: {0}'.format(celsius)) 42 | 43 | def unit_conversion(): 44 | print_menu() 45 | choice = input('Which conversion would you like to do? ') 46 | 47 | if choice == '1': 48 | km_miles() 49 | if choice == '2': 50 | miles_km() 51 | 52 | if choice == '3': 53 | kg_pounds() 54 | if choice == '4': 55 | pounds_kg() 56 | 57 | if choice == '5': 58 | cel_fahren() 59 | if choice == '6': 60 | fahren_cel() 61 | 62 | def find_corr_x_y(x,y): 63 | 64 | if len(x) != len(y): 65 | print('The two sets of numbers are of unequal size') 66 | return None 67 | 68 | n = len(x) 69 | 70 | # find the sum of the products 71 | prod = [xi*yi for xi, yi in zip(x, y)] 72 | sum_prod_x_y = sum(prod) 73 | 74 | # sum of the numbers in x 75 | sum_x = sum(x) 76 | # sum of the numbers in y 77 | sum_y = sum(y) 78 | 79 | # square of the sum of the numbers in x 80 | squared_sum_x = sum_x**2 81 | # square of the sum of the numbers in y 82 | squared_sum_y = sum_y**2 83 | 84 | # find the squares of numbers in x and the 85 | # sum of the squares 86 | x_square = [xi**2 for xi in x] 87 | x_square_sum = sum(x_square) 88 | 89 | # find the squares of numbers in y and the 90 | # sum of the squares 91 | y_square = [yi**2 for yi in y] 92 | y_square_sum = sum(y_square) 93 | 94 | # numerator 95 | numerator = n*sum_prod_x_y - sum_x*sum_y 96 | denominator_term1 = n*x_square_sum - squared_sum_x 97 | denominator_term2 = n*y_square_sum - squared_sum_y 98 | denominator = (denominator_term1*denominator_term2)**0.5 99 | 100 | correlation = numerator/denominator 101 | 102 | return correlation 103 | -------------------------------------------------------------------------------- /slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doingmathwithpython/pycon-au-2016/23de80d31ef155859341874a1f0a640df554cee5/slides.pdf -------------------------------------------------------------------------------- /transcript.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Book: Doing Math With Python\n", 8 | "\n", 9 | "\n", 10 | "\n", 11 | "- Most of what I am going to discuss today\n", 12 | "\n", 13 | "- In addition: Descriptive statistics, Sets and Probability, Random numbers\n", 14 | "\n", 15 | "Published by [No Starch Press](https://www.nostarch.com/doingmathwithpython) in August, 2015.\n", 16 | "\n", 17 | "*Translations*: Simplified Chinese, Japanese, French and Korean." 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "slideshow": { 24 | "slide_type": "notes" 25 | } 26 | }, 27 | "source": [ 28 | "# Why \"Math with Python?\"\n", 29 | "\n", 30 | "Today, I am presenting an idea, a hypothesis or even making a statement - Python can lead to a more enriching learning and teaching experience in the classroom.\n", 31 | "\n", 32 | "Let me explain where I am coming from. When I think back about when I was learning to program and learning all other subjects in standards 7-10. I think it's true today as well. Programming and other subjects such as Math, Science are taught in a disconnected fashion. Programming seems to be all about finding the sum of a series or generating fibonacci numbers. Make no mistake, these exercises are what builds up the programming logic. Some students get really excited about being able to do these, but a lot of them don't. It's a lot like not everyone gets interested in solving puzzles - i don't, i never took to them.\n", 33 | "\n", 34 | "I think I know of a way we could excite more students! Show them how you can write programs to do your homework, or experiment without having to go the science lab or setup elaborate experimental setups. This is my goal for today - in the following slides and notebooks, I will hypothesise on a way of connecting Python programming and other subjects. That will show that programming is a way to get real work done, not something to learn for the sake of it.\n", 35 | "\n", 36 | "I do not have any direct connection to the classroom, so those among you who have are the ones who are going to tell me how my ideas sound.\n", 37 | "\n" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": { 43 | "slideshow": { 44 | "slide_type": "notes" 45 | } 46 | }, 47 | "source": [ 48 | "# How?\n", 49 | "\n", 50 | "We need some tools to help us on our quest. The Python community has some giant shoulders we can stand upon - Python 3, SymPy and matplotlib.\n", 51 | "\n", 52 | "We will see how we can use the Python programming language in three different capacities to explore Math.\n", 53 | "\n" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": { 59 | "slideshow": { 60 | "slide_type": "subslide" 61 | } 62 | }, 63 | "source": [ 64 | "# Scientific calculator\n", 65 | "\n", 66 | "Who uses Python as a calculator? I do! Specifically, I use Python 3 because of 1/2=0 messes up my monthly expenditure calculation. Besides the usual addition and subtraction, we have of course the [math](https://docs.python.org/3/library/math.html) module and more recently the [statistics](https://docs.python.org/3/library/statistics.html) module which makes Python a worthy scientific calculator.\n", 67 | "\n", 68 | "\n", 69 | "- `fabs()`, `abs()`, `sin()`, `cos()`, `gcd()`, `log()` and more (See [math](https://docs.python.org/3/library/math.html))\n", 70 | "\n", 71 | "- Descriptive statistics (See [statistics](https://docs.python.org/3/library/statistics.html#module-statistics))\n", 72 | "\n", 73 | "\n", 74 | "- Develop your own functions: unit conversion, finding correlation, .., anything really\n", 75 | "\n", 76 | "- Use PYTHONSTARTUP to extend the battery of readily available mathematical functions\n", 77 | "\n", 78 | "\n", 79 | "But then, there's more! You are not limited to the functions from those libraries, you can write your own custom functions and make them available whenever you start your Python interpreter. How?\n", 80 | "\n", 81 | "Use PYTHONSTARTUP!\n", 82 | "\n", 83 | "```python\n", 84 | "$ PYTHONSTARTUP=~/work/dmwp/oreilly-webcast-2016/startup_math.py idle3 -s\n", 85 | "```\n", 86 | "\n" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": { 92 | "slideshow": { 93 | "slide_type": "subslide" 94 | } 95 | }, 96 | "source": [ 97 | "\n", 98 | "#### Unit conversion functions\n", 99 | "\n", 100 | "```python\n", 101 | "\n", 102 | ">>> unit_conversion()\n", 103 | "1. Kilometers to Miles\n", 104 | "2. Miles to Kilometers\n", 105 | "3. Kilograms to Pounds\n", 106 | "4. Pounds to Kilograms\n", 107 | "5. Celsius to Fahrenheit\n", 108 | "6. Fahrenheit to Celsius\n", 109 | "Which conversion would you like to do? 6\n", 110 | "Enter temperature in fahrenheit: 98\n", 111 | "Temperature in celsius: 36.66666666666667\n", 112 | ">>> \n", 113 | "\n", 114 | "```" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": { 120 | "slideshow": { 121 | "slide_type": "subslide" 122 | } 123 | }, 124 | "source": [ 125 | "#### Finding linear correlation\n", 126 | "\n", 127 | "```python\n", 128 | ">>> \n", 129 | ">>> x = [1, 2, 3, 4]\n", 130 | ">>> y = [2, 4, 6.1, 7.9]\n", 131 | ">>> find_corr_x_y(x, y)\n", 132 | "0.9995411791453812\n", 133 | "\n", 134 | "```" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": { 140 | "slideshow": { 141 | "slide_type": "notes" 142 | } 143 | }, 144 | "source": [ 145 | "# Really awesome Calculator\n", 146 | "\n", 147 | "So, that was Python and it's standard libraries. When you bring in third party libraries to the mix, Python becomes a seriously fancy calculator.\n", 148 | "\n", 149 | "[SymPy](http://www.sympy.org/en/index.html) - a pure Python symbolic math library\n", 150 | "\n", 151 | "You can give it algebraic expressions to a function and a graph will be created for you.\n", 152 | "\n", 153 | "You can give an equation and out comes the solutions for that equation.\n", 154 | "\n", 155 | "We can even solve calculus problems.\n", 156 | "\n", 157 | "Let's see a few examples." 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": { 163 | "slideshow": { 164 | "slide_type": "notes" 165 | } 166 | }, 167 | "source": [ 168 | "I will pause for a moment now. We have seen how Python can be a super awesome calculator. What does that buy us? We have now been able to show that you can make computer programs literally do your homework. Write a program to do your work once and you will never have to make those lengthy calculations yourselves. Can we use Python to do more? \n", 169 | "\n", 170 | "Let's continue." 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": { 176 | "slideshow": { 177 | "slide_type": "slide" 178 | } 179 | }, 180 | "source": [ 181 | "

Can we do more than write smart calculators?

\n", 182 | "\n" 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": { 188 | "slideshow": { 189 | "slide_type": "slide" 190 | } 191 | }, 192 | "source": [ 193 | "\n", 194 | "# More than smart calculators\n", 195 | "\n", 196 | "Our tools\n", 197 | " \n", 198 | "- matplotlib\n", 199 | "\n", 200 | "- basemap\n", 201 | "\n", 202 | "- Interactive Jupyter Notebooks\n" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "slideshow": { 209 | "slide_type": "notes" 210 | } 211 | }, 212 | "source": [ 213 | "Python can be more than a super powerful calculator. We can use it to enhance the learning experience of other subjects. Next, I have three examples including a demo. \n", 214 | "\n", 215 | "First up, a video of a projectile motion. This program uses matplotlib's animation API to create a basic animation of a projectile motion - a fairly common subject introduced in introductory Physics. The program which is linked asks for the angle of projection and speed and then draws the trajectory of the projectile. Just by running the program multiple times, we can see how the trajectory changes. We don't have to go outside and start throwing balls..\n" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": { 221 | "slideshow": { 222 | "slide_type": "subslide" 223 | } 224 | }, 225 | "source": [ 226 | "\n", 227 | "##### Bringing Science to life\n", 228 | "\n", 229 | "*Animation of a Projectile motion* [(Python Source)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/py-files/projectile_animation.py)\n", 230 | "\n", 231 | "\n" 232 | ] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "metadata": { 237 | "slideshow": { 238 | "slide_type": "subslide" 239 | } 240 | }, 241 | "source": [ 242 | "##### Exploring Fractals in Nature\n", 243 | "\n", 244 | "Next, we will put Jupyter Notebook's interactive widgets to good effect by drawing a Barnsley Fern. Then, we will play with the Mandelbrot Set.\n", 245 | "\n", 246 | "\n", 247 | "*Interactively drawing a Barnsley Fern* [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Interactive%20Barnsley%20Fern.ipynb)\n", 248 | "\n", 249 | "*Playing with Mandelbrot Set*[(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Interactive%20Mandelbrot%20Set.ipynb)\n", 250 | "\n" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "slideshow": { 257 | "slide_type": "subslide" 258 | } 259 | }, 260 | "source": [ 261 | "\n", 262 | "##### The world is your graph paper\n", 263 | "\n", 264 | "Next, with the help of basemap, we can draw places on a world map like we would draw points on a graph paper.\n", 265 | "\n", 266 | "*Showing places on a digital map* [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Maps%20using%20Basemap%20-%20demo.ipynb)" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": { 272 | "slideshow": { 273 | "slide_type": "notes" 274 | } 275 | }, 276 | "source": [ 277 | "I know I would be excited if someone was showing me all these interesting ways to play with these things when I was learning about complex numbers, probability and geography!\n", 278 | "\n", 279 | "\n", 280 | "Okay, so that's great. We have successfully used Python to make the learning experience of young learners more fun and immediately applicable. Can we derive more benefit from doing that? Like something for the future? We all love doing things for the future, don't we?\n", 281 | "\n", 282 | "I think yes, i think if we teach young learners the things we have discussed today, it is a great base for someone wanting to go into data science or machine learning.\n", 283 | "\n", 284 | "Statistics and visualising data are two very key factors of data science.\n", 285 | "\n", 286 | "Differential calculus and specifically the gradient descent method is a simple but useful optimization method used in Machine Learning. Let's see a demo of using gradient descent to find the minimum value of a function.\n", 287 | "\n", 288 | "Now, let's apply gradient descent as an optimizer in a Linear Regression problem." 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": { 294 | "slideshow": { 295 | "slide_type": "slide" 296 | } 297 | }, 298 | "source": [ 299 | "# Great base for the future\n", 300 | "\n", 301 | "*Statistics and Graphing data* -> *Data Science*\n", 302 | "\n", 303 | "*Differential Calculus* -> *Machine learning*\n" 304 | ] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": { 309 | "slideshow": { 310 | "slide_type": "subslide" 311 | } 312 | }, 313 | "source": [ 314 | "### Application of differentiation\n", 315 | "\n", 316 | "Use gradient descent to find a function's minimum value [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Gradient%20Descent.ipynb)" 317 | ] 318 | }, 319 | { 320 | "cell_type": "markdown", 321 | "metadata": { 322 | "collapsed": true, 323 | "slideshow": { 324 | "slide_type": "subslide" 325 | } 326 | }, 327 | "source": [ 328 | "### Predict the college admission score based on high school math score\n", 329 | "\n", 330 | "Use gradient descent as the optimizer for single variable linear regression model [(Notebook)](https://github.com/doingmathwithpython/oreilly-webcast-2016/blob/master/demos/Simple%20Linear%20Regression.ipynb)\n", 331 | "\n" 332 | ] 333 | }, 334 | { 335 | "cell_type": "markdown", 336 | "metadata": { 337 | "collapsed": true, 338 | "slideshow": { 339 | "slide_type": "subslide" 340 | } 341 | }, 342 | "source": [ 343 | "## Advanced libraries\n", 344 | "\n", 345 | "- [scipy](https://scipy.org)\n", 346 | "\n", 347 | "- [numpy](http://www.numpy.org/)\n", 348 | "\n", 349 | "- [scikit-learn](http://scikit-learn.org/stable/)\n", 350 | "\n", 351 | "- [pandas](http://pandas.pydata.org/)\n", 352 | "\n", 353 | "- [Statsmodels](http://statsmodels.sourceforge.net/)\n", 354 | "\n" 355 | ] 356 | }, 357 | { 358 | "cell_type": "markdown", 359 | "metadata": { 360 | "slideshow": { 361 | "slide_type": "notes" 362 | } 363 | }, 364 | "source": [ 365 | "And in the end, I would like to talk about my book \"Doing Math with Python\". My idea was attractive enough to get it published by No Starch Press which makes me hope that I am probably onto something. I discuss all of the topics I discuss today in my talk. In addition, I discuss sets, probability and random numbers and descriptive statistics.\n", 366 | "\n", 367 | "It's being translated into several non-English languages.\n", 368 | "\n", 369 | "The reviews/feedback so far has been really positive. I don't have any first hand involvement in teaching, so it's very appreciative of people to share their viewpoints with me." 370 | ] 371 | }, 372 | { 373 | "cell_type": "markdown", 374 | "metadata": { 375 | "slideshow": { 376 | "slide_type": "subslide" 377 | } 378 | }, 379 | "source": [ 380 | "#### Comments on \"Doing Math with Python\"\n", 381 | "\n", 382 | "\n", 383 | "> Saha does an excellent job providing a clear link between Python and upper-level math concepts, and demonstrates how Python can be transformed into a mathematical stage. This book deserves a spot on every geometry teacher’s bookshelf.\n" 384 | ] 385 | }, 386 | { 387 | "cell_type": "markdown", 388 | "metadata": { 389 | "slideshow": { 390 | "slide_type": "subslide" 391 | } 392 | }, 393 | "source": [ 394 | "\n", 395 | "> Outstanding guide to using Python to do maths. Working back through my undergrad maths using Python.\n" 396 | ] 397 | }, 398 | { 399 | "cell_type": "markdown", 400 | "metadata": { 401 | "slideshow": { 402 | "slide_type": "subslide" 403 | } 404 | }, 405 | "source": [ 406 | "\n", 407 | "> Saha does an excellent job providing a clear link between Python and upper-level math concepts, and demonstrates how Python can be transformed into a mathematical stage." 408 | ] 409 | }, 410 | { 411 | "cell_type": "markdown", 412 | "metadata": { 413 | "slideshow": { 414 | "slide_type": "fragment" 415 | } 416 | }, 417 | "source": [ 418 | "\n", 419 | "> This book is highly recommended for the high school or college student and anyone who is looking for a more natural way of programming math and scientific functions" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": { 425 | "slideshow": { 426 | "slide_type": "fragment" 427 | } 428 | }, 429 | "source": [ 430 | "> As a teacher I highly recommend this book as a way to work with someone in learning both math and programming\n" 431 | ] 432 | }, 433 | { 434 | "cell_type": "markdown", 435 | "metadata": { 436 | "slideshow": { 437 | "slide_type": "slide" 438 | } 439 | }, 440 | "source": [ 441 | "\n", 442 | "# Dialogue\n", 443 | "\n", 444 | "- [Doing Math with Python](http://doingmathwithpython.github.io/)\n", 445 | "\n", 446 | "- Twitter: @echorand\n", 447 | "\n", 448 | "- Email: amitsaha.in@gmail.com\n", 449 | " \n" 450 | ] 451 | } 452 | ], 453 | "metadata": { 454 | "kernelspec": { 455 | "display_name": "Python [Root]", 456 | "language": "python", 457 | "name": "Python [Root]" 458 | }, 459 | "language_info": { 460 | "codemirror_mode": { 461 | "name": "ipython", 462 | "version": 3 463 | }, 464 | "file_extension": ".py", 465 | "mimetype": "text/x-python", 466 | "name": "python", 467 | "nbconvert_exporter": "python", 468 | "pygments_lexer": "ipython3", 469 | "version": "3.5.2" 470 | } 471 | }, 472 | "nbformat": 4, 473 | "nbformat_minor": 0 474 | } 475 | --------------------------------------------------------------------------------