diff --git a/.codespell-ignore-words b/.codespell-ignore-words
new file mode 100644
index 00000000..e69de29b
diff --git a/.codespellrc b/.codespellrc
new file mode 100644
index 00000000..029c71ef
--- /dev/null
+++ b/.codespellrc
@@ -0,0 +1,5 @@
+[codespell]
+skip = .git,*.bib,*.ps,*.js,*.pdf,_build,*.fodp,*.fods
+ignore-words = .codespell-ignore-words
+
+
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..5d808809
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,13 @@
+# Dependabot configuration
+# ref: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+
+ - package-ecosystem: "pip"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..9f2c4e60
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,37 @@
+name: Publish JupyterBook to GitHub Pages
+
+on:
+ push: # trigger build only when push to main
+ branches:
+ - main
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v5
+ - name: Set up Python
+ uses: actions/setup-python@v6
+ with:
+ python-version: "3.11"
+ cache: "pip"
+ - name: Install Python dependencies
+ run: |
+ sudo apt-get install python3-pip graphviz
+ pip install -r requirements.txt
+ pip install ghp-import
+ PATH="${PATH}:${HOME}/.local/bin"
+
+ - name: Build book HTML
+ run: |
+ jupyter-book build ./content
+
+ - name: Push _build/html to gh-pages
+ run: |
+ sudo chown -R $(whoami):$(whoami) .
+ git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
+ git config --global user.name "$GITHUB_ACTOR"
+ git remote set-url origin "https://$GITHUB_ACTOR:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY"
+
+ ghp-import ./content/_build/html -f -p -n
diff --git a/.gitignore b/.gitignore
index 9c538cf9..0045a3f3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,7 @@ syllabus.out
*egg-info
.~lock*
+
+*.fodp
+
+_build
diff --git a/CHANGES b/CHANGES
index aeb0e7da..0c9edf6f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
-- python tutor: http://www.pythontutor.com/
+-- show pybind11
+ https://pybind11.readthedocs.io/en/stable/basics.html#compiling-the-test-cases
+
-- use RISE:
https://damianavila.github.io/RISE/customize.html
diff --git a/lectures/01-python/NOTE b/content/01-python/NOTE
similarity index 100%
rename from lectures/01-python/NOTE
rename to content/01-python/NOTE
diff --git a/lectures/01-python/VARDEN-tests.ini b/content/01-python/VARDEN-tests.ini
similarity index 100%
rename from lectures/01-python/VARDEN-tests.ini
rename to content/01-python/VARDEN-tests.ini
diff --git a/content/01-python/basics.md b/content/01-python/basics.md
new file mode 100644
index 00000000..0a3d9198
--- /dev/null
+++ b/content/01-python/basics.md
@@ -0,0 +1,51 @@
+# Python Basics
+
+The following references give helpful introductions to python:
+
+* The [official python tutorial](http://docs.python.org/3/tutorial/)
+
+* The [software carpentry python lessons](https://swcarpentry.github.io/python-novice-inflammation/)
+
+
+## Practicing
+
+Some resources for practicing on your own:
+
+* [Code Academy python rack](http://www.codecademy.com/tracks/python):
+ step-by-step tutorial through the basics of the language
+
+* [Project Euler](https://projecteuler.net/):
+ a set of increasingly complex programming tasks to try out with
+ python
+
+
+## Online books:
+
+* [Think python](https://greenteapress.com/wp/think-python-3rd-edition/)
+
+* [Dive into Python](https://diveintopython3.net/)
+
+* [SciPy Lecture Notes](http://scipy-lectures.github.io/)
+
+* [Google's python class](https://developers.google.com/edu/python/)
+
+* more resources can be found at: http://pythonbooks.revolunet.com/
+
+
+## Domain-specific libraries
+
+* Astronomy: [AstroPy](http://astropy.org)
+
+* Atmospheric sciences: [PyAOS](https://pyaos.github.io/)
+
+* Biology: [Biopython](http://biopython.org/)
+
+* Ocean and marine sciences: [OceanPython](http://oceanpython.org/)
+
+* Psychology resources: [PyschoPy](http://www.psychopy.org/)
+
+* Quantum physics: [QuTiP](http://qutip.org/)
+
+* Solar physics: [SunPy](http://sunpy.org/)
+
+
diff --git a/content/01-python/functions-classes.md b/content/01-python/functions-classes.md
new file mode 100644
index 00000000..f347a7dc
--- /dev/null
+++ b/content/01-python/functions-classes.md
@@ -0,0 +1,5 @@
+# Functions and Classes
+
+Functions and classes are the building blocks of complex programs.
+These allow you to organize your code into logical units that can
+reused.
diff --git a/content/01-python/installing.md b/content/01-python/installing.md
new file mode 100644
index 00000000..8c7d3dfa
--- /dev/null
+++ b/content/01-python/installing.md
@@ -0,0 +1,41 @@
+# Introduction
+
+This class will introduce the basics of the python programming
+language and the libraries used for scientific computing.
+
+```{tip}
+To get the most from this class, you should work on your own laptop. That
+way you practice using python and the scientific libraries on the in the
+environment you are most comfortable with.
+```
+
+## Getting python
+
+You will want to install python and the associated libraries on your
+laptop that you can bring to the seminar.
+
+On Linux machines, you probably already have python and you can get
+the needed libraries through your system package manager.
+
+For Mac and Windows, I recommend the free Anaconda distribution:
+
+https://www.anaconda.com/products/individual
+
+This will install everything that you need.
+
+```{tip}
+If you have trouble getting a local install working, most of the class
+material will work automatically in the cloud, either on
+[binder](https://mybinder.org/) or [google
+colab](https://research.google.com/colaboratory/).
+```
+
+If you have python successfully installed, you should be able to start
+the python interpreter at the command line as: `python`. A shell will
+come up, and you can try out your first program:
+
+```
+print("hello, world")
+```
+
+
diff --git a/content/01-python/misc.md b/content/01-python/misc.md
new file mode 100644
index 00000000..59891c0e
--- /dev/null
+++ b/content/01-python/misc.md
@@ -0,0 +1,5 @@
+# Miscellaneous
+
+There are a lot of topics that we didn't cover, as well as a lot of
+the python standard library that we won't address. Here we introduce
+a few more concepts.
diff --git a/lectures/01-python/myprofile.py b/content/01-python/myprofile.py
similarity index 97%
rename from lectures/01-python/myprofile.py
rename to content/01-python/myprofile.py
index 9ec4d463..1a5d66ec 100644
--- a/lectures/01-python/myprofile.py
+++ b/content/01-python/myprofile.py
@@ -22,7 +22,7 @@
enough to offset the overhead of the timer class method
calls.
- Multiple timers can be instanciated and nested. The stackCount
+ Multiple timers can be instantiated and nested. The stackCount
global parameter keeps count of the level of nesting, and the
timerNesting data structure stores the nesting level for each
defined timer.
diff --git a/lectures/01-python/paradigms.png b/content/01-python/paradigms.png
similarity index 100%
rename from lectures/01-python/paradigms.png
rename to content/01-python/paradigms.png
diff --git a/lectures/01-python/python-io.ipynb b/content/01-python/python-io.ipynb
similarity index 100%
rename from lectures/01-python/python-io.ipynb
rename to content/01-python/python-io.ipynb
diff --git a/content/01-python/python.md b/content/01-python/python.md
new file mode 100644
index 00000000..60132f80
--- /dev/null
+++ b/content/01-python/python.md
@@ -0,0 +1,3 @@
+# python
+
+These notebooks introduce the core python language
diff --git a/lectures/01-python/python.png b/content/01-python/python.png
similarity index 100%
rename from lectures/01-python/python.png
rename to content/01-python/python.png
diff --git a/lectures/01-python/scipy.png b/content/01-python/scipy.png
similarity index 100%
rename from lectures/01-python/scipy.png
rename to content/01-python/scipy.png
diff --git a/lectures/01-python/shopping.csv b/content/01-python/shopping.csv
similarity index 100%
rename from lectures/01-python/shopping.csv
rename to content/01-python/shopping.csv
diff --git a/lectures/01-python/shopping.fods b/content/01-python/shopping.fods
similarity index 100%
rename from lectures/01-python/shopping.fods
rename to content/01-python/shopping.fods
diff --git a/lectures/01-python/shopping_cart.py b/content/01-python/shopping_cart.py
similarity index 100%
rename from lectures/01-python/shopping_cart.py
rename to content/01-python/shopping_cart.py
diff --git a/lectures/01-python/test.txt b/content/01-python/test.txt
similarity index 100%
rename from lectures/01-python/test.txt
rename to content/01-python/test.txt
diff --git a/lectures/01-python/tic_tac_toe.py b/content/01-python/tic_tac_toe.py
similarity index 100%
rename from lectures/01-python/tic_tac_toe.py
rename to content/01-python/tic_tac_toe.py
diff --git a/content/01-python/using.md b/content/01-python/using.md
new file mode 100644
index 00000000..c9e2738d
--- /dev/null
+++ b/content/01-python/using.md
@@ -0,0 +1,45 @@
+# Using These Notes
+
+These notes are built via [Jupyter book](https://jupyterbook.org/), as
+a collection of [Jupyter](https://jupyter.org/) notebooks and markdown
+pages.
+
+The course is on Github at:
+https://github.com/sbu-python-class/python-science, and the course
+website is built automatically via a Github action each time a change
+is pushed.
+
+If you find any problems or have suggestions for improving the notes,
+feel free to create an issue or pull request at the Github repo.
+
+## Interactive Usage
+
+For the Jupyter notebooks in this collection, there are a few ways to
+access them to run them on your own.
+
+* clicking on the {octicon}`download` icon in the upper right let's
+ you download the raw notebook so you can run it on your local
+ computer.
+
+* clicking on the {octicon}`rocket` icon in the upper right will allow
+ you to run the notebook directly in the cloud. There are 2 different
+ compute clouds:
+
+ * [mybinder](https://mybinder.org/) : this is an open project with
+ ties to the Jupyter project. It can take a few minutes for the
+ page to appear if it hasn't been accessed recently, but then it
+ will give you the standard Jupyter experience.
+
+ * [Google colab](https://colab.research.google.com/) : this is
+ Google's version of an online notebook, which runs directly in
+ Google's cloud. This starts up almost instantly.
+
+````{note}
+Some notebooks use [MyST Markdown](https://jupyterbook.org/en/stable/content/myst.html) to
+allow for more styling. To see these styles, you need to install `jupyterlab-myst`, which
+can be done via:
+```
+pip install jupyterlab_myst
+```
+
+````
diff --git a/lectures/01-python/vector2d.py b/content/01-python/vector2d.py
similarity index 100%
rename from lectures/01-python/vector2d.py
rename to content/01-python/vector2d.py
diff --git a/content/01-python/w1-jupyter.ipynb b/content/01-python/w1-jupyter.ipynb
new file mode 100644
index 00000000..5db52542
--- /dev/null
+++ b/content/01-python/w1-jupyter.ipynb
@@ -0,0 +1,184 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Jupyter"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll be using Jupyter for all of our examples -- this allows us to run python in a web-based notebook, keeping a history of input and output, along with text and images.\n",
+ "\n",
+ "For Jupyter help, visit:\n",
+ "https://jupyter.readthedocs.io/en/latest/content-quickstart.html"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "````{note}\n",
+ "There are several interfaces to [Jupyter](https://jupyter.org/).\n",
+ "\n",
+ "We will use *JupyterLab*, which is traditionally started at the command line via:\n",
+ "```\n",
+ "jupyter lab\n",
+ "```\n",
+ "\n",
+ "The older (classic) interface is *Jupyter Notebook*, which can be started via:\n",
+ "```\n",
+ "jupyter notebook\n",
+ "```\n",
+ "````"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We interact with python by typing into _cells_ in the notebook. \n",
+ "\n",
+ "By default, a cell is a _code_ cell, which means that you can enter any valid python code into it and run it. \n",
+ "\n",
+ "Another important type of cell is a _markdown_ cell. This lets you put text, with different formatting (italics, bold, etc) that describes what the notebook is doing."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A \"markdown cell\" enables you to typeset LaTeX equations right in your notebook. Just put them in `$` or `$$`:\n",
+ "\n",
+ "$$\\frac{\\partial \\rho}{\\partial t} + \\nabla \\cdot (\\rho U) = 0$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```{tip}\n",
+ "You can change the cell type via the menu at the top, or using the shortcuts:\n",
+ "\n",
+ " * ctrl-m m : mark down cell\n",
+ " * ctrl-m y : code cell\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Some useful short-cuts:\n",
+ "\n",
+ " * shift+enter = run cell and jump to the next (creating a new cell if there is no other new one)\n",
+ " * ctrl+enter = run cell-in place\n",
+ " * alt+enter = run cell and insert a new one below"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```{warning}\n",
+ "When you work through a notebook, everything you did in previous cells is still in memory and _known_ by python, so you can refer to functions and variables that were previously defined. Even if you go up to the top of a notebook and insert a cell, all the information done earlier in your notebook session is still defined -- it doesn't matter where physically you are in the notebook. If you want to reset things, you can use the options under the _Kernel_ menu.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "````{admonition} Quick Exercise\n",
+ " \n",
+ "Create a new cell below this one. Make sure that it is a _code_ cell, and enter the following code and run it:\n",
+ " \n",
+ "```\n",
+ "\n",
+ " print(\"Hello, World\")\n",
+ " \n",
+ "```\n",
+ "\n",
+ "````"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`print()` is a _function_ in python that takes arguments (in the `()`) and outputs to the screen. You can print multiple quantities at once like:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1 2 3\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(1, 2, 3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note that the default behavior in Jupyter is to print the return value from the last statement in a cell, so we don't need to `print` if we just want the value of something like:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = 10\n",
+ "a"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/lectures/01-python/w1-python-datatypes.ipynb b/content/01-python/w1-python-datatypes.ipynb
similarity index 52%
rename from lectures/01-python/w1-python-datatypes.ipynb
rename to content/01-python/w1-python-datatypes.ipynb
index 73e6cac0..a8608991 100644
--- a/lectures/01-python/w1-python-datatypes.ipynb
+++ b/content/01-python/w1-python-datatypes.ipynb
@@ -1,135 +1,47 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from __future__ import print_function"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Jupyter"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We'll be using Jupyter for all of our examples -- this allows us to run python in a web-based notebook, keeping a history of input and output, along with text and images.\n",
- "\n",
- "For Jupyter help, visit:\n",
- "https://jupyter.readthedocs.io/en/latest/content-quickstart.html"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We interact with python by typing into _cells_ in the notebook. By default, a cell is a _code_ cell, which means that you can enter any valid python code into it and run it. Another important type of cell is a _markdown_ cell. This lets you put text, with different formatting (italics, bold, etc) that describes what the notebook is doing.\n",
- "\n",
- "You can change the cell type via the menu at the top, or using the shortcuts:\n",
- "\n",
- " * ctrl-m m : mark down cell\n",
- " * ctrl-m y : code cell"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Some useful short-cuts:\n",
- "\n",
- " * shift+enter = run cell and jump to the next (creating a new cell if there is no other new one)\n",
- " * ctrl+enter = run cell-in place\n",
- " * alt+enter = run cell and insert a new one below\n",
- "\n",
- "ctrl+m h lists other commands"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A \"markdown cell\" enables you to typeset LaTeX equations right in your notebook. Just put them in $ or $$:\n",
- "\n",
- "$$\\frac{\\partial \\rho}{\\partial t} + \\nabla \\cdot (\\rho U) = 0$$"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "**Important**: when you work through a notebook, everything you did in previous cells is still in memory and _known_ by python, so you can refer to functions and variables that were previously defined. Even if you go up to the top of a notebook and insert a cell, all the information done earlier in your notebook session is still defined -- it doesn't matter where physically you are in the notebook. If you want to reset things, you can use the options under the _Kernel_ menu.\n",
- "
\n",
- "\n",
+ "````{admonition} Quick Exercise\n",
+ " \n",
"`zip()` allows us to loop over two iterables at the same time. Consider the following two\n",
"lists:\n",
"\n",
"```\n",
- "a = [1, 2, 3, 4, 5, 6, 7, 8]\n",
- "b = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"]\n",
+ "\n",
+ " a = [1, 2, 3, 4, 5, 6, 7, 8]\n",
+ " b = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"]\n",
+ " \n",
"```\n",
"\n",
"`zip(a, b)` will act like a list with each element a tuple with one item from `a` and the corresponding element from `b`. \n",
"\n",
"Try looping over these lists together (using `zip()`) and print the corresponding elements from each list together on a single line.\n",
"\n",
- ""
+ "````"
]
},
{
@@ -276,11 +367,10 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
+ " \n",
"\n",
"The `.split()` function on a string can split it into words (separating on spaces). \n",
"\n",
@@ -290,7 +380,77 @@
"\n",
"and print one word per line\n",
"\n",
- ""
+ "````"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## List Comprehensions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "list comprehensions provide a compact way to initialize lists. Some examples from the tutorial"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "squares = [x**2 for x in range(10)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "squares"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "````{admonition} Quick Exercise\n",
+ "\n",
+ "Use a list comprehension to create a new list from `squares` containing only the even numbers. It might be helpful to use the modulus operator, `%`\n",
+ "\n",
+ "````"
]
},
{
@@ -303,7 +463,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -317,9 +477,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.13.1"
}
},
"nbformat": 4,
- "nbformat_minor": 1
+ "nbformat_minor": 4
}
diff --git a/lectures/01-python/w2-python-exercises.ipynb b/content/01-python/w2-python-exercises.ipynb
similarity index 93%
rename from lectures/01-python/w2-python-exercises.ipynb
rename to content/01-python/w2-python-exercises.ipynb
index c99983e6..1651a963 100644
--- a/lectures/01-python/w2-python-exercises.ipynb
+++ b/content/01-python/w2-python-exercises.ipynb
@@ -1,16 +1,5 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from __future__ import print_function"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -41,7 +30,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -67,7 +56,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -78,13 +67,13 @@
"source": [
"## Q 3\n",
"\n",
- "The function `enumerate(sequence)` returns tuples containing indicies of objects in the sequence, and the objects. \n",
+ "The function `enumerate(sequence)` returns tuples containing indices of objects in the sequence, and the objects. \n",
"\n",
"The `random` module provides tools for working with the random numbers. In particular, `random.randint(start, end)` generates a random number not smaller than `start`, and not bigger than `end`.\n",
"\n",
" * Generate a list of 10 random numbers from 0 to 9.\n",
" \n",
- " * Using the `enumerate(random_list)` function, iterate over the tuples of random numbers and their indicies, and print out *\"Match: NUMBER and INDEX\"* if the random number and its index in the list match."
+ " * Using the `enumerate(random_list)` function, iterate over the tuples of random numbers and their indices, and print out *\"Match: NUMBER and INDEX\"* if the random number and its index in the list match."
]
},
{
@@ -130,7 +119,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -150,7 +139,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -168,7 +157,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -188,7 +177,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -206,7 +195,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -248,7 +237,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -288,7 +277,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Another problem is case—we want to count \"but\" and \"But\" as the same. Strings have a `lower()` method that can be used to covert a string:"
+ "Another problem is case—we want to count \"but\" and \"But\" as the same. Strings have a `lower()` method that can be used to convert a string:"
]
},
{
@@ -331,7 +320,7 @@
" * convert to lowercase\n",
" * test if the word is already a key in the dictionary (using the `in` operator)\n",
" - if the key exists, increment the word count for that key\n",
- " - otherwise, add it to the dictionary with the appropiate count of `1`.\n",
+ " - otherwise, add it to the dictionary with the appropriate count of `1`.\n",
"\n",
"At the end, print out the words and a count of how many times they appear"
]
@@ -340,7 +329,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -367,7 +356,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -385,7 +374,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -423,7 +412,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
@@ -442,7 +431,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -456,9 +445,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.9.9"
}
},
"nbformat": 4,
- "nbformat_minor": 1
+ "nbformat_minor": 4
}
diff --git a/lectures/01-python/w3-python-exceptions.ipynb b/content/01-python/w3-python-exceptions.ipynb
similarity index 95%
rename from lectures/01-python/w3-python-exceptions.ipynb
rename to content/01-python/w3-python-exceptions.ipynb
index ae2a9b1e..c5769516 100644
--- a/lectures/01-python/w3-python-exceptions.ipynb
+++ b/content/01-python/w3-python-exceptions.ipynb
@@ -1,16 +1,5 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from __future__ import print_function"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -173,7 +162,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -187,9 +176,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.3"
+ "version": "3.9.9"
}
},
"nbformat": 4,
- "nbformat_minor": 1
+ "nbformat_minor": 4
}
diff --git a/lectures/01-python/w3-python-exercises.ipynb b/content/01-python/w3-python-exercises.ipynb
similarity index 81%
rename from lectures/01-python/w3-python-exercises.ipynb
rename to content/01-python/w3-python-exercises.ipynb
index cbee0823..f84e4a67 100644
--- a/lectures/01-python/w3-python-exercises.ipynb
+++ b/content/01-python/w3-python-exercises.ipynb
@@ -1,5 +1,12 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Exercises"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -73,36 +80,10 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[1, 2, 1]"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "def primes(n):\n",
- " p = [1, 2]\n",
- " for num in range(n):\n",
- " prime = True\n",
- " for c in p:\n",
- " if num % c == 0:\n",
- " prime = False\n",
- " else:\n",
- " prime = True\n",
- " if prime:\n",
- " p.append(num)\n",
- " return p\n",
- "\n",
- "primes(15)"
- ]
+ "outputs": [],
+ "source": []
},
{
"cell_type": "markdown",
@@ -120,7 +101,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -146,7 +127,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -156,7 +137,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"this is a string\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "Cell \u001b[0;32mIn[4], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m a \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mthis is a string\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 2\u001b[0m b \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[0;31mValueError\u001b[0m: could not convert string to float: 'this is a string'"
]
}
@@ -168,7 +149,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -178,7 +159,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"1.2345\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "Cell \u001b[0;32mIn[5], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m a \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m1.2345\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 2\u001b[0m b \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(b, \u001b[38;5;28mtype\u001b[39m(b))\n",
"\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: '1.2345'"
]
}
@@ -191,7 +172,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -236,7 +217,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
@@ -259,7 +240,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -290,7 +271,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": 1,
"metadata": {},
"outputs": [
{
@@ -307,7 +288,7 @@
" 's9': ''}"
]
},
- "execution_count": 19,
+ "execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
@@ -317,7 +298,7 @@
"\n",
"def initialize_board(play):\n",
" for n in range(9):\n",
- " play[\"s{}\".format(n+1)] = \"\"\n",
+ " play[f\"s{n+1}\"] = \"\"\n",
"\n",
"initialize_board(play)\n",
"play"
@@ -332,7 +313,7 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -341,7 +322,7 @@
"'2 1'"
]
},
- "execution_count": 20,
+ "execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
@@ -362,7 +343,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -398,7 +379,7 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
@@ -408,20 +389,34 @@
" the desired square \"\"\"\n",
" valid_move = False\n",
" while not valid_move:\n",
- " idx = input(\"player {}, enter your move (1-9)\".format(n))\n",
- " if play[\"s{}\".format(idx)] == \"\":\n",
+ " idx = input(f\"player {n}, enter your move (1-9)\")\n",
+ " if play[f\"s{idx}\"] == \"\":\n",
" valid_move = True\n",
" else:\n",
- " print(\"invalid: {}\".format(play[\"s{}\".format(idx)]))\n",
+ " print(\"invalid move\")\n",
" \n",
- " play[\"s{}\".format(idx)] = xo"
+ " play[f\"s{idx}\"] = xo"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function get_move in module __main__:\n",
+ "\n",
+ "get_move(n, xo, play)\n",
+ " ask the current player, n, to make a move -- make sure the square was not \n",
+ " already played. xo is a string of the character (x or o) we will place in\n",
+ " the desired square\n",
+ "\n"
+ ]
+ }
+ ],
"source": [
"help(get_move)"
]
@@ -442,21 +437,48 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": [
"def play_game():\n",
" \"\"\" play a game of tic-tac-toe \"\"\"\n",
- " "
+ " \n",
+ " play ={}\n",
+ " initialize_board(play)\n",
+ " show_board(play)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " | | \n",
+ "-----+-----+-----\n",
+ " | | \n",
+ "-----+-----+----- 123\n",
+ " | | 456\n",
+ " 789 \n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "play_game()"
]
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -470,9 +492,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.11.6"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 4
}
diff --git a/lectures/01-python/w3-python-functions.ipynb b/content/01-python/w3-python-functions.ipynb
similarity index 61%
rename from lectures/01-python/w3-python-functions.ipynb
rename to content/01-python/w3-python-functions.ipynb
index 8566467d..ee20eaf9 100644
--- a/lectures/01-python/w3-python-functions.ipynb
+++ b/content/01-python/w3-python-functions.ipynb
@@ -1,19 +1,10 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from __future__ import print_function"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "# functions"
+ "# Functions"
]
},
{
@@ -27,33 +18,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "A function takes arguments, listed in the `()` and returns a value. Even if you don't explictly give a return value, one will be return (e.g., `None`). \n",
+ "A function takes arguments, listed in the `()` and returns a value. Even if you don't explicitly give a return value, one will be return (e.g., `None`). \n",
"\n",
"Here's a simple example of a function that takes a single argument, `i`"
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Hello\n",
- "None\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "a = print(\"Hello\")\n",
- "print(a)"
+ "def my_fun(i):\n",
+ " print(f\"in the function, i = {i}\")"
]
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -66,154 +48,44 @@
}
],
"source": [
- "def my_fun(i):\n",
- " print(\"in the function, i = {}\".format(i))\n",
- " \n",
"my_fun(10)\n",
"my_fun(5)"
]
},
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "in the function, i = 0\n",
- "None\n"
- ]
- }
- ],
- "source": [
- "a = my_fun(0)\n",
- "print(a)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "functions are one place where _scope_ comes into play. A function has its own _namespace_. If a variable is not defined in that function, then it will look to the namespace from where it was called to see if that variable exists there. \n",
+ "```{note}\n",
+ "Functions are one place where _scope_ comes into play. A function has its own _namespace_. If a variable is not defined in that function, then it will look to the namespace from where it was called to see if that variable exists there. \n",
"\n",
"However, you should avoid this as much as possible (variables that persist across namespaces are called global variables).\n",
- "\n",
- "We already saw one instance of namespaces when we imported from the `math` module."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "-----\n",
- "----------\n"
- ]
- }
- ],
- "source": [
- "global_var = 10\n",
- "\n",
- "def print_fun(string, n):\n",
- " if n < global_var:\n",
- " print(string*n)\n",
- " else:\n",
- " print(string*global_var)\n",
- "\n",
- "print_fun(\"-\", 5)\n",
- "print_fun(\"-\", 20)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "global_var = 100"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--------------------------------------------------\n"
- ]
- }
- ],
- "source": [
- "print_fun(\"-\",50)"
+ "```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "By default, python will let you read from a global, but not update it."
+ "Functions always return a value—if one is not explicitly given, then they return `None`, otherwise, they can return values (even multiple values) of any type"
]
},
{
"cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "in function outer = -100.0\n",
- "outside, outer = -100.0\n"
- ]
- }
- ],
- "source": [
- "outer = 1.0\n",
- "\n",
- "def update():\n",
- " # uncomment this to allow us to access outer in the calling namespace\n",
- " global outer\n",
- " outer = -100.0\n",
- " print(\"in function outer = {}\".format(outer))\n",
- " \n",
- "update()\n",
- "print(\"outside, outer = {}\".format(outer))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "functions always return a value—if one is not explicitly given, then they return None, otherwise, they can return values (even multiple values) of any type"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "in the function, i = 10\n",
- "None\n"
+ "in the function, i = 10\n"
]
}
],
"source": [
"a = my_fun(10)\n",
- "print(a)"
+ "a"
]
},
{
@@ -225,15 +97,20 @@
},
{
"cell_type": "code",
- "execution_count": 9,
- "metadata": {},
+ "execution_count": 3,
+ "metadata": {
+ "tags": []
+ },
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "12\n"
- ]
+ "data": {
+ "text/plain": [
+ "12"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
}
],
"source": [
@@ -241,18 +118,19 @@
" return a*b\n",
"\n",
"c = multiply(3, 4)\n",
- "print(c)"
+ "c"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
+ " \n",
"\n",
"Write a simple function that takes a sentence (as a string) and returns an integer equal to the length of the longest word in the sentence. The `len()` function and the `.split()` methods will be useful here.\n",
"\n",
- ""
+ "````"
]
},
{
@@ -266,13 +144,27 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "None is a special quantity in python (analogous to `null` in some other languages). We can test on `None`—the preferred manner is to use `is`:"
+ "`None` is a special quantity in python (analogous to `null` in some other languages). We can test on `None`—the preferred manner is to use `is`:"
]
},
{
"cell_type": "code",
- "execution_count": 10,
- "metadata": {},
+ "execution_count": null,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def do_nothing():\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "tags": []
+ },
"outputs": [
{
"name": "stdout",
@@ -283,9 +175,6 @@
}
],
"source": [
- "def do_nothing():\n",
- " pass\n",
- "\n",
"a = do_nothing()\n",
"if a is None:\n",
" print(\"we didn't do anything\")"
@@ -293,8 +182,10 @@
},
{
"cell_type": "code",
- "execution_count": 11,
- "metadata": {},
+ "execution_count": 5,
+ "metadata": {
+ "tags": []
+ },
"outputs": [
{
"data": {
@@ -302,7 +193,7 @@
"True"
]
},
- "execution_count": 11,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -315,112 +206,106 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## More Complex Functions\n",
- "\n",
- "Here's a more complex example. We return a pair of variables—behind the scenes in python this is done by packing them into a tuple and then unpacking on the calling end. Also note the _docstring_ here."
+ "## Keyword arguments\n"
]
},
{
- "cell_type": "code",
- "execution_count": 13,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "14\n",
- "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]\n"
- ]
- }
- ],
"source": [
- "def fib2(n): # return Fibonacci series up to n (from the python tutorial)\n",
- " \"\"\"Return a list containing the Fibonacci series up to n.\"\"\"\n",
- " result = []\n",
- " a, b = 0, 1\n",
- " while a < n:\n",
- " result.append(a) # see below\n",
- " a, b = b, a+b\n",
- " return result, len(result)\n",
- "\n",
- "fib, n = fib2(250)\n",
- "print(n)\n",
- "print(fib)"
+ "You can have optional arguments which provide defaults. Here's a simple function that computes $\\sin(\\theta)$ where $\\theta$ can optionally be in degrees."
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": 1,
"metadata": {},
+ "outputs": [],
"source": [
- "Note that this function includes a docstring (just after the function definition). This is used by the help system"
+ "import math"
]
},
{
"cell_type": "code",
- "execution_count": 14,
- "metadata": {},
+ "execution_count": 2,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def my_sin(theta, in_degrees=False):\n",
+ " if in_degrees:\n",
+ " return math.sin(math.radians(theta))\n",
+ " return math.sin(theta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "tags": []
+ },
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Help on function fib2 in module __main__:\n",
- "\n",
- "fib2(n)\n",
- " Return a list containing the Fibonacci series up to n.\n",
- "\n"
- ]
+ "data": {
+ "text/plain": [
+ "(0.7071067811865475, 0.7071067811865475)"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
}
],
"source": [
- "help(fib2)"
+ "my_sin(math.pi/4), my_sin(45, in_degrees=True) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "You can have optional arguments which provide defaults. Here's a simple function that validates an answer, with an optional argument that can provide the correct answer."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def check_answer(val, correct_answer=\"a\"):\n",
- " if val == correct_answer:\n",
- " return True\n",
- " else:\n",
- " return False\n",
+ "```{important}\n",
+ "It is important to note that python evaluates the optional arguments once—when the function is defined. This means that if you make the default an empty object, for instance, it will persist across all call.\n",
"\n",
- "print(check_answer(\"a\"))\n",
- "print(check_answer(\"a\", correct_answer=\"b\"))"
+ "**This leads to one of the most common errors for beginners**\n",
+ "```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "it is important to note that python evaluates the optional arguments once—when the function is defined. This means that if you make the default an empty object, for instance, it will persist across all calls.\n",
- "\n",
- "** This leads to one of the most common errors for beginners **\n",
- "\n",
"Here's an example of trying to initialize to an empty list:"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def f(a, L=[]):\n",
" L.append(a)\n",
- " return L\n",
- "\n",
+ " return L"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1]\n",
+ "[1, 2]\n",
+ "[1, 2, 3]\n"
+ ]
+ }
+ ],
+ "source": [
"print(f(1))\n",
"print(f(2))\n",
"print(f(3))"
@@ -440,7 +325,13 @@
"execution_count": null,
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "def fnew(a, L=None):\n",
+ " if L is None:\n",
+ " L = []\n",
+ " L.append(a)\n",
+ " return L"
+ ]
},
{
"cell_type": "code",
@@ -448,12 +339,6 @@
"metadata": {},
"outputs": [],
"source": [
- "def fnew(a, L=None):\n",
- " if L is None:\n",
- " L = []\n",
- " L.append(a)\n",
- " return L\n",
- "\n",
"print(fnew(1))\n",
"print(fnew(2))\n",
"print(fnew(3))"
@@ -461,9 +346,17 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 2]\n"
+ ]
+ }
+ ],
"source": [
"L = fnew(1)\n",
"print(fnew(2, L=L))"
@@ -478,9 +371,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 2]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"L"
]
@@ -503,7 +407,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
@@ -513,9 +417,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"pairs"
]
@@ -524,14 +439,41 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Here we use a lambda in an extract from a list (with the filter command)"
+ "Here we use a lambda in an extract from a list (with the filter function)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 15,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0,\n",
+ " 36,\n",
+ " 144,\n",
+ " 324,\n",
+ " 576,\n",
+ " 900,\n",
+ " 1296,\n",
+ " 1764,\n",
+ " 2304,\n",
+ " 2916,\n",
+ " 3600,\n",
+ " 4356,\n",
+ " 5184,\n",
+ " 6084,\n",
+ " 7056,\n",
+ " 8100,\n",
+ " 9216]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"squares = [x**2 for x in range(100)]\n",
"sq = list(filter(lambda x : x%2 == 0 and x%3 == 0, squares))\n",
@@ -540,9 +482,44 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on class filter in module builtins:\n",
+ "\n",
+ "class filter(object)\n",
+ " | filter(function or None, iterable) --> filter object\n",
+ " | \n",
+ " | Return an iterator yielding those items of iterable for which function(item)\n",
+ " | is true. If function is None, return the items that are true.\n",
+ " | \n",
+ " | Methods defined here:\n",
+ " | \n",
+ " | __getattribute__(self, name, /)\n",
+ " | Return getattr(self, name).\n",
+ " | \n",
+ " | __iter__(self, /)\n",
+ " | Implement iter(self).\n",
+ " | \n",
+ " | __next__(self, /)\n",
+ " | Implement next(self).\n",
+ " | \n",
+ " | __reduce__(...)\n",
+ " | Return state information for pickling.\n",
+ " | \n",
+ " | ----------------------------------------------------------------------\n",
+ " | Static methods defined here:\n",
+ " | \n",
+ " | __new__(*args, **kwargs) from builtins.type\n",
+ " | Create and return a new object. See help(type) for accurate signature.\n",
+ "\n"
+ ]
+ }
+ ],
"source": [
"help(filter)"
]
@@ -550,7 +527,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -564,9 +541,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.13.2"
}
},
"nbformat": 4,
- "nbformat_minor": 1
+ "nbformat_minor": 4
}
diff --git a/lectures/01-python/w4-python-classes.ipynb b/content/01-python/w4-python-classes.ipynb
similarity index 75%
rename from lectures/01-python/w4-python-classes.ipynb
rename to content/01-python/w4-python-classes.ipynb
index 969e2657..6e539844 100644
--- a/lectures/01-python/w4-python-classes.ipynb
+++ b/content/01-python/w4-python-classes.ipynb
@@ -1,16 +1,5 @@
{
"cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from __future__ import print_function"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -20,7 +9,9 @@
},
{
"cell_type": "markdown",
- "metadata": {},
+ "metadata": {
+ "tags": []
+ },
"source": [
"Classes are the fundamental concept for object oriented programming. A class defines a data type with both data and functions that can operate on the data. An object is an instance of a class. Each object will have its own namespace (separate from other instances of the class and other functions, etc. in your program).\n",
"\n",
@@ -29,47 +20,36 @@
},
{
"cell_type": "markdown",
- "metadata": {},
+ "metadata": {
+ "tags": []
+ },
"source": [
- "simplest example: just a container (like a struct in C)"
+ "## Naming conventions"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "class Container(object):\n",
- " pass\n",
- " \n",
- "a = Container()\n",
- "a.x = 1\n",
- "a.y = 2\n",
- "a.z = 3\n",
+ "The python community has some naming convections, defined in PEP-8:\n",
"\n",
- "b = Container()\n",
- "b.xyz = 1\n",
- "b.uvw = 2\n",
+ "https://www.python.org/dev/peps/pep-0008/\n",
"\n",
- "print(a.x, a.y, a.z)\n",
- "print(b.xyz, b.uvw)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "notice that you don't have to declare what variables are members of the class ahead of time (although, usually that's good practice).\n",
+ "The widely adopted ones are:\n",
"\n",
- "Here, we give the class name an argument, `object`. This is an example of inheritance. For a general class, we inherit from the base python `object` class."
+ "* class names start with an uppercase, and use \"camelcase\" for multiword names, e.g. `ShoppingCart`\n",
+ "\n",
+ "* variable names (including objects which are instances of a class) are lowercase and use underscores to separate words, e.g., `shopping_cart`\n",
+ "\n",
+ "* module names should be lowercase with underscores\n",
+ "\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## More useful class"
+ "## A simple class"
]
},
{
@@ -85,15 +65,24 @@
"metadata": {},
"outputs": [],
"source": [
- "class Student(object):\n",
+ "class Student:\n",
" def __init__(self, name, grade=None):\n",
" self.name = name\n",
" self.grade = grade"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This has a function, `__init__()` which is called automatically when we create an instance of the class. \n",
+ "\n",
+ "The argument `self` refers to the object that we will create, and points to the memory that they object will use to store the class's contents."
+ ]
+ },
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
@@ -120,7 +109,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -144,42 +133,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
"Loop over the students in the `students` list and print out the name and grade of each student, one per line.\n",
"\n",
- ""
+ "````"
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "fry F-\n",
- "leela A\n",
- "zoidberg F\n",
- "hubert C+\n",
- "bender B\n",
- "calculon C\n",
- "amy A\n",
- "hermes A\n",
- "scruffy D\n",
- "flexo F\n",
- "morbo D\n",
- "hypnotoad A+\n",
- "zapp Q\n"
- ]
- }
- ],
- "source": [
- "for s in students:\n",
- " print(s.name, s.grade)"
- ]
+ "outputs": [],
+ "source": []
},
{
"cell_type": "markdown",
@@ -190,7 +156,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -199,7 +165,7 @@
"['leela', 'amy', 'hermes', 'hypnotoad']"
]
},
- "execution_count": 8,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -220,18 +186,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "here's a more complicated class that represents a playing card. Notice that we are using unicode to represent the suits.\n",
- "\n",
- "unicode support in python is also one of the major differences between python 2 and 3. In python 3, every string is unicode."
+ "Here's a more complicated class that represents a playing card. Notice that we are using unicode to represent the suits."
]
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
- "class Card(object):\n",
+ "class Card:\n",
" \n",
" def __init__(self, suit=1, rank=2):\n",
" if suit < 1 or suit > 4:\n",
@@ -241,7 +205,6 @@
" self.suit = suit\n",
" self.rank = rank\n",
" \n",
- "\n",
" def value(self):\n",
" \"\"\" we want things order primarily by rank then suit \"\"\"\n",
" return self.suit + (self.rank-1)*14\n",
@@ -250,7 +213,13 @@
" def __lt__(self, other):\n",
" return self.value() < other.value()\n",
"\n",
- " def __unicode__(self):\n",
+ " def __eq__(self, other):\n",
+ " return self.rank == other.rank and self.suit == other.suit\n",
+ " \n",
+ " def __repr__(self):\n",
+ " return self.__str__()\n",
+ " \n",
+ " def __str__(self):\n",
" suits = [u\"\\u2660\", # spade\n",
" u\"\\u2665\", # heart\n",
" u\"\\u2666\", # diamond\n",
@@ -266,25 +235,19 @@
" elif self.rank == 14:\n",
" r = \"A\"\n",
" \n",
- " return r +':'+suits[self.suit-1]\n",
- " \n",
- " def __str__(self):\n",
- " return self.__unicode__() #.encode('utf-8')\n",
- " "
+ " return r +':'+suits[self.suit-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "When you instantiate a class, the `__init__` method is called. Note that all method in a class always have \"`self`\" as the first argument -- this refers to the object that is invoking the method.\n",
- "\n",
"we can create a card easily."
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -300,11 +263,11 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
- "c2 = Card(suit=1, rank=13)"
+ "c2 = Card(suit=2, rank=2)"
]
},
{
@@ -316,27 +279,27 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "15"
+ "16"
]
},
- "execution_count": 12,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "c1.value()"
+ "c2.value()"
]
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
@@ -355,12 +318,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The `__str__` method converts the object into a string that can be printed. The `__unicode__` method is actually for python 2."
+ "The `__str__` method converts the object into a string that can be printed."
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -368,7 +331,7 @@
"output_type": "stream",
"text": [
"2:♠\n",
- "K:♠\n"
+ "2:♥\n"
]
}
],
@@ -386,7 +349,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -412,7 +375,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
@@ -422,7 +385,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mc1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "Cell \u001b[0;32mIn[12], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mc1\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mc2\u001b[49m\n",
"\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'Card' and 'Card'"
]
}
@@ -435,116 +398,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
" * Create a \"hand\" corresponding to a straight (5 cards of any suite, but in sequence of rank)\n",
" * Create another hand corresponding to a flush (5 cards all of the same suit, of any rank)\n",
" * Finally create a hand with one of the cards duplicated—this should not be allowed in a standard deck of cards. How would you check for this?\n",
"\n",
- ""
+ "````"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Deck of Cards"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "classes can use other include other classes as data objects—here's a deck of cards. Note that we are using the python random module here."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import random\n",
- "\n",
- "class Deck(object):\n",
- " \"\"\" the deck is a collection of cards \"\"\"\n",
- "\n",
- " def __init__(self):\n",
- "\n",
- " self.nsuits = 4\n",
- " self.nranks = 13\n",
- " self.minrank = 2\n",
- " self.maxrank = self.minrank + self.nranks - 1\n",
- "\n",
- " self.cards = []\n",
- "\n",
- " for rank in range(self.minrank,self.maxrank+1):\n",
- " for suit in range(1, self.nsuits+1):\n",
- " self.cards.append(Card(rank=rank, suit=suit))\n",
- "\n",
- " def shuffle(self):\n",
- " random.shuffle(self.cards)\n",
- "\n",
- " def get_cards(self, num=1):\n",
- " hand = []\n",
- " for n in range(num):\n",
- " hand.append(self.cards.pop())\n",
- "\n",
- " return hand\n",
- " \n",
- " def __str__(self):\n",
- " string = \"\"\n",
- " for c in self.cards:\n",
- " string += str(c) + \" \"\n",
- " return string"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "let's create a deck, shuffle, and deal a hand (for a poker game)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "mydeck = Deck()\n",
- "print(mydeck)\n",
- "print(len(mydeck.cards))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "notice that there is no error handling in this class. The get_cards() will deal cards from the deck, removing them in the process. Eventually we'll run out of cards."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "mydeck.shuffle()\n",
- "\n",
- "hand = mydeck.get_cards(5)\n",
- "for c in sorted(hand): print(c)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -561,11 +432,11 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "class Currency(object):\n",
+ "class Currency:\n",
" \"\"\" a simple class to hold foreign currency \"\"\"\n",
" \n",
" def __init__(self, amount, country=\"US\"):\n",
@@ -573,12 +444,13 @@
" self.country = country\n",
" \n",
" def __add__(self, other):\n",
- " if self.country != other.country:\n",
- " return None\n",
" return Currency(self.amount + other.amount, country=self.country)\n",
- " \n",
+ "\n",
+ " def __sub__(self, other):\n",
+ " return Currency(self.amount - other.amount, country=self.country)\n",
+ "\n",
" def __str__(self):\n",
- " return \"{} {}\".format(self.amount, self.country)"
+ " return f\"{self.amount} {self.country}\""
]
},
{
@@ -590,48 +462,38 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "None\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"d1 = Currency(10, \"US\")\n",
- "d2 = Currency(15, \"Euro\")\n",
- "print(d1 + d2)"
+ "d2 = Currency(15, \"US\")\n",
+ "print(d2 - d1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Note that the traditional way to import numpy is to rename it np. This saves on typing and makes your code a little more compact.
"
+ "````{note}\n",
+ " \n",
+ "Note that the traditional way to import numpy is to rename it `np`. This saves on typing and makes your code a little more compact.\n",
+ "````"
]
},
{
@@ -57,7 +51,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Array Creation and Properties"
+ "## Array Creation and Properties"
]
},
{
@@ -132,7 +126,7 @@
"metadata": {},
"outputs": [],
"source": [
- "help(a)"
+ "#help(a)"
]
},
{
@@ -175,7 +169,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There is also an analogous ones() and empty() array routine. Note that here we can explicitly set the datatype for the array in this function if we wish. \n",
+ "There is also an analogous `ones()` and `empty()` array routine. Note that here we can explicitly set the datatype for the array in this function if we wish. \n",
"\n",
"Unlike lists in python, all of the elements of a numpy array are of the same datatype"
]
@@ -211,11 +205,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
"Analogous to `linspace()`, there is a `logspace()` function that creates an array with elements equally spaced in log. Use `help(np.logspace)` to see the arguments, and create an array with 10 elements from $10^{-6}$ to $10^3$.\n",
"\n",
- ""
+ "````"
]
},
{
@@ -229,34 +223,22 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "we can also initialize an array based on a function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "f = np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)\n",
- "f"
+ "## Array Operations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Array Operations"
+ "most operations (`+`, `-`, `*`, `/`) will work on an entire array at once, element-by-element.\n",
+ "\n",
+ "Note that that the multiplication operator is not a matrix multiply, but `@` will do matrix multiplication."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "most operations (`+`, `-`, `*`, `/`) will work on an entire array at once, element-by-element.\n",
- "\n",
- "Note that that the multiplication operator is not a matrix multiply (there is a new operator in python 3.5+, `@`, to do matrix multiplicaiton.\n",
- "\n",
"Let's create a simply array to start with"
]
},
@@ -312,7 +294,9 @@
{
"cell_type": "code",
"execution_count": null,
- "metadata": {},
+ "metadata": {
+ "tags": []
+ },
"outputs": [],
"source": [
"a*a"
@@ -322,18 +306,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "We can think of our 2-d array as a 3 x 5 matrix (3 rows, 5 columns). We can take the transpose to geta 5 x 3 matrix, and then we can do a matrix multiplication"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
"What do you think `1./a` will do? Try it and see\n",
"\n",
- ""
+ "````"
]
},
{
@@ -343,6 +320,13 @@
"outputs": [],
"source": []
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can think of our 2-d array as a 3 x 4 matrix (3 rows, 4 columns). We can take the transpose to geta 4 x 3 matrix, and then we can do a matrix multiplication"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -389,11 +373,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
"`sum()` takes an optional argument, `axis=N`, where `N` is the axis to sum over. Sum the elements of `a` across rows to create an array with just the sum along each column of `a`.\n",
"\n",
- ""
+ "````"
]
},
{
@@ -430,7 +414,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "universal functions work element-by-element. Let's create a new array scaled by `pi`"
+ "universal functions work element-by-element. Let's create a new array scaled by `pi / 12`"
]
},
{
@@ -475,14 +459,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
+ "````{admonition} Quick Exercise\n",
"\n",
"We will often want to write our own function that operates on an array and returns a new array. We can do this just like we did with functions previously—the key is to use the methods from the `np` module to do any operations, since they work on, and return, arrays.\n",
"\n",
"Write a simple function that returns $\\sin(2\\pi x)$ for an input array `x`. Then test it \n",
"by passing in an array `x` that you create via `linspace()`\n",
"\n",
- ""
+ "````"
]
},
{
@@ -496,7 +480,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Slicing"
+ "## Slicing"
]
},
{
@@ -505,9 +489,7 @@
"source": [
"slicing works very similarly to how we saw with strings. Remember, python uses 0-based indexing\n",
"\n",
- "\n",
- "\n",
- "Let's create this array from the image:"
+ "Consider the following array:"
]
},
{
@@ -547,7 +529,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Giving a range uses the range of the edges to return the values"
+ "When we do a range, like `a[2:5]`, then we get the elements starting at index 2 and up to, *but not including* index 5.\n",
+ "\n",
+ "That is, slicing uses the interval: [begin, end)"
]
},
{
@@ -556,7 +540,7 @@
"metadata": {},
"outputs": [],
"source": [
- "print(a[2:3])"
+ "a[2:5]"
]
},
{
@@ -604,24 +588,26 @@
"* passing arrays between languages (we'll talk about this later this semester)\n",
"* looping over arrays -- you want to access elements that are next to one-another in memory\n",
" * e.g, in Fortran:\n",
- " ```\n",
- " double precision :: A(M,N)\n",
- " do j = 1, N\n",
- " do i = 1, M\n",
- " A(i,j) = …\n",
- " enddo\n",
- " enddo\n",
- " ```\n",
+ " \n",
+ " ```\n",
+ " double precision :: A(M,N)\n",
+ " do j = 1, N\n",
+ " do i = 1, M\n",
+ " A(i,j) = …\n",
+ " enddo\n",
+ " enddo\n",
+ " ```\n",
" \n",
" * in C\n",
- " ```\n",
- " double A[M][N];\n",
- " for (i = 0; i < M; i++) {\n",
- " for (j = 0; j < N; j++) {\n",
- " A[i][j] = …\n",
- " }\n",
- " } \n",
- " ```\n",
+ " \n",
+ " ```\n",
+ " double A[M][N];\n",
+ " for (i = 0; i < M; i++) {\n",
+ " for (j = 0; j < N; j++) {\n",
+ " A[i][j] = …\n",
+ " }\n",
+ " } \n",
+ " ```\n",
" \n",
"\n",
"In python, using NumPy, we'll try to avoid explicit loops over elements as much as possible\n",
@@ -750,516 +736,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Quick Exercise:
\n",
- "\n",
- "Consider the array defined as:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "q = np.array([[1, 2, 3, 2, 1],\n",
- " [2, 4, 4, 4, 2],\n",
- " [3, 4, 4, 4, 3],\n",
- " [2, 4, 4, 4, 2],\n",
- " [1, 2, 3, 2, 1]])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- " * using slice notation, create an array that consists of only the `4`'s in `q` (this will be called a _view_, as we'll see shortly)\n",
- " * zero out all of the elements in your view\n",
- " * how does `q` change?\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Copying Arrays"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "simply using \"=\" does not make a copy, but much like with lists, you will just have multiple names pointing to the same ndarray object\n",
- "\n",
- "Therefore, we need to understand if two arrays, `A` and `B` point to:\n",
- "* the same array, including shape and data/memory space\n",
- "* the same data/memory space, but perhaps different shapes (a _view_)\n",
- "* a separate cpy of the data (i.e. stored completely separately in memory)\n",
- "\n",
- "All of these are possible:\n",
- "* `B = A`\n",
- " \n",
- " this is _assignment_. No copy is made. `A` and `B` point to the same data in memory and share the same shape, etc. They are just two different labels for the same object in memory\n",
- " \n",
- "\n",
- "* `B = A[:]`\n",
- "\n",
- " this is a _view_ or _shallow copy_. The shape info for A and B are stored independently, but both point to the same memory location for data\n",
- " \n",
- " \n",
- "* `B = A.copy()`\n",
- "\n",
- " this is a _deep_ copy. A completely separate object will be created in memory, with a completely separate location in memory.\n",
- " \n",
- "Let's look at examples"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.arange(10)\n",
- "print(a)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here is assignment—we can just use the `is` operator to test for equality"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "b = a\n",
- "b is a"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Since `b` and `a` are the same, changes to the shape of one are reflected in the other—no copy is made."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "b.shape = (2, 5)\n",
- "print(b)\n",
- "a.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "b is a"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(a)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "a shallow copy creates a new *view* into the array—the _data_ is the same, but the array properties can be different"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.arange(12)\n",
- "c = a[:]\n",
- "a.shape = (3,4)\n",
- "\n",
- "print(a)\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "since the underlying data is the same memory, changing an element of one is reflected in the other"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "c[1] = -1\n",
- "print(a)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Even slices into an array are just views, still pointing to the same memory"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "d = c[3:8]\n",
- "print(d)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "d[:] = 0 "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(a)\n",
- "print(c)\n",
- "print(d)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "There are lots of ways to inquire if two arrays are the same, views, own their own data, etc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(c is a)\n",
- "print(c.base is a)\n",
- "print(c.flags.owndata)\n",
- "print(a.flags.owndata)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "to make a copy of the data of the array that you can deal with independently of the original, you need a _deep copy_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "d = a.copy()\n",
- "d[:,:] = 0.0\n",
- "\n",
- "print(a)\n",
- "print(d)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Boolean Indexing"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "There are lots of fun ways to index arrays to access only those elements that meet a certain condition"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.arange(12).reshape(3,4)\n",
- "a"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here we set all the elements in the array that are > 4 to zero"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a[a > 4] = 0\n",
- "a"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "and now, all the zeros to -1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a[a == 0] = -1\n",
- "a"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a == -1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "if we have 2 tests, we need to use `logical_and()` or `logical_or()`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.arange(12).reshape(3,4)\n",
- "a[np.logical_and(a > 3, a <= 9)] = 0.0\n",
- "a"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Our test that we index the array with returns a boolean array of the same shape:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "a > 4"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Avoiding Loops"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In general, you want to avoid loops over elements on an array.\n",
+ "````{admonition} Quick Exercise\n",
"\n",
- "Here, let's create 1-d x and y coordinates and then try to fill some larger array"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "M = 32\n",
- "N = 64\n",
- "xmin = ymin = 0.0\n",
- "xmax = ymax = 1.0\n",
+ "Consider the array defined as:\n",
"\n",
- "x = np.linspace(xmin, xmax, M, endpoint=False)\n",
- "y = np.linspace(ymin, ymax, N, endpoint=False)\n",
+ "```\n",
"\n",
- "print(x.shape)\n",
- "print(y.shape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we'll time out code"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import time"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "t0 = time.time()\n",
- "\n",
- "g = np.zeros((M, N))\n",
+ " q = np.array([[1, 2, 3, 2, 1],\n",
+ " [2, 4, 4, 4, 2],\n",
+ " [3, 4, 4, 4, 3],\n",
+ " [2, 4, 4, 4, 2],\n",
+ " [1, 2, 3, 2, 1]])\n",
+ " \n",
+ "```\n",
"\n",
- "for i in range(M):\n",
- " for j in range(N):\n",
- " g[i,j] = np.sin(2.0*np.pi*x[i]*y[j])\n",
- " \n",
- "t1 = time.time()\n",
- "print(\"time elapsed: {} s\".format(t1-t0))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now let's instead do this using all array syntax. First will extend our 1-d coordinate arrays to be 2-d. NumPy has a function for this (`meshgrid()`)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "x2d, y2d = np.meshgrid(x, y, indexing=\"ij\")\n",
- "\n",
- "print(x2d[:,0])\n",
- "print(x2d[0,:])\n",
- "\n",
- "print(y2d[:,0])\n",
- "print(y2d[0,:])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "t0 = time.time()\n",
- "g2 = np.sin(2.0*np.pi*x2d*y2d)\n",
- "t1 = time.time()\n",
- "print(\"time elapsed: {} s\".format(t1-t0))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(np.max(np.abs(g2-g)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Numerical differencing on NumPy arrays"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we want to construct a derivative, \n",
- "$$\n",
- "\\frac{d f}{dx}\n",
- "$$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "x = np.linspace(0, 2*np.pi, 25)\n",
- "f = np.sin(x)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We want to do this without loops—we'll use views into arrays offset from one another. Recall from calculus that a derivative is approximately:\n",
- "$$\n",
- "\\frac{df}{dx} = \\frac{f(x+h) - f(x)}{h}\n",
- "$$\n",
- "Here, we'll take $h$ to be a single adjacent element"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "dx = x[1] - x[0]\n",
- "dfdx = (f[1:] - f[:-1])/dx"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "dfdx"
+ " * using slice notation, create an array that consists of only the `4`'s in `q` (this will be called a _view_, as we'll see shortly)\n",
+ " * zero out all of the elements in your view\n",
+ " * how does `q` change?\n",
+ "````"
]
},
{
@@ -1272,7 +766,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -1286,9 +780,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.13.2"
}
},
"nbformat": 4,
- "nbformat_minor": 1
+ "nbformat_minor": 4
}
diff --git a/lectures/02-numpy/numpy-exercises.ipynb b/content/02-numpy/numpy-exercises.ipynb
similarity index 95%
rename from lectures/02-numpy/numpy-exercises.ipynb
rename to content/02-numpy/numpy-exercises.ipynb
index 1a5e8454..1a352e89 100644
--- a/lectures/02-numpy/numpy-exercises.ipynb
+++ b/content/02-numpy/numpy-exercises.ipynb
@@ -18,10 +18,8 @@
},
{
"cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": 2,
+ "metadata": {},
"outputs": [],
"source": [
"import numpy as np"
@@ -45,7 +43,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -73,7 +71,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -99,7 +97,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -121,7 +119,10 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "collapsed": true,
+ "jupyter": {
+ "outputs_hidden": true
+ }
},
"outputs": [],
"source": []
@@ -143,7 +144,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -168,7 +169,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": true
+ "tags": []
},
"outputs": [],
"source": []
@@ -185,6 +186,7 @@
"\n",
"Given an array, $a$, and an average $\\bar{a}$, the standard deviation\n",
"is:\n",
+ "\n",
"$$\n",
"\\sigma = \\left [ \\frac{1}{N} \\sum_{i=1}^N (a_i - \\bar{a})^2 \\right ]^{1/2}\n",
"$$\n",
@@ -209,7 +211,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -223,9 +225,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.4.2"
+ "version": "3.12.1"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 4
}
diff --git a/content/02-numpy/numpy.md b/content/02-numpy/numpy.md
new file mode 100644
index 00000000..19ab63c9
--- /dev/null
+++ b/content/02-numpy/numpy.md
@@ -0,0 +1,3 @@
+# NumPy
+
+The NumPy library provides a class for n-dimensional arrays of data.
diff --git a/lectures/02-numpy/row_column_major.png b/content/02-numpy/row_column_major.png
similarity index 100%
rename from lectures/02-numpy/row_column_major.png
rename to content/02-numpy/row_column_major.png
diff --git a/lectures/02-numpy/sample.txt b/content/02-numpy/sample.txt
similarity index 100%
rename from lectures/02-numpy/sample.txt
rename to content/02-numpy/sample.txt
diff --git a/lectures/02-numpy/slicing.png b/content/02-numpy/slicing.png
similarity index 100%
rename from lectures/02-numpy/slicing.png
rename to content/02-numpy/slicing.png
diff --git a/lectures/03-practices/git-single.md b/content/03-practices/git-single.md
similarity index 100%
rename from lectures/03-practices/git-single.md
rename to content/03-practices/git-single.md
diff --git a/lectures/03-practices/git.png b/content/03-practices/git.png
similarity index 100%
rename from lectures/03-practices/git.png
rename to content/03-practices/git.png
diff --git a/lectures/03-practices/git.txt b/content/03-practices/git.txt
similarity index 100%
rename from lectures/03-practices/git.txt
rename to content/03-practices/git.txt
diff --git a/lectures/03-practices/python-style.ipynb b/content/03-practices/python-style.ipynb
similarity index 85%
rename from lectures/03-practices/python-style.ipynb
rename to content/03-practices/python-style.ipynb
index ff82e6a8..3eca3af9 100644
--- a/lectures/03-practices/python-style.ipynb
+++ b/content/03-practices/python-style.ipynb
@@ -18,21 +18,21 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### code lay-out"
+ "## code lay-out"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "#### indentation"
+ "### indentation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Intentation should use 4 spaces per indentation level (and NOT tabs). Python 3 does not allow for a mixture of tabs and spaces. Note that a lot of editors will map the tab key into a sequence of spaces\n",
+ "Indentation should use 4 spaces per indentation level (and NOT tabs). Python 3 does not allow for a mixture of tabs and spaces. Note that a lot of editors will map the tab key into a sequence of spaces\n",
"\n",
"Continuation lines should align wrapped elements either vertically inside parentheses, brackets, or braces, or using a hanging indent (with no arguments on the first line)\n",
"\n",
@@ -65,7 +65,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## line length"
+ "### line length"
]
},
{
@@ -78,14 +78,17 @@
"\n",
"Comments and docstrings should be limited to 72-characters\n",
"\n",
- "Implied line continuation is automatic inside paranthesis, brackets"
+ "Implied line continuation is automatic inside parenthesis, brackets"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ }
},
"outputs": [],
"source": []
@@ -93,23 +96,23 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 2",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
- "name": "python2"
+ "name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
- "version": 2
+ "version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
- "pygments_lexer": "ipython2",
- "version": "2.7.10"
+ "pygments_lexer": "ipython3",
+ "version": "3.10.2"
}
},
"nbformat": 4,
- "nbformat_minor": 0
+ "nbformat_minor": 4
}
diff --git a/lectures/04-matplotlib/NOTES b/content/04-matplotlib/NOTES
similarity index 100%
rename from lectures/04-matplotlib/NOTES
rename to content/04-matplotlib/NOTES
diff --git a/lectures/04-matplotlib/anatomy1.png b/content/04-matplotlib/anatomy1.png
similarity index 100%
rename from lectures/04-matplotlib/anatomy1.png
rename to content/04-matplotlib/anatomy1.png
diff --git a/lectures/04-matplotlib/ipyvolume-example.ipynb b/content/04-matplotlib/ipyvolume-example.ipynb
similarity index 99%
rename from lectures/04-matplotlib/ipyvolume-example.ipynb
rename to content/04-matplotlib/ipyvolume-example.ipynb
index 71bb083d..fd588bc9 100644
--- a/lectures/04-matplotlib/ipyvolume-example.ipynb
+++ b/content/04-matplotlib/ipyvolume-example.ipynb
@@ -288,7 +288,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -302,9 +302,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.13.2"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 4
}
diff --git a/content/04-matplotlib/matplotlib-basics.ipynb b/content/04-matplotlib/matplotlib-basics.ipynb
new file mode 100644
index 00000000..20fae828
--- /dev/null
+++ b/content/04-matplotlib/matplotlib-basics.ipynb
@@ -0,0 +1,1242 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# matplotlib"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Matplotlib is the core plotting package in scientific python. There are others to explore as well (which we'll chat about on slack)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```{note}\n",
+ "There are different interfaces for interacting with matplotlib, an interactive, function-driven (state machine) command-set and an object-oriented version. We'll focus on the OO interface.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "````{tip}\n",
+ "To enable interactivity in the plots, install the [ipympl package](https://matplotlib.org/ipympl/) and then\n",
+ "in a cell, run:\n",
+ "\n",
+ "```\n",
+ "%matplotlib widget\n",
+ "```\n",
+ "\n",
+ "````"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Matplotlib concepts\n",
+ "\n",
+ "Matplotlib was designed with the following goals (from mpl docs):\n",
+ "\n",
+ "* Plots should look great---publication quality (e.g. antialiased)\n",
+ "* Postscript/PDF output for inclusion with TeX documents\n",
+ "* Embeddable in a graphical user interface for application development\n",
+ "* Code should be easy to understand it and extend\n",
+ "* Making plots should be easy\n",
+ "\n",
+ "Matplotlib is mostly for 2-d data, but there are some basic 3-d (surface) interfaces.\n",
+ "\n",
+ "Volumetric data requires a different approach"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Gallery\n",
+ "\n",
+ "Matplotlib has a great gallery on their webpage -- find something there close to what you are trying to do and use it as a starting point:\n",
+ "\n",
+ "https://matplotlib.org/stable/gallery/index.html"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Importing\n",
+ "\n",
+ "There are several different interfaces for matplotlib (see https://matplotlib.org/3.1.1/faq/index.html)\n",
+ "\n",
+ "Basic ideas:\n",
+ "\n",
+ "* `matplotlib` is the entire package\n",
+ "* `matplotlib.pyplot` is a module within matplotlib that provides easy access to the core plotting routines\n",
+ "* `pylab` combines pyplot and numpy into a single namespace to give a MatLab like interface. You should avoid this—it might be removed in the future.\n",
+ "\n",
+ "There are a number of modules that extend its behavior, e.g. `basemap` for plotting on a sphere, `mplot3d` for 3-d surfaces\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Anatomy of a figure\n",
+ "\n",
+ "Figures are the highest level object and can include multiple axes\n",
+ "\n",
+ "\n",
+ "(figure from: http://matplotlib.org/faq/usage_faq.html#parts-of-a-figure )\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Backends\n",
+ "\n",
+ "Interactive backends: pygtk, wxpython, tkinter, ...\n",
+ "\n",
+ "Hardcopy backends: PNG, PDF, PS, SVG, ...\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Basic plotting"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x = np.linspace(0.0, 2.0*np.pi, 50)\n",
+ "y = np.cos(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`plot()` is the most basic command.\n",
+ "\n",
+ "We'll use `plt.subplots()` to create a `Figure` and `Axis` object"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(0.0, 6.283185307179586)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "8286ca027462470cabce2c4cb4998daa",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "image/png": "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",
+ "text/html": [
+ "\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We see that there are > 500k parameters that we will be training"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Train\n",
+ "\n",
+ "For training, we pass in the inputs and target and the number of epochs to run and it will optimize the network by adjusting the weights between the nodes in the layers.\n",
+ "\n",
+ "The number of epochs is the number of times the entire data set is passed forward and backward through the network. The batch size is the number of training pairs you pass through the network at a given time. You update the parameter in your model (the weights) once for each batch. This makes things more efficient and less noisy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.8868 - loss: 0.3697 - val_accuracy: 0.9540 - val_loss: 0.1459\n",
+ "Epoch 2/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9529 - loss: 0.1573 - val_accuracy: 0.9682 - val_loss: 0.1009\n",
+ "Epoch 3/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9642 - loss: 0.1172 - val_accuracy: 0.9735 - val_loss: 0.0821\n",
+ "Epoch 4/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9702 - loss: 0.0959 - val_accuracy: 0.9793 - val_loss: 0.0693\n",
+ "Epoch 5/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9748 - loss: 0.0826 - val_accuracy: 0.9788 - val_loss: 0.0682\n",
+ "Epoch 6/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9772 - loss: 0.0732 - val_accuracy: 0.9815 - val_loss: 0.0638\n",
+ "Epoch 7/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9801 - loss: 0.0646 - val_accuracy: 0.9813 - val_loss: 0.0620\n",
+ "Epoch 8/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9814 - loss: 0.0592 - val_accuracy: 0.9808 - val_loss: 0.0636\n",
+ "Epoch 9/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9832 - loss: 0.0540 - val_accuracy: 0.9803 - val_loss: 0.0641\n",
+ "Epoch 10/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9847 - loss: 0.0486 - val_accuracy: 0.9837 - val_loss: 0.0622\n",
+ "Epoch 11/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9858 - loss: 0.0449 - val_accuracy: 0.9828 - val_loss: 0.0608\n",
+ "Epoch 12/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9872 - loss: 0.0412 - val_accuracy: 0.9840 - val_loss: 0.0599\n",
+ "Epoch 13/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9875 - loss: 0.0391 - val_accuracy: 0.9836 - val_loss: 0.0604\n",
+ "Epoch 14/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9876 - loss: 0.0374 - val_accuracy: 0.9845 - val_loss: 0.0595\n",
+ "Epoch 15/20\n",
+ "235/235 - 2s - 7ms/step - accuracy: 0.9887 - loss: 0.0351 - val_accuracy: 0.9847 - val_loss: 0.0579\n",
+ "Epoch 16/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9895 - loss: 0.0331 - val_accuracy: 0.9849 - val_loss: 0.0611\n",
+ "Epoch 17/20\n",
+ "235/235 - 2s - 6ms/step - accuracy: 0.9898 - loss: 0.0321 - val_accuracy: 0.9834 - val_loss: 0.0638\n",
+ "Epoch 18/20\n",
+ "235/235 - 2s - 6ms/step - accuracy: 0.9901 - loss: 0.0303 - val_accuracy: 0.9856 - val_loss: 0.0590\n",
+ "Epoch 19/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9904 - loss: 0.0275 - val_accuracy: 0.9846 - val_loss: 0.0702\n",
+ "Epoch 20/20\n",
+ "235/235 - 1s - 6ms/step - accuracy: 0.9906 - loss: 0.0291 - val_accuracy: 0.9842 - val_loss: 0.0664\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "epochs = 20\n",
+ "batch_size = 256\n",
+ "model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size,\n",
+ " validation_data=(X_test, y_test), verbose=2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test\n",
+ "\n",
+ "keras has a routine, `evaluate()` that can take the inputs and targets of a test data set and return the loss value and accuracy (or other defined metrics) on this data.\n",
+ "\n",
+ "Here we see we are > 98% accurate on the test data—this is the data that the model has never seen before (and was not trained with)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - accuracy: 0.9806 - loss: 0.0810\n",
+ "0.9842000007629395\n"
+ ]
+ }
+ ],
+ "source": [
+ "loss_value, accuracy = model.evaluate(X_test, y_test, batch_size=16)\n",
+ "print(accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Predicting\n",
+ "\n",
+ "Suppose we simply want to ask our neural network to predict the target for an input. We can use the `predict()` method to return the category array with the predictions. We can then use `np.argmax()` to select the most probable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 7ms/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "np.int64(7)"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.argmax(model.predict(np.array([X_test[0]])))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y_test[0]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's loop over the test set and print out what we predict vs. the true answer for those we get wrong. We can also plot the image of the digit."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 8: prediction = 6, truth is 5\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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PfHEEyovL1ddXZ0GDhxovV7cdXd3a9GiRbrllltUUFAgffp8SElJ0bBhw6Lu25+fDz0dB0m67777NHLkSOXk5GjPnj16/PHH1dDQoDfffNN033P1+QDh/8rLyyP/PGHCBBUVFWnkyJF6/fXX9eCDD5ruBnv33HNP5J9vuukmTZgwQWPGjFFNTY2mTZtmulsiVFRUaO/evVfE+6Bf5ELHYd68eZF/vummm5Sdna1p06apqalJY8aMMdj0fH3+j+AyMjI0cODA8z7F0tbWpmAwaLZXXzBs2DCNHTtWjY2N1quY+ew5wPPjfKNHj1ZGRka/fH4sXLhQmzdv1nvvvRf161uCwaBOnz6tY8eORd2/vz4fLnQcelJUVCRJfer50OcDlJKSookTJ6q6ujpyXXd3t6qrq1VcXGy6m7Xjx4+rqalJ2dnZ1quYyc/PVzAYjHp+hMNh7dix44p/fhw4cEBHjx7tV88P55wWLlyoDRs2aOvWrcrPz4+6feLEiRo8eHDU86GhoUH79+/vV8+Hix2HnuzevVuS+tbzwfpTEJfi1VdfdX6/361bt8794x//cPPmzXPDhg1zra2t1qv1qp/+9KeupqbGNTc3u7/+9a+upKTEZWRkuMOHD1uvllDt7e1u165dbteuXU6Se+6559yuXbvcv//9b+ecc88884wbNmyY27Rpk9uzZ4+bMWOGy8/PdydPnrRePa6+6Di0t7e7Rx55xNXV1bnm5mb37rvvuq997WvuhhtucKdOnbJePW4WLFjgAoGAq6mpcYcOHYpcTpw4EbnP/Pnz3YgRI9zWrVvdzp07XXFxsSsuLjbdO94udhwaGxvdz372M7dz507X3NzsNm3a5EaPHu2mTJlivXqUpAiQc8698MILbsSIES4lJcVNnjzZbd++3XqlXnf33Xe77Oxsl5KS4q677jp39913u8bGRuu1Eu69995zks67zJ4927lPP4r91FNPuaysLOf3+920adNcQ0OD9dpx90XH4cSJE2769Olu+PDhbvDgwW7kyJFu7ty5/e4/0nr695fk1q5dG7nPyZMn3Y9//GP3pS99yV199dXuzjvvdIcOHTLdO94udhz279/vpkyZ4tLT053f73fXX3+9e/TRR10oFLJePQq/jgEAYKLPvwcEAOifCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAAT/wMKCQeSQPmrrQAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 247: prediction = 2, truth is 4\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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Ow6SdO+992rkyJHKycnRvn379MQTT6iurk5vvfWW6bzf1OsDhP8pLS2N/Hn8+PEqKCjQyJEj9eabb+qBBx4wnQ325syZE/nzDTfcoPHjx2v06NGqrq7WlClTTGdLhLKyMu3fv/+yeB70fM51HB588MHIn2+44QZlZ2drypQpOnjwoEaPHm0w6dl6/T/BZWRkqH///me9iqWlpUXBYNBsrt5g2LBhuu6661RfX289ipmvzwHOj7ONGjVKGRkZSXl+LFy4UJs2bdL27dujPr4lGAzq5MmTam1tjdo/Wc+Hcx2H7hQUFEhSrzofen2AUlJSNGHCBFVVVUVu6+rqUlVVlQoLC01ns3bs2DEdPHhQ2dnZ1qOYycvLUzAYjDo/wuGwdu3addmfH5988omOHj2aVOeHc04LFy7U+vXrtW3bNuXl5UXdP2HCBA0cODDqfKirq9OhQ4eS6ny40HHozt69eyWpd50P1q+CuBhr1qxxfr/fVVZWun/84x/uwQcfdMOGDXPNzc3Wo/WoX/ziF666uto1NDS4v/71r66oqMhlZGS4I0eOWI+WUG1tbe6jjz5yH330kZPkXnjhBffRRx+5//znP84555577jk3bNgwt3HjRrdv3z531113uby8PPfFF19Yjx5X5zsObW1t7rHHHnO1tbWuoaHBbd261d10003u2muvdSdOnLAePW4WLFjgAoGAq66udk1NTZHt+PHjkX0eeughN2LECLdt2za3e/duV1hY6AoLC03njrcLHYf6+nr361//2u3evds1NDS4jRs3ulGjRrlJkyZZjx6lTwTIOedeeeUVN2LECJeSkuImTpzodu7caT1Sj5s9e7bLzs52KSkp7lvf+pabPXu2q6+vtx4r4bZv3+4knbXNnTvXua9eiv3UU0+5rKws5/f73ZQpU1xdXZ312HF3vuNw/PhxN3XqVHf11Ve7gQMHupEjR7r58+cn3f+kdff3l+RWrlwZ2eeLL75wP//5z92VV17phgwZ4mbMmOGamppM5463Cx2HQ4cOuUmTJrn09HTn9/vdNddc4375y1+6UChkPXoUPo4BAGCi1z8HBABITgQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACAif8HEBHDrEMofEoAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 321: prediction = 7, truth is 2\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGxJJREFUeJzt3X9sVfX9x/HXBekVtL2slPa245YV/IETqBmDrkHxBw2ly4wIWVD8AwiBgMWInT/SiaJzWR1mfImmgyVzoJkIMxOY/MECxZboChsII0TX0aYTCLRMlt5bihRGP98/0DuuFPFc7u27tzwfyUnovefT+97ZWZ873NuDzznnBABAD+tnPQAA4NpEgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgInrrAf4qq6uLh07dkzp6eny+XzW4wAAPHLOqb29XXl5eerX7/LXOb0uQMeOHVMoFLIeAwBwlY4cOaJhw4Zd9vleF6D09HTpi8EzMjKsxwEAeBSJRBQKhaI/zy8naQGqrq7WK6+8opaWFhUWFuq1117ThAkTrrjuy792y8jIIEAAkMKu9DZKUj6EsGHDBlVUVGjZsmX66KOPVFhYqNLSUp04cSIZLwcASEFJCdCKFSs0f/58zZ07V9/97ne1evVqDRo0SL/73e+S8XIAgBSU8ACdPXtWe/fuVUlJyf9epF8/lZSUqL6+/pL9Ozs7FYlEYjYAQN+X8AB99tlnOn/+vHJycmIez8nJUUtLyyX7V1VVKRAIRDc+AQcA1wbzX0StrKxUOByObkeOHLEeCQDQAxL+KbisrCz1799fra2tMY+3trYqGAxesr/f75ff70/0GACAXi7hV0BpaWkaN26campqoo91dXWppqZGxcXFiX45AECKSsrvAVVUVGj27Nn6/ve/rwkTJmjlypXq6OjQ3Llzk/FyAIAUlJQAzZw5U//+97/1/PPPq6WlRXfccYe2bt16yQcTAADXLp9zzlkPcbFIJKJAIKBwOMydEAAgBX3Tn+Pmn4IDAFybCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACAiYQH6IUXXpDP54vZRo0aleiXAQCkuOuS8U1vv/12bd++/X8vcl1SXgYAkMKSUobrrrtOwWAwGd8aANBHJOU9oEOHDikvL08jRozQI488osOHD192387OTkUikZgNAND3JTxARUVFWrt2rbZu3apVq1apublZd911l9rb27vdv6qqSoFAILqFQqFEjwQA6IV8zjmXzBdoa2vT8OHDtWLFCs2bN++S5zs7O9XZ2Rn9OhKJKBQKKRwOKyMjI5mjAQCSIBKJKBAIXPHneNI/HTB48GDdcsstamxs7PZ5v98vv9+f7DEAAL1M0n8P6NSpU2pqalJubm6yXwoAkEISHqAnn3xSdXV1+te//qW//OUvevDBB9W/f389/PDDiX4pAEAKS/hfwR09elQPP/ywTp48qaFDh+rOO+/Url27NHTo0ES/FAAghSU8QOvXr0/0t8Q1rq2tzfOaQ4cOxfVa69ati2udVytXrvS8xufzJWWWRInnd//q6+s9rxk+fLjnNeiduBccAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGAi6f8gHXCx3//+957X/OIXv/C8pqGhwfOanhTPjUULCws9rzl37pznNZL0ySefeF7T2trqeU1LS4vnNdyMtO/gCggAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmuBs24rZu3TrPaxYtWuR5zenTpz2vyczM9LxGkqZPn+55TTx3qZ40aZLnNfHcBfq///2v5zWSFAqFPK/5/PPPPa+J5xwqKiryvAa9E1dAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJbkaKuG72KUm//e1vPa8ZN26c5zVLly71vGbixIme10jSwIED41rXW8Vzg1BJ8vl8CZ+lOz/+8Y975HXQO3EFBAAwQYAAACYIEADABAECAJgg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zp07pylTpqijoyO6zxNPPKH33ntP77zzjurq6nTs2DFNnz49GbMDAFKYpw8hbN26NebrtWvXKjs7W3v37tWkSZMUDof1+uuva926dbrvvvskSWvWrNFtt92mXbt26Qc/+EFipwcApKyreg8oHA5LkjIzMyVJe/fu1blz51RSUhLdZ9SoUcrPz1d9fX2336Ozs1ORSCRmAwD0fXEHqKurS0uWLNHEiRM1evRoSVJLS4vS0tI0ePDgmH1zcnLU0tLS7fepqqpSIBCIbqFQKN6RAAApJO4AlZeX6+DBg1q/fv1VDVBZWalwOBzdjhw5clXfDwCQGuL6RdTFixdry5Yt2rlzp4YNGxZ9PBgM6uzZs2pra4u5CmptbVUwGOz2e/n9fvn9/njGAACkME9XQM45LV68WBs3btSOHTtUUFAQ8/y4ceM0YMAA1dTURB9raGjQ4cOHVVxcnLipAQApz9MVUHl5udatW6fNmzcrPT09+r5OIBDQwIEDFQgENG/ePFVUVCgzM1MZGRl67LHHVFxczCfgAAAxPAVo1apVkqR77rkn5vE1a9ZE74f1f//3f+rXr59mzJihzs5OlZaW6te//nUiZwYA9AGeAuScu+I+119/vaqrq1VdXX01cwFR//znP61H+FpLly61HiHhNmzY4HnNzJkzkzIL+i7uBQcAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATcf2LqEBP2rNnT4+91nPPPed5TX5+vuc1nZ2dnte8++67nte89NJLntdI0muvvRbXOsALroAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABPcjBS9Xn19fY+91n/+8x/Paz7++GPPax555BHPaz799FPPa5599lnPayTp7rvvjmsd4AVXQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACZ9zzlkPcbFIJKJAIKBwOKyMjAzrcdALPProo57X/OY3v0nKLIkSz//sFixY4HnN6tWrPa8BrtY3/TnOFRAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYOI66wGA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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 340: prediction = 3, truth is 5\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGxVJREFUeJzt3X9sVfX9x/HX5dcVtL2slPb2SsGCAhvQOhG6RkUZDaVbkF9ZQFwCzvDL4kTmNF1UdFvWr5go06As08HMxB8kApNtJFhsiVthAWGEuFXKKtSVlkHCvaVIQfr5/oHeeaEI53Jv3215PpKT0HvPp+ft+d71+T3cy6nPOecEAEA762Y9AADg6kSAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACAiR7WA5yvtbVV9fX1SklJkc/nsx4HAOCRc05NTU0KhULq1u3i1zkdLkD19fXKzs62HgMAcIXq6uo0YMCAiz7f4QKUkpIifTF4amqq9TgAAI8ikYiys7OjP88vJmkBWrlypZ599lk1NDQoLy9PL774osaOHXvJdV/+tVtqaioBAoBO7FJvoyTlQwhvvfWWli5dqmXLlunDDz9UXl6eioqKdOTIkWQcDgDQCSUlQM8995zmzZun++67T9/61re0atUq9enTR7/73e+ScTgAQCeU8ACdPn1au3btUmFh4f8O0q2bCgsLVVVVdcH+LS0tikQiMRsAoOtLeICOHj2qs2fPKjMzM+bxzMxMNTQ0XLB/WVmZAoFAdOMTcABwdTD/h6ilpaUKh8PRra6uznokAEA7SPin4NLT09W9e3c1NjbGPN7Y2KhgMHjB/n6/X36/P9FjAAA6uIRfAfXq1UujR49WeXl59LHW1laVl5eroKAg0YcDAHRSSfl3QEuXLtWcOXN06623auzYsVqxYoWam5t13333JeNwAIBOKCkBmjlzpv773//qySefVENDg26++WZt3rz5gg8mAACuXj7nnLMe4qsikYgCgYDC4TB3QgCATuhyf46bfwoOAHB1IkAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABM9rAcAcHk+/vhjz2sWLFgQ17Fmz57tec28efPiOhauXlwBAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmuBkpYCCeG4t+//vf97zm3//+t+c1kvTJJ594XsPNSOEVV0AAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAluRgpcoV//+tee16xYscLzmkOHDnleE69Bgwa127Fw9eIKCABgggABAEwkPEBPPfWUfD5fzDZ8+PBEHwYA0Mkl5T2gESNG6L333vvfQXrwVhMAIFZSytCjRw8Fg8FkfGsAQBeRlPeA9u/fr1AopMGDB+vee+/92k/vtLS0KBKJxGwAgK4v4QHKz8/XmjVrtHnzZr388suqra3VHXfcoaampjb3LysrUyAQiG7Z2dmJHgkA0AElPEDFxcX6wQ9+oNzcXBUVFenPf/6zjh8/rrfffrvN/UtLSxUOh6NbXV1dokcCAHRASf90QN++fTV06FDV1NS0+bzf75ff70/2GACADibp/w7oxIkTOnDggLKyspJ9KABAJ5LwAD3yyCOqrKzUJ598or/97W+aNm2aunfvrnvuuSfRhwIAdGIJ/yu4Tz/9VPfcc4+OHTum/v376/bbb9f27dvVv3//RB8KANCJJTxAb775ZqK/JdBuPv/8c89rPvroI89rDh486HmNz+fzvGbo0KGe10jSH/7wh7jWAV5wLzgAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwETSfyEd0JmsWrXK85pXXnklKbMkQnp6elzrBgwYkPBZgPNxBQQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAAT3A0bXVJ9fX1c61599VXPa5xz7bImHs8++2y7HAeIB1dAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJbkaKLungwYNxrdu7d6/nNT6fL65jeXX33Xd7XnPLLbckZRYgEbgCAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBM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a7KysjyvQdfBFRAAwAQBAgCY8BSgsrIyjRkzRikpKcrIyNDUqVNVXV0ds8+pU6dUUlKifv366brrrtOMGTPi+j0mAICuzVOAKisrVVJSou3bt2vLli06c+aMJk6cqObm5ug+Dz/8sN59912tW7dOlZWVqq+v1/Tp05MxOwCgE/P0IYTNmzfHfL1mzRplZGRo165dGjdunMLhsF599VWtXbtW3/3udyVJq1ev1je/+U1t375d3/nOdxI7PQCg07qi94DC4bAkKS0tTZK0a9cunTlzRoWFhdF9hg8froEDB6qqqqrN79HS0qJIJBKzAQC6vrgD1NraqiVLlui2227TyJEjJUkNDQ3q1auX+vbtG7NvZmamGhoa2vw+ZWVlCgQC0S07OzvekQAAnUjcASopKdG+ffv05ptvXtEApaWlCofD0a2uru6Kvh8AoHOI6x+iLl68WJs2bdK2bds0YMCA6OPBYFCnT5/W8ePHY66CGhsbFQwG2/xefr9ffr8/njEAAJ2Ypysg55wWL16s9evXa+vWrcrJyYl5fvTo0erZs6fKy8ujj1VXV+vQoUMqKChI3NQAgE7P0xVQSUmJ1q5dq40bNyolJSX6vk4gEFDv3r0VCAR0//33a+nSpUpLS1NqaqoefPBBFRQU8Ak4AEAMTwF6+eWXJUl33XVXzOOrV6/W3LlzJUnPP/+8unXrphkzZqilpUVFRUV66aWXEjkzAKAL8Ll47oqYRJFIRIFAQOFwOO4bKcKb+vr6uNaNGDHC85ovP7rvRTw34ezovvre6eX69re/7XnNQw895HmNJI0fPz6udYA8/BznXnAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwEddvREXXEgqF4lq3YcMGz2t2794d17G8euGFF+Jad/6vGrkcubm5ntcsWbLE8xqgq+EKCABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw4XPOOeshvioSiSgQCCgcDis1NdV6HACAR5f7c5wrIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMCEpwCVlZVpzJgxSklJUUZGhqZOnarq6uqYfe666y75fL6YbeHChYmeGwDQyXkKUGVlpUpKSrR9+3Zt2bJFZ86c0cSJE9Xc3Byz37x583T48OHotnz58kTPDQDo5Hp42Xnz5s0xX69Zs0YZGRnatWuXxo0bF328T58+CgaDiZsSANDlXNF7QOFwWJKUlpYW8/jrr7+u9PR0jRw5UqWlpTp58uRFv0dLS4sikUjMBgDo+jxdAX1Va2urlixZottuu00jR46MPj579mwNGjRIoVBIe/fu1WOPPabq6mq98847bX6fsrIyPf300/GOAQDopHzOORfPwkWLFukvf/mLPvjgAw0YMOCi+23dulUTJkxQTU2NhgwZcsHzLS0tamlpiX4diUSUnZ2tcDis1NTUeEYDABiKRCIKBAKX/Dke1xXQ4sWLtWnTJm3btu1r4yNJ+fn5knTRAPn9fvn9/njGAAB0Yp4C5JzTgw8+qPXr16uiokI5OTmXXLNnzx5JUlZWVvxTAgC6HE8BKikp0dq1a7Vx40alpKSooaFBkhQIBNS7d28dOHBAa9eu1fe+9z3169dPe/fu1cMPP6xx48YpNzc3Wf8NAIBOyNN7QD6fr83HV69erblz56qurk4//OEPtW/fPjU3Nys7O1vTpk3T448/ftnv51zu3x0CADqmpLwHdKlWZWdnq7Ky0su3BABcpbgXHADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADARA/rAc7nnJMkRSIR61EAAHH48uf3lz/PL6bDBaipqUmSlJ2dbT0KAOAKNDU1KRAIXPR5n7tUotpZa2ur6uvrlZKSIp/PF/NcJBJRdna26urqlJqaajajNc7DOZyHczgP53AezukI58E5p6amJoVCIXXrdvF3ejrcFVC3bt00YMCAr90nNTX1qn6BfYnzcA7n4RzOwzmch3Osz8PXXfl8iQ8hAABMECAAgIlOFSC/369ly5bJ7/dbj2KK83AO5+EczsM5nIdzOtN56HAfQgAAXB061RUQAKDrIEAAABMECABgggABAEx0mgCtXLlSN9xwg6655hrl5+fr73//u/VI7e6pp56Sz+eL2YYPH249VtJt27ZNkydPVigUks/n04YNG2Ked87pySefVFZWlnr37q3CwkLt37/fbN5kudR5mDt37gWvj0mTJpnNmwxlZWUaM2aMUlJSlJGRoalTp6q6ujpmn1OnTqmkpET9+vXTddddpxkzZqixsdFs5mS4nPNw1113XfB6WLhwodnMbekUAXrrrbe0dOlSLVu2TB9++KHy8vJUVFSkI0eOWI/W7kaMGKHDhw9Htw8++MB6pKRrbm5WXl6eVq5c2ebzy5cv1wsvvKBVq1Zpx44duvbaa1VUVKRTp061+6zJdKnzIEmTJk2KeX288cYb7TpjslVWVqqkpETbt2/Xli1bdObMGU2cOFHNzc3RfR5++GG9++67WrdunSorK1VfX6/p06ebzp1ol3MeJGnevHkxr4fly5ebzdwm1wmMHTvWlZSURL8+e/asC4VCrqyszHSu9rZs2TKXl5dnPYYpSW79+vXRr1tbW10wGHTPPvts9LHjx487v9/v3njjDaMpk+/88+Ccc3PmzHFTpkwxm8nCkSNHnCRXWVnp3Bf/t+/Zs6dbt25ddJ9//vOfTpKrqqoynDS5zj8Pzjl35513uoceesh0rkvp8FdAp0+f1q5du1RYWBh9rFu3biosLFRVVZXpbBb279+vUCikwYMH695779WhQ4esRzJVW1urhoaGmNdHIBBQfn7+Vfn6qKioUEZGhoYNG6ZFixbp2LFj1iMlVTgcliSlpaVJknbt2qUzZ87EvB6GDx+ugQMHdunXw/nn4Uuvv/660tPTNXLkSJWWlurkyZNGE7atw92M9HxHjx7V2bNnlZmZGfN4Zmam/vWvf5nNZSE/P19r1qzRsGHDdPjwYT399NO64447tG/fPqWkpFiPZ6KhoUH64vXwVZmZmdHnrhaTJk3S9OnTlZOTowMHDuhnP/uZiouLVVVVpe7du1uPl3Ctra1asmSJbrvtNo0cOVL64vXQq1cv9e3bN2bfrvx6aOs8SNLs2bM1aNAghUIh7d27V4899piqq6v1zjvvmM77VR0+QPif4uLi6J9zc3OVn5+vQYMG6e2339b9999vOhvszZo1K/rnUaNGKTc3V0OGDFFFRYUmTJhgOlsylJSUaN++fVfF+6Bf52LnYf78+dE/jxo1SllZWZowYYIOHDigIUOGGEx6oQ7/V3Dp6enq3r37BZ9iaWxsVDAYNJurI+jbt6+GDh2qmpoa61HMfPka4PVxocGDBys9Pb1Lvj4WL16sTZs26f3334/59S3BYFCnT5/W8ePHY/bvqq+Hi52HtuTn50tSh3o9dPgA9erVS6NHj1Z5eXn0sdbWVpWXl6ugoMB0NmsnTpzQgQMHlJWVZT2KmZycHAWDwZjXRyQS0Y4dO67618enn36qY8eOdanXh3NOixcv1vr167V161bl5OTEPD969Gj17Nkz5vVQXV2tQ4cOdanXw6XOQ1v27NkjSR3r9WD9KYjL8eabbzq/3+/WrFnjPvroIzd//nzXt29f19DQYD1au/rJT37iKioqXG1trfvrX//qCgsLXXp6ujty5Ij1aEnV1NTkdu/e7Xbv3u0kueeee87t3r3bHTx40Dnn3P/93/+5vn37uo0bN7q9e/e6KVOmuJycHPfZZ59Zj55QX3cempqa3COPPOKqqqpcbW2te++999wtt9zibrrpJnfq1Cnr0RNm0aJFLhAIuIqKCnf48OHodvLkyeg+CxcudAMHDnRbt251O3fudAUFBa6goMB07kS71HmoqalxP//5z93OnTtdbW2t27hxoxs8eLAbN26c9egxOkWAnHPuxRdfdAMHDnS9evVyY8eOddu3b7ceqd3NnDnTZWVluV69ernrr7/ezZw509XU1FiPlXTvv/++k3TBNmfOHOe++Cj2E0884TIzM53f73cTJkxw1dXV1mMn3Nedh5MnT7qJEye6/v37u549e7pBgwa5efPmdbn/J62t/35JbvXq1dF9PvvsM/fAAw+4b3zjG65Pnz5u2rRp7vDhw6ZzJ9qlzsOhQ4fcuHHjXFpamvP7/e7GG290P/3pT104HLYePQa/jgEAYKLDvwcEAOiaCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAAT/w8EYeB3dji4VwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 445: prediction = 0, truth is 6\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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AAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATMT1G1HRd40ZM6bX7iueT9Hes2dPUnYBkHp4BgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw4SlAFRUVmjRpktLS0pSVlaUZM2aovr4+5pjrrrtOPp8v5nLvvfcmem8AQIrzFKDq6mqVl5ertrZWmzdv1rFjxzR16lR1dnbGHDd37lzt378/elm2bFmi9wYApLgLvBy8adOmmK9XrVqlrKws1dXVqbi4OHr9RRddpGAwmLgtAQD9ztd6DSgcDkuSMjIyYq5/4403lJmZqXHjxmnRokU6fPjwGb9HV1eXIpFIzAUA0P95egZ0su7ubi1YsEBXXXWVxo0bF73+9ttv18iRIxUKhbR792499thjqq+v19tvv93j96moqNDSpUvjXQMAkKJ8zjkXz+C8efP0t7/9Te+9956GDx9+xuO2bNmiKVOmqKGhQaNGjTrt9q6uLnV1dUW/jkQiys3NVTgcVnp6ejyrAQAMRSIRBQKBs/4cj+sZ0Pz587Vx40Zt27btK+MjSYWFhZJ0xgD5/X75/f541gAApDBPAXLO6f7779e6detUVVWlvLy8s87s2rVLkpSTkxP/lgCAfsdTgMrLy7V69Wpt2LBBaWlpam1tlSQFAgENGTJEjY2NWr16tW644QZdeuml2r17tx566CEVFxdrwoQJyfp3AACkIE+vAfl8vh6vX7lypebMmaOWlhbdeeed2rNnjzo7O5Wbm6ubb75ZTzzxxDm/nnOuf3YIAOibkvIa0NlalZubq+rqai/fEgBwnuKz4AAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJi6wXuBUzjlJUiQSsV4FABCHL39+f/nz/Ez6XIA6OjokSbm5udarAAC+ho6ODgUCgTPe7nNnS1Qv6+7u1r59+5SWliafzxdzWyQSUW5urlpaWpSenm62ozXOwwmchxM4DydwHk7oC+fBOaeOjg6FQiENGHDmV3r63DOgAQMGaPjw4V95THp6+nn9APsS5+EEzsMJnIcTOA8nWJ+Hr3rm8yXehAAAMEGAAAAmUipAfr9fS5Yskd/vt17FFOfhBM7DCZyHEzgPJ6TSeehzb0IAAJwfUuoZEACg/yBAAAATBAgAYIIAAQBMpEyAli9frm9+85u68MILVVhYqB07dliv1Oueeuop+Xy+mMvYsWOt10q6bdu2afr06QqFQvL5fFq/fn3M7c45LV68WDk5ORoyZIhKSkq0d+9es32T5WznYc6cOac9PkpLS832TYaKigpNmjRJaWlpysrK0owZM1RfXx9zzJEjR1ReXq5LL71Ul1xyiWbOnKm2tjaznZPhXM7Dddddd9rj4d577zXbuScpEaC33npLCxcu1JIlS/TBBx+ooKBA06ZN04EDB6xX63VXXnml9u/fH72899571islXWdnpwoKCrR8+fIeb1+2bJlefPFFvfLKK9q+fbsuvvhiTZs2TUeOHOn1XZPpbOdBkkpLS2MeH2vWrOnVHZOturpa5eXlqq2t1ebNm3Xs2DFNnTpVnZ2d0WMeeughvfPOO1q7dq2qq6u1b98+3XLLLaZ7J9q5nAdJmjt3bszjYdmyZWY798ilgMmTJ7vy8vLo18ePH3ehUMhVVFSY7tXblixZ4goKCqzXMCXJrVu3Lvp1d3e3CwaD7rnnnote197e7vx+v1uzZo3Rlsl36nlwzrnZs2e7m266yWwnCwcOHHCSXHV1tXNf/G8/aNAgt3bt2ugx//rXv5wkV1NTY7hpcp16Hpxz7tprr3UPPvig6V5n0+efAR09elR1dXUqKSmJXjdgwACVlJSopqbGdDcLe/fuVSgUUn5+vu644w41Nzdbr2SqqalJra2tMY+PQCCgwsLC8/LxUVVVpaysLF1xxRWaN2+eDh48aL1SUoXDYUlSRkaGJKmurk7Hjh2LeTyMHTtWI0aM6NePh1PPw5feeOMNZWZmaty4cVq0aJEOHz5stGHP+tyHkZ7qs88+0/Hjx5WdnR1zfXZ2tv7973+b7WWhsLBQq1at0hVXXKH9+/dr6dKluuaaa7Rnzx6lpaVZr2eitbVV+uLxcLLs7OzobeeL0tJS3XLLLcrLy1NjY6Mef/xxlZWVqaamRgMHDrReL+G6u7u1YMECXXXVVRo3bpz0xeNh8ODBGjp0aMyx/fnx0NN5kKTbb79dI0eOVCgU0u7du/XYY4+pvr5eb7/9tum+J+vzAcL/lZWVRf95woQJKiws1MiRI/XnP/9Zd999t+lusDdr1qzoP48fP14TJkzQqFGjVFVVpSlTppjulgzl5eXas2fPefE66Fc503m45557ov88fvx45eTkaMqUKWpsbNSoUaMMNj1dn/8juMzMTA0cOPC0d7G0tbUpGAya7dUXDB06VGPGjFFDQ4P1Kma+fAzw+Dhdfn6+MjMz++XjY/78+dq4caO2bt0a8+tbgsGgjh49qvb29pjj++vj4UznoSeFhYWS1KceD30+QIMHD9bEiRNVWVkZva67u1uVlZUqKioy3c3aoUOH1NjYqJycHOtVzOTl5SkYDMY8PiKRiLZv337ePz4++eQTHTx4sF89Ppxzmj9/vtatW6ctW7YoLy8v5vaJEydq0KBBMY+H+vp6NTc396vHw9nOQ0927dolSX3r8WD9Lohz8eabbzq/3+9WrVrl/vnPf7p77rnHDR061LW2tlqv1qt+/vOfu6qqKtfU1OTef/99V1JS4jIzM92BAwesV0uqjo4O9+GHH7oPP/zQSXLPP/+8+/DDD91//vMf55xzzzzzjBs6dKjbsGGD2717t7vppptcXl6e+/zzz61XT6ivOg8dHR3u4YcfdjU1Na6pqcm9++677nvf+567/PLL3ZEjR6xXT5h58+a5QCDgqqqq3P79+6OXw4cPR4+599573YgRI9yWLVvczp07XVFRkSsqKjLdO9HOdh4aGhrc008/7Xbu3Omamprchg0bXH5+visuLrZePUZKBMg551566SU3YsQIN3jwYDd58mRXW1trvVKvu/XWW11OTo4bPHiwu+yyy9ytt97qGhoarNdKuq1btzpJp11mz57t3BdvxX7yySdddna28/v9bsqUKa6+vt567YT7qvNw+PBhN3XqVDds2DA3aNAgN3LkSDd37tx+9x9pPf37S3IrV66MHvP555+7++67z33jG99wF110kbv55pvd/v37TfdOtLOdh+bmZldcXOwyMjKc3+93o0ePdo888ogLh8PWq8fg1zEAAEz0+deAAAD9EwECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABg4n97AQ2d0CW16QAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 449: prediction = 5, truth is 3\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAG8pJREFUeJzt3X9s1PUdx/HXFejxw/awlPbaUbCAioB0GZOuUVFHQ6mRgRAVdAaMwcmKGaLT1Cno5taJiTMahGSbMBN+KIlANI6JxZYxCwsgYWyuo1ilBFqEjLtSpBD62R/ojZMifI+7vnvl+UguoXffd++9744+Pe44fM45JwAAOliK9QIAgMsTAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACa6Wy/wTW1tbTpw4IDS0tLk8/ms1wEAeOScU3Nzs3Jzc5WScv7nOZ0uQAcOHFBeXp71GgCAS9TQ0KABAwac9/ZOF6C0tDTpq8XT09Ot1wEAeBQOh5WXlxf5eX4+CQvQokWL9OKLL6qxsVEFBQV69dVXNWbMmAvOff3Hbunp6QQIAJLYhV5GScibEN58803NmzdPCxYs0I4dO1RQUKCSkhIdOnQoEXcHAEhCCQnQSy+9pFmzZumBBx7Q8OHDtWTJEvXu3Vuvv/56Iu4OAJCE4h6gkydPavv27SouLv7/naSkqLi4WDU1Necc39raqnA4HHUBAHR9cQ/Q4cOHdfr0aWVnZ0ddn52drcbGxnOOr6ioUCAQiFx4BxwAXB7M/yJqeXm5QqFQ5NLQ0GC9EgCgA8T9XXCZmZnq1q2bmpqaoq5vampSMBg853i/3y+/3x/vNQAAnVzcnwGlpqZq9OjRqqysjFzX1tamyspKFRUVxfvuAABJKiF/D2jevHmaMWOGvv/972vMmDF6+eWX1dLSogceeCARdwcASEIJCdA999yjL774QvPnz1djY6O++93vav369ee8MQEAcPnyOeec9RJnC4fDCgQCCoVCfBICACShi/05bv4uOADA5YkAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw0d16gcvFb37zG88zPp/P88zIkSM9z0ycONHzDABcKp4BAQBMECAAgIm4B+jZZ5+Vz+eLugwbNizedwMASHIJeQ1oxIgR+uCDD/5/J915qQkAEC0hZejevbuCwWAivjUAoItIyGtAe/bsUW5urgYPHqz77rtP+/btO++xra2tCofDURcAQNcX9wAVFhZq2bJlWr9+vRYvXqz6+nrdfPPNam5ubvf4iooKBQKByCUvLy/eKwEAOqG4B6i0tFR33XWXRo0apZKSEr333ns6evSo3nrrrXaPLy8vVygUilwaGhrivRIAoBNK+LsD+vbtq2uuuUZ1dXXt3u73++X3+xO9BgCgk0n43wM6duyY9u7dq5ycnETfFQAgicQ9QI8//riqq6v12Wef6aOPPtKdd96pbt26afr06fG+KwBAEov7H8Ht379f06dP15EjR9S/f3/ddNNN2rJli/r37x/vuwIAJDGfc85ZL3G2cDisQCCgUCik9PR063XiJpYPFo1lpkePHp5nevbs6XkGlyaW33bPPvus55nU1FTPM7F6//33Pc/cf//9nmfuuusuzzPoWBf7c5zPggMAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATCT8H6RDxzp16lSHzODSxPJhpI8//nhCdrH0xRdfeJ7hw0i7Dp4BAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwASfht1BFi9e7Hnm/fffT8gu8XL48GHPM5s3b07ILgCSD8+AAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATPuecs17ibOFwWIFAQKFQSOnp6dbr4Ft88MEHnmfGjx+fkF2SzaBBgzzPXH311QnZpT0jRozwPNOvXz/PM1OmTPE8M3z4cM8z6FgX+3OcZ0AAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgInu1gsgee3fv996hbjr3t37b4mnnnrK88z999/veWbIkCGeZ4DOjGdAAAATBAgAYMJzgDZt2qSJEycqNzdXPp9Pa9eujbrdOaf58+crJydHvXr1UnFxsfbs2RPPnQEAXYDnALW0tKigoECLFi1q9/aFCxfqlVde0ZIlS7R161b16dNHJSUlOnHiRDz2BQB0EZ5fcS0tLVVpaWm7tznn9PLLL+vpp5/WpEmTJElvvPGGsrOztXbtWk2bNu3SNwYAdAlxfQ2ovr5ejY2NKi4ujlwXCARUWFiompqadmdaW1sVDoejLgCAri+uAWpsbJQkZWdnR12fnZ0due2bKioqFAgEIpe8vLx4rgQA6KTM3wVXXl6uUCgUuTQ0NFivBADoAHENUDAYlCQ1NTVFXd/U1BS57Zv8fr/S09OjLgCAri+uAcrPz1cwGFRlZWXkunA4rK1bt6qoqCiedwUASHKe3wV37Ngx1dXVRb6ur6/Xzp07lZGRoYEDB2ru3Ll6/vnndfXVVys/P1/PPPOMcnNzNXny5HjvDgBIYp4DtG3bNt12222Rr+fNmydJmjFjhpYtW6YnnnhCLS0teuihh3T06FHddNNNWr9+vXr27BnfzQEASc3nnHPWS5wtHA4rEAgoFArxelAHaW5ujmnupptu8jzzj3/8I6b78qpfv34xzS1dutTzzB133BHTfQFd1cX+HDd/FxwA4PJEgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAE57/OQZ0PZs3b45prra2Nu67xMuJEydimlu9enWHzNxyyy2eZ2bOnOl5JiWF/8ZE58WjEwBgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw4XPOOeslzhYOhxUIBBQKhZSenm69Dr7F888/73lm/vz5Cdkl2cTy2+4nP/mJ55kePXp4npGkuXPnep7p37+/55nevXt7nunenc9Q7uwu9uc4z4AAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABN8GCli9tlnn3meWbVqleeZ5cuXe5755z//6XmmI8Xy287n8yVkF0vTpk3zPPP00097nhk+fLjnGcSODyMFAHRqBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJPowUOMu6des8z2zdutXzzEcffeR5prq62vMMzrj77rtjmhszZoznmcceeyym++pK+DBSAECnRoAAACY8B2jTpk2aOHGicnNz5fP5tHbt2qjbZ86cKZ/PF3WZMGFCPHcGAHQBngPU0tKigoICLVq06LzHTJgwQQcPHoxcVq5ceal7AgC6mO5eB0pLS1VaWvqtx/j9fgWDwUvZCwDQxSXkNaCqqiplZWXp2muv1ezZs3XkyJHzHtva2qpwOBx1AQB0fXEP0IQJE/TGG2+osrJSL7zwgqqrq1VaWqrTp0+3e3xFRYUCgUDkkpeXF++VAACdkOc/gruQadOmRX59/fXXa9SoURoyZIiqqqo0bty4c44vLy/XvHnzIl+Hw2EiBACXgYS/DXvw4MHKzMxUXV1du7f7/X6lp6dHXQAAXV/CA7R//34dOXJEOTk5ib4rAEAS8fxHcMeOHYt6NlNfX6+dO3cqIyNDGRkZeu655zR16lQFg0Ht3btXTzzxhIYOHaqSkpJ47w4ASGKeA7Rt2zbddtttka+/fv1mxowZWrx4sXbt2qU//elPOnr0qHJzczV+/Hj96le/kt/vj+/mAICkxoeRAgZOnjzpeaa1tdXzzAsvvOB5RpJ27tzpeea9996L6b46s549e3qeWbhwoeeZOXPmeJ7pzPgwUgBAp0aAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATfBo2gHN8+eWXnmf++9//ep7Zv3+/55m7777b88y+ffs8z3SktrY26xXiik/DBgB0agQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACAie7WCwDofHr16tUhM59++qnnmZycHM8znf3DSC9XPAMCAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEzwYaTQH/7wh5jmfv/733ueGTFihOeZ119/3fMMzvjrX/8a01xra6vnmddee83zzMaNGz3PhMNhzzMdaejQodYrJA2eAQEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJvgw0i7m8OHDnmd+/etfx3Rfn3/+ueeZ//znP55nxo4d63lm+PDhnmdi9Ze//MXzTFVVleeZlBTv/724efNmzzOK8cNIu6I+ffp4ntmwYUNCdumKeAYEADBBgAAAJjwFqKKiQjfccIPS0tKUlZWlyZMnq7a2NuqYEydOqKysTP369dMVV1yhqVOnqqmpKd57AwCSnKcAVVdXq6ysTFu2bNGGDRt06tQpjR8/Xi0tLZFjHn30Ub3zzjtavXq1qqurdeDAAU2ZMiURuwMAkpinNyGsX78+6utly5YpKytL27dv19ixYxUKhfTHP/5RK1as0A9/+ENJ0tKlS3Xddddpy5Yt+sEPfhDf7QEASeuSXgMKhUKSpIyMDEnS9u3bderUKRUXF0eOGTZsmAYOHKiampp2v0dra6vC4XDUBQDQ9cUcoLa2Ns2dO1c33nijRo4cKUlqbGxUamqq+vbtG3Vsdna2Ghsb2/0+FRUVCgQCkUteXl6sKwEAkkjMASorK9Pu3bu1atWqS1qgvLxcoVAocmloaLik7wcASA4x/UXUOXPm6N1339WmTZs0YMCAyPXBYFAnT57U0aNHo54FNTU1KRgMtvu9/H6//H5/LGsAAJKYp2dAzjnNmTNHa9as0caNG5Wfnx91++jRo9WjRw9VVlZGrqutrdW+fftUVFQUv60BAEnP0zOgsrIyrVixQuvWrVNaWlrkdZ1AIKBevXopEAjowQcf1Lx585SRkaH09HQ98sgjKioq4h1wAIAongK0ePFiSdKtt94adf3SpUs1c+ZMSdLvfvc7paSkaOrUqWptbVVJSYlee+21eO4MAOgCfM45Z73E2cLhsAKBgEKhkNLT063XSTpr1671PDN9+vSY7osPrIxdLL/tfD5fQnax1LNnT88zV111leeZQCDgeUaSfvGLX3ieueOOO2K6r67kYn+O81lwAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMBHTv4iKzmvy5MmeZwoLC2O6r08++cTzzBdffBHTfSE2ffr0iWnuyiuv9Dwze/ZszzMFBQWeZ26//XbPM+iceAYEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJjgw0ihqqqqmOYaGho8z0yaNMnzzKeffup5JlY/+tGPPM+MGTMmIbvEw3XXXRfT3Lhx4+K+C/BNPAMCAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEzwYaSIWV5enueZHTt2JGQXAMmHZ0AAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADAhKcAVVRU6IYbblBaWpqysrI0efJk1dbWRh1z6623yufzRV0efvjheO8NAEhyngJUXV2tsrIybdmyRRs2bNCpU6c0fvx4tbS0RB03a9YsHTx4MHJZuHBhvPcGACQ5T/8i6vr166O+XrZsmbKysrR9+3aNHTs2cn3v3r0VDAbjtyUAoMu5pNeAQqGQJCkjIyPq+uXLlyszM1MjR45UeXm5jh8/ft7v0draqnA4HHUBAHR9np4Bna2trU1z587VjTfeqJEjR0auv/feezVo0CDl5uZq165devLJJ1VbW6u333673e9TUVGh5557LtY1AABJyuecc7EMzp49W3/+85+1efNmDRgw4LzHbdy4UePGjVNdXZ2GDBlyzu2tra1qbW2NfB0Oh5WXl6dQKKT09PRYVgMAGAqHwwoEAhf8OR7TM6A5c+bo3Xff1aZNm741PpJUWFgoSecNkN/vl9/vj2UNAEAS8xQg55weeeQRrVmzRlVVVcrPz7/gzM6dOyVJOTk5sW8JAOhyPAWorKxMK1as0Lp165SWlqbGxkZJUiAQUK9evbR3716tWLFCt99+u/r166ddu3bp0Ucf1dixYzVq1KhE/W8AACQhT68B+Xy+dq9funSpZs6cqYaGBv34xz/W7t271dLSory8PN155516+umnL/r1nIv9s0MAQOeUkNeALtSqvLw8VVdXe/mWAIDLFJ8FBwAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw0d16gW9yzkmSwuGw9SoAgBh8/fP765/n59PpAtTc3CxJysvLs14FAHAJmpubFQgEznu7z10oUR2sra1NBw4cUFpamnw+X9Rt4XBYeXl5amhoUHp6utmO1jgPZ3AezuA8nMF5OKMznAfnnJqbm5Wbm6uUlPO/0tPpngGlpKRowIAB33pMenr6Zf0A+xrn4QzOwxmchzM4D2dYn4dve+bzNd6EAAAwQYAAACaSKkB+v18LFiyQ3++3XsUU5+EMzsMZnIczOA9nJNN56HRvQgAAXB6S6hkQAKDrIEAAABMECABgggABAEwkTYAWLVqkq666Sj179lRhYaH+/ve/W6/U4Z599ln5fL6oy7Bhw6zXSrhNmzZp4sSJys3Nlc/n09q1a6Nud85p/vz5ysnJUa9evVRcXKw9e/aY7ZsoFzoPM2fOPOfxMWHCBLN9E6GiokI33HCD0tLSlJWVpcmTJ6u2tjbqmBMnTqisrEz9+vXTFVdcoalTp6qpqcls50S4mPNw6623nvN4ePjhh812bk9SBOjNN9/UvHnztGDBAu3YsUMFBQUqKSnRoUOHrFfrcCNGjNDBgwcjl82bN1uvlHAtLS0qKCjQokWL2r194cKFeuWVV7RkyRJt3bpVffr0UUlJiU6cONHhuybShc6DJE2YMCHq8bFy5coO3THRqqurVVZWpi1btmjDhg06deqUxo8fr5aWlsgxjz76qN555x2tXr1a1dXVOnDggKZMmWK6d7xdzHmQpFmzZkU9HhYuXGi2c7tcEhgzZowrKyuLfH369GmXm5vrKioqTPfqaAsWLHAFBQXWa5iS5NasWRP5uq2tzQWDQffiiy9Grjt69Kjz+/1u5cqVRlsm3jfPg3POzZgxw02aNMlsJwuHDh1yklx1dbVzX/1/36NHD7d69erIMZ988omT5Gpqagw3TaxvngfnnLvlllvcz372M9O9LqTTPwM6efKktm/fruLi4sh1KSkpKi4uVk1NjeluFvbs2aPc3FwNHjxY9913n/bt22e9kqn6+no1NjZGPT4CgYAKCwsvy8dHVVWVsrKydO2112r27Nk6cuSI9UoJFQqFJEkZGRmSpO3bt+vUqVNRj4dhw4Zp4MCBXfrx8M3z8LXly5crMzNTI0eOVHl5uY4fP260Yfs63YeRftPhw4d1+vRpZWdnR12fnZ2tf//732Z7WSgsLNSyZct07bXX6uDBg3ruued08803a/fu3UpLS7Nez0RjY6P01ePhbNnZ2ZHbLhcTJkzQlClTlJ+fr7179+qpp55SaWmpampq1K1bN+v14q6trU1z587VjTfeqJEjR0pfPR5SU1PVt2/fqGO78uOhvfMgSffee68GDRqk3Nxc7dq1S08++aRqa2v19ttvm+57tk4fIPxfaWlp5NejRo1SYWGhBg0apLfeeksPPvig6W6wN23atMivr7/+eo0aNUpDhgxRVVWVxo0bZ7pbIpSVlWn37t2Xxeug3+Z85+Ghhx6K/Pr6669XTk6Oxo0bp71792rIkCEGm56r0/8RXGZmprp163bOu1iampoUDAbN9uoM+vbtq2uuuUZ1dXXWq5j5+jHA4+NcgwcPVmZmZpd8fMyZM0fvvvuuPvzww6h/viUYDOrkyZM6evRo1PFd9fFwvvPQnsLCQknqVI+HTh+g1NRUjR49WpWVlZHr2traVFlZqaKiItPdrB07dkx79+5VTk6O9Spm8vPzFQwGox4f4XBYW7duvewfH/v379eRI0e61OPDOac5c+ZozZo12rhxo/Lz86NuHz16tHr06BH1eKitrdW+ffu61OPhQuehPTt37pSkzvV4sH4XxMVYtWqV8/v9btmyZe5f//qXe+ihh1zfvn1dY2Oj9Wod6rHHHnNVVVWuvr7e/e1vf3PFxcUuMzPTHTp0yHq1hGpubnYff/yx+/jjj50k99JLL7mPP/7Yff755845537729+6vn37unXr1rldu3a5SZMmufz8fPfll19arx5X33Yempub3eOPP+5qampcfX29++CDD9z3vvc9d/XVV7sTJ05Yrx43s2fPdoFAwFVVVbmDBw9GLsePH48c8/DDD7uBAwe6jRs3um3btrmioiJXVFRkune8Xeg81NXVuV/+8pdu27Ztrr6+3q1bt84NHjzYjR071nr1KEkRIOece/XVV93AgQNdamqqGzNmjNuyZYv1Sh3unnvucTk5OS41NdV95zvfcffcc4+rq6uzXivhPvzwQyfpnMuMGTOc++qt2M8884zLzs52fr/fjRs3ztXW1lqvHXffdh6OHz/uxo8f7/r37+969OjhBg0a5GbNmtXl/iOtvf/9ktzSpUsjx3z55Zfupz/9qbvyyitd79693Z133ukOHjxoune8Xeg87Nu3z40dO9ZlZGQ4v9/vhg4d6n7+85+7UChkvXoU/jkGAICJTv8aEACgayJAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATPwPrDArw0QSkJcAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 495: prediction = 0, truth is 8\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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ta688kq1trZq0aJFuv7667Vz506lpqZaj2eira1N+uz1cKLs7OzIc+eKadOm6dZbb1V+fr52796tRx99VKWlpaqvr9fgwYOtx4u7np4eLViwQNdee63Gjh0rffZ6SElJUXp6etS+yfx66O08SNKdd96pkSNHKjc3Vzt27NAjjzyixsZGvf7666bznqjfBwhfKC0tjfx63LhxKiws1MiRI/Xqq6/q3nvvNZ0N9m6//fbIr6+++mqNGzdOo0ePVm1traZMmWI6WyKUl5dr586d58T7oF/lVOdh7ty5kV9fffXVysnJ0ZQpU7R7926NHj3aYNKT9fvfgsvMzNTgwYNP+hRLe3u7gsGg2Vz9QXp6uq644go1NTVZj2Lm89cAr4+TjRo1SpmZmUn5+pg/f742bNigd955J+qvbwkGgzpy5Ig6Ojqi9k/W18OpzkNvCgsLJalfvR76fYBSUlI0fvx41dTURB7r6elRTU2NioqKTGezdvDgQe3evVs5OTnWo5jJz89XMBiMen2Ew2Ft3br1nH997N27VwcOHEiq14dzTvPnz9fatWu1adMm5efnRz0/fvx4DRkyJOr10NjYqD179iTV6+F056E327dvl6T+9Xqw/hTEmVizZo3z+/2uurra/eMf/3Bz58516enprq2tzXq0PvWzn/3M1dbWuubmZvfXv/7VFRcXu8zMTLd//37r0RKqs7PTvf/+++799993ktyzzz7r3n//fffvf//bOefcU0895dLT09369evdjh073PTp011+fr779NNPrUePq686D52dne6hhx5y9fX1rrm52b399tvuW9/6lrv88svd4cOHrUePm3nz5rlAIOBqa2tda2trZDt06FBkn/vuu8+NGDHCbdq0yW3bts0VFRW5oqIi07nj7XTnoampyS1evNht27bNNTc3u/Xr17tRo0a5SZMmWY8eZUAEyDnnnnvuOTdixAiXkpLiJk6c6LZs2WI9Up+bNWuWy8nJcSkpKe7SSy91s2bNck1NTdZjJdw777zjJJ20lZWVOffZR7Eff/xxl52d7fx+v5syZYprbGy0Hjvuvuo8HDp0yE2dOtVdcsklbsiQIW7kyJFuzpw5Sfc/ab3980tyq1atiuzz6aefuvvvv99ddNFFbtiwYe6WW25xra2tpnPH2+nOw549e9ykSZNcRkaG8/v97rLLLnM///nPXSgUsh49Cn8dAwDARL9/DwgAkJwIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABP/B3dN7WFeklZVAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 582: prediction = 2, truth is 8\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAG3BJREFUeJzt3X9s1PUdx/HXgXCCtsdKaa8dBQv+AEG6yKBrEMTRAF1i+LUERDYwBiIrZsicpowfOt2qGJnRdDr3A6YDdWQUoslYsNgStsLGrxAmNpRUwEDLj4S7UqQQ+tkf6M2TInyPu77b6/ORfBN79333Pn5369Nv7+5bn3POCQCANtbFegEAgM6JAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABM3WS/g61paWnTs2DGlpKTI5/NZLwcA4JFzTo2NjcrOzlaXLlc/z2l3ATp27JhycnKslwEAuEFHjx5V3759r3p/uwtQSkqK9MXCU1NTrZcDAPAoHA4rJycn8vP8ahIWoLKyMr300kuqr69XXl6eXnvtNY0cOfKac1/+2i01NZUAAUAHdq2XURLyJoT33ntPixYt0vLly7V7927l5eVpwoQJOnHiRCIeDgDQASUkQCtXrtTcuXP1yCOP6O6779Ybb7yhnj176k9/+lMiHg4A0AHFPUAXLlzQrl27VFhY+P8H6dJFhYWFqq6uvmL/5uZmhcPhqA0AkPziHqBTp07p0qVLyszMjLo9MzNT9fX1V+xfWlqqQCAQ2XgHHAB0DuYfRC0pKVEoFIpsR48etV4SAKANxP1dcOnp6eratasaGhqibm9oaFAwGLxif7/fL7/fH+9lAADaubifAXXv3l3Dhw9XRUVF5LaWlhZVVFSooKAg3g8HAOigEvI5oEWLFmn27Nn67ne/q5EjR+qVV15RU1OTHnnkkUQ8HACgA0pIgKZPn66TJ09q2bJlqq+v13e+8x1t2rTpijcmAAA6L59zzlkv4qvC4bACgYBCoRBXQgCADuh6f46bvwsOANA5ESAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABM3WS8A6Ix8Pp/nmalTp3qecc55npGkIUOGeJ557rnnYnosdF6cAQEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJnwu1qsVJkg4HFYgEFAoFFJqaqr1coCE6NLF+3/7xXIB01j/7x3LY61bt87zTCwXWEX7d70/xzkDAgCYIEAAABNxD9Azzzwjn88XtQ0aNCjeDwMA6OAS8gfphgwZog8//PD/D3ITf/cOABAtIWW46aabFAwGE/GtAQBJIiGvAR08eFDZ2dkaMGCAHn74YR05cuSq+zY3NyscDkdtAIDkF/cA5efna/Xq1dq0aZNef/111dXVafTo0WpsbGx1/9LSUgUCgciWk5MT7yUBANqhhH8O6MyZM+rfv79WrlypRx999Ir7m5ub1dzcHPk6HA4rJyeHzwEhqfE5oMv4HFByut7PASX83QG9evXSnXfeqdra2lbv9/v98vv9iV4GAKCdSfjngM6ePatDhw4pKysr0Q8FAOhA4h6gJ598UlVVVfr000/1r3/9S1OmTFHXrl310EMPxfuhAAAdWNx/BffZZ5/poYce0unTp9WnTx/dd9992r59u/r06RPvhwIAdGBcjBQw8Oabb7bJ4yxZsiSmuVOnTnmeGT58uOeZ//znP55n0P5xMVIAQLtGgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJhI+B+kA3ClefPmtcnj7N69O6a53//+93FfC/B1nAEBAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABFfDBnAF55znmdGjRydkLUhenAEBAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACa4GCmQxMrLy2Oa8/l8nmemTJkS02Oh8+IMCABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwwcVIgSQW6wVC33zzTc8zo0ePjumx0HlxBgQAMEGAAAAmPAdo69atevDB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/fTTqqmp0fr1603X+1XtPkD4v6Kiosg/Dxs2TPn5+erfv7/++te/6tFHHzVdG+zNmDEj8s/33HOPhg0bpoEDB6qyslLjxo0zXVsiFBcXa//+/Z3iddBvcrXjMG/evMg/33PPPcrKytK4ceN06NAhDRw40GClV2r3v4JLT09X165dr3gXS0NDg4LBoNm62oNevXrpzjvvVG1trfVSzHz5HOD5caUBAwYoPT09KZ8fCxYs0AcffKCPPvoo6s+3BINBXbhwQWfOnInaP1mfD1c7Dq3Jz8+XpHb1fGj3AerevbuGDx+uioqKyG0tLS2qqKhQQUGB6dqsnT17VocOHVJWVpb1Uszk5uYqGAxGPT/C4bB27NjR6Z8fn332mU6fPp1Uzw/nnBYsWKDy8nJt2bJFubm5UfcPHz5c3bp1i3o+1NTU6MiRI0n1fLjWcWjN3r17Jal9PR+s3wVxPd59913n9/vd6tWr3ccff+zmzZvnevXq5err662X1qZ+9rOfucrKSldXV+f++c9/usLCQpeenu5OnDhhvbSEamxsdHv27HF79uxxktzKlSvdnj173OHDh51zzr3wwguuV69ebuPGjW7fvn1u0qRJLjc3133++efWS4+rbzoOjY2N7sknn3TV1dWurq7Offjhh+7ee+91d9xxhzt//rz10uNm/vz5LhAIuMrKSnf8+PHIdu7cucg+jz32mOvXr5/bsmWL27lzpysoKHAFBQWm6463ax2H2tpa98tf/tLt3LnT1dXVuY0bN7oBAwa4MWPGWC89SocIkHPOvfbaa65fv36ue/fubuTIkW779u3WS2pz06dPd1lZWa579+7u29/+tps+fbqrra21XlbCffTRR07SFdvs2bOd++Kt2EuXLnWZmZnO7/e7cePGuZqaGutlx903HYdz58658ePHuz59+rhu3bq5/v37u7lz5ybdf6S19u8vya1atSqyz+eff+5+8pOfuG9961uuZ8+ebsqUKe748eOm6463ax2HI0eOuDFjxri0tDTn9/vd7bff7n7+85+7UChkvfQo/DkGAICJdv8aEAAgOREgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJv4HAX3h4ZDJJG8AAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 619: prediction = 8, truth is 1\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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x8eyZcv00Ucf6dNPP43551tCoZAuX76s8+fPx+yfro+Hm52HrpSUlEhSj3o89PgA9e/fX+PHj1d1dXX0ts7OTlVXV6u0tNR0NmsXLlzQ8ePHlZeXZz2KmaKiIoVCoZjHRyQS0f79+3v94+PLL7/UuXPn0urx4ZzTsmXLtH37du3evVtFRUUx948fP179+vWLeTw0NDToxIkTafV4uNV56Mrhw4clqWc9HqzfBXE73n//fef3+93mzZvdv/71L7dkyRI3aNAg19zcbD1at/r1r3/tampqXFNTk/v73//uysrKXHZ2tjtz5oz1aEnV2trqDh065A4dOuQkuVdeecUdOnTIffHFF8455/74xz+6QYMGuZ07d7ojR464WbNmuaKiIvfVV19Zj55Q33YeWltb3bPPPuvq6upcU1OT++STT9wPf/hDd99997lLly5Zj54wS5cudcFg0NXU1LjTp09Ht4sXL0b3eeqpp9ywYcPc7t273YEDB1xpaakrLS01nTvRbnUeGhsb3e9+9zt34MAB19TU5Hbu3OmGDx/uJk+ebD16jJQIkHPOvf76627YsGGuf//+buLEiW7fvn3WI3W7xx57zOXl5bn+/fu77373u+6xxx5zjY2N1mMl3aeffuok3bDNnz/fua/fiv3CCy+43Nxc5/f73dSpU11DQ4P12An3befh4sWLbtq0aW7IkCGuX79+rrCw0C1evDjt/ietq7+/JLdp06boPl999ZV7+umn3Xe+8x03cOBA9+ijj7rTp0+bzp1otzoPJ06ccJMnT3ZZWVnO7/e7e++91/3mN79x4XDYevQY/HMMAAATPf41IABAeiJAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATPw/WCG7lZLACPAAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "test 659: prediction = 7, truth is 2\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGztJREFUeJzt3X9s1PUdx/HXgfQEba8rpb12FCz4AydSN4TaoIijoXQLE2WbomRgDEwsZsicpkZF3bJukDinYfDPBpLJLxeBSCaLFlviLGwgBMm2jpIqNbRFSXpXihSkn/2B3jgpwve467t3fT6Sb0Lvvp9+3/vu0qdf7vrF55xzAgCgh/WzHgAA0DcRIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYOIy6wG+qqurS4cPH1Z6erp8Pp/1OAAAj5xzam9vV35+vvr1O/91Tq8L0OHDh1VQUGA9BgDgEjU1NWno0KHnfb7XBSg9PV36YvCMjAzrcQAAHoXDYRUUFER+np9PwgK0bNkyLV26VC0tLSoqKtLLL7+s8ePHX3Ddl3/tlpGRQYAAIIld6G2UhHwIYf369Vq0aJEWL16s999/X0VFRSorK9ORI0cScTgAQBJKSIBeeOEFzZ07Vw888IC+9a1vacWKFRo0aJD+9Kc/JeJwAIAkFPcAnTx5Urt371Zpaen/D9Kvn0pLS1VXV3fO/p2dnQqHw1EbACD1xT1An376qU6fPq3c3Nyox3Nzc9XS0nLO/lVVVQoEApGNT8ABQN9g/ouolZWVCoVCka2pqcl6JABAD4j7p+Cys7PVv39/tba2Rj3e2tqqYDB4zv5+v19+vz/eYwAAerm4XwGlpaVp7Nixqq6ujjzW1dWl6upqlZSUxPtwAIAklZDfA1q0aJFmz56tm2++WePHj9eLL76ojo4OPfDAA4k4HAAgCSUkQPfcc48++eQTPfPMM2ppadFNN92krVu3nvPBBABA3+VzzjnrIc4WDocVCAQUCoW4EwIAJKGL/Tlu/ik4AEDfRIAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJi4zHoAoC86dOiQ5zU//OEPPa/55z//6XlNrB577DHPa5YuXZqQWZAcuAICAJggQAAAE3EP0LPPPiufzxe1jRo1Kt6HAQAkuYS8B3TDDTfo7bff/v9BLuOtJgBAtISU4bLLLlMwGEzEtwYApIiEvAd04MAB5efna8SIEbr//vu/9hM/nZ2dCofDURsAIPXFPUDFxcVatWqVtm7dquXLl6uxsVG33Xab2tvbu92/qqpKgUAgshUUFMR7JABALxT3AJWXl+tHP/qRxowZo7KyMv31r39VW1ubNmzY0O3+lZWVCoVCka2pqSneIwEAeqGEfzogMzNT1157rRoaGrp93u/3y+/3J3oMAEAvk/DfAzp27JgOHjyovLy8RB8KAJBE4h6gxx57TLW1tfrwww/13nvv6a677lL//v01c+bMeB8KAJDE4v5XcB9//LFmzpypo0ePasiQIbr11lu1Y8cODRkyJN6HAgAksbgHaN26dfH+lkCPee+99zyv+fWvf+15TXNzs+c1e/bs8bzG5/N5XqMv3rv16r777ovpWOi7uBccAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGAi4f8gHXCpPvnkE89r1q9fH9OxnnrqKc9rwuFwTMfqzdra2jyvWbt2rec13/72tz2vQergCggAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmuBs2Yr6b89GjRz2v2bhxo+c1q1ev9rxm3759ntcA6FlcAQEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJrgZaYr57LPPPK+ZNWtWTMfasmVLTOtSzbRp0zyv8fv9ntf85S9/8bwG6M24AgIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATHAz0hRz4sQJz2u4qej/3XLLLZ7XvPLKK57XVFdXe17DzUiRargCAgCYIEAAABOeA7R9+3ZNmzZN+fn58vl82rRpU9Tzzjk988wzysvL08CBA1VaWqoDBw7Ec2YAQArwHKCOjg4VFRVp2bJl3T6/ZMkSvfTSS1qxYoV27typK664QmVlZTG9NwEASF2eP4RQXl6u8vLybp9zzunFF1/UU089pTvvvFOStHr1auXm5mrTpk269957L31iAEBKiOt7QI2NjWppaVFpaWnksUAgoOLiYtXV1XW7prOzU+FwOGoDAKS+uAaopaVFkpSbmxv1eG5ubuS5r6qqqlIgEIhsBQUF8RwJANBLmX8KrrKyUqFQKLI1NTVZjwQA6AFxDVAwGJQktba2Rj3e2toaee6r/H6/MjIyojYAQOqLa4AKCwsVDAajfss7HA5r586dKikpieehAABJzvOn4I4dO6aGhobI142Njdq7d6+ysrI0bNgwLVy4UL/61a90zTXXqLCwUE8//bTy8/M1ffr0eM8OAEhingO0a9cu3XHHHZGvFy1aJEmaPXu2Vq1apccff1wdHR2aN2+e2tradOutt2rr1q26/PLL4zs5ACCpeQ7QpEmT5Jw77/M+n0/PP/+8nn/++UudDb3crFmzPK/585//nJBZvuoHP/hBTOvuv/9+z2syMzM9r3n11Vc9rwFSjfmn4AAAfRMBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMeL4bNlJPQUFBTOs++ugjz2sOHz4c07G8Sk9Pj2ndFVdcEfdZuvPmm2/2yHGA3owrIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABDcjTTGDBg3yvGbdunUxHauzs9PzmmAwGNOxerOVK1d6XnP69OmEzAIkE66AAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATPuecsx7ibOFwWIFAQKFQSBkZGdbjABd06tQpz2tieW3HcvPXWMVy09hDhw55XnPZZdwPORVd7M9xroAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABPcCRA4ywcffOB5zbPPPut5zeeff+55TU/q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i+X3+61HMcV5OIPzcAbn4QzOwxnJdB563YcQAAB9Q1JdAQEAUgcBAgCYIEAAABMECABgImkCtGzZMl111VW6/PLLVVxcrH/84x/WI/W4Z599Vj6fL2obNWqU9VgJt337dk2bNk35+fny+XzatGlT1PPOOT3zzDPKy8vTwIEDVVpaqgMHDpjNmygXOg9z5sw55/UxdepUs3kToaqqSuPGjVN6erpycnI0ffp01dfXR+1z4sQJVVRUaPDgwbryyis1Y8YMtba2ms2cCBdzHiZNmnTO6+Ghhx4ym7k7SRGg9evXa9GiRVq8eLHef/99FRUVqaysTEeOHLEercfdcMMNam5ujmzvvvuu9UgJ19HRoaKiIi1btqzb55csWaKXXnpJK1as0M6dO3XFFVeorKxMJ06c6PFZE+lC50GSpk6dGvX6WLt2bY/OmGi1tbWqqKjQjh079NZbb+nUqVOaMmWKOjo6Ivs8+uijeuONN/Taa6+ptrZWhw8f1t133206d7xdzHmQpLlz50a9HpYsWWI2c7dcEhg/fryrqKiIfH369GmXn5/vqqqqTOfqaYsXL3ZFRUXWY5iS5DZu3Bj5uqurywWDQbd06dLIY21tbc7v97u1a9caTZl4Xz0Pzjk3e/Zsd+edd5rNZOHIkSNOkqutrXXui//vBwwY4F577bXIPv/+97+dJFdXV2c4aWJ99Tw459ztt9/ufvazn5nOdSG9/gro5MmT2r17t0pLSyOP9evXT6WlpaqrqzOdzcKBAweUn5+vESNG6P7779ehQ4esRzLV2NiolpaWqNdHIBBQcXFxn3x91NTUKCcnR9ddd53mz5+vo0ePWo+UUKFQSJKUlZUlSdq9e7dOnToV9XoYNWqUhg0bltKvh6+ehy+9+uqrys7O1ujRo1VZWanjx48bTdi9Xncz0q/69NNPdfr0aeXm5kY9npubq//85z9mc1koLi7WqlWrdN1116m5uVnPPfecbrvtNu3fv1/p6enW45loaWmRvng9nC03NzfyXF8xdepU3X333SosLNTBgwf15JNPqry8XHV1derfv7/1eHHX1dWlhQsXasKECRo9erT0xeshLS1NmZmZUfum8uuhu/MgSffdd5+GDx+u/Px87du3T0888YTq6+v1+uuvm857tl4fIPxfeXl55M9jxoxRcXGxhg8frg0bNujBBx80nQ327r333sifb7zxRo0ZM0YjR45UTU2NJk+ebDpbIlRUVGj//v194n3Qr3O+8zBv3rzIn2+88Ubl5eVp8uTJOnjwoEaOHGkw6bl6/V/BZWdnq3///ud8iqW1tVXBYNBsrt4gMzNT1157rRoaGqxHMfPla4DXx7lGjBih7OzslHx9LFiwQFu2bNE777wT9c+3BINBnTx5Um1tbVH7p+rr4XznoTvFxcWS1KteD70+QGlpaRo7dqyqq6sjj3V1dam6ulolJSWms1k7duyYDh48qLy8POtRzBQWFioYDEa9PsLhsHbu3NnnXx8ff/yxjh49mlKvD+ecFixYoI0bN2rbtm0qLCyMen7s2LEaMGBA1Ouhvr5ehw4dSqnXw4XOQ3f27t0rSb3r9WD9KYiLsW7dOuf3+92qVavcv/71Lzdv3jyXmZnpWlparEfrUT//+c9dTU2Na2xsdH//+99daWmpy87OdkeOHLEeLaHa29vdnj173J49e5wk98ILL7g9e/a4jz76yDnn3G9+8xuXmZnpNm/e7Pbt2+fuvPNOV1hY6D777DPr0ePq685De3u7e+yxx1xdXZ1rbGx0b7/9tvvOd77jrrnmGnfixAnr0eNm/vz5LhAIuJqaGtfc3BzZjh8/HtnnoYcecsOGDXPbtm1zu3btciUlJa6kpMR07ni70HloaGhwzz//vNu1a5drbGx0mzdvdiNGjHATJ060Hj1KUgTIOedefvllN2zYMJeWlubGjx/vduzYYT1Sj7vnnntcXl6eS0tLc9/85jfdPffc4xoaGqzHSrh33nnHSTpnmz17tnNffBT76aefdrm5uc7v97vJkye7+vp667Hj7uvOw/Hjx92UKVPckCFD3IABA9zw4cPd3LlzU+4/0rr73y/JrVy5MrLPZ5995h5++GH3jW98ww0aNMjdddddrrm52XTueLvQeTh06JCbOHGiy8rKcn6/31199dXuF7/4hQuFQtajR+GfYwAAmOj17wEBAFITAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGDif4Ccv6Fn+RIuAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "wrong = 0\n",
+ "max_wrong = 10\n",
+ "\n",
+ "for n, (x, y) in enumerate(zip(X_test, y_test)):\n",
+ " try:\n",
+ " res = model.predict(np.array([x]), verbose=0)\n",
+ " if np.argmax(res) != np.argmax(y):\n",
+ " print(f\"test {n}: prediction = {np.argmax(res)}, truth is {np.argmax(y)}\")\n",
+ " plt.imshow(x.reshape(28, 28), cmap=\"gray_r\")\n",
+ " plt.show()\n",
+ " wrong += 1\n",
+ " if (wrong > max_wrong-1):\n",
+ " break\n",
+ " except KeyboardInterrupt:\n",
+ " print(\"stopping\")\n",
+ " break\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Experimenting"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "There are a number of things we can play with to see how the network performance\n",
+ "changes:\n",
+ "\n",
+ "* batch size\n",
+ "\n",
+ "* adding or removing hidden layers\n",
+ "\n",
+ "* changing the dropout\n",
+ "\n",
+ "* changing the activation function"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Callbacks\n",
+ "\n",
+ "Keras allows for callbacks each epoch to store some information. These can allow you to,\n",
+ "for example, plot of the accuracy vs. epoch by adding a callback. Take a look here for some inspiration:\n",
+ "\n",
+ "https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/History\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Going Further\n",
+ "\n",
+ "Convolutional neural networks are often used for image recognition, especially with larger images. They use filter to try to recognize patterns in portions of images (A tile). See this for a keras example: \n",
+ "\n",
+ "https://www.tensorflow.org/tutorials/images/cnn\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/content/11-machine-learning/machine-learning-basics.ipynb b/content/11-machine-learning/machine-learning-basics.ipynb
new file mode 100644
index 00000000..dcc7a97e
--- /dev/null
+++ b/content/11-machine-learning/machine-learning-basics.ipynb
@@ -0,0 +1,246 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "f324283b-1ab5-4c9c-8b41-0d96e76ff84d",
+ "metadata": {},
+ "source": [
+ "# Machine Learning Introduction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c1346fda-937c-4521-80fd-879674bf8d58",
+ "metadata": {},
+ "source": [
+ "## Neural networks\n",
+ "\n",
+ "When we talk about machine learning, we usually mean an [_artifical neural network_](https://en.wikipedia.org/wiki/Artificial_neural_network).\n",
+ "A neural network mimics the action of neurons in your brain. \n",
+ "\n",
+ "Basic idea:\n",
+ "\n",
+ "* Create a nonlinear fitting routine with free parameters\n",
+ "* Train the network on data with known inputs and outputs to set the parameters\n",
+ "* Use the trained network on new data to predict the outcome\n",
+ "\n",
+ "We can think of a neural network as a map that takes a set of n parameters and returns a set of m parameters, $\\mathbb{R}^n \\rightarrow \\mathbb{R}^m$ and we can express this as:\n",
+ "\n",
+ "$${\\bf z} = {\\bf A} {\\bf x}$$\n",
+ "\n",
+ "where ${\\bf x} \\in \\mathbb{R}^n$ are the inputs, ${\\bf z} \\in \\mathbb{R}^m$ are the outputs, and ${\\bf A}$ is an $m \\times n$ matrix.\n",
+ "\n",
+ "Our goal is to determine the matrix elements of ${\\bf A}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b0eddb35-abe2-4026-a064-ee05f232fbe8",
+ "metadata": {},
+ "source": [
+ "### Some nomeclature\n",
+ "\n",
+ "We can visualize a neural network as:\n",
+ "\n",
+ "\n",
+ "\n",
+ "* Neural networks are divided into _layers_\n",
+ "\n",
+ " * There is always an _input layer_—it doesn't do any processing\n",
+ " \n",
+ " * There is always an _output layer_\n",
+ " \n",
+ "* Within a layer there are neurons or _nodes_.\n",
+ "\n",
+ " * For input, there will be one node for each input variable.\n",
+ " \n",
+ "* Every node in the first layer connects to every node in the next layer\n",
+ "\n",
+ " * The _weight_ associated with the _connection_ can vary—these are the matrix elements.\n",
+ " \n",
+ "* In this example, the processing is done in layer 2 (the output)\n",
+ "\n",
+ "* When you train the neural network, you are adjusting the weights connecting to the nodes\n",
+ "\n",
+ " * Some connections might have zero weight\n",
+ " \n",
+ " * This mimics nature—a single neuron can connect to several (or lots) of other neurons."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c678e3c3-4b2f-4d4a-abf0-3716c59d2f0d",
+ "metadata": {},
+ "source": [
+ "## Universal approximation theorem and non-linearity\n",
+ "\n",
+ "A neural network can be designed to approximate any function, $f(x)$. For this to work, there must be a source of non-linearity in the network. This is applied on a layer. This is a result of the [universal approximation theorem](https://en.wikipedia.org/wiki/Universal_approximation_theorem).\n",
+ "\n",
+ "We call this an [_activation function_](https://en.wikipedia.org/wiki/Activation_function) and it has the form:\n",
+ "\n",
+ "\n",
+ "$$g({\\bf x}) = \\left ( \\begin{array}{c} g(x_0) \\\\ g(x_1) \\\\ \\vdots \\\\ g(x_{n-1}) \\end{array} \\right )$$\n",
+ "\n",
+ "Then our neural network has the form: ${\\bf z} = g({\\bf A x})$\n",
+ "\n",
+ "We want to choose a $g(x)$ that is differentiable. A common choice is the _sigmoid function_:\n",
+ "\n",
+ "$$g(p) = \\frac{1}{1 + e^{-p}}$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "2a029ea0-33bd-4058-bc58-26dde63ddd14",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "d9d672b0-594f-4a03-9065-496e24abe89b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sigmoid(p):\n",
+ " return 1 / (1 + np.exp(-p))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "69eebe24-d010-4c40-905a-eb014bee84ee",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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sBRhBAAAWIowAgAALOX3YeR3v/ud0tLSFBISop49ezbbJycnR5MnT1ZoaKiio6N1//33q6qq6oyvW1lZqfvuu0/R0dEKDQ3VjTfeqP3793fAGrTeihUrZLPZmr1t3LixxeXuuOOOJv3HjRvXiZV7Z8CAAU3qffDBB8+4jDFGjz76qOLj4xUcHKwrr7xSX331VSdV3HrffPON7rrrLiUlJSk4OFiDBg3SI488ctafx66+DefPn6+kpCQFBQUpJSVFq1evPmP/lStXKiUlRUFBQRo4cKCef/75TqrUO/PmzdPFF1+ssLAw9enTRzfffLN27NhxxmVa+j39+uuvO6lq7zz66KNNao2NjT3jMr6y/aTmP09sNpvuvffeZvt39e23atUqTZ48WfHx8bLZbHr33XcbPd/Wz8K3335b5513nlwul8477zwtWbKkXev2+zBSVVWlW2+9VT/96U+bfd7tduv6669XeXm51qxZozfeeENvv/22HnjggTO+7syZM7VkyRK98cYbWrNmjY4dO6YbbrhBbre7I1ajVdLS0pSfn9/odvfdd2vAgAEaM2bMGZe99tprGy23dOnSTqq6bebOnduo3v/8z/88Y/8nn3xSTz31lJ599llt3LhRsbGxuuaaaxque9RVfP311/J4PHrhhRf01Vdf6emnn9bzzz+vhx566KzLdtVtuHjxYs2cOVMPP/ywsrKyNH78eE2aNEk5OTnN9s/OztZ1112n8ePHKysrSw899JDuv/9+vf32251c+dmtXLlS9957rzZs2KCMjAzV1NQoPT1d5eXlZ112x44djbbXkCFDOqHithk5cmSjWrds2dJiX1/afpK0cePGRuuWkZEhSbr11lvPuFxX3X7l5eUaNWqUnn322Wafb8tn4fr16zVlyhTdfvvt+uKLL3T77bfrtttu06efftp+hZtuYtGiRSYiIqJJ+9KlS43dbjd5eXkNba+//rpxuVympKSk2dc6evSoCQwMNG+88UZDW15enrHb7ebDDz9s99rbqqqqyvTp08fMnTv3jP2mTZtmbrrpps4pqh0kJiaap59+utX9PR6PiY2NNY8//nhDW0VFhYmIiDDPP/98B1TYvp588kmTlJR0xj5deRtecsklZvr06Y3ahg8fbh588MFm+//qV78yw4cPb9T2k5/8xIwbN67DamwvhYWFRpJZuXJli32WL19uJJkjR450XmHn4JFHHjGjRo1qdX9f3n7GGPPzn//cDBo0yHg8nmaf96XtJ8ksWbKk4XFbPwtvu+02c+211zZqmzhxovne977XbrX6/Z6Rs1m/fr2Sk5MVHx/f0DZx4kRVVlYqMzOz2WUyMzNVXV2t9PT0hrb4+HglJydr3bp1HV5za7333nsqKirSHXfccda+K1asUJ8+fTR06FDdc889Kiws7PgCz8ETTzyhqKgoXXjhhfrd7353xmGM7OxsFRQUNNpeLpdLV1xxRZfaXi0pKSlRZGTkWft1xW1YVVWlzMzMRt97SUpPT2/xe79+/fom/SdOnKhNmzapurq6w2ptDyUlJZLUqu110UUXKS4uTldffbWWL1/e0aWdk127dik+Pl5JSUn63ve+p71797bY15e3X1VVlV599VX96Ec/OutFWX1p+9Vr62dhS9u0PT8/u30YKSgoUExMTKO2Xr16yel0qqCgoMVlnE6nevXq1ag9JiamxWWssHDhQk2cOFEJCQln7Ddp0iS99tpr+uSTT/SHP/xBGzdu1IQJE1RZWdlJlXrn5z//ud544w0tX75cM2bM0DPPPKOf/exnLfav3yanb+eutr2as2fPHv35z3/W9OnTz9ivq27DoqIiud1ur773zf1OxsTEqKamRkVFRR1W67kyxmj27Nm67LLLlJyc3GK/uLg4vfjii3r77bf1zjvvaNiwYbr66qu1atWqTqy29caOHatXXnlFH330kf7yl7+ooKBAaWlpKi4ubra/r24/SXr33Xd19OjRM/4D52vb71Rt/SxsaZu25+enT1y193SPPvqoHnvssTP22bhx41mPk6jXXAI2xpw1GbfHMq3RlvXdv3+/PvroI/3jH/846+tPmTKl4X5ycrLGjBmjxMREffDBB7rlllvaXrgXvFnHWbNmNbRdcMEF6tWrl7773e827C1pyenbpqO2V3Pasg0PHDiga6+9VrfeeqvuvvvuMy7bFbbhmXj7vW+uf3PtXcmMGTP05Zdfas2aNWfsN2zYMA0bNqzhcWpqqnJzc/X73/9el19+eUeX6bVJkyY13D///POVmpqqQYMG6W9/+5tmz57d7DK+uP2k2n/gJk2a1GhP+el8bfs1py2fhR39+emTYWTGjBn63ve+d8Y+AwYMaNVrxcbGNjkI58iRI6qurm6SBE9dpqqqSkeOHGm0d6SwsFBpaWmtel9vtGV9Fy1apKioKN14441ev19cXJwSExO1a9cur5dtq3PZpvVnjezevbvZMFJ/5H9BQYHi4uIa2gsLC1vcxu3N2/U7cOCArrrqKqWmpurFF1/0+v2s2IbNiY6OlsPhaPIf1Jm+97Gxsc32DwgIOGPYtNJ9992n9957T6tWrVK/fv28Xn7cuHF69dVXO6Cy9hcaGqrzzz+/xZ8tX9x+krRv3z59/PHHeuedd7xe1le2X1s/C1vapu35+emTYSQ6OlrR0dHt8lqpqan63e9+p/z8/IaNs2zZMrlcLqWkpDS7TEpKigIDA5WRkaHbbrtNkpSfn6+tW7fqySefbJe6TuXt+hpjtGjRIk2dOlWBgYFev19xcbFyc3Mb/bB2tHPZpllZWZLUYr1JSUmKjY1VRkaGLrroIkm1Y8MrV67UE0880baCveTN+uXl5emqq65SSkqKFi1aJLvd+9FUK7Zhc5xOp1JSUpSRkaFvf/vbDe0ZGRm66aabml0mNTVV77//fqO2ZcuWacyYMW36ee5Ixhjdd999WrJkiVasWKGkpKQ2vU5WVpbl26q1KisrtX37do0fP77Z531p+51q0aJF6tOnj66//nqvl/WV7dfWz8LU1FRlZGQ02iu9bNmy9v3nu90Ohe2i9u3bZ7Kyssxjjz1mevToYbKyskxWVpYpKyszxhhTU1NjkpOTzdVXX20+//xz8/HHH5t+/fqZGTNmNLzG/v37zbBhw8ynn37a0DZ9+nTTr18/8/HHH5vPP//cTJgwwYwaNcrU1NR0+jqe7uOPPzaSzLZt25p9ftiwYeadd94xxhhTVlZmHnjgAbNu3TqTnZ1tli9fblJTU03fvn1NaWlpZ5bdKuvWrTNPPfWUycrKMnv37jWLFy828fHx5sYbb2zU79R1NMaYxx9/3ERERJh33nnHbNmyxXz/+983cXFxXW4d8/LyzODBg82ECRPM/v37TX5+fsPtVL60Dd944w0TGBhoFi5caLZt22ZmzpxpQkNDzTfffGOMMebBBx80t99+e0P/vXv3mpCQEDNr1iyzbds2s3DhQhMYGGjeeustq1ahRT/96U9NRESEWbFiRaNtdfz48YY+p6/f008/bZYsWWJ27txptm7dah588EEjybz99ttWrMJZPfDAA2bFihVm7969ZsOGDeaGG24wYWFhfrH96rndbtO/f3/z61//uslzvrb9ysrKGv7OSWr4vNy3b58xpnWfhbfffnujs93Wrl1rHA6Hefzxx8327dvN448/bgICAsyGDRvarW6/DyPTpk0zkprcli9f3tBn37595vrrrzfBwcEmMjLSzJgxw1RUVDQ8n52d3WSZEydOmBkzZpjIyEgTHBxsbrjhBpOTk9OJa9ay73//+yYtLa3F5yWZRYsWGWOMOX78uElPTze9e/c2gYGBpn///mbatGldZl1Ol5mZacaOHWsiIiJMUFCQGTZsmHnkkUdMeXl5o36nrqMxtae0PfLIIyY2Nta4XC5z+eWXmy1btnRy9We3aNGiZn9eT/+/wde24XPPPWcSExON0+k0o0ePbnTq67Rp08wVV1zRqP+KFSvMRRddZJxOpxkwYIBZsGBBJ1fcOi1tq1N/9k5fvyeeeMIMGjTIBAUFmV69epnLLrvMfPDBB51ffCtNmTLFxMXFmcDAQBMfH29uueUW89VXXzU878vbr95HH31kJJkdO3Y0ec7Xtl/9qcen36ZNm2aMad1n4RVXXNHQv96bb75phg0bZgIDA83w4cPbPXzZjKk7sggAAMAC3f7UXgAAYC3CCAAAsBRhBAAAWIowAgAALEUYAQAAliKMAAAASxFGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAs9f8BalpP6tz/SfIAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p = np.linspace(-10, 10, 200)\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "\n",
+ "ax.plot(p, sigmoid(p))\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9eaf8794-cfa8-475b-a255-711560c5f0c2",
+ "metadata": {},
+ "source": [
+ "Notice that the sigmoid scales all output to be in $z_i \\in (0, 1)$\n",
+ "\n",
+ "This means that we need to ensure that our training set set is likewise mapped to $(0, 1)$, and if not, we need to transform it."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c193973c-d51c-4dfd-a30e-8667fd330158",
+ "metadata": {},
+ "source": [
+ "## Basic algorithm\n",
+ "\n",
+ "* Training\n",
+ "\n",
+ " * We have $T$ pairs $(x^k, y^k)$ for $k = 1, \\ldots, T$\n",
+ " \n",
+ " * We require that $g({\\bf A x}^k) = {\\bf y}^k$ for all $k$\n",
+ " \n",
+ " Recall that $g(p)$ is a scalar function that works element-by-element:\n",
+ " \n",
+ " $$z_i = g([{\\bf A x}]_i) = g \\left ( \\sum_j A_{ij} x_j \\right )$$\n",
+ " \n",
+ " * Find the elements of ${\\bf A}$\n",
+ " \n",
+ " This is a minimization problem, where we are minimizing:\n",
+ " \n",
+ " $$f(A_{ij}) = \\| g({\\bf A x}^k) - {\\bf y}^k \\|^2$$\n",
+ " \n",
+ " We call this function the _cost function_.\n",
+ " \n",
+ " A common minimization technique is [_gradient descent_](https://en.wikipedia.org/wiki/Gradient_descent).\n",
+ " \n",
+ " Some caveats:\n",
+ " \n",
+ " * When you minimize with one set of training data, there is no guarantee that your are still minimimzed with respect to the others. We do multiple _epochs_ or passes through the training data to fix this.\n",
+ " \n",
+ " * We often don't apply the full correction from gradient descent, but instead scale it by some $\\eta < 1$ called the _learning rate_.\n",
+ " \n",
+ "* Using the network\n",
+ "\n",
+ " With the trained ${\\bf A}$, we can now use the network on data we haven't seen before"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9801589-7251-48b2-9099-e8b22f9c9250",
+ "metadata": {},
+ "source": [
+ "## Hidden layers\n",
+ "\n",
+ "We can get better performance from a neural network by adding a hidden layer:\n",
+ "\n",
+ "\n",
+ "\n",
+ "The side of the hidden layer is independent of the size of the input and output layers. Now we have an additional matrix ${\\bf B}$ to train. This can all be done together using the same algorithm described above. Where we now minimize:\n",
+ "\n",
+ "$$f(A_{ls}, B_{ij}) = \\sum_{l=1}^m (z_l - y_l)^2$$\n",
+ "\n",
+ "$$\\tilde{z}_i = g \\left ( \\sum_{j=1}^n B_{ij} x_j \\right )$$\n",
+ "\n",
+ "$$z_l = g \\left ( \\sum_{s=1}^k A_{ls} \\tilde{z}_s \\right )$$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7409a682-1905-4bde-a8a9-1d0c4d4d8347",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/content/11-machine-learning/machine-learning-libraries.md b/content/11-machine-learning/machine-learning-libraries.md
new file mode 100644
index 00000000..756e5c3b
--- /dev/null
+++ b/content/11-machine-learning/machine-learning-libraries.md
@@ -0,0 +1,106 @@
+# Diving Deeper into Machine Learning
+
+We've focused on neural networks, using labeled data that we
+can use to learn the trends in our data. This is an example
+of _supervised learning_.
+
+Broadly speaking there are
+3 main [approaches to machine learning](https://en.wikipedia.org/wiki/Machine_learning#Approaches)
+
+* [Supervised learning](https://en.wikipedia.org/wiki/Supervised_learning)
+
+ This uses labeled pairs (input and output) to train the model
+ to learn how to predict the outputs from the inputs.
+
+* [Unsupervised learning](https://en.wikipedia.org/wiki/Unsupervised_learning)
+
+ No labeled data is provided. Instead the machine learning
+ algorithm seeks to find the structure on its own. The goal
+ is to learn patterns and features to be able to produce
+ new data.
+
+* [Reinforcement learning](https://en.wikipedia.org/wiki/Reinforcement_learning)
+
+ As with unsupervised learning, no labeled data is used,
+ but the model is "rewarded" when it does something right,
+ and the model tries to maximize rewards (think: self-driving
+ cars).
+
+## Libraries
+
+There are a number of popular libraries that implement machine learning algorithms.
+Their features and performance vary quite a bit. An comparison of their
+features is provided by Wikipedia: [Comparison of deep learning software](https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software).
+
+Some additional comparisons are provided here: https://ritza.co/articles/scikit-learn-vs-tensorflow-vs-pytorch-vs-keras/
+
+* [TensorFlow](https://www.tensorflow.org/)
+
+ This is an open source machine learning library released by Google. It has support
+ for CPUs, GPUs, and [TPUs](https://en.wikipedia.org/wiki/Tensor_Processing_Unit),
+ and provides all the features you need to build deep learning workflows:
+ [TensorFlow feactures](https://en.wikipedia.org/wiki/TensorFlow#Features).
+
+ You can install tensorflow via:
+
+ ```
+ pip install tensorflow
+ ```
+
+ ```{note}
+ At the moment, tensorflow only supports python <= 3.12. So I'll be using
+ pytorch instead (since I am running python 3.13).
+ ```
+
+* [PyTorch](https://pytorch.org/)
+
+ This is a machine learning library build off of the Torch library, originally
+ developed by Facebook.
+
+ You can install pytorch via:
+
+ ```
+ pip install torch
+ ```
+
+* [scikit-learn](https://scikit-learn.org/stable/)
+
+ This is a python library developed for machine learning. It has a lot of
+ sample datasets that provide a nice means to learn how different methods work.
+ It is designed to work with NumPy and SciPy.
+
+ General recommendations on the web seem to be to use Scikit-learn to get
+ started with machine learning and to explore ideas, but to switch to
+ one of the other packages for computationally-intensive work.
+
+ You can install scikit-learn via:
+
+ ```
+ pip install scikit-learn
+ ```
+
+ Scikit-learn provides some nice sample datasets:
+
+ https://scikit-learn.org/stable/datasets/toy_dataset.html
+
+ as well as generators for
+ datasets:
+
+ https://scikit-learn.org/stable/datasets/sample_generators.html
+
+There are also tools that provide higher-level interfaces to these
+
+* [Keras](https://keras.io/)
+
+ Keras provides a common python interface to several different machine learning
+ libraries, including tensorflow and torch. This hides a lot of the implementation
+ details and makes it easy to get started using these libraries.
+
+## Keras
+
+We'll focus on Keras.
+
+There are a large number of examples provided by Keras:
+
+https://keras.io/examples/
+
diff --git a/content/11-machine-learning/machine-learning.md b/content/11-machine-learning/machine-learning.md
new file mode 100644
index 00000000..21e8d859
--- /dev/null
+++ b/content/11-machine-learning/machine-learning.md
@@ -0,0 +1,3 @@
+# Machine Learning
+
+We'll look at a popular library for machine learning.
diff --git a/content/11-machine-learning/model.png b/content/11-machine-learning/model.png
new file mode 100644
index 00000000..a95a93b2
Binary files /dev/null and b/content/11-machine-learning/model.png differ
diff --git a/content/11-machine-learning/neural-net-basics.md b/content/11-machine-learning/neural-net-basics.md
new file mode 100644
index 00000000..38f938bb
--- /dev/null
+++ b/content/11-machine-learning/neural-net-basics.md
@@ -0,0 +1,151 @@
+# Artificial Neural Network Basics
+
+## Neural networks
+
+An [_artifical
+neural
+network_](https://en.wikipedia.org/wiki/Artificial_neural_network)
+mimics the action of neurons in your brain to form connections
+between nodes (neurons) that link the input to the output.
+
+```{note}
+We'll loosely
+follow the notation from _Computational Methods for Physics_ by
+Franklin.
+```
+
+Basic idea:
+
+* Create a nonlinear fitting routine with free parameters
+* Train the network on data with known inputs and outputs to set the parameters
+* Use the trained network on new data to predict the outcome
+
+We can think of a neural network as a map that takes a set of
+$N_\mathrm{in}$ parameters and returns a set of $N_\mathrm{out}$
+parameters, which we can express this as:
+
+$${\bf z} = {\bf A} {\bf x}$$
+
+where
+
+$${\bf x} = (x_1, x_2, \ldots, x_{N_\mathrm{in}})$$
+
+are the inputs,
+
+$${\bf z} = (z_1, z_2, \ldots, z_{N_\mathrm{out}})$$
+
+are the outputs, and
+${\bf A}$ is an $N_\mathrm{out} \times N_\mathrm{in}$ matrix.
+
+Our goal is to determine the matrix elements of ${\bf A}$.
+
+## Nomenclature
+
+We can visualize a neural network as:
+
+
+
+* Neural networks are divided into _layers_
+
+ * There is always an _input layer_—it doesn't do any processing.
+
+ * There is always an _output layer_.
+
+* Within a layer there are neurons or _nodes_.
+
+ * For input, there will be one node for each input variable. In this figure,
+ there are 3 nodes on the input layer.
+
+ * The output layer will have as many nodes are needed to convey the answer
+ we are seeking from the network. In this case, there are 2 nodes on the
+ output layer.
+
+* Every node in the first layer connects to every node in the next layer
+
+ * The _weight_ associated with the _connection_ can vary—these are the matrix elements.
+
+ ```{note}
+ This is called a _dense layer_. There are alternate types of layers
+ we can explore where the nodes are connected differently.
+ ```
+
+* In this example, the processing is done in layer 2 (the output)
+
+* When you train the neural network, you are adjusting the weights connecting to the nodes
+
+ * Some connections might have zero weight
+
+ * This mimics nature—a single neuron can connect to several (or lots) of other neurons.
+
+## Universal approximation theorem
+
+A neural network can be designed to approximate any function, $f(x)$. For this to work, there must be a source of non-linearity in the network—this is a result of the [universal approximation theorem](https://en.wikipedia.org/wiki/Universal_approximation_theorem).
+
+We use a nonlinear [_activation function_](https://en.wikipedia.org/wiki/Activation_function) that is applied in a layer. It has
+the form:
+
+$$g({\bf v}) = \left ( \begin{array}{c} g(v_0) \\ g(v_1) \\ \vdots \\ g(v_{n-1}) \end{array} \right )$$
+
+```{note}
+The activation function, $g({\bf v})$ works element-by-element on the vector ${\bf v}$.
+```
+
+Then our neural network has the form: ${\bf z} = g({\bf A x})$
+
+We want to choose a function $g(\xi)$ that is differentiable. A common choice is the _sigmoid function_:
+
+$$g(\xi) = \frac{1}{1 + e^{-\xi}}$$
+
+```{figure} sigmoid.png
+---
+align: center
+---
+The sigmoid function
+```
+
+```{note}
+There are [many choices for the activation function](https://en.wikipedia.org/wiki/Activation_function) which have
+different properties. Often the choice of activation function will be empirical, by experimenting with the
+performance of the network.
+```
+
+## Basic algorithm
+
+We'll consider the case where we have training data---a set of inputs, ${\bf x}^k$,
+together with the expected output (answer), ${\bf y}^k$. These training pairs
+allow us to constrain the output of the network and train the weights.
+
+* Training
+
+ * Loop over the $T$ pairs $({\bf x}^k, {\bf y}^k)$ for $k = 1, \ldots, T$
+
+ * Predict the output for ${\bf x}^k$ as:
+
+ $$z_i = g([{\bf A x}^k]_i) = g \left ( \sum_{j=1}^{N_\mathrm{in}} A_{ij} x^k_j \right )$$
+
+ * Constrain that ${\bf z} = {\bf y}^k$.
+
+ This is a minimization problem, where we are minimizing:
+
+ \begin{align*}
+ \mathcal{L}(A_{ij}) &= \| g({\bf A x}^k) - {\bf y}^k \|^2 \\
+ &= \sum_{i=1}^{N_\mathrm{out}} \left [ g\left (\sum_{j=1}^{N_\mathrm{in}} A_{ij} x^k_j \right ) - y^k_i \right ]^2
+ \end{align*}
+
+ We call this function, $\mathcal{L}$, the _cost function_ or [loss function](https://en.wikipedia.org/wiki/Loss_function).
+
+ ```{note}
+ This is called the _mean square error_ loss function, and is one possible choice for $\mathcal{L}(A_{ij})$, but [many others exist](https://en.wikipedia.org/wiki/Loss_function).
+ ```
+
+ * Update the matrix ${\bf A}$ based on the training pair $({\bf x}^k, {\bf y^{k}})$.
+
+* Using the network
+
+ With the trained ${\bf A}$, we can now use the network on data we haven't seen before, $\boldsymbol \chi$:
+
+ $$z_i = g([{\bf A {\boldsymbol \chi}}^k]_i) = g \left ( \sum_{j=1}^{N_\mathrm{in}} A_{ij} \chi^k_j \right )$$
+
+There are a lot of details that we still need to figure out involving the training and minimization.
+We'll start with minimization: a common minimization technique used with
+neural networks is [_gradient descent_](https://en.wikipedia.org/wiki/Gradient_descent).
diff --git a/content/11-machine-learning/neural-net-derivation.md b/content/11-machine-learning/neural-net-derivation.md
new file mode 100644
index 00000000..c13f6a41
--- /dev/null
+++ b/content/11-machine-learning/neural-net-derivation.md
@@ -0,0 +1,93 @@
+# Deriving the Learning Correction
+
+For gradient descent, we need to derive the update to the matrix
+${\bf A}$ based on training on a set of our data, $({\bf x}^k, {\bf y}^k)$.
+
+```{important}
+The derivation we do here is specific to our choice of loss function, $\mathcal{L}(A_{ij})$
+and activation function, $g(\xi)$.
+```
+
+Let's start with our cost function:
+
+$$\mathcal{L}(A_{ij}) = \sum_{i=1}^{N_\mathrm{out}} (z_i - y_i^k)^2 = \sum_{i=1}^{N_\mathrm{out}}
+ \Biggl [ g\biggl (\underbrace{\sum_{j=1}^{N_\mathrm{in}} A_{ij} x^k_j}_{\equiv \alpha_i} \biggr ) - y^k_i \Biggr ]^2$$
+
+where we'll refer to the product ${\boldsymbol \alpha} \equiv {\bf
+Ax}$ to help simplify notation. This means that ${\bf z} = g({\boldsymbol \alpha})$.
+
+We can compute the derivative with respect to a single matrix
+element, $A_{pq}$ by applying the chain rule:
+
+$$\frac{\partial \mathcal{L}}{\partial A_{pq}} =
+ 2 \sum_{i=1}^{N_\mathrm{out}} (z_i - y^k_i) \left . \frac{\partial g}{\partial \xi} \right |_{\xi=\alpha_i} \frac{\partial \alpha_i}{\partial A_{pq}}$$
+
+
+with
+
+$$\frac{\partial \alpha_i}{\partial A_{pq}} = \sum_{j=1}^{N_\mathrm{in}} \frac{\partial A_{ij}}{\partial A_{pq}} x^k_j = \sum_{j=1}^{N_\mathrm{in}} \delta_{ip} \delta_{jq} x^k_j = \delta_{ip} x^k_q$$
+
+and for $g(\xi)$, we will assume the sigmoid function,so
+
+$$\frac{\partial g}{\partial \xi}
+ = \frac{\partial}{\partial \xi} \frac{1}{1 + e^{-\xi}}
+ =- (1 + e^{-\xi})^{-2} (- e^{-\xi})
+ = g(\xi) \frac{e^{-\xi}}{1+ e^{-\xi}} = g(\xi) (1 - g(\xi))$$
+
+which gives us:
+
+\begin{align*}
+\frac{\partial \mathcal{L}}{\partial A_{pq}} &= 2 \sum_{i=1}^{N_\mathrm{out}}
+ (z_i - y^k_i) z_i (1 - z_i) \delta_{ip} x^k_q \\
+ &= 2 (z_p - y^k_p) z_p (1- z_p) x^k_q
+\end{align*}
+
+where we used the fact that the $\delta_{ip}$ means that only a single term contributes to the sum.
+
+```{note}
+Observe that:
+
+* $e_p^k \equiv (z_p - y_p^k)$ is the error on the output layer,
+ and the correction is proportional to the error (as we would
+ expect).
+
+* The $k$ superscripts here remind us that this is the result of
+ only a single pair of data from the training set.
+```
+
+Now ${\bf z}$ and ${\bf y}^k$ are all vectors of size $N_\mathrm{out} \times 1$ and ${\bf x}^k$ is a vector of size $N_\mathrm{in} \times 1$, so we can write this expression for the matrix as a whole as:
+
+$$\frac{\partial \mathcal{L}}{\partial {\bf A}} = 2 ({\bf z} - {\bf y}^k) \circ {\bf z} \circ (1 - {\bf z}) \cdot ({\bf x}^k)^\intercal$$
+
+where the operator $\circ$ represents _element-by-element_ multiplication (the [Hadamard product](https://en.wikipedia.org/wiki/Hadamard_product_(matrices))).
+
+## Performing the update
+
+We could do the update like we just saw with our gradient descent
+example: take a single data point, $({\bf x}^k, {\bf y}^k)$ and
+do the full minimization, continually estimating the correction,
+$\partial \mathcal{L}/\partial {\bf A}$ and updating ${\bf A}$ until we
+reach a minimum. The problem with this is that $({\bf x}^k, {\bf y}^k)$ is only one point in our training data, and there is no
+guarantee that if we minimize completely with point $k$ that we will
+also be a minimum with point $k+1$.
+
+Instead we take multiple passes through the training data (called _epochs_) and apply only a single push in the direction that gradient
+descent suggests, scaled by a _learning rate_ $\eta$.
+
+The overall minimization appears as:
+
+```{card} Minimization
+* Loop over epochs
+
+ * Loop over the training data, $\{ ({\bf x}^0, {\bf y}^0), ({\bf x}^1, {\bf y}^1), \ldots \}$. We'll refer to the current training
+ pair as $({\bf x}^k, {\bf y}^k)$
+
+ * Propagate ${\bf x}^k$ through the network, getting the output
+ ${\bf z} = g({\bf A x}^k)$
+
+ * Compute the error on the output layer, ${\bf e}^k = {\bf z} - {\bf y}^k$
+
+ * Update the matrix ${\bf A}$ according to:
+
+ $${\bf A} \leftarrow {\bf A} - 2 \,\eta\, {\bf e}^k \circ {\bf z} \circ (1 - {\bf z}) \cdot ({\bf x}^k)^\intercal$$
+```
diff --git a/content/11-machine-learning/neural-net-hidden.md b/content/11-machine-learning/neural-net-hidden.md
new file mode 100644
index 00000000..1e27c737
--- /dev/null
+++ b/content/11-machine-learning/neural-net-hidden.md
@@ -0,0 +1,111 @@
+# Hidden Layers
+
+
+ We can get better performance from a neural network by adding a hidden layer:
+
+
+
+The size of the hidden layer is independent of the size of the input and output
+layers. In this case, we have a hidden layer that is larger
+than either the input or output layers.
+
+Now we have an additional matrix ${\bf B}$ to train. The matrix sizes are:
+
+* ${\bf A}$ : $N_\mathrm{out} \times N_\mathrm{hidden}$
+* ${\bf B}$ : $N_\mathrm{hidden} \times N_\mathrm{in}$
+
+
+```{note}
+Neglecting the activation functions, the action of the network
+is to do ${\bf z} = {\bf A B x}$ which has size $N_\mathrm{out}$.
+```
+
+The derivation of the corrections to matrices ${\bf A}$ and ${\bf B}$ can be done
+via the chain rule.
+
+```{note}
+We'll consider the case of a single hidden layer, but the derivation we
+do here generalizes to multiple hidden layers.
+```
+
+\begin{equation}
+\mathcal{L}(A_{lm}, B_{ij}) = \sum_{l=1}^{N_\mathrm{out}} (z_l - y^k_l)^2
+\end{equation}
+
+$$\tilde{z}_i = g \biggl ( \underbrace{\sum_{j=1}^{N_\mathrm{in}} B_{ij} x^k_j}_{\equiv \beta_i} \biggr )$$
+
+$$z_l = g \biggl ( \underbrace{\sum_{m=1}^{N_\mathrm{hidden}} A_{lm} \tilde{z}_m}_{\equiv \alpha_l} \biggr )$$
+
+Note that we are assuming here that the same activation function, $g(\xi)$
+is used on each layer.
+
+## Updates to ${\bf A}$
+
+Matrix ${\bf A}$ is trained based on the output layer, we know the error there
+directly, ${\bf e}^k = {\bf z} - {\bf y}^k$. As a result, we can just use
+the result that we got for a single layer, but now the input is $\tilde{\bf z}$
+instead of ${\bf x}$:
+
+$$\frac{\partial \mathcal{L}}{\partial {\bf A}} = 2 {\bf e}^k \circ {\bf z} \circ (1 - {\bf z}) \cdot \tilde{\bf z}^\intercal$$
+
+## Updates to ${\bf B}$
+
+To find the corrections to matrix ${\bf B}$, we essentially need to know what the
+error is on the hidden layer. But we only know the error on the output layer, so
+by applying the chainrule on our cost function, we will work out this correction,
+and in the process see how the error on the output layer informs the error on the
+hidden layer—a process called _backpropagation_.
+
+Let's start with our cost function:
+
+\begin{align*}
+\mathcal{L}(A_{lm}, B_{ij}) &= \sum_{l=1}^{N_\mathrm{out}} (z_l - y^k_l)^2 \\
+ &= \sum_{l=1}^{N_\mathrm{out}} \Biggl [ g \biggl ( \sum_{m=1}^{N_\mathrm{hidden}} A_{lm} \tilde{z}_m \biggr ) - y_l^k \Biggr ]^2 \\
+ &= \sum_{l=1}^{N_\mathrm{out}} \Biggl [ g \biggl ( \sum_{m=1}^{N_\mathrm{hidden}} A_{lm} \,g \biggl ( \sum_{j=1}^{N_\mathrm{in}} B_{mj} x_j^k \biggr ) \biggr ) - y_l^k \Biggr ]^2
+\end{align*}
+
+Differentiating with respect to an element in matrix ${\bf B}$, we apply the chain rule over and over,
+giving:
+
+$$\frac{\partial \mathcal{L}}{\partial B_{pq}} = 2 \sum_{l=1}^{N_\mathrm{out}} (z_l - y_l^k)
+ \left .\frac{\partial g}{\partial \xi} \right |_{\xi = \alpha_l}
+ \sum_{m=1}^{N_\mathrm{hidden}} A_{lm}\, \left . \frac{\partial g}{\partial \xi} \right |_{\xi = \beta_m}
+ \sum_{j=1}^{N_\mathrm{in}} \frac{\partial B_{mj}}{\partial B_{pq}} x_j^k $$
+
+
+Now we have 3 derivatives left, which are straightforward:
+
+$$\left .\frac{\partial g}{\partial \xi} \right |_{\xi = \alpha_l} = g(\alpha_l)\left [ 1 - g(\alpha_l)\right ]
+ = z_l (1 - z_l)$$
+
+$$\left .\frac{\partial g}{\partial \xi} \right |_{\xi = \beta_m} = g(\beta_m)\left [ 1 - g(\beta_m)\right ]
+ = \tilde{z}_m (1 - \tilde{z}_m)$$
+
+$$\frac{\partial B_{mj}}{\partial B_{pq}} = \delta_{mp} \delta_{jq}$$
+
+Inserting these dervatives and using the $\delta$'s, we are left with:
+
+$$\frac{\partial \mathcal{L}}{\partial B_{pq}} = 2 \sum_{l=1}^{N_\mathrm{out}}
+ \underbrace{(z_l - y_l^k)}_{ = e_l^k} z_l (1 - z_l) A_{lp} \tilde{z}_p (1 - \tilde{z}_p) x^k_q$$
+
+Now, that remaining sum is contracting on the first of the indices of
+the matrix ${\bf A}$, indicating a matrix vector product involving
+${\bf A}^\intercal$. This allows us to define the error _backpropagated_ to the hidden layer:
+
+$$\tilde{e}_p^k = \sum_{l=1}^{N_\mathrm{out}} e_l^k z_l (1 - z_l) A_{lp}
+ = \left [ {\bf A}^\intercal \cdot ({\bf e}^k \circ {\bf z} \circ (1 - {\bf z})) \right ]_p$$
+
+and we can write
+
+$$\frac{\partial \mathcal{L}}{\partial {\bf B}} = 2 \tilde{\bf e}^k \circ \tilde{\bf z} \circ (1 - \tilde{\bf z}) \cdot ({\bf x}^k)^\intercal$$
+
+
+Notice the symmetry in the update of each matrix:
+
+\begin{align*}
+\frac{\partial \mathcal{L}}{\partial {\bf A}} &= 2 {\bf e}^k \circ {\bf z} \circ (1 - {\bf z}) \cdot \tilde{\bf z}^\intercal \\
+\frac{\partial \mathcal{L}}{\partial {\bf B}} &= 2 \tilde{\bf e}^k \circ \tilde{\bf z} \circ (1 - \tilde{\bf z}) \cdot ({\bf x}^k)^\intercal
+\end{align*}
+
+Adding additional hidden layers would continue the trend, with each hidden layer's matrix update depending
+on the error backpropagated to that layer.
diff --git a/content/11-machine-learning/neural-net-improvements.md b/content/11-machine-learning/neural-net-improvements.md
new file mode 100644
index 00000000..d894d4c3
--- /dev/null
+++ b/content/11-machine-learning/neural-net-improvements.md
@@ -0,0 +1,103 @@
+# Improvements
+
+There are many ways we could improve the performance of our network, but these will add
+a lot of complexity to the simple class that we wrote. Fortunately there are a lot of
+machine learning libraries that provide these features, and work efficiently, so for
+real applications we would want to use one of those libraries (we'll explore these next).
+
+## Batching
+
+Right now, we did our training as:
+
+* Loop over the $T$ pairs $({\bf x}^k, {\bf y}^k)$ for $k = 1, \ldots, T$
+
+ * Propagate $({\bf x}^k, {\bf y}^k)$ through the network
+ * Compute the corrections $\partial \mathcal{L}/\partial {\bf A}$, $\partial \mathcal{L}/\partial {\bf B}$
+ * Update the matrices:
+
+ $${\bf A} \leftarrow {\bf A} - \eta \frac{\partial \mathcal{L}}{\partial {\bf A}}$$
+
+ $${\bf B} \leftarrow {\bf B} - \eta \frac{\partial \mathcal{L}}{\partial {\bf B}}$$
+
+In this manner, each training pair sees slightly different
+matrices ${\bf A}$ and ${\bf B}$, as each previous pair
+updates it immediately.
+
+We could instead divide our training set into $N$ batches,
+each with $\tau = T/N$ training pairs and do our update as:
+
+* Loop over $N$ batches
+
+ * Loop over the $\tau$ pairs $({\bf x}^k, {\bf y}^k)$ for $k = 1, \ldots, \tau$ in the current batch
+
+ * Propagate $({\bf x}^k, {\bf y}^k)$ through the network
+ * Compute the gradients $\partial \mathcal{L}/\partial {\bf A}^k$, $\partial \mathcal{L}/\partial {\bf B}^k$ from the current pair
+
+ * Accumulate the gradients:
+
+ $$\frac{\partial \mathcal{L}}{\partial {\bf A}} = \frac{\partial \mathcal{L}}{\partial {\bf A}} + \frac{\partial \mathcal{L}}{\partial {\bf A}^k}$$
+
+ $$\frac{\partial \mathcal{L}}{\partial {\bf B}} = \frac{\partial \mathcal{L}}{\partial {\bf B}} + \frac{\partial \mathcal{L}}{\partial {\bf B}^k}$$
+
+ * Apply a single update to the matrices for this batch:
+
+ $${\bf A} \leftarrow {\bf A} - \frac{\eta}{\tau} \frac{\partial \mathcal{L}}{\partial {\bf A}}$$
+
+ $${\bf B} \leftarrow {\bf B} - \frac{\eta}{\tau} \frac{\partial \mathcal{L}}{\partial {\bf B}}$$
+
+```{note}
+We normalize the accumulated gradients by the batch size, $\tau$, which means that
+we are applying the average gradient over the batch.
+```
+
+The advantage of this is that the $\tau$ trainings in a batch
+can all be done in parallel now, spread across many CPU cores
+or GPU cores. This greatly accelerates the training time.
+
+
+## Different activation or cost functions
+
+We used a simple cost function: the sum of the square of the errors. This is analogous to the $L_2$ norm we discussed previously. But there are a lot of other cost functions
+we could explore. Changing the cost function will require
+us to recompute our derivatives.
+
+Likewise, there are a wide number of activation functions,
+some of which are not differentiable. The choice of activation
+function can depend on what type of data you are using. You
+might also want to use a different activation function
+on each layer. Again, this would require us to redo
+our derivatives.
+
+
+## Use a different minimization technique
+
+We only explored gradient descent. But there are improvements
+to this (like momentum that we mentioned previously) as well
+as alternate minimization techniques we could use (some of
+which don't need the gradient at all).
+
+
+## Different types of layers / connections
+
+We only considered a dense network: every node on one
+layer was connected to every node on the adjacent layer.
+But there are alternatives.
+
+For example, a [convolutional neural network](https://en.wikipedia.org/wiki/Convolutional_neural_network) performs a convolution on a layer with some kernel. This
+helps identifying features.
+
+## More hidden layers
+
+There is no restriction on the number of hidden layers we
+can use. Each additional hidden layer means an additional
+matrix is added to our network. For our code, we'd simply need to backpropagate
+the error to each hidden layer and compute the update to
+the new matrix.
+
+## Auto-differentiation libraries
+
+At some point, with all of these options, doing all of the
+differentiation / chain-rule by hand becomes burdensome and
+prone to errors. For this reason, libraries often use
+automatic differentiation libraries, like [JAX](https://jax.readthedocs.io/en/latest/) which can take
+the derivatives of our python functions themselves.
\ No newline at end of file
diff --git a/content/11-machine-learning/nn_fig.png b/content/11-machine-learning/nn_fig.png
new file mode 100644
index 00000000..6c9dea83
Binary files /dev/null and b/content/11-machine-learning/nn_fig.png differ
diff --git a/content/11-machine-learning/nn_fig.py b/content/11-machine-learning/nn_fig.py
new file mode 100644
index 00000000..97e5cb4a
--- /dev/null
+++ b/content/11-machine-learning/nn_fig.py
@@ -0,0 +1,180 @@
+import random
+
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+class Neuron(object):
+ def __init__(self, x, y, R=0.35):
+ self.x = x
+ self.y = y
+ self.R = R
+
+ def draw(self, color="C0", label=None):
+ theta = np.linspace(0, 2*np.pi, 180)
+ xc = self.x + self.R*np.cos(theta)
+ yc = self.y + self.R*np.sin(theta)
+
+ plt.fill(xc, yc, color=color, alpha=0.75)
+
+ if label is not None:
+ plt.text(self.x, self.y, label, color="k",
+ horizontalalignment="center", verticalalignment="center")
+
+
+class Layer(object):
+ def __init__(self, x, num_neurons=3, dy=1.0):
+ self.x = x
+ self.dy = dy
+ self.num_neurons = num_neurons
+ self.neurons = []
+
+ for i in range(self.num_neurons):
+ y = -i*self.dy
+ self.neurons.append(Neuron(self.x, y))
+
+ def draw(self, color="C1", label=None, top_label=None):
+ # compute the bounding box
+ ys = [q.y for q in self.neurons]
+
+ ymin = min(ys) - self.neurons[0].R
+ ymax = max(ys) + self.neurons[0].R
+
+ xmin = self.neurons[0].x - self.neurons[0].R
+ xmax = self.neurons[0].x + self.neurons[0].R
+
+ dx = xmax - xmin
+ xmin -= 0.25*dx
+ xmax += 0.25*dx
+ ymin -= 0.25*dx
+ ymax += 0.25*dx
+
+ plt.fill([xmin, xmin, xmax, xmax, xmin],
+ [ymin, ymax, ymax, ymin, ymin],
+ color=color, zorder=-100, alpha=0.5, edgecolor="none")
+
+ for i, n in enumerate(self.neurons):
+ n.draw(label="{}".format(i))
+
+ if label is not None:
+ plt.text(self.x, ymin-0.5*dx, label,
+ horizontalalignment="center", color="k")
+
+ if top_label is not None:
+ plt.text(self.x, ymax+0.25*dx, top_label,
+ horizontalalignment="center", color="k")
+
+class NeuralNet(object):
+
+ def __init__(self, dx=2.0, nlayers=2, neurons_in=3, neurons_out=2):
+ self.nlayers = nlayers
+
+ self.layers = []
+ for i in range(self.nlayers):
+ if i == 0:
+ neurons = neurons_in
+ elif i == nlayers-1:
+ neurons = neurons_out
+ else:
+ neurons = int(1.5*neurons_in)
+
+ self.layers.append(Layer(i*dx, num_neurons=neurons, dy=1.5))
+
+ def draw(self):
+ for i, l in enumerate(self.layers):
+ if i == 0:
+ label = "input\nlayer {}".format(i+1)
+ top_label = r"${\bf x}$"
+ elif i == len(self.layers)-1:
+ label = "output\nlayer {}".format(i+1)
+ if len(self.layers) == 3:
+ top_label = r"${\bf z} = g({\bf A}\tilde{\bf z})$"
+ else:
+ top_label = r"${\bf z} = g({\bf A}{\bf x})$"
+ else:
+ label = "hidden\nlayer {}".format(i+1)
+ top_label = r"$\tilde{\bf z} = g({\bf B x})$"
+
+ l.draw(label=label, top_label=top_label)
+
+ colors = ["0.5", "C1", "C2", "C3", "C4", "C5", "C6"]
+
+ # now connect
+ for i in range(0, len(self.layers)-1):
+ for j, n in enumerate(self.layers[i].neurons):
+ x0 = n.x
+ y0 = n.y
+ R0 = n.R
+
+ c = random.choice(colors)
+
+ for q in self.layers[i+1].neurons:
+ xt = q.x
+ yt = q.y
+ Rt = q.R
+
+ # figure out the angle
+ theta = np.arctan2(yt-y0, xt-x0)
+ L = np.sqrt((xt - x0)**2 + (yt - y0)**2) - Rt - R0
+
+ plt.arrow(x0+R0*np.cos(theta), y0+R0*np.sin(theta),
+ L*np.cos(theta), L*np.sin(theta),
+ head_width=0.075, zorder=-50,
+ color=c,
+ length_includes_head=True)
+
+ xc = 0.5*(self.layers[i].x + self.layers[i+1].x)
+ yc = self.layers[i].neurons[0].y + 0.25*(self.layers[i].neurons[0].y - self.layers[i].neurons[1].y)
+ if i == 0 and self.nlayers > 2:
+ label = r"${\bf B}$"
+ else:
+ label = r"${\bf A}$"
+
+ plt.text(xc, yc, label, color="r")
+
+ # draw inputs and outputs
+ ls = self.layers[0]
+ xf = ls.neurons[0].x - 1.5*ls.neurons[0].R
+ L = 2.0*ls.neurons[0].R
+
+ for n in ls.neurons:
+ plt.arrow(xf - L, n.y, L, 0, head_width=0.075, color="k")
+
+ ls = self.layers[-1]
+ xf = ls.neurons[0].x + 1.25*ls.neurons[0].R
+ L = 2.0*ls.neurons[0].R
+
+ for n in ls.neurons:
+ plt.arrow(xf, n.y, L, 0, head_width=0.075, color="k")
+
+
+# simple version
+nn = NeuralNet()
+nn.draw()
+
+plt.axis("off")
+ax = plt.gca()
+ax.set_aspect("equal", "datalim")
+
+f = plt.gcf()
+f.set_size_inches(5, 5)
+
+plt.tight_layout()
+plt.savefig("nn_fig.png", dpi=150, bbox_inches="tight")
+
+# hidden layer
+plt.clf()
+
+nn = NeuralNet(nlayers=3)
+nn.draw()
+
+plt.axis("off")
+ax = plt.gca()
+ax.set_aspect("equal", "datalim")
+
+f = plt.gcf()
+f.set_size_inches(7, 5.5)
+plt.tight_layout()
+plt.savefig("nn_fig_hidden.png", dpi=150)
+
+# add some labels
diff --git a/content/11-machine-learning/nn_fig2.png b/content/11-machine-learning/nn_fig2.png
new file mode 100644
index 00000000..a010b5d6
Binary files /dev/null and b/content/11-machine-learning/nn_fig2.png differ
diff --git a/content/11-machine-learning/nn_fig_hidden.png b/content/11-machine-learning/nn_fig_hidden.png
new file mode 100644
index 00000000..9b329fec
Binary files /dev/null and b/content/11-machine-learning/nn_fig_hidden.png differ
diff --git a/content/11-machine-learning/sigmoid.png b/content/11-machine-learning/sigmoid.png
new file mode 100644
index 00000000..1f11dd14
Binary files /dev/null and b/content/11-machine-learning/sigmoid.png differ
diff --git a/content/11-machine-learning/sigmoid.py b/content/11-machine-learning/sigmoid.py
new file mode 100644
index 00000000..58eb1f96
--- /dev/null
+++ b/content/11-machine-learning/sigmoid.py
@@ -0,0 +1,14 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def sigmoid(p):
+ return 1 / (1 + np.exp(-p))
+
+p = np.linspace(-10, 10, 200)
+
+fig, ax = plt.subplots()
+
+ax.plot(p, sigmoid(p))
+
+fig.savefig("sigmoid.png")
diff --git a/content/12-extensions/extensions-example.md b/content/12-extensions/extensions-example.md
new file mode 100644
index 00000000..f4e89cf2
--- /dev/null
+++ b/content/12-extensions/extensions-example.md
@@ -0,0 +1,305 @@
+# Example Extension
+
+Let's rewrite our Mandelbrot generator using different languages
+to see how the performance differs.
+
+Recall the Mandelbrot set is defined as the set such that $z_{k+1} = z_k^2 + c$
+remains bounded, defined as $|z_{k+1}| \le 2$, where $c$ is a complex number,
+$c = x + iy$, in the complex plane, and $z_0 = 0$ is the starting condition.
+
+We'll do a fixed number of iterations, and store the iteration for which $|z_{k+1}|$
+first becomes larger than 2.
+
+
+
+## NumPy array syntax
+
+Here's an example of a python implementation using NumPy array operations:
+
+
+```{literalinclude} ../../examples/extensions/python/mandel.py
+:language: python
+```
+
+We can test this as:
+
+```{literalinclude} ../../examples/extensions/python/test_mandel.py
+:language: python
+```
+
+Here's the resulting image
+
+```{image} test.png
+:align: center
+```
+
+## Python with explicit loops
+
+Here's a version where the loops are explicitly written out in python:
+
+```{literalinclude} ../../examples/extensions/python-slow/mandel.py
+:language: python
+```
+
+This can be run using the same driver as the numpy vectorized version.
+
+
+## Numba version
+
+We can install Numba simply by doing:
+
+```bash
+pip install numba
+```
+
+To get a Numba optimized version of the python with explicit loops we just add:
+
+```python
+from numba import njit
+```
+
+and then right before the function definition:
+
+```python
+@njit()
+```
+
+Here's the full code:
+
+```{literalinclude} ../../examples/extensions/numba/mandel.py
+:language: python
+```
+
+Again, this uses the same driver.
+
+
+```{note}
+We didn't need to do anything special to *compile* the numba code.
+This is done for us when we first encounter it.
+```
+
+```{tip}
+We run it twice in our driver, since the first call will have the overhead
+of the JIT compilation.
+```
+
+```{literalinclude} ../../examples/extensions/numba/test_mandel.py
+:language: python
+```
+
+````{tip}
+We can get even better performance if we let numba do things in parallel, with
+
+```
+@njit(parallel=True)
+```
+````
+
+## Cython version
+
+We can install Cython by doing
+
+```bash
+pip install Cython
+```
+
+For Cython, we mainly need to specify the datatypes of the different
+variables. We use the extension `.pyx` for a cython file.
+
+Here's the full code:
+
+```{literalinclude} ../../examples/extensions/cython/mandel.pyx
+:language: python
+```
+
+To build it, we can use a `setup.py` file:
+
+```{literalinclude} ../../examples/extensions/cython/setup.py
+:language: python
+```
+
+and make the extension as:
+
+```bash
+python setup.py build_ext --inplace
+```
+
+```{note}
+This build process will likely change in the near future, as
+the community is transitioning away from `setup.py`, but the
+docs don't seem to be fully up to date on the new way to build.
+```
+
+````{tip}
+To help understand where the slow parts of your Cython code are, you
+can do
+```
+cythonize -a mandel.pyx
+```
+This will produce an HTML file with the parts of the code that interact
+with python highlighted. (Make sure there are no `.c` files hanging around).
+These highlighted lines are places you should try to optimize.
+
+For our example, if we do
+```
+np.abs(z[i,j])
+```
+instead of
+```
+abs(z[i,j])
+```
+we get a dramatic slowdown!
+
+Thanks to Eric Johnson for pointing this out.
+
+````
+
+
+## Fortran implementation
+
+If we want to write the code in Fortran, we need to [compile it into a shared
+object library](https://numpy.org/doc/stable/f2py/usage.html) that python can import.
+This is where `f2py` comes in---it is part of the numpy project, so you probably
+already have it installed.
+
+```{note}
+Support for this is in transition at the moment. The old official way to do this
+was to use `distutils`, but this is removed in python 3.12.
+
+Instead, we will use the [meson build system](https://mesonbuild.com/).
+```
+
+We need to install `meson` and `ninja`:
+
+```bash
+pip install meson ninja
+```
+
+Here's our Fortran implementation for the Mandelbrot generator:
+
+```{literalinclude} ../../examples/extensions/f2py/mandel.f90
+:language: fortran
+```
+
+To build the extension, we can do:
+
+```bash
+f2py -c mandel.f90 -m mandel_f2py
+```
+
+````{note}
+If the `f2py` command-line tool is not available, you can try running it as a module instead:
+```bash
+python -m numpy.f2py -c mandel.f90 -m mandel_f2py
+```
+````
+
+````{tip}
+The build doesn't show you the compilation commands used to make the library. But if you look
+at the output, it will say something like:
+```
+The Meson build system
+Version: 1.4.0
+Source dir: /tmp/tmp0sbl86zt
+Build dir: /tmp/tmp0sbl86zt/bbdir
+Build type: native build
+Project name: mandel_f2py
+```
+If you then look in the build directory, there will be a file `compile_commands.json` that
+lists the commands that meson + f2py use to compile the extension. In our case,
+it is using the optimization flag `-O3`.
+````
+
+This will create a library (on my machine, it is called `mandel_f2py.cpython-312-x86_64-linux-gnu.so`)
+which we can import as `import mandel_f2py`.
+
+Here's a driver:
+
+```{literalinclude} ../../examples/extensions/f2py/test_mandel.py
+:language: python
+```
+
+```{note}
+ Even though our Fortran subroutine takes the array `m` as an
+ argument, since it is marked as `intent(out)`, the python module
+ will use this as the return value.
+```
+
+```{note}
+The numpy array returned to python will have Fortran ordering (column-major) instead
+of the usual row-major ordering (take a look at the ``.flags`` attributes).
+```
+
+## C++ / pybind11 implementation
+
+pybind11 allows you to construct a numpy-compatible array in C++
+and return it. There are different constructors for this---here
+we use on that allows us to specify the shape and stride.
+
+We can install pybind11 via pip:
+
+```bash
+pip install pybind11
+```
+
+Inside of the `mandelbrot()` function, we need temporary
+two-dimensional arrays to store $z$ and $c$. With C++23
+we could use `std::mdspan` to give us nice multidimensional
+indexing. For now, we need to do something different.
+Our first attempt will use `std::vector>>`.
+
+Here's the implementation of our Mandelbrot generator:
+
+
+```{literalinclude} ../../examples/extensions/pybind11/mandel.cpp
+:language: c++
+```
+
+We build the shared library as:
+
+```bash
+g++ -DNDEBUG -O3 -Wall -Wextra -shared -std=c++17 -fPIC $(python3 -m pybind11 --includes) mandel.cpp -o mandel$(python3-config --extension-suffix)
+```
+
+Our driver is essentially the same as the Fortran one.
+
+
+```{literalinclude} ../../examples/extensions/pybind11/test_mandel.py
+:language: python
+```
+
+A slightly more complicated version that creates a contiguous `Array` class
+that can be indexed with `()` runs faster. That code is here:
+
+```{literalinclude} ../../examples/extensions/pybind11/contiguous/mandel.cpp
+:language: C++
+```
+
+It uses the same driver.
+
+
+## Timings
+
+On my machine, (python 3.13, numpy 2.2.5, Cython 3.0.12, GCC 15, numba
+0.61.2, pybind11 2.13.6) here are some timings (average of 3 runs):
+
+
+| technique | timings (s) |
+| -------------------------------------------- | -------------- |
+| python / numpy | 0.218 |
+| python w/ explicit loops | 17.4 |
+| Numba(*) | 0.0922 |
+| Cython | 0.0866 |
+| Fortran + f2py | 0.0860 |
+| C++ + pybind11 (vector of vector) | 0.120 |
+| C++ + pybind11 (contiguous `Array`) | 0.108 |
+
+
+(*) timing for the second invocation, which excludes JIT overhead.
+
+
+We see that Numba, Cython, and Fortran are all quite close in
+performance, with C++ contiguous only slightly slower, and all of
+these much faster than the other implementations. It may be possible
+to further optimize the numpy version, but it is so much easier to
+just use Numba in this situation.
diff --git a/content/12-extensions/extensions-overview.md b/content/12-extensions/extensions-overview.md
new file mode 100644
index 00000000..376b510e
--- /dev/null
+++ b/content/12-extensions/extensions-overview.md
@@ -0,0 +1,77 @@
+# Extensions
+
+Python code can be slow, so we sometimes turn to _extension modules_ to
+get performance in critical parts of our algorithms There are a number
+of ways to write extension modules in python -- these can be in
+another language like C or Fortran or use a library that converts
+python into compiled code (with some restrictions) like Cython or
+Numba.
+
+We'll look at some examples of these and talk about their strengths
+and weaknesses.
+
+
+## Methods
+
+* C++
+
+ * [pybind11](https://github.com/pybind/pybind11) : this is a
+ header-only library that allows you to call C++ functions directly
+ from python.
+
+ A related library is [nanobind](https://github.com/wjakob/nanobind),
+ which has similar syntax but may be more efficient.
+
+* C
+
+ * [C-API](https://docs.python.org/3/c-api/index.html) : the
+ standard python interpreter (cpython) is written in C, so it is
+ natural that we can write C code to interact with our python code.
+ This is the python C-API. Since NumPy is also written in C, we
+ can work with NumPy arrays in C code as well.
+
+ This will give us the performance of C compiled code, but the
+ downside is that we lose a lot of what makes python great. We
+ need to pass data into C as pointers and cast them into types that
+ represent the arrays we use. This means writing a lot of
+ boilerplate code just to deal with some simple operations.
+
+ This underlies many of the techniques that we'll see here.
+
+ ```{note}
+ These days, there are better methods for most applications,
+ and you should probably not use the C-API directly.
+ ```
+
+ * [ctypes](https://docs.python.org/3/library/ctypes.html) : this
+ is a module that allows you to call functions in shared libraries.
+ This is part of standard python.
+
+ With ctypes, you don't need to modify your C code -- you just need to
+ define an interface to the C function in python. However, the calling
+ mechanism can be slow.
+
+ There is support for NumPy through numpy.ctypeslib.
+
+* Fortran
+
+ * [f2py](https://numpy.org/doc/stable/f2py/) : this is part of
+ NumPy. It allows for easy calling of Fortran from python.
+
+ You essentially just need to add some comments to your Fortran
+ code to allow f2py to build an interface. f2py understands the
+ different orderings of indices between C and Fortran arrays.
+
+* python
+
+ * [Cython](https://cython.org/) : this is a superset of python that can convert python into
+ compiled C code.
+
+ The advantage here is that the code looks like python, with some
+ declarations of the variable types with `cdef`. Performance can be
+ really great when you need to explicitly write out loops over
+ NumPy array indices.
+
+ * [Numba](https://numba.pydata.org/) : this is a just-in-time
+ compiler. It just requires a simple decorator and then it will
+ compile a python function the first time it is encountered.
diff --git a/content/12-extensions/test.png b/content/12-extensions/test.png
new file mode 100644
index 00000000..fcf011ff
Binary files /dev/null and b/content/12-extensions/test.png differ
diff --git a/content/CHANGES b/content/CHANGES
new file mode 100644
index 00000000..66dc0cf4
--- /dev/null
+++ b/content/CHANGES
@@ -0,0 +1,8 @@
+-- make this S/U grading
+
+-- perhaps have BB "grade" participation on the forum?
+
+
+debugging:
+
+memray: https://github.com/bloomberg/memray
diff --git a/content/Introduction.md b/content/Introduction.md
new file mode 100644
index 00000000..b6b5091c
--- /dev/null
+++ b/content/Introduction.md
@@ -0,0 +1,55 @@
+# PHY 546: Python for Scientific Computing
+
+
+
+(from https://xkcd.com)
+
+## Why python?
+
+* Python is a very high-level language
+
+ * it provides many complex data-structures (lists, dictionaries, ...)
+
+ * your code is shorter than a comparable algorithm in a compiled language
+
+* Many powerful libraries to perform complex tasks
+
+ * Parse structured inputs files
+
+ * send e-mail
+
+ * interact with the operating system
+
+ * make plots
+
+ * make GUIs
+
+ * do scientific computations
+
+ * ...
+
+* Python makes it easy to prototype new tools
+
+* Python is cross-platform and Free
+
+## Language Features
+
+Some of the language features are:
+
+* Dynamical typing
+
+* Object-oriented foundation
+
+* Extensible (easy to call Fortran, C/C++, ...)
+
+* Automatic memory management (garbage collection)
+
+* Ease of readability (whitespace matters)
+
+
+## Scientific python
+
+Perhaps most importantly, and why we are here:
+
+> Python has been widely adopted in the scientific community.
+
diff --git a/lectures/NOTES b/content/NOTES
similarity index 100%
rename from lectures/NOTES
rename to content/NOTES
diff --git a/content/_config.yml b/content/_config.yml
new file mode 100644
index 00000000..2c0567e0
--- /dev/null
+++ b/content/_config.yml
@@ -0,0 +1,57 @@
+# Book settings
+# Learn more at https://jupyterbook.org/customize/config.html
+
+title: "PHY 546: Python for Scientific Computing"
+author: Michael Zingale
+#logo: logo.png
+copyright: "2022"
+
+# Force re-execution of notebooks on each build.
+# See https://jupyterbook.org/content/execute.html
+execute:
+ execute_notebooks: force
+ allow_errors: true
+
+# Define the name of the latex output file for PDF builds
+latex:
+ latex_documents:
+ targetname: book.tex
+
+# Information about where the book exists on the web
+repository:
+ url: https://github.com/sbu-python-class/python-science
+ path_to_book: content # Optional path to your book, relative to the repository root
+ branch: main # Which branch of the repository should be used when creating links (optional)
+
+# Add GitHub buttons to your book
+# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository
+html:
+ use_issues_button: true
+ use_repository_button: true
+ extra_footer: |
+
+
+sphinx:
+ config:
+ html_show_copyright: false
+ nbsphinx_timeout: 300
+ nb_execution_timeout: 300
+
+launch_buttons:
+ binderhub_url: "https://mybinder.org"
+ colab_url: "https://colab.research.google.com"
+
+parse:
+ extensions:
+ - myst_parser
+ - sphinx_design
+
+ myst_enable_extensions:
+ # don't forget to list any other extensions you want enabled,
+ # including those that are enabled by default!
+ - amsmath
+ - dollarmath
+ - linkify
+ - colon_fence
diff --git a/content/_static/myfile.css b/content/_static/myfile.css
new file mode 100644
index 00000000..aeeec947
--- /dev/null
+++ b/content/_static/myfile.css
@@ -0,0 +1,10 @@
+@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
+
+body {
+ font-family: "Open Sans", sans-serif;
+}
+
+.heading-style, h1, h2, h3, h4, h5, h6 {
+ font-family: "Open Sans", sans-serif;
+}
diff --git a/content/_toc.yml b/content/_toc.yml
new file mode 100644
index 00000000..6a8039a8
--- /dev/null
+++ b/content/_toc.yml
@@ -0,0 +1,97 @@
+format: jb-book
+root: Introduction
+parts:
+ - caption: Getting Started
+ chapters:
+ - file: 01-python/installing
+ - file: 01-python/using
+ - file: 01-python/w1-jupyter.ipynb
+
+ - caption: Python Basics
+ chapters:
+ - file: 01-python/basics
+ sections:
+ - file: 01-python/w1-python-datatypes.ipynb
+ - file: 01-python/w2-python-advanced-datatypes.ipynb
+ - file: 01-python/w2-python-control-flow.ipynb
+ - file: 01-python/w2-python-exercises.ipynb
+ - file: 01-python/functions-classes
+ sections:
+ - file: 01-python/w3-python-functions.ipynb
+ - file: 01-python/w3-python-exercises.ipynb
+ - file: 01-python/w4-python-classes.ipynb
+ - file: 01-python/w4-python-modules.ipynb
+ - file: 01-python/w4-python-exercises.ipynb
+ - file: 01-python/misc
+ sections:
+ - file: 01-python/w3-python-exceptions.ipynb
+ - file: 01-python/python-io.ipynb
+ - file: 01-python/w5-python-more-examples.ipynb
+
+ - caption: Arrays
+ chapters:
+ - file: 02-numpy/numpy
+ sections:
+ - file: 02-numpy/numpy-basics.ipynb
+ - file: 02-numpy/numpy-advanced.ipynb
+ - file: 02-numpy/numpy-exercises.ipynb
+
+ - caption: Scientific Python
+ chapters:
+ - file: 04-matplotlib/matplotlib
+ sections:
+ - file: 04-matplotlib/matplotlib-basics.ipynb
+ - file: 04-matplotlib/matplotlib-exercises.ipynb
+ - file: 05-scipy/scipy
+ sections:
+ - file: 05-scipy/scipy-basics.ipynb
+ - file: 05-scipy/scipy-exercises.ipynb
+ - file: 05-scipy/scipy-basics-2.ipynb
+ - file: 05-scipy/scipy-exercises-2.ipynb
+ - file: 06-sympy/sympy
+ sections:
+ - file: 06-sympy/sympy-examples.ipynb
+ - file: 06-sympy/sympy-exercises.ipynb
+
+ - caption: Machine Learning
+ chapters:
+ - file: 11-machine-learning/neural-net-basics
+ sections:
+ - file: 11-machine-learning/gradient-descent
+ - file: 11-machine-learning/neural-net-derivation
+ - file: 11-machine-learning/neural-net-hidden
+ sections:
+ - file: 11-machine-learning/neural-net-improvements
+ - file: 11-machine-learning/machine-learning-libraries
+ sections:
+ - file: 11-machine-learning/keras-mnist
+ - file: 11-machine-learning/keras-clustering
+
+ - caption: Python packaging and applications
+ chapters:
+ - file: 09-packages/python-modules
+ - file: 09-packages/python-arguments
+ - file: 09-packages/python-more-modules
+ - file: 09-packages/python-packages
+ - file: 09-packages/python-tools
+
+ - caption: Git and Github
+ chapters:
+ - file: git/version-control
+ - file: git/git
+ - file: git/github
+ - file: git/pull-requests
+
+ - caption: Unit tests
+ chapters:
+ - file: 10-testing/testing
+ - file: 10-testing/pytest
+ sections:
+ - file: 10-testing/more-pytest
+ - file: 10-testing/real-world-example
+
+ - caption: Extensions
+ chapters:
+ - file: 12-extensions/extensions-overview
+ - file: 12-extensions/extensions-example
+
diff --git a/content/git/distributed_version_control.png b/content/git/distributed_version_control.png
new file mode 100644
index 00000000..347c19ad
Binary files /dev/null and b/content/git/distributed_version_control.png differ
diff --git a/content/git/git-branches.md b/content/git/git-branches.md
new file mode 100644
index 00000000..c404318a
--- /dev/null
+++ b/content/git/git-branches.md
@@ -0,0 +1,374 @@
+# Git Branches
+
+When we develop as a team, we often use *branches* to organize our
+changes. Here we walk through an example of branches.
+
+To get more practice, we'll start a new project and initialize it.
+
+```{figure} https://imgs.xkcd.com/comics/git.png
+ :width: 75%
+ :align: center
+ :alt: xkcd comic on git
+
+ from XKCD
+```
+
+1. Let's repeat the setup we did before...
+
+ ```bash
+ mkdir project2
+ cd project2
+ echo "a second git project" > README
+ git init
+ ```
+
+2. Now let's add our `README` to git and commit:
+
+ ```bash
+ git add README
+ git commit
+ ```
+
+ (Remember to enter a log and save...)
+
+3. Let's create and add another file.
+
+ We write a simple shell script. Open a new file, called `myscript`, e.g., with nano:
+
+ ```bash
+ nano myscript
+ ```
+
+ and copy-paste the following content into it:
+
+ ```bash
+ ls -l > script.out
+ ```
+
+ be sure to end with a new line.
+
+ Now, this script is not that fancy and it needs to be run as:
+
+ ```bash
+ bash ./myscript
+ ```
+
+ when you do this, you should see the output `script.out` created.
+
+ Now let's tell git that we want it to track this:
+
+ ```bash
+ git add myscript
+ git commit
+ ```
+
+ Be sure to add a useful message.
+
+4. Ignoring things.
+
+ Let's look at the status of our project:
+
+ ```bash
+ git status
+ ```
+
+ You'll see something like:
+
+ ```
+ On branch main
+ Untracked files:
+ (use "git add ..." to include in what will be committed)
+
+ script.out
+
+ nothing added to commit but untracked files present (use "git add" to track)
+ ```
+
+ It is telling us that it is not keeping track of `script.out`.
+ But we don't want it to—that is the output from running out
+ script, and generally we don't keep the output of our codes in
+ version control.
+
+ So we'd like to tell git to ignore that file. The way to do this is to
+ create a `.gitignore` file:
+
+ ```bash
+ nano .gitignore
+ ```
+
+ and add the following:
+
+ ```
+ *.out
+ ```
+
+ now if you do `git status`, that file will not appear, but `.gitignore` does!
+
+ Be sure to add `.gitignore` to git by doing `git add` followed
+ by `git commit`.
+
+
+
+## A Feature Branch
+
+Now let's imagine that our project is mature and we don't want to break it as
+we test out some new ideas. This is where *branches* come into play.
+
+Let's create a new branch called `feature` that we can work on without
+disturbing our code in ``main``.
+
+```bash
+git checkout -b feature
+```
+
+This creates a new branch called `feature` that is initially identical to `main`.
+
+You can tell what branch you are on by doing:
+
+```bash
+git branch
+```
+
+and we see:
+
+```
+* feature
+ main
+```
+
+The `*` indicates which branch we are currently on.
+
+What about the log?
+
+```bash
+git log
+```
+
+we see:
+
+```
+commit 69eb3bf482bd78c3bf63e890f52b9aac33d5ee2a (HEAD -> feature, main)
+Author: Michael Zingale
+Date: Tue Feb 1 10:21:19 2022 -0500
+
+ add an ignore file
+
+commit 9b0ae624393bd28f26f37d633d9692be3c2929f0
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:53 2022 -0500
+
+ add my first script
+
+commit 9625926dd4bc26e04d37988ffceaa7eba64a76da
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:02 2022 -0500
+
+ start of our new project
+```
+
+Notice that the most recent commit line shows that both `feature` and `main`
+are at the same hash, and it also calls that commit `HEAD`.
+`HEAD` is the most recent change on the branch.
+
+
+Now let's make a change.
+
+Let's put a "Hello, World" code in our repo! Create a file called
+`hello.cpp` and add the following:
+
+```c++
+#include
+
+int main() {
+
+ std::cout << "Hello, World!" << std::endl;
+
+}
+```
+
+Let's add it to git control:
+
+```bash
+git add hello.cpp
+git commit
+```
+
+Now look at the log:
+
+```
+Author: Michael Zingale
+Date: Tue Feb 1 10:23:51 2022 -0500
+
+ add hello world
+
+commit 69eb3bf482bd78c3bf63e890f52b9aac33d5ee2a (main)
+Author: Michael Zingale
+Date: Tue Feb 1 10:21:19 2022 -0500
+
+ add an ignore file
+
+commit 9b0ae624393bd28f26f37d633d9692be3c2929f0
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:53 2022 -0500
+
+ add my first script
+
+commit 9625926dd4bc26e04d37988ffceaa7eba64a76da
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:02 2022 -0500
+
+ start of our new project
+```
+
+Now it is clear that `main` is still on the last commit but
+`feature` is on the latest (`HEAD`) commit.
+
+
+Recall that we can compile our `hello.cpp` via:
+
+```bash
+g++ -o hello hello.cpp
+```
+
+```{tip}
+We don't want the executable `hello` to be under git control, so
+add it to your `.gitignore` and commit that change.
+```
+
+
+## Switching Branches
+
+Let's go back to `main`. The `checkout` command does this for us:
+
+```bash
+git checkout main
+```
+
+Now notice that if you do `ls`, you don't see `hello.cpp`! That
+file is in your `feature` branch, and under git control, and git
+knows it is not on `main` so when you switch to main, it does not
+appear.
+
+Let's add an `authors.txt` file to our project, just containing your name.
+
+```{admonition} Try it...
+create an `authors.txt` and add it to git control.
+```
+
+Note that this is on `main`. If you switch to `feature` you won't see it:
+
+```bash
+git checkout feature
+```
+
+````{tip}
+Just like we can use ``cd -`` to switch to the previous directory we were on,
+we can use
+
+```bash
+git checkout -
+```
+to switch back to the previous branch we were on -- in this case, `main`
+````
+
+Switch back to ``main``.
+
+
+## Diff
+
+Let's look at the differences between our branches. Since we're on
+`main`, we can ask git what the difference between our current code
+and the code in `feature` is via:
+
+```bash
+git diff feature
+```
+
+As you use git more and more, you'll see that `diff` is very handy.
+
+
+## Merging
+
+Now we're happy with the changes we made on `feature` and we want to
+incorporate them into `main`—this is called *merging*, we
+accomplish this by doing
+
+```bash
+git merge feature
+```
+
+This is a special type of commit, and your editor will pop up with a
+merge commit already entered. Just save this, and it will be logged.
+
+
+## Going back in time...
+
+If we look at our project history so far:
+
+```bash
+git log
+```
+
+We see something like this (again, your hashes will be different)
+
+```
+commit 42596acdd432e1dbdc4f8abd668dffa30c707473 (HEAD -> main)
+Merge: c8904ec bb38a3d
+Author: Michael Zingale
+Date: Tue Feb 1 10:54:51 2022 -0500
+
+ Merge branch 'feature' into main
+
+commit c8904ec0bd8ac1bc3449ec79ade971ee9902c14e
+Author: Michael Zingale
+Date: Tue Feb 1 10:31:03 2022 -0500
+
+ add authors
+
+commit bb38a3d1f3f4f2971ced93a1f203c52c276f37a5 (feature)
+Author: Michael Zingale
+Date: Tue Feb 1 10:27:09 2022 -0500
+
+ don't track executable
+
+commit 22e1d58cee38021da961516b24dde689d3b8a66e
+Author: Michael Zingale
+Date: Tue Feb 1 10:23:51 2022 -0500
+
+ add hello world
+
+commit 69eb3bf482bd78c3bf63e890f52b9aac33d5ee2a
+Author: Michael Zingale
+Date: Tue Feb 1 10:21:19 2022 -0500
+
+ add an ignore file
+
+commit 9b0ae624393bd28f26f37d633d9692be3c2929f0
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:53 2022 -0500
+
+ add my first script
+
+commit 9625926dd4bc26e04d37988ffceaa7eba64a76da
+Author: Michael Zingale
+Date: Tue Feb 1 10:18:02 2022 -0500
+
+ start of our new project
+```
+
+Imagine that our current code is not working, but we remember that it
+was before we did our branching and added the `hello.cpp`. Looking
+at the log or the graph shows that that change came in with the commit
+`22e1d58cee38021da961516b24dde689d3b8a66e`. We can checkout the
+state of the code before that commit by using the hash from the
+previous commit:
+
+```bash
+git checkout 69eb3bf482bd78c3bf63e890f52b9aac33d5ee2a
+```
+
+Note that you don't need to type out the entire hash—you only need the starting bits,
+as long as it is unique.
+
+This command puts you in a detached branch, but you could make it a named branch by using
+`git checkout -b name`.
diff --git a/content/git/git-remotes.md b/content/git/git-remotes.md
new file mode 100644
index 00000000..6b7971a2
--- /dev/null
+++ b/content/git/git-remotes.md
@@ -0,0 +1,110 @@
+# Git Remotes
+
+## Bare Repository
+
+So far, we've just been using our git repo for ourselves.
+
+Let's look back at the figure illustrating ways we can share with distributed version control:
+
+```{image} distributed_version_control.png
+:align: center
+```
+
+When multiple developers are working on the same code together, it is
+convenient to have a central repository that everyone can communicate
+with.
+
+We use a special `bare` repository for this purpose. A bare repo
+has all of the metadata for the project, but we don't work directly in
+it. This way we avoid the risk of having unsaved changed in the repo
+that other people are using to synchronize with.
+
+Let's create a bare repo from our `project2` project. From your home directory
+(assuming that project2 is `~/project2/`, we do:
+
+```bash
+git clone --bare project2
+```
+
+Now we see a new directory `project2.git`.
+
+
+
+## A First Example of Collaboration
+
+Let's pretend we are a different user. Let's make a directory for our
+pretend user and clone our project:
+
+```bash
+cd ~
+mkdir newuser
+cd newuser
+git clone ~/project2.git
+```
+
+The `clone` command make a new git repo for our user called `project2/`
+
+If we do a `git log` in it, we'll see the whole history we had from
+our earlier work.
+
+Now, this repo knows where it was cloned from, through a concept
+called *remotes*. A remote is a repo (usually a bare repo) that we
+communicate with the share our changes (a *push*) of get changes from
+other users (a *pull*). We can see our remote by doing:
+
+```bash
+git remote -v
+```
+
+We'll see something like:
+
+```
+origin /home/campus.stonybrook.edu/mzingale/project2.git (fetch)
+origin /home/campus.stonybrook.edu/mzingale/project2.git (push)
+```
+
+Now's let's make a change
+
+```{admonition} try it...
+add the new user's name to `authors.txt` and commit the change.
+```
+
+Now we can share our changes with our remote—the bare repo by doing a *push*.
+
+```bash
+git push
+```
+
+This pushes our changes back to the bare repo. Now go back to our original repo:
+
+```bash
+cd
+cd project2
+```
+
+We need to add a remote to this original repo (if you do `git
+remote` it will show nothing). We'll add a remote called `origin`.
+
+```bash
+git remote add origin ~/project2.git
+```
+
+Now, we can communicate with the bare repo and get the changes that
+the other user made by doing a *pull*:
+
+```bash
+git pull origin main
+```
+
+To make our life easier, we can tell git what remote branch to track:
+
+```bash
+git branch --set-upstream-to=origin/main main
+```
+
+then we can do just
+
+```bash
+git pull
+```
+
diff --git a/content/git/git.md b/content/git/git.md
new file mode 100644
index 00000000..f47bed76
--- /dev/null
+++ b/content/git/git.md
@@ -0,0 +1,222 @@
+# A Git Walkthrough
+
+We'll do a walkthrough on git.
+
+```{note}
+An alternate walkthrough is provided by the [Software
+Carpentry](https://software-carpentry.org/) lesson [_Version Control
+with Git_](https://swcarpentry.github.io/git-novice/index.html) and it
+is highly suggested that you work through that on your own.
+```
+
+There are a few ways in which we can use git. We'll start by assuming
+that we are the only developer on a project and learn the basics and
+then we'll see how to share what we've done locally and remotely using
+GitHub.
+
+```{important}
+You should create a [GitHub account](https://github.com). Pick a
+username that is professional and meaningful.
+```
+
+Let's start by setting up our git environment:
+
+```bash
+git config --global user.name "name"
+git config --global user.email "email"
+git config --global core.editor "nano -w"
+```
+
+Replace `name` with your name and `email` with your email. This sets `nano`
+as our default editor, but you can choose something else that you are comfortable
+with (see https://swcarpentry.github.io/git-novice/02-setup.html).
+
+This information will be stored in a file called ``.gitconfig`` in your home directory.
+
+
+Our goal here is to create a project (we'll call the directory
+`project/`) and have git keep track of the files and changes to our
+project.
+
+1. First create a project directory with some basic content:
+
+ ```bash
+ mkdir project
+ cd project
+ echo "this is the start of my awesome new project" > README
+ ```
+
+2. Now let's tell git that we want to track this directory.
+
+ ```bash
+ git init
+ ```
+
+ If you do `ls` it will look like nothing has changed, but this
+ command created a `.git/` sub-directory in our project, which you
+ can see by doing:
+
+ ```bash
+ ls -a
+ ```
+
+3. At this point, we haven't told git about any of our files. To tell git
+ to track the file `README` we do:
+
+ ```bash
+ git add README
+ git commit README
+ ```
+
+ ```{note}
+ When you `commit`, and editor window will pop up asking you to
+ make a commit message. This is where you describe the change so
+ "future you" or someone else can understand why the change was
+ made.
+ ```
+
+ The editor will be whatever your default is.
+ We can now ask git the state of our project with
+
+ ```bash
+ git status
+ ```
+
+ You should see something like:
+
+ ```
+ On branch main
+ nothing to commit, working tree clean
+ ```
+
+ We can also see our log message:
+
+ ```bash
+ git log
+ ```
+
+ The output will look like:
+
+ ```
+ commit 2001a0e996110926a576dcb5fc13fc8022864d0b (HEAD -> main)
+ Author: Michael Zingale
+ Date: Sun Jan 30 13:11:24 2022 -0500
+
+ my first change
+ ```
+
+ But should show your name, and the long string of numbers of
+ letters after `commit` on the first line will be different. We'll call
+ the string the `hash`. More on that later...
+
+4. Now let's modify the file
+
+ Open the file with nano and add a second line of text:
+
+ ```bash
+ nano README
+ ```
+
+ Here's my file:
+
+ ```bash
+ cat README
+ ```
+
+ ```
+ this is the start of my awesome new project
+ this is now under version control!
+ ```
+
+ What does git think about our changes?
+
+ ```bash
+ git status
+ ```
+
+ you should see something like:
+
+ ```
+ On branch main
+ Changes not staged for commit:
+ (use "git add ..." to update what will be committed)
+ (use "git checkout -- ..." to discard changes in working directory)
+
+ modified: README
+
+ no changes added to commit (use "git add" and/or "git commit -a")
+ ```
+
+ This is telling you that you have local changes but you haven't yet told git to care about them.
+
+ Let's `add` the changes:
+
+ ```bash
+ git add README
+ ```
+
+ and now `git status` will show something like:
+
+ ```
+ On branch main
+ Changes to be committed:
+ (use "git reset HEAD ..." to unstage)
+
+ modified: README
+ ```
+
+ ```{admonition} What is `add` really doing?
+
+ Git has a concept call the *staging area*. When we ``add`` a
+ file, git puts the changes into the staging area. We can add
+ multiple changes via separate ``git add`` invocations, and git
+ will accumulate these in the staging area.
+
+ Once we do `git commit`, git will record the all of the
+ changes that are staged into a "commit".
+ ```
+
+ To have git track these changes, we can now just do:
+
+ ```bash
+ git commit
+ ```
+
+ Notice that we didn't specify the file here -- all the changes that
+ were staged were part of that commit.
+
+ If we now do `git log`, we'll see that there is a second commit
+ in our project, and it has a different unique hash:
+
+ ```
+ commit 78b6925752e8388dddb3d65b6355bfeeb87b87a7 (HEAD -> main)
+ Author: Michael Zingale
+ Date: Sun Jan 30 14:23:09 2022 -0500
+
+ make some modifications
+
+ commit 2001a0e996110926a576dcb5fc13fc8022864d0b
+ Author: Michael Zingale
+ Date: Sun Jan 30 13:11:24 2022 -0500
+
+ my first change
+ ```
+
+This repo now captures the state of our project. Next we'll see how to use branches to
+help our development process.
+
+
+Summary
+=======
+
+We learned:
+
+* `git init`
+
+* `git add`
+
+* `git commit`
+
+* `git status`
+
+* `git log`
diff --git a/content/git/github-clone.png b/content/git/github-clone.png
new file mode 100644
index 00000000..b67b29a2
Binary files /dev/null and b/content/git/github-clone.png differ
diff --git a/content/git/github-copy-ssh.png b/content/git/github-copy-ssh.png
new file mode 100644
index 00000000..7ef27d8e
Binary files /dev/null and b/content/git/github-copy-ssh.png differ
diff --git a/content/git/github-create.png b/content/git/github-create.png
new file mode 100644
index 00000000..9be0a783
Binary files /dev/null and b/content/git/github-create.png differ
diff --git a/content/git/github-fork.png b/content/git/github-fork.png
new file mode 100644
index 00000000..119be9ff
Binary files /dev/null and b/content/git/github-fork.png differ
diff --git a/content/git/github-new.png b/content/git/github-new.png
new file mode 100644
index 00000000..9f0712c3
Binary files /dev/null and b/content/git/github-new.png differ
diff --git a/content/git/github-pr.png b/content/git/github-pr.png
new file mode 100644
index 00000000..1541900e
Binary files /dev/null and b/content/git/github-pr.png differ
diff --git a/content/git/github-pr2.png b/content/git/github-pr2.png
new file mode 100644
index 00000000..ce62d3d5
Binary files /dev/null and b/content/git/github-pr2.png differ
diff --git a/content/git/github-workflow.odg b/content/git/github-workflow.odg
new file mode 100644
index 00000000..120f9608
Binary files /dev/null and b/content/git/github-workflow.odg differ
diff --git a/content/git/github-workflow.pdf b/content/git/github-workflow.pdf
new file mode 100644
index 00000000..fdae4f22
Binary files /dev/null and b/content/git/github-workflow.pdf differ
diff --git a/content/git/github-workflow.png b/content/git/github-workflow.png
new file mode 100644
index 00000000..e2c7001d
Binary files /dev/null and b/content/git/github-workflow.png differ
diff --git a/content/git/github.md b/content/git/github.md
new file mode 100644
index 00000000..527d157e
--- /dev/null
+++ b/content/git/github.md
@@ -0,0 +1,194 @@
+# github
+
+Github provides a web-based way to interact with git repositories. At
+its heart it hosts a bare repo that we can push-pull to/from, but it
+also provides features to make it easier for users to request their
+changes be incorporated.
+
+
+## Creating a repository on github
+
+Let's start by creating a new git repository using github's web interface. Start
+on your github home page and click on the "+" icon and select "New repository":
+
+```{image} github-new.png
+:align: center
+```
+
+Now we give the repository a name. Let's use our initials, followed
+by `_class_repo`, so for me, it will be `mz_class_repo`.
+
+Make sure that it defaults the repo to be public, which means anyone on the internet
+can see the contents—that's what we want.
+
+Finally, check the box to add a `README` file—this means that our repository will
+not be empty initially.
+
+```{image} github-create.png
+:align: center
+```
+
+Our project is now found at: ``https://github.com/ [username]/ [reponame]``,
+where *username* is your Github username and *reponame* is the name of
+the repository you just created.
+
+
+## SSH interlude
+
+Github works best is we communicate via [secure
+shell](https://en.wikipedia.org/wiki/Secure_Shell) or *SSH*.
+
+There is some nice documentation describing key pairs in the Software
+Carpentry [Create an SSH key pair](https://swcarpentry.github.io/git-novice/07-github.html#ssh-background-and-setup)
+section.
+
+Here's how we will set things up:
+
+1. A the bash prompt generate a new key pair:
+
+ ```bash
+ ssh-keygen -t ed25519
+ ```
+
+ The `-t` option picks a secure encryption method.
+
+ It will ask you for a passpharse—just hit "Enter" to keep it
+ empty (if other people had access to your account, the you would
+ want to pick a passphrase).
+
+ If you do
+
+ ```bash
+ ls -l ~/.ssh
+ ```
+
+ you'll see 2 files: `id_ed25519` and `id_ed25519.pub` this is
+ the private and public key for encryption.
+
+ ```{caution}
+ Never share your private key (`id_ed25519`) with anyone.
+
+ Our public key (`id_ed25519.pub`) is meant to be public, and
+ we can give it to places we want to communicate with, like github
+ ```
+
+2. Go to you Github profile SSH keys settings: https://github.com/settings/keys
+
+ Click on the *New SSH key* button and:
+
+ * give a *title* which is descriptive of the machine you are using, like
+ ``MathLab``
+
+ * copy and paste the contents of `id_ed25519.pub` into the *key*
+ text box. You can see the contents by doing:
+
+ ```bash
+ cat ~/.ssh/id_ed25519.pub
+ ```
+
+ * Click on ``Add SSH key``
+
+3. Test things out:
+
+ ```bash
+ ssh -T git@github.com
+ ```
+
+ It will ask you if we want to save the *fingerprint*—say "yes", and then
+ it should report:
+
+ ```
+ Hi zingale! You've successfully authenticated, but GitHub does
+ not provide shell access.
+ ```
+
+That means everything is working.
+
+
+## Working remotely
+
+Now we can git clone this repo. From the github project page, click on the
+*code* button.
+
+```{image} github-clone.png
+:align: center
+```
+
+Copy the string in the text box there and then on your command line clone
+the repo as:
+
+```bash
+git clone git@github.com:zingale/mz_class_repo.git
+```
+
+(replacing my repo and username with your own).
+
+Now we can go into our repo and look around.
+
+```bash
+cd mz_class_repo
+ls -al
+```
+
+Notice that there is a
+`.git/` directory. Also look at the remotes:
+
+```bash
+git remote -v
+```
+
+```
+origin git@github.com:zingale/mz_class_repo.git (fetch)
+origin git@github.com:zingale/mz_class_repo.git (push)
+```
+
+This is just like the example or remotes we did previously, except now
+github is acting as our remote.
+
+This means that we call push to github and pull from there.
+
+Let's add a `hello.py`:
+
+```python
+#!/usr/bin/env python
+
+def main():
+ print("hello, world")
+
+if __name__ == "__main__":
+ main()
+```
+
+```bash
+git add hello.py
+git commit
+git push
+```
+
+Notice that the `git push` pushes to our remote: github. If you refresh
+your browser page, you'll see that our file now appears on github.
+
+As a single user, this will allow you to develop from any computer
+and keep the code base in sync across all of them.
+
+If the project has multiple developers, this can be where all of the
+developers sync up their projects.
+
+
+### `README.md` is special
+
+The web interface that github provides to our repo has a number of features.
+
+First, the `README.md` file is always displayed on the main project
+page. This is where you can put descriptions of what your project is,
+how people can contribute, even share the status of testing and
+documentation builds (we'll talk about those later in class).
+
+This file is in github-flavored [Markdown
+format](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)
+(that's what the `.md` extension signifies). Markdown allows you to
+do basic formatting.
+
+Here's an example of what you can do in a `README.md` from one of my
+projects: https://github.com/pynucastro/pynucastro
+
diff --git a/content/git/pull-requests.md b/content/git/pull-requests.md
new file mode 100644
index 00000000..21ddcbe1
--- /dev/null
+++ b/content/git/pull-requests.md
@@ -0,0 +1,130 @@
+# Pull requests
+
+Github allows you to give permissions to users to contribute to a
+repository (read, write, or admin access). But the best type of workflow
+is one where users don't push directly to the git repo. Instead it is based
+around pulls.
+
+How do we contribute to a project that we don't own?
+
+Here's a github *organization* for our class: https://github.com/sbu-python-class
+
+and here's a simple repo in this organization: https://github.com/sbu-python-class/test_repo
+
+```{note}
+An organization is meant to be used by a collection of developers who
+can all have different access permissions. It provides tools for
+managing who can do different things to the repos under its control.
+```
+
+Let's clone this repo:
+
+```bash
+git clone git@github.com:sbu-python-class/test_repo.git
+cd test_repo
+```
+
+Now, let's each try to add a file of the form *username.txt* containing
+your full name. Ex:
+
+```bash
+echo Michael Zingale > zingale.txt
+git add zingale.txt
+git commit
+```
+
+Now try to push it to the repo we clone:
+
+```bash
+git push
+```
+
+what happened?
+
+The issue is that you don't have *write* permission to that repo,
+since I own it. So you are denied access.
+
+This is okay. The workflow that github emphasizes is one based around
+*pulls* not *pushes*, so let's see how we do that.
+
+First, we need to *fork* the repo -- this creates a clone under our
+control that we can do with as we please. Click on the "fork" button.
+
+```{image} github-fork.png
+:align: center
+```
+
+It may ask you where you want the fork to live—you want it to live
+under your profile / username.
+
+This will bring you to a new github page, displaying the fork, with a
+URL that should look something like: ``https://github.com/zingale/test_repo``
+
+Now click on the *code* button and copy the SSH location.
+
+```{image} github-copy-ssh.png
+:align: center
+```
+
+We want to add this fork as a new remote:
+
+```bash
+git remote add myfork git@github.com:zingale/test_repo.git
+```
+
+(again, make sure you replace that with the link to your repo).
+
+Now you can do:
+
+```bash
+git push myfork
+```
+
+If you reload your github page, you should see your change there.
+
+Now we can do all *pull-request*. Select "pull requests"
+
+```{image} github-pr.png
+:align: center
+```
+
+Then click on the "New pull request" button, and you'll see something like:
+
+```{image} github-pr2.png
+:align: center
+```
+
+This is showing that you are asking to merge the changes in your fork into the
+class ``test_repo`` repository.
+
+Click on *create pull request*, type in a comment about what this does, and then click
+on the *create pull request* button again.
+
+Now it is out of your hands.
+
+The owner of the class repo (me) will get a notification that you want
+to incorporate your changes into the class repo, and I can merge them
+via the github web tools.
+
+
+The overall workflow that we did: fork, push to our fork, issue a PR, looks like:
+
+```{image} github-workflow.png
+:align: center
+:width: 80%
+```
+
+
+
+## Our class notes github
+
+Let's take a tour of our class notes on github: https://github.com/sbu-python-class/python-science
+
+There are a lot of other features that github provides that we can use to make our life easier, including:
+
+* github actions : automating some workflows (like testing) on our code
+
+* github pages : building and hosting web pages for our project
+
+
+
diff --git a/content/git/version-control.md b/content/git/version-control.md
new file mode 100644
index 00000000..ecc99778
--- /dev/null
+++ b/content/git/version-control.md
@@ -0,0 +1,153 @@
+# Version Control
+
+````{note}
+To follow along, you will need to install `git` on your computer.
+You can follow the instructions from the [Software Carpentry lessons](https://carpentries.github.io/workshop-template/install_instructions/#git). In particular, for:
+
+* Windows: use [git for Windows](https://gitforwindows.org/)
+
+* Mac: in a teminal, do:
+
+ ```
+ git --version
+ ```
+
+ If it is not already installed, it will prompt you for installation.
+
+* Linux: it is probably already installed, but otherwise, use your
+ package manager.
+````
+
+## Why use version control?
+
+When we develop code, we are going to be making lots of changes over
+time. And you will find yourself in the following situations:
+
+* *You swear that the code worked perfectly 6 months ago* but today it doesn't and
+ you can't figure out what changed.
+
+* *The code looks different than you remembered and you don't know why it changed*.
+
+* *Your research group is all working on the same code* and you need to sync up with
+ everyone's changes and make sure that no one breaks the code.
+
+This is what [version control](https://en.wikipedia.org/wiki/Version_control) does for us.
+
+
+```{note}
+Version control systems keep track of the history of changes to
+source code and allow multiple developers to all work on the same code
+base.
+```
+
+In particular:
+
+* Logs tell you what changes have been made to each file over time.
+
+* You can request the source as it was at any time in the past.
+
+* Multiple developers can all work on the same source code and share and synchronize changes.
+
+ * Changes by different developers to the same file are merged.
+
+ * If two developers changed the same part of a file, version control
+ provides mechanisms to resolve conflicts.
+
+* You can make a branch and work on new features without breaking the
+ current working code, and when you are ready, merge those changes
+ into the main version.
+
+
+```{note}
+Even for a single developer, version control is a great asset.
+
+Common task: you notice your code is giving different answers than you've
+seen in the past.
+
+With version control, you can checkout an old copy when you know it
+was working, and ask for the difference with the current code.
+```
+
+```{tip}
+Version control is not just for source code. You can use it for
+writing papers in LaTeX, course notes, etc.
+
+These course notes are in git, hosted on github here:
+https://github.com/zingale/computational_astrophysics
+```
+
+## Centralized vs. distributed version control
+
+Broadly speaking, there are two different types of version control:
+centralized and distributed. We'll call the collection of code under
+version control the *repository*.
+
+### Centralized version control
+
+Examples: [CVS](https://en.wikipedia.org/wiki/Concurrent_Versions_System) , [subversion](https://en.wikipedia.org/wiki/Apache_Subversion)
+
+* A server holds the master copy of the source, stores the history, changes
+
+* Each user communicates with the server:
+
+ * "checkout" source
+ * "commit" changes back to the source
+ * request the log (history) of a file from the server
+ * "diff" your local version with the version on the server
+
+This is the older style of version control, and not widely used for new projects.
+
+
+### Distributed version control
+
+Examples: [git](https://en.wikipedia.org/wiki/Git), [mercurial](https://en.wikipedia.org/wiki/Mercurial)
+
+* Everyone has a full-fledged repository
+
+* Commits, history, diff, logs, etc. are all local operations
+
+* You can clone another person's repo and they can pull your changes
+ back to their version
+
+* Each copy is a backup of the whole history of the project
+
+* Easy to "fork" -- just clone and go.
+
+```{tip}
+Any version control system is better than no version control.
+
+Git is the most popular right now, so we'll focus on that.
+```
+
+Consider the figure below:
+
+```{image} distributed_version_control.png
+:align: center
+```
+
+We see:
+
+* You in the upper left box interacting with your local computer.
+ You can add changes to your repo and query the log, etc. all just
+ using your own machine.
+
+* Your colleague in the upper right. They can also interact with
+ their own computer, using their own version of the repo.
+
+ Now, imagine that they make a change that you want. You can *pull*
+ their version of the code into your repo, getting all of their
+ changes.
+
+* Suppose you both want to efficiently share work as a group. So you
+ setup a group server and you can both synchronize your repo with
+ that server by doing *pull* and *push*.
+
+ This server provides a mechanism for everyone in the group to stay
+ in sync.
+
+* Imagine now that you have an external collaborator who doesn't have
+ access to your server. You can let them *pull* from your copy of
+ the repo, without giving them permission to push changes back.
+
+ They can then interact with their copy locally.
+
diff --git a/docs/.nojekyll b/docs/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/www/LICENSE.txt b/docs/LICENSE.txt
similarity index 100%
rename from www/LICENSE.txt
rename to docs/LICENSE.txt
diff --git a/www/assets/css/font-awesome.min.css b/docs/assets/css/font-awesome.min.css
similarity index 100%
rename from www/assets/css/font-awesome.min.css
rename to docs/assets/css/font-awesome.min.css
diff --git a/www/assets/css/ie9.css b/docs/assets/css/ie9.css
similarity index 100%
rename from www/assets/css/ie9.css
rename to docs/assets/css/ie9.css
diff --git a/www/assets/css/images/0101_banner.png b/docs/assets/css/images/0101_banner.png
similarity index 100%
rename from www/assets/css/images/0101_banner.png
rename to docs/assets/css/images/0101_banner.png
diff --git a/www/assets/css/images/overlay.png b/docs/assets/css/images/overlay.png
similarity index 100%
rename from www/assets/css/images/overlay.png
rename to docs/assets/css/images/overlay.png
diff --git a/www/assets/css/images/rt_1.5e7_clean2.png b/docs/assets/css/images/rt_1.5e7_clean2.png
similarity index 100%
rename from www/assets/css/images/rt_1.5e7_clean2.png
rename to docs/assets/css/images/rt_1.5e7_clean2.png
diff --git a/www/assets/css/main.css b/docs/assets/css/main.css
similarity index 100%
rename from www/assets/css/main.css
rename to docs/assets/css/main.css
diff --git a/www/assets/fonts/FontAwesome.otf b/docs/assets/fonts/FontAwesome.otf
similarity index 100%
rename from www/assets/fonts/FontAwesome.otf
rename to docs/assets/fonts/FontAwesome.otf
diff --git a/www/assets/fonts/fontawesome-webfont.eot b/docs/assets/fonts/fontawesome-webfont.eot
similarity index 100%
rename from www/assets/fonts/fontawesome-webfont.eot
rename to docs/assets/fonts/fontawesome-webfont.eot
diff --git a/www/assets/fonts/fontawesome-webfont.svg b/docs/assets/fonts/fontawesome-webfont.svg
similarity index 100%
rename from www/assets/fonts/fontawesome-webfont.svg
rename to docs/assets/fonts/fontawesome-webfont.svg
diff --git a/www/assets/fonts/fontawesome-webfont.ttf b/docs/assets/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from www/assets/fonts/fontawesome-webfont.ttf
rename to docs/assets/fonts/fontawesome-webfont.ttf
diff --git a/www/assets/fonts/fontawesome-webfont.woff b/docs/assets/fonts/fontawesome-webfont.woff
similarity index 100%
rename from www/assets/fonts/fontawesome-webfont.woff
rename to docs/assets/fonts/fontawesome-webfont.woff
diff --git a/www/assets/fonts/fontawesome-webfont.woff2 b/docs/assets/fonts/fontawesome-webfont.woff2
similarity index 100%
rename from www/assets/fonts/fontawesome-webfont.woff2
rename to docs/assets/fonts/fontawesome-webfont.woff2
diff --git a/www/assets/js/ie/PIE.htc b/docs/assets/js/ie/PIE.htc
similarity index 100%
rename from www/assets/js/ie/PIE.htc
rename to docs/assets/js/ie/PIE.htc
diff --git a/www/assets/js/ie/html5shiv.js b/docs/assets/js/ie/html5shiv.js
similarity index 100%
rename from www/assets/js/ie/html5shiv.js
rename to docs/assets/js/ie/html5shiv.js
diff --git a/www/assets/js/ie/respond.min.js b/docs/assets/js/ie/respond.min.js
similarity index 100%
rename from www/assets/js/ie/respond.min.js
rename to docs/assets/js/ie/respond.min.js
diff --git a/www/assets/js/jquery.min.js b/docs/assets/js/jquery.min.js
similarity index 100%
rename from www/assets/js/jquery.min.js
rename to docs/assets/js/jquery.min.js
diff --git a/www/assets/js/main.js b/docs/assets/js/main.js
similarity index 100%
rename from www/assets/js/main.js
rename to docs/assets/js/main.js
diff --git a/www/assets/js/skel.min.js b/docs/assets/js/skel.min.js
similarity index 100%
rename from www/assets/js/skel.min.js
rename to docs/assets/js/skel.min.js
diff --git a/www/assets/js/util.js b/docs/assets/js/util.js
similarity index 100%
rename from www/assets/js/util.js
rename to docs/assets/js/util.js
diff --git a/www/images/python.png b/docs/images/python.png
similarity index 100%
rename from www/images/python.png
rename to docs/images/python.png
diff --git a/www/images/rt_1.5e7_clean2.png b/docs/images/rt_1.5e7_clean2.png
similarity index 100%
rename from www/images/rt_1.5e7_clean2.png
rename to docs/images/rt_1.5e7_clean2.png
diff --git a/www/index.html b/docs/index.html
similarity index 97%
rename from www/index.html
rename to docs/index.html
index 67d60bf6..f1ab84b5 100644
--- a/www/index.html
+++ b/docs/index.html
@@ -71,7 +71,7 @@
Failed to display Jupyter Widget of type interactive.
\n",
- "
\n",
- " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
- " that the widgets JavaScript is still loading. If this message persists, it\n",
- " likely means that the widgets JavaScript library is either not installed or\n",
- " not enabled. See the Jupyter\n",
- " Widgets Documentation for setup instructions.\n",
- "
\n",
- "
\n",
- " If you're reading this message in another frontend (for example, a static\n",
- " rendering on GitHub or NBViewer),\n",
- " it may mean that your frontend doesn't currently support widgets.\n",
- "
Failed to display Jupyter Widget of type interactive.
\n",
- "
\n",
- " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
- " that the widgets JavaScript is still loading. If this message persists, it\n",
- " likely means that the widgets JavaScript library is either not installed or\n",
- " not enabled. See the Jupyter\n",
- " Widgets Documentation for setup instructions.\n",
- "
\n",
- "
\n",
- " If you're reading this message in another frontend (for example, a static\n",
- " rendering on GitHub or NBViewer),\n",
- " it may mean that your frontend doesn't currently support widgets.\n",
- "
\n"
- ],
- "text/plain": [
- "interactive(children=(IntSlider(value=5050, description='N', max=10000, min=100, step=10), FloatSlider(value=2.7, description='sigma', max=5.0, min=0.5), Output()), _dom_classes=('widget-interact',))"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# interactive histogram\n",
- "def hist(N, sigma):\n",
- " r = sigma*np.random.randn(N)\n",
- " plt.hist(r, normed=True, bins=20)\n",
- "\n",
- " x = np.linspace(-5,5,200)\n",
- " \n",
- " plt.plot(x, np.exp(-x**2/(2*sigma**2))/(sigma*np.sqrt(2.0*np.pi)),\n",
- " c=\"r\", lw=2)\n",
- " plt.xlabel(\"x\")\n",
- " plt.show()\n",
- " \n",
- "interact(hist, N=(100,10000,10), sigma=(0.5,5,0.1))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Final fun"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "if you want to make things look hand-drawn in the style of xkcd, rerun these examples after doing\n",
- "plt.xkcd()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "plt.xkcd()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
-}
diff --git a/lectures/04-matplotlib/matplotlib-exercises.ipynb b/lectures/04-matplotlib/matplotlib-exercises.ipynb
deleted file mode 100644
index 0da45a86..00000000
--- a/lectures/04-matplotlib/matplotlib-exercises.ipynb
+++ /dev/null
@@ -1,309 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# matplotlib exercises"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q1: planetary positions\n",
- "\n",
- "The distances of the planets from the Sun (technically, their semi-major axes) are:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.array([0.39, 0.72, 1.00, 1.52, 5.20, 9.54, 19.22, 30.06, 39.48])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "These are in units where the Earth-Sun distance is 1 (astronomical units).\n",
- "\n",
- "The corresponding periods of their orbits (how long they take to go once around the Sun) are, in years"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "P = np.array([0.24, 0.62, 1.00, 1.88, 11.86, 29.46, 84.01, 164.8, 248.09])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Finally, the names of the planets corresponding to these are:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "names = [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \n",
- " \"Uranus\", \"Neptune\", \"Pluto\"]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "(technically, pluto isn't a planet anymore, but we still love it :)\n",
- "\n",
- " * Plot as points, the periods vs. distances for each planet on a log-log plot.\n",
- "\n",
- " * Write the name of the planet next to the point for that planet on the plot"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q2: drawing a circle\n",
- "\n",
- "For an angle $\\theta$ in the range $\\theta \\in [0, 2\\pi]$, the polar equations of a circle of radius $R$ are:\n",
- "$$\n",
- "x = R\\cos(\\theta)\n",
- "$$\n",
- "$$ \n",
- "y = R\\sin(\\theta)\n",
- "$$\n",
- "\n",
- "We want to draw a circle. \n",
- "\n",
- " * Create an array to hold the theta values—the more we use, the smoother the circle will be\n",
- " * Create `x` and `y` arrays from `theta` for your choice of $R$\n",
- " * Plot `y` vs. `x`\n",
- " \n",
- "Now, look up the matplotlib `fill()` function, and draw a circle filled in with a solid color."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q3: Circles, circles, circles...\n",
- "\n",
- "Generalize your circle drawing commands to produce a function, \n",
- "```\n",
- "draw_circle(x0, y0, R, color)\n",
- "```\n",
- "that draws the circle. Here, `(x0, y0)` is the center of the circle, `R` is the radius, and `color` is the color of the circle. \n",
- "\n",
- "Now randomly draw 10 circles at different locations, with random radii, and random colors on the same plot."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q4: Climate\n",
- "\n",
- "Download the data file of global surface air temperature averages from here:\n",
- "https://raw.githubusercontent.com/sbu-python-summer/python-tutorial/master/day-4/nasa-giss.txt\n",
- "\n",
- "(this data comes from: https://data.giss.nasa.gov/gistemp/graphs/)\n",
- "\n",
- "There are 3 columns here: the year, the temperature change, and a smoothed representation of the temperature change. \n",
- "\n",
- " * Read in this data using `np.loadtxt()`. \n",
- " * Plot as a line the smoothed representation of the temperature changes. \n",
- " * Plot as points the temperature change (no smoothing). Color the points blue if they are < 0 and color them red if they are >= 0\n",
- " \n",
- "You might find the NumPy `where()` function useful."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q5: subplots\n",
- "\n",
- "matplotlib has a number of ways to create multiple axes in a figure -- look at `plt.subplot()` (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot)\n",
- "\n",
- "Create an `x` array using NumPy with a number of points, spanning from $[0, 2\\pi]$. \n",
- "\n",
- "Create 3 axes vertically, and do the following:\n",
- "\n",
- "* Define a new numpy array `f` initialized to a function of your choice.\n",
- "* Plot f in the top axes\n",
- "* Compute a numerical derivative of `f`,\n",
- " $$ f' = \\frac{f_{i+1} - f_i}{\\Delta x}$$\n",
- " and plot this in the middle axes\n",
- "* Do this again, this time on $f'$ to compute the second derivative and plot that in the bottom axes\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q6: frequent words plotting\n",
- "\n",
- "In this exercise, we will read the file with the transcription of _Star Trek TOS, Shore Leave_ and calculate the amount of time each word was found. We will then plot the 25 most frequent words and label the plot.\n",
- "\n",
- "### 6.1 Read the file and create the dictionaty {'word':count}\n",
- "\n",
- " * Open the `shore_leave.txt`\n",
- " * Create the dictionary of the form {'word':count}, where `count` shows the amount of times the word was found in the text. Remember to get rid of the punctuation (\".\" and \",\") and to ensure that all words are lowercase"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "f = open(\"shore_leave.txt\", \"r\")\n",
- "\n",
- "for line in f:\n",
- " pass"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2. Plot 25 most frequent words\n",
- "\n",
- "Plot a labelled bar chart of the most frequent 25 words with their frequencies."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# your code here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "## Q7: Mandelbrot set\n",
- "\n",
- "The mandelbrot set is defined such that $z_{k+1} = z_k^2 + c$\n",
- "remains bounded, which is usually taken as $|z_{k+1}| <= 2$\n",
- "where $c$ is a complex number and we start with $z_0 = 0$\n",
- "\n",
- "We want to consider a range of $c$, as complex numbers $c = x + iy$,\n",
- "where $-2 < x < 2$ and $-2 < y < 2$.\n",
- "\n",
- "For each $c$, identify its position on a Cartesian grid as $(x,y)$ and \n",
- "assign a value $N$ that is the number of iterations, $k$, required for $|z_{k+1}|$ to become greater than $2$.\n",
- "\n",
- "The plot of this function is called the Mandelbrot set.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/lectures/04-matplotlib/matplotlib-interactive-backend.ipynb b/lectures/04-matplotlib/matplotlib-interactive-backend.ipynb
deleted file mode 100644
index fdd873eb..00000000
--- a/lectures/04-matplotlib/matplotlib-interactive-backend.ipynb
+++ /dev/null
@@ -1,830 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "%matplotlib nbagg"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\n",
- "mpl.get_websocket_type = function() {\n",
- " if (typeof(WebSocket) !== 'undefined') {\n",
- " return WebSocket;\n",
- " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
- " return MozWebSocket;\n",
- " } else {\n",
- " alert('Your browser does not have WebSocket support.' +\n",
- " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
- " 'Firefox 4 and 5 are also supported but you ' +\n",
- " 'have to enable WebSockets in about:config.');\n",
- " };\n",
- "}\n",
- "\n",
- "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
- " this.id = figure_id;\n",
- "\n",
- " this.ws = websocket;\n",
- "\n",
- " this.supports_binary = (this.ws.binaryType != undefined);\n",
- "\n",
- " if (!this.supports_binary) {\n",
- " var warnings = document.getElementById(\"mpl-warnings\");\n",
- " if (warnings) {\n",
- " warnings.style.display = 'block';\n",
- " warnings.textContent = (\n",
- " \"This browser does not support binary websocket messages. \" +\n",
- " \"Performance may be slow.\");\n",
- " }\n",
- " }\n",
- "\n",
- " this.imageObj = new Image();\n",
- "\n",
- " this.context = undefined;\n",
- " this.message = undefined;\n",
- " this.canvas = undefined;\n",
- " this.rubberband_canvas = undefined;\n",
- " this.rubberband_context = undefined;\n",
- " this.format_dropdown = undefined;\n",
- "\n",
- " this.image_mode = 'full';\n",
- "\n",
- " this.root = $('');\n",
- " this._root_extra_style(this.root)\n",
- " this.root.attr('style', 'display: inline-block');\n",
- "\n",
- " $(parent_element).append(this.root);\n",
- "\n",
- " this._init_header(this);\n",
- " this._init_canvas(this);\n",
- " this._init_toolbar(this);\n",
- "\n",
- " var fig = this;\n",
- "\n",
- " this.waiting = false;\n",
- "\n",
- " this.ws.onopen = function () {\n",
- " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
- " fig.send_message(\"send_image_mode\", {});\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " fig.waiting = false;\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " this.ws.close();\n",
- " }\n",
- "\n",
- " this.ws.onmessage = this._make_on_message_function(this);\n",
- "\n",
- " this.ondownload = ondownload;\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._init_header = function() {\n",
- " var titlebar = $(\n",
- " '');\n",
- " var titletext = $(\n",
- " '');\n",
- " titlebar.append(titletext)\n",
- " this.root.append(titlebar);\n",
- " this.header = titletext[0];\n",
- "}\n",
- "\n",
- "\n",
- "\n",
- "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
- "\n",
- "}\n",
- "\n",
- "\n",
- "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
- "\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._init_canvas = function() {\n",
- " var fig = this;\n",
- "\n",
- " var canvas_div = $('');\n",
- "\n",
- " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
- "\n",
- " function canvas_keyboard_event(event) {\n",
- " return fig.key_event(event, event['data']);\n",
- " }\n",
- "\n",
- " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
- " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
- " this.canvas_div = canvas_div\n",
- " this._canvas_extra_style(canvas_div)\n",
- " this.root.append(canvas_div);\n",
- "\n",
- " var canvas = $('');\n",
- " canvas.addClass('mpl-canvas');\n",
- " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
- "\n",
- " this.canvas = canvas[0];\n",
- " this.context = canvas[0].getContext(\"2d\");\n",
- "\n",
- " var rubberband = $('');\n",
- " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
- "\n",
- " var pass_mouse_events = true;\n",
- "\n",
- " canvas_div.resizable({\n",
- " start: function(event, ui) {\n",
- " pass_mouse_events = false;\n",
- " },\n",
- " resize: function(event, ui) {\n",
- " fig.request_resize(ui.size.width, ui.size.height);\n",
- " },\n",
- " stop: function(event, ui) {\n",
- " pass_mouse_events = true;\n",
- " fig.request_resize(ui.size.width, ui.size.height);\n",
- " },\n",
- " });\n",
- "\n",
- " function mouse_event_fn(event) {\n",
- " if (pass_mouse_events)\n",
- " return fig.mouse_event(event, event['data']);\n",
- " }\n",
- "\n",
- " rubberband.mousedown('button_press', mouse_event_fn);\n",
- " rubberband.mouseup('button_release', mouse_event_fn);\n",
- " // Throttle sequential mouse events to 1 every 20ms.\n",
- " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
- "\n",
- " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
- " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
- "\n",
- " canvas_div.on(\"wheel\", function (event) {\n",
- " event = event.originalEvent;\n",
- " event['data'] = 'scroll'\n",
- " if (event.deltaY < 0) {\n",
- " event.step = 1;\n",
- " } else {\n",
- " event.step = -1;\n",
- " }\n",
- " mouse_event_fn(event);\n",
- " });\n",
- "\n",
- " canvas_div.append(canvas);\n",
- " canvas_div.append(rubberband);\n",
- "\n",
- " this.rubberband = rubberband;\n",
- " this.rubberband_canvas = rubberband[0];\n",
- " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
- " this.rubberband_context.strokeStyle = \"#000000\";\n",
- "\n",
- " this._resize_canvas = function(width, height) {\n",
- " // Keep the size of the canvas, canvas container, and rubber band\n",
- " // canvas in synch.\n",
- " canvas_div.css('width', width)\n",
- " canvas_div.css('height', height)\n",
- "\n",
- " canvas.attr('width', width);\n",
- " canvas.attr('height', height);\n",
- "\n",
- " rubberband.attr('width', width);\n",
- " rubberband.attr('height', height);\n",
- " }\n",
- "\n",
- " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
- " // upon first draw.\n",
- " this._resize_canvas(600, 600);\n",
- "\n",
- " // Disable right mouse context menu.\n",
- " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
- " return false;\n",
- " });\n",
- "\n",
- " function set_focus () {\n",
- " canvas.focus();\n",
- " canvas_div.focus();\n",
- " }\n",
- "\n",
- " window.setTimeout(set_focus, 100);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._init_toolbar = function() {\n",
- " var fig = this;\n",
- "\n",
- " var nav_element = $('')\n",
- " nav_element.attr('style', 'width: 100%');\n",
- " this.root.append(nav_element);\n",
- "\n",
- " // Define a callback function for later on.\n",
- " function toolbar_event(event) {\n",
- " return fig.toolbar_button_onclick(event['data']);\n",
- " }\n",
- " function toolbar_mouse_event(event) {\n",
- " return fig.toolbar_button_onmouseover(event['data']);\n",
- " }\n",
- "\n",
- " for(var toolbar_ind in mpl.toolbar_items) {\n",
- " var name = mpl.toolbar_items[toolbar_ind][0];\n",
- " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
- " var image = mpl.toolbar_items[toolbar_ind][2];\n",
- " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
- "\n",
- " if (!name) {\n",
- " // put a spacer in here.\n",
- " continue;\n",
- " }\n",
- " var button = $('');\n",
- " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
- " 'ui-button-icon-only');\n",
- " button.attr('role', 'button');\n",
- " button.attr('aria-disabled', 'false');\n",
- " button.click(method_name, toolbar_event);\n",
- " button.mouseover(tooltip, toolbar_mouse_event);\n",
- "\n",
- " var icon_img = $('');\n",
- " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
- " icon_img.addClass(image);\n",
- " icon_img.addClass('ui-corner-all');\n",
- "\n",
- " var tooltip_span = $('');\n",
- " tooltip_span.addClass('ui-button-text');\n",
- " tooltip_span.html(tooltip);\n",
- "\n",
- " button.append(icon_img);\n",
- " button.append(tooltip_span);\n",
- "\n",
- " nav_element.append(button);\n",
- " }\n",
- "\n",
- " var fmt_picker_span = $('');\n",
- "\n",
- " var fmt_picker = $('');\n",
- " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
- " fmt_picker_span.append(fmt_picker);\n",
- " nav_element.append(fmt_picker_span);\n",
- " this.format_dropdown = fmt_picker[0];\n",
- "\n",
- " for (var ind in mpl.extensions) {\n",
- " var fmt = mpl.extensions[ind];\n",
- " var option = $(\n",
- " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
- " fmt_picker.append(option)\n",
- " }\n",
- "\n",
- " // Add hover states to the ui-buttons\n",
- " $( \".ui-button\" ).hover(\n",
- " function() { $(this).addClass(\"ui-state-hover\");},\n",
- " function() { $(this).removeClass(\"ui-state-hover\");}\n",
- " );\n",
- "\n",
- " var status_bar = $('');\n",
- " nav_element.append(status_bar);\n",
- " this.message = status_bar[0];\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
- " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
- " // which will in turn request a refresh of the image.\n",
- " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.send_message = function(type, properties) {\n",
- " properties['type'] = type;\n",
- " properties['figure_id'] = this.id;\n",
- " this.ws.send(JSON.stringify(properties));\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.send_draw_message = function() {\n",
- " if (!this.waiting) {\n",
- " this.waiting = true;\n",
- " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
- " }\n",
- "}\n",
- "\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " var format_dropdown = fig.format_dropdown;\n",
- " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
- " fig.ondownload(fig, format);\n",
- "}\n",
- "\n",
- "\n",
- "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
- " var size = msg['size'];\n",
- " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
- " fig._resize_canvas(size[0], size[1]);\n",
- " fig.send_message(\"refresh\", {});\n",
- " };\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
- " var x0 = msg['x0'];\n",
- " var y0 = fig.canvas.height - msg['y0'];\n",
- " var x1 = msg['x1'];\n",
- " var y1 = fig.canvas.height - msg['y1'];\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 0, fig.canvas.width, fig.canvas.height);\n",
- "\n",
- " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
- " // Updates the figure title.\n",
- " fig.header.textContent = msg['label'];\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
- " var cursor = msg['cursor'];\n",
- " switch(cursor)\n",
- " {\n",
- " case 0:\n",
- " cursor = 'pointer';\n",
- " break;\n",
- " case 1:\n",
- " cursor = 'default';\n",
- " break;\n",
- " case 2:\n",
- " cursor = 'crosshair';\n",
- " break;\n",
- " case 3:\n",
- " cursor = 'move';\n",
- " break;\n",
- " }\n",
- " fig.rubberband_canvas.style.cursor = cursor;\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
- " fig.message.textContent = msg['message'];\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
- " // Request the server to send over a new figure.\n",
- " fig.send_draw_message();\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
- " fig.image_mode = msg['mode'];\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.updated_canvas_event = function() {\n",
- " // Called whenever the canvas gets updated.\n",
- " this.send_message(\"ack\", {});\n",
- "}\n",
- "\n",
- "// A function to construct a web socket function for onmessage handling.\n",
- "// Called in the figure constructor.\n",
- "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
- " return function socket_on_message(evt) {\n",
- " if (evt.data instanceof Blob) {\n",
- " /* FIXME: We get \"Resource interpreted as Image but\n",
- " * transferred with MIME type text/plain:\" errors on\n",
- " * Chrome. But how to set the MIME type? It doesn't seem\n",
- " * to be part of the websocket stream */\n",
- " evt.data.type = \"image/png\";\n",
- "\n",
- " /* Free the memory for the previous frames */\n",
- " if (fig.imageObj.src) {\n",
- " (window.URL || window.webkitURL).revokeObjectURL(\n",
- " fig.imageObj.src);\n",
- " }\n",
- "\n",
- " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
- " evt.data);\n",
- " fig.updated_canvas_event();\n",
- " return;\n",
- " }\n",
- " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
- " fig.imageObj.src = evt.data;\n",
- " fig.updated_canvas_event();\n",
- " return;\n",
- " }\n",
- "\n",
- " var msg = JSON.parse(evt.data);\n",
- " var msg_type = msg['type'];\n",
- "\n",
- " // Call the \"handle_{type}\" callback, which takes\n",
- " // the figure and JSON message as its only arguments.\n",
- " try {\n",
- " var callback = fig[\"handle_\" + msg_type];\n",
- " } catch (e) {\n",
- " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
- " return;\n",
- " }\n",
- "\n",
- " if (callback) {\n",
- " try {\n",
- " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
- " callback(fig, msg);\n",
- " } catch (e) {\n",
- " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
- " }\n",
- " }\n",
- " };\n",
- "}\n",
- "\n",
- "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
- "mpl.findpos = function(e) {\n",
- " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
- " var targ;\n",
- " if (!e)\n",
- " e = window.event;\n",
- " if (e.target)\n",
- " targ = e.target;\n",
- " else if (e.srcElement)\n",
- " targ = e.srcElement;\n",
- " if (targ.nodeType == 3) // defeat Safari bug\n",
- " targ = targ.parentNode;\n",
- "\n",
- " // jQuery normalizes the pageX and pageY\n",
- " // pageX,Y are the mouse positions relative to the document\n",
- " // offset() returns the position of the element relative to the document\n",
- " var x = e.pageX - $(targ).offset().left;\n",
- " var y = e.pageY - $(targ).offset().top;\n",
- "\n",
- " return {\"x\": x, \"y\": y};\n",
- "};\n",
- "\n",
- "mpl.figure.prototype.mouse_event = function(event, name) {\n",
- " var canvas_pos = mpl.findpos(event)\n",
- "\n",
- " if (name === 'button_press')\n",
- " {\n",
- " this.canvas.focus();\n",
- " this.canvas_div.focus();\n",
- " }\n",
- "\n",
- " var x = canvas_pos.x;\n",
- " var y = canvas_pos.y;\n",
- "\n",
- " this.send_message(name, {x: x, y: y, button: event.button,\n",
- " step: event.step});\n",
- "\n",
- " /* This prevents the web browser from automatically changing to\n",
- " * the text insertion cursor when the button is pressed. We want\n",
- " * to control all of the cursor setting manually through the\n",
- " * 'cursor' event from matplotlib */\n",
- " event.preventDefault();\n",
- " return false;\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
- " // Handle any extra behaviour associated with a key event\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.key_event = function(event, name) {\n",
- "\n",
- " // Prevent repeat events\n",
- " if (name == 'key_press')\n",
- " {\n",
- " if (event.which === this._key)\n",
- " return;\n",
- " else\n",
- " this._key = event.which;\n",
- " }\n",
- " if (name == 'key_release')\n",
- " this._key = null;\n",
- "\n",
- " var value = '';\n",
- " if (event.ctrlKey && event.which != 17)\n",
- " value += \"ctrl+\";\n",
- " if (event.altKey && event.which != 18)\n",
- " value += \"alt+\";\n",
- " if (event.shiftKey && event.which != 16)\n",
- " value += \"shift+\";\n",
- "\n",
- " value += 'k';\n",
- " value += event.which.toString();\n",
- "\n",
- " this._key_event_extra(event, name);\n",
- "\n",
- " this.send_message(name, {key: value});\n",
- " return false;\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
- " if (name == 'download') {\n",
- " this.handle_save(this, null);\n",
- " } else {\n",
- " this.send_message(\"toolbar_button\", {name: name});\n",
- " }\n",
- "};\n",
- "\n",
- "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
- " this.message.textContent = tooltip;\n",
- "};\n",
- "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
- "\n",
- "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
- "\n",
- "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
- " // Create a \"websocket\"-like object which calls the given IPython comm\n",
- " // object with the appropriate methods. Currently this is a non binary\n",
- " // socket, so there is still some room for performance tuning.\n",
- " var ws = {};\n",
- "\n",
- " ws.close = function() {\n",
- " comm.close()\n",
- " };\n",
- " ws.send = function(m) {\n",
- " //console.log('sending', m);\n",
- " comm.send(m);\n",
- " };\n",
- " // Register the callback with on_msg.\n",
- " comm.on_msg(function(msg) {\n",
- " //console.log('receiving', msg['content']['data'], msg);\n",
- " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
- " ws.onmessage(msg['content']['data'])\n",
- " });\n",
- " return ws;\n",
- "}\n",
- "\n",
- "mpl.mpl_figure_comm = function(comm, msg) {\n",
- " // This is the function which gets called when the mpl process\n",
- " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
- "\n",
- " var id = msg.content.data.id;\n",
- " // Get hold of the div created by the display call when the Comm\n",
- " // socket was opened in Python.\n",
- " var element = $(\"#\" + id);\n",
- " var ws_proxy = comm_websocket_adapter(comm)\n",
- "\n",
- " function ondownload(figure, format) {\n",
- " window.open(figure.imageObj.src);\n",
- " }\n",
- "\n",
- " var fig = new mpl.figure(id, ws_proxy,\n",
- " ondownload,\n",
- " element.get(0));\n",
- "\n",
- " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
- " // web socket which is closed, not our websocket->open comm proxy.\n",
- " ws_proxy.onopen();\n",
- "\n",
- " fig.parent_element = element.get(0);\n",
- " fig.cell_info = mpl.find_output_cell(\"\");\n",
- " if (!fig.cell_info) {\n",
- " console.error(\"Failed to find cell for figure\", id, fig);\n",
- " return;\n",
- " }\n",
- "\n",
- " var output_index = fig.cell_info[2]\n",
- " var cell = fig.cell_info[0];\n",
- "\n",
- "};\n",
- "\n",
- "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
- " // Update the output cell to use the data from the current canvas.\n",
- " fig.push_to_output();\n",
- " var dataURL = fig.canvas.toDataURL();\n",
- " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
- " // the notebook keyboard shortcuts fail.\n",
- " IPython.keyboard_manager.enable()\n",
- " $(fig.parent_element).html('');\n",
- " fig.send_message('closing', {});\n",
- " fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '';\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.updated_canvas_event = function() {\n",
- " // Tell IPython that the notebook contents must change.\n",
- " IPython.notebook.set_dirty(true);\n",
- " this.send_message(\"ack\", {});\n",
- " var fig = this;\n",
- " // Wait a second, then push the new image to the DOM so\n",
- " // that it is saved nicely (might be nice to debounce this).\n",
- " setTimeout(function () { fig.push_to_output() }, 1000);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._init_toolbar = function() {\n",
- " var fig = this;\n",
- "\n",
- " var nav_element = $('')\n",
- " nav_element.attr('style', 'width: 100%');\n",
- " this.root.append(nav_element);\n",
- "\n",
- " // Define a callback function for later on.\n",
- " function toolbar_event(event) {\n",
- " return fig.toolbar_button_onclick(event['data']);\n",
- " }\n",
- " function toolbar_mouse_event(event) {\n",
- " return fig.toolbar_button_onmouseover(event['data']);\n",
- " }\n",
- "\n",
- " for(var toolbar_ind in mpl.toolbar_items){\n",
- " var name = mpl.toolbar_items[toolbar_ind][0];\n",
- " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
- " var image = mpl.toolbar_items[toolbar_ind][2];\n",
- " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
- "\n",
- " if (!name) { continue; };\n",
- "\n",
- " var button = $('');\n",
- " button.click(method_name, toolbar_event);\n",
- " button.mouseover(tooltip, toolbar_mouse_event);\n",
- " nav_element.append(button);\n",
- " }\n",
- "\n",
- " // Add the status bar.\n",
- " var status_bar = $('');\n",
- " nav_element.append(status_bar);\n",
- " this.message = status_bar[0];\n",
- "\n",
- " // Add the close button to the window.\n",
- " var buttongrp = $('');\n",
- " var button = $('');\n",
- " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
- " button.mouseover('Close figure', toolbar_mouse_event);\n",
- " buttongrp.append(button);\n",
- " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
- " titlebar.prepend(buttongrp);\n",
- "}\n",
- "\n",
- "\n",
- "mpl.figure.prototype._canvas_extra_style = function(el){\n",
- " // this is important to make the div 'focusable\n",
- " el.attr('tabindex', 0)\n",
- " // reach out to IPython and tell the keyboard manager to turn it's self\n",
- " // off when our div gets focus\n",
- "\n",
- " // location in version 3\n",
- " if (IPython.notebook.keyboard_manager) {\n",
- " IPython.notebook.keyboard_manager.register_events(el);\n",
- " }\n",
- " else {\n",
- " // location in version 2\n",
- " IPython.keyboard_manager.register_events(el);\n",
- " }\n",
- "\n",
- "}\n",
- "\n",
- "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
- " var manager = IPython.notebook.keyboard_manager;\n",
- " if (!manager)\n",
- " manager = IPython.keyboard_manager;\n",
- "\n",
- " // Check for shift+enter\n",
- " if (event.shiftKey && event.which == 13) {\n",
- " this.canvas_div.blur();\n",
- " event.shiftKey = false;\n",
- " // Send a \"J\" for go to next cell\n",
- " event.which = 74;\n",
- " event.keyCode = 74;\n",
- " manager.command_mode();\n",
- " manager.handle_keydown(event);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\n",
- "mpl.find_output_cell = function(html_output) {\n",
- " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
- " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
- " // IPython event is triggered only after the cells have been serialised, which for\n",
- " // our purposes (turning an active figure into a static one), is too late.\n",
- " var cells = IPython.notebook.get_cells();\n",
- " var ncells = cells.length;\n",
- " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
- " data = data.data;\n",
- " }\n",
- " if (data['text/html'] == html_output) {\n",
- " return [cell, data, j];\n",
- " }\n",
- " }\n",
- " }\n",
- " }\n",
- "}\n",
- "\n",
- "// Register the function which deals with the matplotlib target/channel.\n",
- "// The kernel may be null if the page has been refreshed.\n",
- "if (IPython.notebook.kernel != null) {\n",
- " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
- "}\n"
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- ""
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# example from: http://matplotlib.org/examples/mplot3d/surface3d_radial_demo.html\n",
- "\n",
- "from mpl_toolkits.mplot3d import Axes3D\n",
- "import matplotlib\n",
- "import numpy as np\n",
- "from matplotlib import cm\n",
- "from matplotlib import pyplot as plt\n",
- "step = 0.04\n",
- "maxval = 1.0\n",
- "fig = plt.figure()\n",
- "ax = fig.add_subplot(111, projection='3d')\n",
- "\n",
- "# create supporting points in polar coordinates\n",
- "r = np.linspace(0, 1.25, 50)\n",
- "p = np.linspace(0, 2*np.pi, 50)\n",
- "R, P = np.meshgrid(r, p)\n",
- "# transform them to cartesian system\n",
- "X, Y = R*np.cos(P), R*np.sin(P)\n",
- "\n",
- "Z = ((R**2 - 1)**2)\n",
- "ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r)\n",
- "ax.set_zlim3d(0, 1)\n",
- "ax.set_xlabel(r'$\\phi_\\mathrm{real}$')\n",
- "ax.set_ylabel(r'$\\phi_\\mathrm{im}$')\n",
- "ax.set_zlabel(r'$V(\\phi)$')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.4.3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/lectures/04-matplotlib/matplotlib.fodp b/lectures/04-matplotlib/matplotlib.fodp
deleted file mode 100644
index e996d278..00000000
--- a/lectures/04-matplotlib/matplotlib.fodp
+++ /dev/null
@@ -1,1542 +0,0 @@
-
-
-
- Michael Zingale2013-01-02T12:36:142016-03-07T13:55:28.804330850Michael ZingalePT17H27M47S60LibreOffice/5.0.5.2$Linux_X86_64 LibreOffice_project/00$Build-2
-
-
- -834
- -5654
- 36374
- 21657
-
-
- view1
- true
- false
- true
- true
- true
- true
- false
- false
- true
- 1500
- false
- //////////////////////////////////////////8=
- //////////////////////////////////////////8=
-
- false
- true
- false
- 0
- 10
- false
- true
- true
- 4
- 0
- 0
- 1
- -309
- -5017
- 38005
- 21614
- 2540
- 2540
- 254
- 254
- 254
- 1
- 254
- 1
- false
- 1500
- true
-
-
-
-
- true
- $(user)/config/standard.sob
- 0
- $(user)/config/standard.soc
- $(user)/config/standard.sod
- 1270
- false
-
-
- en
- US
-
-
-
-
-
- $(user)/config/standard.sog
- true
- $(user)/config/standard.soh
- false
- false
- true
- true
- false
- true
- false
- false
- true
- false
- false
- false
- false
- false
- $(user)/config/standard.soe
- false
- 4
- false
- 0
- low-resolution
- hp
- sgH+/2hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpocAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMA0wAAAAAAAAAIAFZUAAAkbQAASm9iRGF0YSAxCnByaW50ZXI9aHAKb3JpZW50YXRpb249UG9ydHJhaXQKY29waWVzPTEKY29sbGF0ZT1mYWxzZQptYXJnaW5kYWp1c3RtZW50PTAsMCwwLDAKY29sb3JkZXB0aD0yNApwc2xldmVsPTAKcGRmZGV2aWNlPTEKY29sb3JkZXZpY2U9MApQUERDb250ZXhEYXRhClBhZ2VTaXplOkxldHRlcgBJbnB1dFNsb3Q6RGVmYXVsdABEdXBsZXg6RHVwbGV4Tm9UdW1ibGUAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEVVBMRVhfTE9OR0VER0U=
- false
- 6
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <number><number><number><number><number><number><number><number><number><number>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PHY 688: Numerical Methods for (Astro)Physics
-
-
-
-
- <number><number><number><number><number><number><number><number><number><number>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <number><number><number><number><number><number><number><number><number><number>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <number><number><number><number><number><number><number><number><number>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <number><number><number><number><number><number><number><number><number>
-
-
-
-
-
-
-
-
-
-
-
- matplotlib
-
-
-
-
-
-
-
-
-
-
-
-
-
- Intro to matplotlib
-
-
-
-
-
-
- Matplotlib is the standard plotting library for scientific python
-
-
- Design objectives(from the matplotlib documentation):
-
-
- Plots should look great - publication quality. One important requirement for me is that the text looks good (antialiased, etc.)
-
-
- Postscript output for inclusion with TeX documents
-
-
- Embeddable in a graphical user interface for application development
-
-
- Code should be easy enough that I can understand it and extend it
-
-
- Making plots should be easy
-
-
-
-
-
-
- Mostly it is for 2-d data (including surface plots of f(x,y), etc.)
-
-
- Active development with lots of new features
-
-
- Best way to figure out how to do something: look at the gallery
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Importing
-
-
-
-
-
-
- There are several interfaces to matplotlib that provide varying amounts of access to its underlying functionality
-
-
- See http://matplotlib.org/faq/usage_faq.html
-
-
- matplotlib is the entire package
-
-
- matplotlib.pyplot is a module within matplotlib that provides easy access to the core plotting routines
-
-
- pylab combines pyplot and numpy into a single namespace to give a MatLab like interface
-
-
- This is deprecated
-
-
-
-
-
-
- A number of toolkits extend the functionality
-
-
- basemap and cartopy: mapping (e.g. projecting onto a globe, geographical boundaries)
-
-
- mplot3d: basic 3-d plotting
-
-
- AxesGrid: high-level methods for arranging multiple plots together in a figure
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Figures vs. Axes
-
-
-
-
-
-
- Figures are the highest level object and can include multiple axes (see http://matplotlib.org/users/pyplot_tutorial.html)
-
-
- There are many matplotlib routines to subdivide a figure into multiple subplots
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Backends
-
-
-
-
-
-
- matplotlib can output to a number of different devices—the backends provide this functionality
-
-
- Interactive backends:
-
-
- pygtk, wxpython, tkinter, q3, macosx
-
-
- These allow for plotting to the screen, and updates with each command (if desired)
-
-
-
-
- Hardcopy backends:
-
-
- PNG, SVG, PDF, PS
-
-
-
-
- To select a backend:
-
-
- import matplotlib
- matplotlib.use('PS')
- import matplotlib.pyplot
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- IPython and matplotlib
-
-
-
-
-
-
- IPython supports matplotlib:
-
-
- ipython --pylab will pop up a window in interactive mode
-
-
- %matplotlib inline magic in notebooks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Successors
-
-
-
-
-
-
- There are a lot of new projects, some built upon matplotlib, others independent.
-
-
- A common goal for a lot of these is to allow for interactive data exploration in the web browser. Many use the javascript library d3.js to do this
-
-
- Examples:
-
-
- mpld3: http://mpld3.github.io/ (based on matplotlib; see his blog post here: http://jakevdp.github.io/blog/2014/01/10/d3-plugins-truly-interactive/)
-
-
- Bokeh: http://bokeh.pydata.org/en/latest/
-
-
- plot.ly: https://plot.ly/
-
-
- Glue: http://www.glueviz.org/en/stable/(explore relationships among related datasets)
-
-
- D3PO: http://d3po.org/
-
-
- d3py: https://github.com/mikedewar/d3py (inactive?)
-
-
- Seaborn: http://web.stanford.edu/~mwaskom/software/seaborn/(based on matplotlib)
-
-
- ggplot: https://github.com/yhat/ggplot/ (for you R users)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some Examples
-
-
-
-
-
-
- There are far more examples than we can cover—we'll see more as the class goes on.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Volume Sources
-
-
-
-
-
-
- For data that is x, y, z + a value, other libraries help
-
-
- yt does volume rendering, isosurfaces, projections, ...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Volume Sources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Interactive Plots
-
-
-
-
-
-
- Bokeh offers interactivity
-
-
- Here's a recently-published paper with an interactive plot: http://iopscience.iop.org/article/10.3847/0004-637X/819/2/113/meta
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/lectures/04-matplotlib/shore_leave.txt b/lectures/04-matplotlib/shore_leave.txt
deleted file mode 100644
index 53d5f562..00000000
--- a/lectures/04-matplotlib/shore_leave.txt
+++ /dev/null
@@ -1,415 +0,0 @@
-Shore Leave
-Bridge
-Enterprise is orbiting a very green planet, and a young female Yeoman is getting a signature from the Captain.
-Anything from the landing party.
-They should be sending up a report momentarily, Captain. Kirk stretches and groans Something wrong.
-A kink in my back. behind his back the Yeoman starts to massage it that is it. A little higher, please. Push. Push hard. Dig it in there, Mister
-Spock steps forward and Kirk realises who is massaging his lower back
-Thank you, Yeoman. that is sufficient.
-You need sleep, Captain. If it is not out of line
-I have enough of that from Doctor McCoy, Yeoman. Thank you.
-Doctor McCoy is correct, Captain. After what this ship has been through in the last three months, there is not a crewman aboard who is not in need of rest. Myself excepted, of course.
-Have Doctor McCoy report channeled to my quarters, Lieutenant.
-Aye, aye, Captain.
-Planet surface
-Beautiful, beautiful. No animals, no people, no worries. Just what the doctor ordered. Right, Doctor.
-I could not have prescribed better. We are one weary ship.
-Do you think the Captain will authorise shore leave here.
-Depending upon my report and that of the other scouting parties. You know, you have to see this place to believe it. it is like something out of Alice in Wonderland. The Captain has to come down.
-he would like it.
-He needs it. you have got your problems, I have got mine. he is got ours, plus his, plus four hundred and thirty other people. Where are you going.
-To get some cellstructure records. A blade of grass, a bush, a tree, a flower petal. With these, we can tell the whole planet biology.
-As Sulu crouches down behind some pampas grass, McCoy turns and looks straight at a white rabbit in a check jacket, yellow waistcoat, and looking at a gold pocketwatch.
-Oh, my paws and whiskers. I will be late.
-It heads off down a hole. Then a young girl comes running up, wearing a blue dress with a white apron.
-Excuse me, sir. Have you seen a rather large white rabbit with a yellow waistcoat and white gloves here about.
-Wordlessly, McCoy points in the direction the rabbit went. The girl curtseys nicely
-Thank you very much.
-She runs off after the rabbit
-Sulu.
-What is it. what is the matter.
-Did you see them.
-See what. I do not see anything. What is it, Doc.
-Kirk quarters
-The Captain is dictating his log in the presence of Yeoman Tonia Barrows
-captain log. We are orbiting an uninhabited planet in the Omicron Delta region. A planet remarkably like Earth, or how we remember Earth to be. Parklike, beautiful, green, flowers, trees, green lawn, quiet and restful. Almost too good to be true.
-Sir, I do not see your name in any of the shore parties.
-I may be tired, Yeoman, but I am not falling apart. Dismissed.
-Aye, aye, sir.
-She leaves, and Spock enters
-Mister Spock, we are beaming down the starboard section first. Which section would you like to go with.
-Not necessary in my case, Captain. On my planet, to rest is to rest, to cease using energy. To me, it is quite illogical to run up and down on green grass using energy instead of saving it.
-Intercom whistles
-Kirk here.
-Doctor McCoy calling from the planet, Captain.
-Yes. Open a channel, Uhura.
-Aye, aye, sir.
-Captain, are you beaming down.
-Kirk quarters
-I had not planned to, Bones. Why.
-Well, either our scouting probes and detectors are malfunctioning, and all us scouts careless and beautyintoxicated, or I must report myself unfit for duty.
-Kirk quarters
-Explain.
-On this supposedly uninhabited planet, I just saw a large rabbit
-Kirk quarters
-Pull a gold watch from his vest and claim that he was late.
-that is pretty good. I got one for you. The rabbit was followed by a little blonde girl, right.
-As a matter of fact, yes.
-Kirk quarters
-And they disappeared through a hole in a hedge.
-All right, Doctor, I will take your report under consideration. Captain out. that is a McCoy pill, with a little mystery sugarcoating. He wants to get me down there. I am afraid I will not swallow it.
-Very well, Captain. Something I did come to discuss.
-Yes, Mister Spock, what is it.
-I picked this up from Doctor McCoy log. We have a crewmember aboard who showing signs of stress and fatigue. Reaction time down nine to twelve percent, associational reading norm minus three.
-that is much too low a rating.
-he is becoming irritable and quarrelsome, yet he refuses to take rest and rehabilitation. Now, He has that right, but we have found
-A crewman right ends where the safety of the ship begins. That man will go a shore on my orders. what is his name.
-James Kirk. Enjoy yourself, Captain. it is an interesting planet. you will find it quite pleasant. Very much like your Earth.
-Planet surface
-An establishing shot of a landscape
-Scouts have detected no animals, artefacts, or force fields of any kind. Only peace, sunshine, and good air. you will have no problems.
-But as these words are spoken, a rock raises itself to reveal a classic westernstyle six shooter gun.
-Elsewhere, a man and a woman are taking scans of the vegetation
-the woman Does it always have to be work with you. There so much loveliness.
-You will not find all this so lovely if our report for the Captain is not ready when he asks for it, which should not be long.
-Kirk and Barrows beam down
-Rodriguez, Teller, everything all right.
-Yes, sir. we have completed the specimen survey.
-Good. That should be sufficient. Beam it up to Mister Spock when you are ready, and start enjoying yourselves.
-Thank you, sir. And sir, I think you will find Doctor McCoy and Mister Sulu that way.
-Thank you.
-Walking along
-Restful. After what we have been through, it is hard to believe a place this beautiful exists.
-It is beautiful. So lovely, and restful. I mean, affirmative, Captain.
-McCoy. McCoy.
-Over here. Over here.
-They meet up by the lake
-Bones, know any good rabbit jokes lately.
-As a matter of fact, I do, but this is not one of them. Look at this. a pair of large tracks in the soil I saw what I saw, or maybe I hallucinated it, but I want you to take a look and tell me what you think about it.
-Footprints. Could be a rabbit. It would have to be an unusual creature to make this size tracks. What about Mister Sulu. Will he confirm what you saw.
-Negative. He was examining the flora at the time.
-Bridge, this is the Captain.
-Where is Mister Sulu.
-Collecting specimens.
-Bridge.
-Has the first shore party beamed down yet.
-Negative, Captain. they are just about to start.
-Get this message to all shore parties. Stand by. No one is to leave the ship.
-Aye, aye, sir.
-you are cancelling the shore leave on account of this, Jim.
-you are the doctor, Doctor. Can you explain this.
-Well, no.
-Neither can I. I admit it looks harmless. It probably is harmless. But before I bring my people down here, I want proof it is harmless.
-They hear a gunshot. Kirk draws his phaser and they head off in the direction of the shot. More are fired.
-Woodland path
-They find Sulu target practising
-What do you think you are doing.
-Target shooting, Captain. is not it a beauty. have not got anything like this in my collection.
-Where did you get it, Mister Sulu.
-I found it. I know it is a crazy coincidence, but I have always wanted one like this. Found it lying right over there. An oldtime police special, and in beautiful condition. has not been one like this made in a couple of centuries.
-holding out his hand for the offending weapon Mister Sulu.
-handing it over It fires lead pellets propelled by expanding gases from a chemical explosion.
-I will hang on to it. The fresh air seems to have made you triggerhappy.
-Doctor McCoy rabbit, sir. He must have gone through here.
-Are you sure our instruments did not show any animal life on this planet.
-Absolutely. No birds, no mammals, no insects, nothing. I am certain our readings were not off.
-I would like to believe this is an elaborate gag, but. Yeoman Barrows, you accompany Mister Sulu. Find out where those tracks came from. Doctor, you come with me back to the glade. I would like another look at that area.
-As they head back, an aerial comes up in front of our point of view and follows them.
-This is turning out to be one very unusual shore leave.
-Well, it could have been worse.
-How.
-You could have seen the rabbit.
-what is the matter, Bones, you getting a persecution complex.
-Well, yeah, I am beginning to feel a little bit picked on, if that is what you mean.
-I know the feeling very well. I had it at the Academy. An upper classman there. One practical joke after another, and always on me. My own personal devil. A guy by the name of Finnegan.
-And you being the very serious young
-Serious. I will make a confession, Bones. I was absolutely grim, which delighted Finnegan no end. he is the kind of guy to put a bowl of cold soup in your bed or a bucket of water propped on a halfopen door. You never knew where he would strike next. More tracks. Looks like your rabbit came from over there.
-A girl footprints. The young blonde girl I saw chasing it.
-Yes. You follow the rabbit. I will backtrack the girl. I will meet you around the other side of the hill.
-Good. I have got a personal grudge against that rabbit, Jim.
-They split up, and then suddenly there a young man leaning against a tree trunk
-in a dreadful codIrish accent Jim.
-Finnegan. I cannot believe it.
-You never know when I am going to strike, huh, Jim. hits him on the jaw How this. Come on, come on. it is me, Finnegan. All right, Jimmy boy. maniacal laughter Go ahead, lay one on me. that is what you always wanted, is not it. Come on. Come on.
-All right, let try that one again. Go.
-He just lays hands on Finnegan for a good fight, when they hear screams. Kirk runs off to investigate
-Go. Any excuse, Jim baby. Run away. Run away. Run away.
-Along the path, he meets McCoy
-What was it.
-Yeoman Barrows.
-They arrive on the scene to find Tonia disheveled, her uniform torn, hugging a tree
-What happened.
-I do not know. I mean I do know. I was following the tracks, and there he was.
-Who was.
-Him.
-Barrows, give me a report.
-He had a cloak, sir, and a dagger with jewels on it.
-Are you sure you are not imagining all this.
-Captain, I know it sounds incredible, but I did not imagine it any more than I imagined he did this.
-Sounds like Don Juan.
-Yes. Yes. It was so sort of story book walking around here, and I was thinking, all a girl needs is Don Juan. Just day dreaming, the way you would about someone you would like to meet.
-Mister Sulu was with you. Where is he now.
-He ran after him.
-Stay with her, Doctor.
-He heads off in the direction she indicates
-Mister Sulu. Sulu.
-An aerial comes up from a rock and monitors him as he runs along the path
-Mister Sulu. Sulu.
-Rocky outcrop
-The Captain runs across a barren piece of ground towards a rocky outcrop, which suddenly gains palms and banana plants when he gets there.
-Sulu.
-He picks an orange flower, and becomes wistful. And there she is, blonde and lovely, her dress half white, half black and roses.
-Ruth. Ruth.
-Jim, darling, it is me. It is Ruth.
-She kisses him
-captain log. Stardate Investigation of this increasingly unusual planet continues, and we are seeing things that cannot possibly exist, yet they are undeniably real.
-Rocky outcrop
-into communicator McCoy, do you read me. Ruth. Ruth, how can it be you. How could you possibly be here. You have not aged. it is been fifteen years.
-It does not matter. None of that matters.
-His communicator beeps
-Kirk here.
-Did you find Mister Sulu, Captain.
-What.
-Did you find Mister Sulu.
-No, but I am sure he is all right.
-Sir. Are you all right.
-Yes, I am fine.
-Rodriguez to Captain Kirk.
-Yes, Mister Rodriguez.
-Captain, a while ago, I saw well, birds, a whole flock of them.
-do not you like birds, Mister Rodriguez.
-I like them fine, sir, but all our surveys showed
-Then offhand I would say our instruments are defective. There are indeed lifeforms on this planet.
-Sir, our surveys could not have been that wrong.
-Mister Rodriguez, have the search parties rendezvous at the glade. I would like some answers to all this.
-Aye, aye, sir.
-You have to go.
-I do not want to.
-you will see me again if you want to.
-You have not told me. You have not told me
-Do what you have to do, and I will be waiting.
-Ruth.
-communicator beeps
-Kirk here.
-Captain.
-Yes, Mister Spock.
-Bridge
-I am getting strange readings from the planet surface, Captain. Some sort of power field down there.
-Rocky outcrop
-Specify.
-A highly sophisticated type of energy draining our power and increasing, beginning to affect our communications.
-Can you pinpoint the source.
-Bridge
-Could be coming from beneath the planet surface. Patterns indicate some sort of industrial activity.
-Rocky outcrop
-Keep me posted, Mister Spock. we will continue our investigation down here. Captain out.
-He walks off
-Woodland path
-Meanwhile, back at the tree where Tonia met Don Juan, something is monitoring them. The couple go walking arm in arm through the tropical plants.
-Feeling better.
-A little, but I would not want to be alone here.
-it is a beautiful place. A little strange, I will admit.
-that is just it. it is almost too beautiful. I was thinking, even before my tunic was torn, that in a place like this a girl should be, oh let see now, a girl should be dressed like a fairytale princess, with lots of floaty stuff and a tall hat with a veil.
-I see what you mean, but then you would have whole armies of Don Juans to fight off. And me, too.
-Is that a promise, Doctor.
-He takes her hands in his, and they gaze into each others eyes for a long second. Then she spots her dream clothing hanging on some shrubs
-Oh, Doctor, they are lovely. Look at me, Doctor. A lady to be protected and fought for. A princess of the blood royale.
-You are all of those things and many more. they will look even lovelier with you wearing them.
-Doctor, I am afraid.
-Now, look, I do not know how or why, but the dress is here. I would like to see you in it. Why do not you put it on.
-All right, but you stay right there. do not peek.
-My dear girl, I am a doctor. When I peek, it is in the line of duty.
-he turns his back on her, and his communicator beeps
-Calling Doctor McCoy.
-McCoy here. I cannot read you very well. Is this Rodriguez.
-This is all the volume I can get on this thing. cannot read you well, either. captain orders. Rendezvous at that glade where he first found you.
-Right. What the devil wrong with communications. Esteban. Esteban.
-But Esteban and Teller have problems of their own a tiger has them trapped
-Doctor. Doctor. Doctor McCoy.
-The tiger gets bored and leaves. Tonia emerges from her changing room looking lovely, and happy in her Disney fantasy creation.
-Bridge
-you are the science officer, Mister Spock. I want some answers.
-Rocky outcrop
-First there was McCoy Alice in Wonderland where there was supposedly no animal life. And Sulu gun where there no refined metal detected. Rodriguez birds. And then my, well, the two people I saw.
-Bridge
-Any chance these could be hallucinations.
-Rocky outcrop
-One hallucination flattened me with a clout on the jaw.
-Bridge
-The other.
-That sounds like a painful reality.
-Rocky outcrop
-Yes.
-There must be some logical explanation.
-Bridge
-Your signal is very weak. Can you turn up your gain.
-I am already on maximum.
-Captain, shall I beam down an armed party.
-Rocky outcrop
-Negative. Our people here are armed with phasers. Besides, there yet to be any real danger. he sees geese flying overhead Captain out.
-Cliff face
-Sulu walks along by a cliff face, a hatch opens in the ground and out comes a Samurai to attack him. Sulu phaser does not work and he is forced to dodge the long, sharp sword
-Rocky outcrop
-McCoy. McCoy, do you read me. Kirk to McCoy. Come in.
-Sulu comes running over the rocks towards him
-Captain, take cover. There a Samurai after me.
-A what.
-I mean, there was. no one is chasing him now Captain, you have got to believe me.
-I do. I have met some interesting personalities myself. Have you seen any of the others while I have been gone.
-Got a call a few minutes ago. Rodriguez. Said you were rendezvousing back at the glade.
-I hope he got through to everybody. Communications are almost out.
-that is not all. So my phaser.
-Kirk checks his own weapon nothing Yeah. we would better get to the glade.
-Yes, sir. sound of a transporter beam Look. Someone beaming down from the bridge.
-Trying to. Something obstructing it. finally the familiar shape fully materialises Mister Spock, my orders were no one was to leave the ship.
-Necessary, Captain. Unable to contact you by communicator, and the transporter is useless to us now. As I told you before, there an unusual power field down here. it is soaking up all the energy at the source. I calculated the rate of its growth, and reasoned that I just might be able to transport one more person.
-Good. We can use your help.
-we are stranded down here, Captain.
-Until we can find out what this is all about.
-There no one here.
-This is where the Captain said to rendezvous. makes Tonia stand with her back to a tree I swear I heard someone moving around.
-do not talk like that.
-A princess should not be afraid, not with a brave knight to protect her.
-Rocky outcrop
-The trio hear the snarl of a big cat
-That way. Spread out. Let find it.
-A knight in armour on a black horse has appeared, and is coming towards them.
-These things cannot be real. Hallucinations cannot harm us. Go back to where you were.
-Kirk and Spock arrive on the scene. The knight lowers his lance, charges, and runs McCoy through. Tonia screams. Spock draws his phaser, and Kirk the gun he confiscated from Sulu. He shoots the knight from his horse, then they run to McCoy.
-he is dead.
-captain log, supplemental. All contact with the Enterprise has been lost. we are trapped here. Our ship surgeon, my personal friend, is dead. we are certain now that whatever we are facing is terribly real.
-it is my fault. It never would have happened. it is my fault.
-No.
-It is, it is. I am to blame.
-Yeoman. we are in trouble. I need every crewman alert and thinking.
-Aye, aye, sir.
-at the knight body Captain. Captain.
-Kirk goes over
-you would better have a look at this, sir. the knight is a plastic dummy I do not understand.
-Neither do I, Mister Sulu, but before we leave this planet, I will.
-it is like a dummy, Captain. It could not be alive.
-Tricorder.
-Still operating, sir.
-Mister Spock. Spock and Sulu swap places, handing over the tricorder What do you make of that.
-This is not human skin tissue, Captain. It more closely resembles the cellular casting we use for wound repairs. Much finer, of course.
-I want an exact judgment, Mister Spock.
-This is definitely a mechanical contrivance. It has the same basic cell structure as the plants here, even the trees, the grass.
-Are you saying this is a plant, Mister Spock.
-I am saying that these are all multicellular castings. The plants, the animals, the people. they are all being manufactured.
-By who. And why. And why these particular things.
-All we know for certain is that they act exactly like the real thing. Just as pleasant or just as deadly.
-There a buzzing sound in the air, and a plane flies overhead
-Woodland path
-What is it.
-Of all the crazy things. Remember what I was telling you a while ago, about the early wars and funny air vehicles they used. that is one of them.
-Can it hurt us.
-Not unless it makes a strafing run.
-A what.
-The way they used to attack people on the ground. the plane descends Come on.
-They run along the path, as a second plane joins the first, straight into a clump of trees. Angela falls to the ground having hit the tree.
-Angela.
-Everyone has been watching the air show, then Sulu notices...
-Captain.
-McCoy body.
-he is gone. Dragged off.
-The black knight, too.
-Spock.
-At this point, Captain, my analysis may not sound very scientific.
-McCoy death is a scientific fact.
-There is one slight possibility, very slim, but nevertheless. Captain, what were your thoughts just before you encountered the people you described.
-I was, I was thinking about the Academy. My days
-Hey, Jim baby. I see you brought out reinforcements. Ha. Well, I am waiting for you, Jimmy boy.
-Finnegan. Finnegan. what is been happening to my people.
-Finnegan laughs and runs off
-Take Sulu. Find McCoy body. This man is my problem.
-Captain, wait.
-that is an order, Mister Spock.
-He runs off after Finnegan
-Here I am. Run.
-Rocky outcrop
-Jim. Find me. cannot you see me. Come and get me. Here I am. Come on. You never could find your head with both hands. Like it used to be, Jimmy. Remember. finally Kirk catches up to him, because he is lounging on a ledge Hey, Jim
-I want some answers.
-Coming up.
-He jumps on Kirk and they have a fight. Finnegan knocks Kirk down
-Get up. Get up. Get up. Always fight fair, do not you. True officer and gentleman, you. You stupid underclassman. I have got the edge. I am still twenty years old. Look at you. you are an old man.
-The fight resumes, and Kirk punches Finnegan till he falls down a rocky slope and ends up writhing in pain
-I cannot move me leg. I cannot feel me leg. My back is broken. you have broken me back.
-Can you feel that.
-He gets kicked to the ground
-Can you feel that, now. Kirk passes out Sleep sweet, Jimmy boy. Sleep as long as you like. Sleep forever, Jim boy. Forever and forever.
-A little later, Kirk regains consciousness
-will not you ever learn, Jim boy. You never could take me, you know.
-Finnegan. One thing
-Sure. Name it.
-Answers.
-Earn them.
-He throws dirt in Kirk face and the exchange of punches resumes until they are both too tired to continue.
-Not bad. Kind of makes up for things, huh, Jim.
-A lot of things. what is been happening to my people.
-I never answer questions from plebes, Jimmy boy.
-I am not a plebe. This is today, fifteen years later. What are you doing here.
-I am being exactly what you expect me to be, Jimmy boy.
-Kirk lands the final haymaker that knocks Finnegan out cold
-Did you enjoy it, Captain.
-Yes, I enjoyed it. After all these years. realisation dawns I did enjoy it. The one thing I wanted to do after all these years was to beat the tar out of Finnegan.
-Which supports a theory I have been formulating.
-That we are all meeting people and things that we happen to be thinking about at the moment.
-Yes. Somehow our thoughts are read, these things are quickly manufactured and provided for us.
-Dangerous if we happen to be thinking about
-Yes. We must all control our thoughts.
-Difficult.
-The force field we encountered is obviously underground, manufacturing these things. Passages lead to the surface. Just for example, when Rodriguez thought of a tiger
-Spock.
-The tiger is behind them, the chain around it is neck tethering it to the spot clearly visible
-we have got to get back to the landing party and warn them.
-They start to run back to the glade. The aircraft strafe them, Kirk elbows the Samurai out of his way
-Tonia has changed back into her uniform when Don Juan sneaks up behind her and grabs her, warding off Sulu and Rodriquez with his sword
-Sulu, Rodriguez, Barrows. Front and centre.
-Don Juan runs off
-Sir.
-do not ask any questions, Sulu. Face front, everyone. do not talk. do not breathe. do not think. you are at attention. Concentrate on that and only that. Concentrate.
-Captain.
-A smiling greyhaired man in a long green robe walks up to Kirk
-Who are you.
-I am the caretaker of this place, Captain Kirk.
-You know my name.
-But of course. Lieutenant Rodriguez, Lieutenant Sulu, Yeoman Barrows and Mister Spock. we have just discovered you do not understand all this. These experiences were intended to amuse you.
-Amuse. that is your word for what we have been through.
-But none of this is permanent. Here you have to only imagine your fondest wishes, either old ones you wish to relive or new ones, anything at all. Battle, fear, love, triumph. Anything that pleases you can be made to happen.
-The term is amusement park.
-Of course.
-An old Earth name for a place where people could go to see and do all sorts of fascinating things.
-This entire planet was constructed for our race of people to come and play.
-Play. As advanced as you obviously are, and you still play.
-Yes, play, Mister Sulu. The more complex the mind, the greater the need for the simplicity of play.
-Exactly, Captain. How very perceptive of you.
-But that still does not explain the death of my ship surgeon.
-Possibly because no one has died, Jim. Strolls in with a lovely girl on each arm I was taken below the surface for some rather remarkable repairs. it is amazing. they have got a factory complex down there you would not believe. They can build or do anything immediately.
-not amused And how do you explain them.
-Oh. Them. Well I, er, I was thinking about a little cabaret I know on Rigel Two, and, er, there were these two girls in the chorus line. And well, here they are. Well after all, I am on shore leave.
-And so am l.
-Oh, yes. So you are. Well, girls, I suppose you can turn something up.
-The cabaret girls go to Sulu and Spock.
-We regret that some of you have been made uncomfortable.
-You say your people built all this. Who are you. What planet are you from.
-My impression is that your race is not yet ready to understand us, Captain.
-I tend to agree.
-a communicator beeps
-Kirk here.
-This is the bridge, Captain. Our power systems have just come back in. Do you require assistance.
-No, everything is in order, Lieutenant. Stand by.
-However.
-Aye, aye, sir.
-If you would use the proper caution, this amusement planet of ours could be an ideal place for your people to enjoy themselves, if you wish.
-it is what the doctor ordered, Jim.
-Lieutenant.
-Sir.
-Commence transporting shore leave parties. Tell them to prepare for the best shore leave they have ever had. Kirk out.
-handing the girl over to Sulu Captain, I will go back aboard ship and take over. With all due respect to the young lady, I have already had as much shore leave as I care for.
-No, Mister Spock. I will go. You. then he sees Ruth walking towards the group On the other hand, I will stay for a day or two.
-Bridge
-Did you enjoy your rest, gentlemen.
-Yes, we did, Mister Spock. I think we did.
-Indeed we did, Mister Spock.
-Most illogical.
-Ahead warp factor one, Mister Sulu.
diff --git a/lectures/04-matplotlib/test.png b/lectures/04-matplotlib/test.png
deleted file mode 100644
index 1721b30d..00000000
Binary files a/lectures/04-matplotlib/test.png and /dev/null differ
diff --git a/lectures/05-scipy/scipy-basics.ipynb b/lectures/05-scipy/scipy-basics.ipynb
deleted file mode 100644
index 6cb4015e..00000000
--- a/lectures/05-scipy/scipy-basics.ipynb
+++ /dev/null
@@ -1,5934 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pyplot as plt"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# SciPy\n",
- "\n",
- "SciPy is a collection of numerical algorithms with python interfaces. In many cases, these interfaces are wrappers around standard numerical libraries that have been developed in the community and are used with other languages. Usually detailed references are available to explain the implementation.\n",
- "\n",
- "There are many subpackages generally, you load the subpackages separately, e.g.\n",
- "\n",
- "```\n",
- "from scipy import linalg, optimize\n",
- "```\n",
- "then you have access to the methods in those namespaces\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Numerical Methods \n",
- "\n",
- "One thing to keep in mind -- all numerical methods have strengths and weaknesses, and make assumptions. You should always do some research into the method to understand what it is doing.\n",
- "\n",
- "It is also always a good idea to run a new method on some test where you know the answer, to make sure it is behaving as expected."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Integration"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we'll do some integrals of the form\n",
- "\n",
- "$$I = \\int_a^b f(x) dx$$\n",
- "\n",
- "We can imagine two situations:\n",
- "* our function $f(x)$ is given by an analytic expression. This gives us the freedom to pick our integration points, and in general can allow us to optimize our result and get high accuracy\n",
- "* our function $f(x)$ is defined on at a set of (possibly regular spaced) points. \n",
- "\n",
- "In numerical analysis, the term _quadrature_ is used to describe any integration method that represents the integral as the weighted sum of a discrete number of points."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Help on package scipy.integrate in scipy:\n",
- "\n",
- "NAME\n",
- " scipy.integrate\n",
- "\n",
- "DESCRIPTION\n",
- " =============================================\n",
- " Integration and ODEs (:mod:`scipy.integrate`)\n",
- " =============================================\n",
- " \n",
- " .. currentmodule:: scipy.integrate\n",
- " \n",
- " Integrating functions, given function object\n",
- " ============================================\n",
- " \n",
- " .. autosummary::\n",
- " :toctree: generated/\n",
- " \n",
- " quad -- General purpose integration\n",
- " dblquad -- General purpose double integration\n",
- " tplquad -- General purpose triple integration\n",
- " nquad -- General purpose n-dimensional integration\n",
- " fixed_quad -- Integrate func(x) using Gaussian quadrature of order n\n",
- " quadrature -- Integrate with given tolerance using Gaussian quadrature\n",
- " romberg -- Integrate func using Romberg integration\n",
- " quad_explain -- Print information for use of quad\n",
- " newton_cotes -- Weights and error coefficient for Newton-Cotes integration\n",
- " IntegrationWarning -- Warning on issues during integration\n",
- " \n",
- " Integrating functions, given fixed samples\n",
- " ==========================================\n",
- " \n",
- " .. autosummary::\n",
- " :toctree: generated/\n",
- " \n",
- " trapz -- Use trapezoidal rule to compute integral.\n",
- " cumtrapz -- Use trapezoidal rule to cumulatively compute integral.\n",
- " simps -- Use Simpson's rule to compute integral from samples.\n",
- " romb -- Use Romberg Integration to compute integral from\n",
- " -- (2**k + 1) evenly-spaced samples.\n",
- " \n",
- " .. seealso::\n",
- " \n",
- " :mod:`scipy.special` for orthogonal polynomials (special) for Gaussian\n",
- " quadrature roots and weights for other weighting factors and regions.\n",
- " \n",
- " Solving initial value problems for ODE systems\n",
- " ==============================================\n",
- " \n",
- " The solvers are implemented as individual classes which can be used directly\n",
- " (low-level usage) or through a convenience function.\n",
- " \n",
- " .. autosummary::\n",
- " :toctree: generated/\n",
- " \n",
- " solve_ivp -- Convenient function for ODE integration.\n",
- " RK23 -- Explicit Runge-Kutta solver of order 3(2).\n",
- " RK45 -- Explicit Runge-Kutta solver of order 5(4).\n",
- " Radau -- Implicit Runge-Kutta solver of order 5.\n",
- " BDF -- Implicit multi-step variable order (1 to 5) solver.\n",
- " LSODA -- LSODA solver from ODEPACK Fortran package.\n",
- " OdeSolver -- Base class for ODE solvers.\n",
- " DenseOutput -- Local interpolant for computing a dense output.\n",
- " OdeSolution -- Class which represents a continuous ODE solution.\n",
- " \n",
- " \n",
- " Old API\n",
- " -------\n",
- " \n",
- " These are the routines developed earlier for scipy. They wrap older solvers\n",
- " implemented in Fortran (mostly ODEPACK). While the interface to them is not\n",
- " particularly convenient and certain features are missing compared to the new\n",
- " API, the solvers themselves are of good quality and work fast as compiled\n",
- " Fortran code. In some cases it might be worth using this old API.\n",
- " \n",
- " .. autosummary::\n",
- " :toctree: generated/\n",
- " \n",
- " odeint -- General integration of ordinary differential equations.\n",
- " ode -- Integrate ODE using VODE and ZVODE routines.\n",
- " complex_ode -- Convert a complex-valued ODE to real-valued and integrate.\n",
- " \n",
- " \n",
- " Solving boundary value problems for ODE systems\n",
- " ===============================================\n",
- " \n",
- " .. autosummary::\n",
- " :toctree: generated/\n",
- " \n",
- " solve_bvp -- Solve a boundary value problem for a system of ODEs.\n",
- "\n",
- "PACKAGE CONTENTS\n",
- " _bvp\n",
- " _dop\n",
- " _ivp (package)\n",
- " _ode\n",
- " _odepack\n",
- " _quadpack\n",
- " _test_multivariate\n",
- " _test_odeint_banded\n",
- " lsoda\n",
- " odepack\n",
- " quadpack\n",
- " quadrature\n",
- " setup\n",
- " tests (package)\n",
- " vode\n",
- "\n",
- "CLASSES\n",
- " builtins.UserWarning(builtins.Warning)\n",
- " scipy.integrate.quadpack.IntegrationWarning\n",
- " builtins.object\n",
- " scipy.integrate._ivp.base.DenseOutput\n",
- " scipy.integrate._ivp.base.OdeSolver\n",
- " scipy.integrate._ivp.bdf.BDF\n",
- " scipy.integrate._ivp.lsoda.LSODA\n",
- " scipy.integrate._ivp.radau.Radau\n",
- " scipy.integrate._ivp.common.OdeSolution\n",
- " scipy.integrate._ode.ode\n",
- " scipy.integrate._ode.complex_ode\n",
- " scipy.integrate._ivp.rk.RungeKutta(scipy.integrate._ivp.base.OdeSolver)\n",
- " scipy.integrate._ivp.rk.RK23\n",
- " scipy.integrate._ivp.rk.RK45\n",
- " \n",
- " class BDF(scipy.integrate._ivp.base.OdeSolver)\n",
- " | Implicit method based on Backward Differentiation Formulas.\n",
- " | \n",
- " | This is a variable order method with the order varying automatically from\n",
- " | 1 to 5. The general framework of the BDF algorithm is described in [1]_.\n",
- " | This class implements a quasi-constant step size approach as explained\n",
- " | in [2]_. The error estimation strategy for the constant step BDF is derived\n",
- " | in [3]_. An accuracy enhancement using modified formulas (NDF) [2]_ is also\n",
- " | implemented.\n",
- " | \n",
- " | Can be applied in a complex domain.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " | must return array_like with shape (n, k), i.e. each column\n",
- " | corresponds to a single column in ``y``. The choice between the two\n",
- " | options is determined by `vectorized` argument (see below). The\n",
- " | vectorized implementation allows faster approximation of the Jacobian\n",
- " | by finite differences.\n",
- " | t0 : float\n",
- " | Initial time.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial state.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | max_step : float, optional\n",
- " | Maximum allowed step size. Default is np.inf, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | rtol, atol : float and array_like, optional\n",
- " | Relative and absolute tolerances. The solver keeps the local error\n",
- " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " | relative accuracy (number of correct digits). But if a component of `y`\n",
- " | is approximately below `atol` then the error only needs to fall within\n",
- " | the same `atol` threshold, and the number of correct digits is not\n",
- " | guaranteed. If components of y have different scales, it might be\n",
- " | beneficial to set different `atol` values for different components by\n",
- " | passing array_like with shape (n,) for `atol`. Default values are\n",
- " | 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " | jac : {None, array_like, sparse_matrix, callable}, optional\n",
- " | Jacobian matrix of the right-hand side of the system with respect to\n",
- " | y, required only by 'Radau' and 'BDF' methods. The Jacobian matrix\n",
- " | has shape (n, n) and its element (i, j) is equal to ``d f_i / d y_j``.\n",
- " | There are 3 ways to define the Jacobian:\n",
- " | \n",
- " | * If array_like or sparse_matrix, then the Jacobian is assumed to\n",
- " | be constant.\n",
- " | * If callable, then the Jacobian is assumed to depend on both\n",
- " | t and y, and will be called as ``jac(t, y)`` as necessary. The\n",
- " | return value might be a sparse matrix.\n",
- " | * If None (default), then the Jacobian will be approximated by\n",
- " | finite differences.\n",
- " | \n",
- " | It is generally recommended to provide the Jacobian rather than\n",
- " | relying on a finite difference approximation.\n",
- " | jac_sparsity : {None, array_like, sparse matrix}, optional\n",
- " | Defines a sparsity structure of the Jacobian matrix for a finite\n",
- " | difference approximation, its shape must be (n, n). If the Jacobian has\n",
- " | only few non-zero elements in *each* row, providing the sparsity\n",
- " | structure will greatly speed up the computations [4]_. A zero\n",
- " | entry means that a corresponding element in the Jacobian is identically\n",
- " | zero. If None (default), the Jacobian is assumed to be dense.\n",
- " | vectorized : bool, optional\n",
- " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | step_size : float\n",
- " | Size of the last successful step. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | nlu : int\n",
- " | Number of LU decompositions.\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [1] G. D. Byrne, A. C. Hindmarsh, \"A Polyalgorithm for the Numerical\n",
- " | Solution of Ordinary Differential Equations\", ACM Transactions on\n",
- " | Mathematical Software, Vol. 1, No. 1, pp. 71-96, March 1975.\n",
- " | .. [2] L. F. Shampine, M. W. Reichelt, \"THE MATLAB ODE SUITE\", SIAM J. SCI.\n",
- " | COMPUTE., Vol. 18, No. 1, pp. 1-22, January 1997.\n",
- " | .. [3] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations I:\n",
- " | Nonstiff Problems\", Sec. III.2.\n",
- " | .. [4] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n",
- " | sparse Jacobian matrices\", Journal of the Institute of Mathematics\n",
- " | and its Applications, 13, pp. 117-120, 1974.\n",
- " | \n",
- " | Method resolution order:\n",
- " | BDF\n",
- " | scipy.integrate._ivp.base.OdeSolver\n",
- " | builtins.object\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, **extraneous)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class DenseOutput(builtins.object)\n",
- " | Base class for local interpolant over step made by an ODE solver.\n",
- " | \n",
- " | It interpolates between `t_min` and `t_max` (see Attributes below).\n",
- " | Evaluation outside this interval is not forbidden, but the accuracy is not\n",
- " | guaranteed.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | t_min, t_max : float\n",
- " | Time range of the interpolation.\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __call__(self, t)\n",
- " | Evaluate the interpolant.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | t : float or array_like with shape (n_points,)\n",
- " | Points to evaluate the solution at.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | y : ndarray, shape (n,) or (n, n_points)\n",
- " | Computed values. Shape depends on whether `t` was a scalar or a\n",
- " | 1-d array.\n",
- " | \n",
- " | __init__(self, t_old, t)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " \n",
- " class IntegrationWarning(builtins.UserWarning)\n",
- " | Warning on issues during integration.\n",
- " | \n",
- " | Method resolution order:\n",
- " | IntegrationWarning\n",
- " | builtins.UserWarning\n",
- " | builtins.Warning\n",
- " | builtins.Exception\n",
- " | builtins.BaseException\n",
- " | builtins.object\n",
- " | \n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from builtins.UserWarning:\n",
- " | \n",
- " | __init__(self, /, *args, **kwargs)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | __new__(*args, **kwargs) from builtins.type\n",
- " | Create and return a new object. See help(type) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from builtins.BaseException:\n",
- " | \n",
- " | __delattr__(self, name, /)\n",
- " | Implement delattr(self, name).\n",
- " | \n",
- " | __getattribute__(self, name, /)\n",
- " | Return getattr(self, name).\n",
- " | \n",
- " | __reduce__(...)\n",
- " | helper for pickle\n",
- " | \n",
- " | __repr__(self, /)\n",
- " | Return repr(self).\n",
- " | \n",
- " | __setattr__(self, name, value, /)\n",
- " | Implement setattr(self, name, value).\n",
- " | \n",
- " | __setstate__(...)\n",
- " | \n",
- " | __str__(self, /)\n",
- " | Return str(self).\n",
- " | \n",
- " | with_traceback(...)\n",
- " | Exception.with_traceback(tb) --\n",
- " | set self.__traceback__ to tb and return self.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from builtins.BaseException:\n",
- " | \n",
- " | __cause__\n",
- " | exception cause\n",
- " | \n",
- " | __context__\n",
- " | exception context\n",
- " | \n",
- " | __dict__\n",
- " | \n",
- " | __suppress_context__\n",
- " | \n",
- " | __traceback__\n",
- " | \n",
- " | args\n",
- " \n",
- " class LSODA(scipy.integrate._ivp.base.OdeSolver)\n",
- " | Adams/BDF method with automatic stiffness detection and switching.\n",
- " | \n",
- " | This is a wrapper to the Fortran solver from ODEPACK [1]_. It switches\n",
- " | automatically between the nonstiff Adams method and the stiff BDF method.\n",
- " | The method was originally detailed in [2]_.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " | must return array_like with shape (n, k), i.e. each column\n",
- " | corresponds to a single column in ``y``. The choice between the two\n",
- " | options is determined by `vectorized` argument (see below). The\n",
- " | vectorized implementation allows faster approximation of the Jacobian\n",
- " | by finite differences.\n",
- " | t0 : float\n",
- " | Initial time.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial state.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | first_step : float or None, optional\n",
- " | Initial step size. Default is ``None`` which means that the algorithm\n",
- " | should choose.\n",
- " | min_step : float, optional\n",
- " | Minimum allowed step size. Default is 0.0, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | max_step : float, optional\n",
- " | Maximum allowed step size. Default is ``np.inf``, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | rtol, atol : float and array_like, optional\n",
- " | Relative and absolute tolerances. The solver keeps the local error\n",
- " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " | relative accuracy (number of correct digits). But if a component of `y`\n",
- " | is approximately below `atol` then the error only needs to fall within\n",
- " | the same `atol` threshold, and the number of correct digits is not\n",
- " | guaranteed. If components of y have different scales, it might be\n",
- " | beneficial to set different `atol` values for different components by\n",
- " | passing array_like with shape (n,) for `atol`. Default values are\n",
- " | 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " | jac : None or callable, optional\n",
- " | Jacobian matrix of the right-hand side of the system with respect to\n",
- " | ``y``. The Jacobian matrix has shape (n, n) and its element (i, j) is\n",
- " | equal to ``d f_i / d y_j``. The function will be called as\n",
- " | ``jac(t, y)``. If None (default), then the Jacobian will be\n",
- " | approximated by finite differences. It is generally recommended to\n",
- " | provide the Jacobian rather than relying on a finite difference\n",
- " | approximation.\n",
- " | lband, uband : int or None, optional\n",
- " | Jacobian band width:\n",
- " | ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Setting these\n",
- " | requires your jac routine to return the Jacobian in the packed format:\n",
- " | the returned array must have ``n`` columns and ``uband + lband + 1``\n",
- " | rows in which Jacobian diagonals are written. Specifically\n",
- " | ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format is used\n",
- " | in `scipy.linalg.solve_banded` (check for an illustration).\n",
- " | These parameters can be also used with ``jac=None`` to reduce the\n",
- " | number of Jacobian elements estimated by finite differences.\n",
- " | vectorized : bool, optional\n",
- " | Whether `fun` is implemented in a vectorized fashion. A vectorized\n",
- " | implementation offers no advantages for this solver. Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [1] A. C. Hindmarsh, \"ODEPACK, A Systematized Collection of ODE\n",
- " | Solvers,\" IMACS Transactions on Scientific Computation, Vol 1.,\n",
- " | pp. 55-64, 1983.\n",
- " | .. [2] L. Petzold, \"Automatic selection of methods for solving stiff and\n",
- " | nonstiff systems of ordinary differential equations\", SIAM Journal\n",
- " | on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148,\n",
- " | 1983.\n",
- " | \n",
- " | Method resolution order:\n",
- " | LSODA\n",
- " | scipy.integrate._ivp.base.OdeSolver\n",
- " | builtins.object\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, first_step=None, min_step=0.0, max_step=inf, rtol=0.001, atol=1e-06, jac=None, lband=None, uband=None, vectorized=False, **extraneous)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class OdeSolution(builtins.object)\n",
- " | Continuous ODE solution.\n",
- " | \n",
- " | It is organized as a collection of `DenseOutput` objects which represent\n",
- " | local interpolants. It provides an algorithm to select a right interpolant\n",
- " | for each given point.\n",
- " | \n",
- " | The interpolants cover the range between `t_min` and `t_max` (see\n",
- " | Attributes below). Evaluation outside this interval is not forbidden, but\n",
- " | the accuracy is not guaranteed.\n",
- " | \n",
- " | When evaluating at a breakpoint (one of the values in `ts`) a segment with\n",
- " | the lower index is selected.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | ts : array_like, shape (n_segments + 1,)\n",
- " | Time instants between which local interpolants are defined. Must\n",
- " | be strictly increasing or decreasing (zero segment with two points is\n",
- " | also allowed).\n",
- " | interpolants : list of DenseOutput with n_segments elements\n",
- " | Local interpolants. An i-th interpolant is assumed to be defined\n",
- " | between ``ts[i]`` and ``ts[i + 1]``.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | t_min, t_max : float\n",
- " | Time range of the interpolation.\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __call__(self, t)\n",
- " | Evaluate the solution.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | t : float or array_like with shape (n_points,)\n",
- " | Points to evaluate at.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | y : ndarray, shape (n_states,) or (n_states, n_points)\n",
- " | Computed values. Shape depends on whether `t` is a scalar or a\n",
- " | 1-d array.\n",
- " | \n",
- " | __init__(self, ts, interpolants)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " \n",
- " class OdeSolver(builtins.object)\n",
- " | Base class for ODE solvers.\n",
- " | \n",
- " | In order to implement a new solver you need to follow the guidelines:\n",
- " | \n",
- " | 1. A constructor must accept parameters presented in the base class\n",
- " | (listed below) along with any other parameters specific to a solver.\n",
- " | 2. A constructor must accept arbitrary extraneous arguments\n",
- " | ``**extraneous``, but warn that these arguments are irrelevant\n",
- " | using `common.warn_extraneous` function. Do not pass these\n",
- " | arguments to the base class.\n",
- " | 3. A solver must implement a private method `_step_impl(self)` which\n",
- " | propagates a solver one step further. It must return tuple\n",
- " | ``(success, message)``, where ``success`` is a boolean indicating\n",
- " | whether a step was successful, and ``message`` is a string\n",
- " | containing description of a failure if a step failed or None\n",
- " | otherwise.\n",
- " | 4. A solver must implement a private method `_dense_output_impl(self)`\n",
- " | which returns a `DenseOutput` object covering the last successful\n",
- " | step.\n",
- " | 5. A solver must have attributes listed below in Attributes section.\n",
- " | Note that `t_old` and `step_size` are updated automatically.\n",
- " | 6. Use `fun(self, t, y)` method for the system rhs evaluation, this\n",
- " | way the number of function evaluations (`nfev`) will be tracked\n",
- " | automatically.\n",
- " | 7. For convenience a base class provides `fun_single(self, t, y)` and\n",
- " | `fun_vectorized(self, t, y)` for evaluating the rhs in\n",
- " | non-vectorized and vectorized fashions respectively (regardless of\n",
- " | how `fun` from the constructor is implemented). These calls don't\n",
- " | increment `nfev`.\n",
- " | 8. If a solver uses a Jacobian matrix and LU decompositions, it should\n",
- " | track the number of Jacobian evaluations (`njev`) and the number of\n",
- " | LU decompositions (`nlu`).\n",
- " | 9. By convention the function evaluations used to compute a finite\n",
- " | difference approximation of the Jacobian should not be counted in\n",
- " | `nfev`, thus use `fun_single(self, t, y)` or\n",
- " | `fun_vectorized(self, t, y)` when computing a finite difference\n",
- " | approximation of the Jacobian.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, n_points), then\n",
- " | ``fun`` must return array_like with shape (n, n_points) (each column\n",
- " | corresponds to a single column in ``y``). The choice between the two\n",
- " | options is determined by `vectorized` argument (see below).\n",
- " | t0 : float\n",
- " | Initial time.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial state.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | vectorized : bool\n",
- " | Whether `fun` is implemented in a vectorized fashion.\n",
- " | support_complex : bool, optional\n",
- " | Whether integration in a complex domain should be supported.\n",
- " | Generally determined by a derived solver class capabilities.\n",
- " | Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | step_size : float\n",
- " | Size of the last successful step. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | nlu : int\n",
- " | Number of LU decompositions.\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, vectorized, support_complex=False)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes defined here:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class RK23(RungeKutta)\n",
- " | Explicit Runge-Kutta method of order 3(2).\n",
- " | \n",
- " | The Bogacki-Shamping pair of formulas is used [1]_. The error is controlled\n",
- " | assuming 2nd order accuracy, but steps are taken using a 3rd oder accurate\n",
- " | formula (local extrapolation is done). A cubic Hermit polynomial is used\n",
- " | for the dense output.\n",
- " | \n",
- " | Can be applied in a complex domain.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " | must return array_like with shape (n, k), i.e. each column\n",
- " | corresponds to a single column in ``y``. The choice between the two\n",
- " | options is determined by `vectorized` argument (see below). The\n",
- " | vectorized implementation allows faster approximation of the Jacobian\n",
- " | by finite differences.\n",
- " | t0 : float\n",
- " | Initial time.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial state.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | max_step : float, optional\n",
- " | Maximum allowed step size. Default is np.inf, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | rtol, atol : float and array_like, optional\n",
- " | Relative and absolute tolerances. The solver keeps the local error\n",
- " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " | relative accuracy (number of correct digits). But if a component of `y`\n",
- " | is approximately below `atol` then the error only needs to fall within\n",
- " | the same `atol` threshold, and the number of correct digits is not\n",
- " | guaranteed. If components of y have different scales, it might be\n",
- " | beneficial to set different `atol` values for different components by\n",
- " | passing array_like with shape (n,) for `atol`. Default values are\n",
- " | 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " | vectorized : bool, optional\n",
- " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | step_size : float\n",
- " | Size of the last successful step. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | nlu : int\n",
- " | Number of LU decompositions.\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [1] P. Bogacki, L.F. Shampine, \"A 3(2) Pair of Runge-Kutta Formulas\",\n",
- " | Appl. Math. Lett. Vol. 2, No. 4. pp. 321-325, 1989.\n",
- " | \n",
- " | Method resolution order:\n",
- " | RK23\n",
- " | RungeKutta\n",
- " | scipy.integrate._ivp.base.OdeSolver\n",
- " | builtins.object\n",
- " | \n",
- " | Data and other attributes defined here:\n",
- " | \n",
- " | A = [array([ 0.5]), array([ 0. , 0.75])]\n",
- " | \n",
- " | B = array([ 0.22222222, 0.33333333, 0.44444444])\n",
- " | \n",
- " | C = array([ 0.5 , 0.75])\n",
- " | \n",
- " | E = array([ 0.06944444, -0.08333333, -0.11111111, 0.125 ])\n",
- " | \n",
- " | P = array([[ 1. , -1.33333333, 0.55555556],\n",
- " | ...\n",
- " | [ 0. ...\n",
- " | \n",
- " | n_stages = 3\n",
- " | \n",
- " | order = 2\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from RungeKutta:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, **extraneous)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class RK45(RungeKutta)\n",
- " | Explicit Runge-Kutta method of order 5(4).\n",
- " | \n",
- " | The Dormand-Prince pair of formulas is used [1]_. The error is controlled\n",
- " | assuming 4th order accuracy, but steps are taken using a 5th\n",
- " | oder accurate formula (local extrapolation is done). A quartic\n",
- " | interpolation polynomial is used for the dense output [2]_.\n",
- " | \n",
- " | Can be applied in a complex domain.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " | must return array_like with shape (n, k), i.e. each column\n",
- " | corresponds to a single column in ``y``. The choice between the two\n",
- " | options is determined by `vectorized` argument (see below). The\n",
- " | vectorized implementation allows faster approximation of the Jacobian\n",
- " | by finite differences.\n",
- " | t0 : float\n",
- " | Initial value of the independent variable.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial values of the dependent variable.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | max_step : float, optional\n",
- " | Maximum allowed step size. Default is np.inf, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | rtol, atol : float and array_like, optional\n",
- " | Relative and absolute tolerances. The solver keeps the local error\n",
- " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " | relative accuracy (number of correct digits). But if a component of `y`\n",
- " | is approximately below `atol` then the error only needs to fall within\n",
- " | the same `atol` threshold, and the number of correct digits is not\n",
- " | guaranteed. If components of y have different scales, it might be\n",
- " | beneficial to set different `atol` values for different components by\n",
- " | passing array_like with shape (n,) for `atol`. Default values are\n",
- " | 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " | vectorized : bool, optional\n",
- " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | step_size : float\n",
- " | Size of the last successful step. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | nlu : int\n",
- " | Number of LU decompositions.\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [1] J. R. Dormand, P. J. Prince, \"A family of embedded Runge-Kutta\n",
- " | formulae\", Journal of Computational and Applied Mathematics, Vol. 6,\n",
- " | No. 1, pp. 19-26, 1980.\n",
- " | .. [2] L. W. Shampine, \"Some Practical Runge-Kutta Formulas\", Mathematics\n",
- " | of Computation,, Vol. 46, No. 173, pp. 135-150, 1986.\n",
- " | \n",
- " | Method resolution order:\n",
- " | RK45\n",
- " | RungeKutta\n",
- " | scipy.integrate._ivp.base.OdeSolver\n",
- " | builtins.object\n",
- " | \n",
- " | Data and other attributes defined here:\n",
- " | \n",
- " | A = [array([ 0.2]), array([ 0.075, 0.225]), array([ 0.97777778, -3.73...\n",
- " | \n",
- " | B = array([ 0.09114583, 0. , 0.4492363 , 0.65104167, -0.3223...\n",
- " | \n",
- " | C = array([ 0.2 , 0.3 , 0.8 , 0.88888889, 1. ...\n",
- " | \n",
- " | E = array([-0.00123264, 0. , 0.00425277, -0...7, 0.0508638 ,...\n",
- " | \n",
- " | P = array([[ 1. , -2.85358007, 3.07174346... , 1.38246...\n",
- " | \n",
- " | n_stages = 6\n",
- " | \n",
- " | order = 4\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from RungeKutta:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, vectorized=False, **extraneous)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class Radau(scipy.integrate._ivp.base.OdeSolver)\n",
- " | Implicit Runge-Kutta method of Radau IIA family of order 5.\n",
- " | \n",
- " | Implementation follows [1]_. The error is controlled for a 3rd order\n",
- " | accurate embedded formula. A cubic polynomial which satisfies the\n",
- " | collocation conditions is used for the dense output.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | fun : callable\n",
- " | Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " | Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " | It can either have shape (n,), then ``fun`` must return array_like with\n",
- " | shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " | must return array_like with shape (n, k), i.e. each column\n",
- " | corresponds to a single column in ``y``. The choice between the two\n",
- " | options is determined by `vectorized` argument (see below). The\n",
- " | vectorized implementation allows faster approximation of the Jacobian\n",
- " | by finite differences.\n",
- " | t0 : float\n",
- " | Initial time.\n",
- " | y0 : array_like, shape (n,)\n",
- " | Initial state.\n",
- " | t_bound : float\n",
- " | Boundary time --- the integration won't continue beyond it. It also\n",
- " | determines the direction of the integration.\n",
- " | max_step : float, optional\n",
- " | Maximum allowed step size. Default is np.inf, i.e. the step is not\n",
- " | bounded and determined solely by the solver.\n",
- " | rtol, atol : float and array_like, optional\n",
- " | Relative and absolute tolerances. The solver keeps the local error\n",
- " | estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " | relative accuracy (number of correct digits). But if a component of `y`\n",
- " | is approximately below `atol` then the error only needs to fall within\n",
- " | the same `atol` threshold, and the number of correct digits is not\n",
- " | guaranteed. If components of y have different scales, it might be\n",
- " | beneficial to set different `atol` values for different components by\n",
- " | passing array_like with shape (n,) for `atol`. Default values are\n",
- " | 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " | jac : {None, array_like, sparse_matrix, callable}, optional\n",
- " | Jacobian matrix of the right-hand side of the system with respect to\n",
- " | y, required only by 'Radau' and 'BDF' methods. The Jacobian matrix\n",
- " | has shape (n, n) and its element (i, j) is equal to ``d f_i / d y_j``.\n",
- " | There are 3 ways to define the Jacobian:\n",
- " | \n",
- " | * If array_like or sparse_matrix, then the Jacobian is assumed to\n",
- " | be constant.\n",
- " | * If callable, then the Jacobian is assumed to depend on both\n",
- " | t and y, and will be called as ``jac(t, y)`` as necessary. The\n",
- " | return value might be a sparse matrix.\n",
- " | * If None (default), then the Jacobian will be approximated by\n",
- " | finite differences.\n",
- " | \n",
- " | It is generally recommended to provide the Jacobian rather than\n",
- " | relying on a finite difference approximation.\n",
- " | jac_sparsity : {None, array_like, sparse matrix}, optional\n",
- " | Defines a sparsity structure of the Jacobian matrix for a finite\n",
- " | difference approximation, its shape must be (n, n). If the Jacobian has\n",
- " | only few non-zero elements in *each* row, providing the sparsity\n",
- " | structure will greatly speed up the computations [2]_. A zero\n",
- " | entry means that a corresponding element in the Jacobian is identically\n",
- " | zero. If None (default), the Jacobian is assumed to be dense.\n",
- " | vectorized : bool, optional\n",
- " | Whether `fun` is implemented in a vectorized fashion. Default is False.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | n : int\n",
- " | Number of equations.\n",
- " | status : string\n",
- " | Current status of the solver: 'running', 'finished' or 'failed'.\n",
- " | t_bound : float\n",
- " | Boundary time.\n",
- " | direction : float\n",
- " | Integration direction: +1 or -1.\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current state.\n",
- " | t_old : float\n",
- " | Previous time. None if no steps were made yet.\n",
- " | step_size : float\n",
- " | Size of the last successful step. None if no steps were made yet.\n",
- " | nfev : int\n",
- " | Number of the system's rhs evaluations.\n",
- " | njev : int\n",
- " | Number of the Jacobian evaluations.\n",
- " | nlu : int\n",
- " | Number of LU decompositions.\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [1] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations II:\n",
- " | Stiff and Differential-Algebraic Problems\", Sec. IV.8.\n",
- " | .. [2] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n",
- " | sparse Jacobian matrices\", Journal of the Institute of Mathematics\n",
- " | and its Applications, 13, pp. 117-120, 1974.\n",
- " | \n",
- " | Method resolution order:\n",
- " | Radau\n",
- " | scipy.integrate._ivp.base.OdeSolver\n",
- " | builtins.object\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, fun, t0, y0, t_bound, max_step=inf, rtol=0.001, atol=1e-06, jac=None, jac_sparsity=None, vectorized=False, **extraneous)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | dense_output(self)\n",
- " | Compute a local interpolant over the last successful step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | sol : `DenseOutput`\n",
- " | Local interpolant over the last successful step.\n",
- " | \n",
- " | step(self)\n",
- " | Perform one integration step.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | message : string or None\n",
- " | Report from the solver. Typically a reason for a failure if\n",
- " | `self.status` is 'failed' after the step was taken or None\n",
- " | otherwise.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | step_size\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data and other attributes inherited from scipy.integrate._ivp.base.OdeSolver:\n",
- " | \n",
- " | TOO_SMALL_STEP = 'Required step size is less than spacing between numb...\n",
- " \n",
- " class complex_ode(ode)\n",
- " | A wrapper of ode for complex systems.\n",
- " | \n",
- " | This functions similarly as `ode`, but re-maps a complex-valued\n",
- " | equation system to a real-valued one before using the integrators.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | f : callable ``f(t, y, *f_args)``\n",
- " | Rhs of the equation. t is a scalar, ``y.shape == (n,)``.\n",
- " | ``f_args`` is set by calling ``set_f_params(*args)``.\n",
- " | jac : callable ``jac(t, y, *jac_args)``\n",
- " | Jacobian of the rhs, ``jac[i,j] = d f[i] / d y[j]``.\n",
- " | ``jac_args`` is set by calling ``set_f_params(*args)``.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current variable values.\n",
- " | \n",
- " | Examples\n",
- " | --------\n",
- " | For usage examples, see `ode`.\n",
- " | \n",
- " | Method resolution order:\n",
- " | complex_ode\n",
- " | ode\n",
- " | builtins.object\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, f, jac=None)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | integrate(self, t, step=False, relax=False)\n",
- " | Find y=y(t), set y as an initial condition, and return y.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | t : float\n",
- " | The endpoint of the integration step.\n",
- " | step : bool\n",
- " | If True, and if the integrator supports the step method,\n",
- " | then perform a single integration step and return.\n",
- " | This parameter is provided in order to expose internals of\n",
- " | the implementation, and should not be changed from its default\n",
- " | value in most cases.\n",
- " | relax : bool\n",
- " | If True and if the integrator supports the run_relax method,\n",
- " | then integrate until t_1 >= t and return. ``relax`` is not\n",
- " | referenced if ``step=True``.\n",
- " | This parameter is provided in order to expose internals of\n",
- " | the implementation, and should not be changed from its default\n",
- " | value in most cases.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | y : float\n",
- " | The integrated value at t\n",
- " | \n",
- " | set_initial_value(self, y, t=0.0)\n",
- " | Set initial conditions y(t) = y.\n",
- " | \n",
- " | set_integrator(self, name, **integrator_params)\n",
- " | Set integrator by name.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | name : str\n",
- " | Name of the integrator\n",
- " | integrator_params\n",
- " | Additional parameters for the integrator.\n",
- " | \n",
- " | set_solout(self, solout)\n",
- " | Set callable to be called at every successful integration step.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | solout : callable\n",
- " | ``solout(t, y)`` is called at each internal integrator step,\n",
- " | t is a scalar providing the current independent position\n",
- " | y is the current soloution ``y.shape == (n,)``\n",
- " | solout should return -1 to stop integration\n",
- " | otherwise it should return None or 0\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | y\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from ode:\n",
- " | \n",
- " | get_return_code(self)\n",
- " | Extracts the return code for the integration to enable better control\n",
- " | if the integration fails.\n",
- " | \n",
- " | set_f_params(self, *args)\n",
- " | Set extra parameters for user-supplied function f.\n",
- " | \n",
- " | set_jac_params(self, *args)\n",
- " | Set extra parameters for user-supplied function jac.\n",
- " | \n",
- " | successful(self)\n",
- " | Check if integration was successful.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from ode:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " \n",
- " class ode(builtins.object)\n",
- " | A generic interface class to numeric integrators.\n",
- " | \n",
- " | Solve an equation system :math:`y'(t) = f(t,y)` with (optional) ``jac = df/dy``.\n",
- " | \n",
- " | *Note*: The first two arguments of ``f(t, y, ...)`` are in the\n",
- " | opposite order of the arguments in the system definition function used\n",
- " | by `scipy.integrate.odeint`.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | f : callable ``f(t, y, *f_args)``\n",
- " | Right-hand side of the differential equation. t is a scalar,\n",
- " | ``y.shape == (n,)``.\n",
- " | ``f_args`` is set by calling ``set_f_params(*args)``.\n",
- " | `f` should return a scalar, array or list (not a tuple).\n",
- " | jac : callable ``jac(t, y, *jac_args)``, optional\n",
- " | Jacobian of the right-hand side, ``jac[i,j] = d f[i] / d y[j]``.\n",
- " | ``jac_args`` is set by calling ``set_jac_params(*args)``.\n",
- " | \n",
- " | Attributes\n",
- " | ----------\n",
- " | t : float\n",
- " | Current time.\n",
- " | y : ndarray\n",
- " | Current variable values.\n",
- " | \n",
- " | See also\n",
- " | --------\n",
- " | odeint : an integrator with a simpler interface based on lsoda from ODEPACK\n",
- " | quad : for finding the area under a curve\n",
- " | \n",
- " | Notes\n",
- " | -----\n",
- " | Available integrators are listed below. They can be selected using\n",
- " | the `set_integrator` method.\n",
- " | \n",
- " | \"vode\"\n",
- " | \n",
- " | Real-valued Variable-coefficient Ordinary Differential Equation\n",
- " | solver, with fixed-leading-coefficient implementation. It provides\n",
- " | implicit Adams method (for non-stiff problems) and a method based on\n",
- " | backward differentiation formulas (BDF) (for stiff problems).\n",
- " | \n",
- " | Source: http://www.netlib.org/ode/vode.f\n",
- " | \n",
- " | .. warning::\n",
- " | \n",
- " | This integrator is not re-entrant. You cannot have two `ode`\n",
- " | instances using the \"vode\" integrator at the same time.\n",
- " | \n",
- " | This integrator accepts the following parameters in `set_integrator`\n",
- " | method of the `ode` class:\n",
- " | \n",
- " | - atol : float or sequence\n",
- " | absolute tolerance for solution\n",
- " | - rtol : float or sequence\n",
- " | relative tolerance for solution\n",
- " | - lband : None or int\n",
- " | - uband : None or int\n",
- " | Jacobian band width, jac[i,j] != 0 for i-lband <= j <= i+uband.\n",
- " | Setting these requires your jac routine to return the jacobian\n",
- " | in packed format, jac_packed[i-j+uband, j] = jac[i,j]. The\n",
- " | dimension of the matrix must be (lband+uband+1, len(y)).\n",
- " | - method: 'adams' or 'bdf'\n",
- " | Which solver to use, Adams (non-stiff) or BDF (stiff)\n",
- " | - with_jacobian : bool\n",
- " | This option is only considered when the user has not supplied a\n",
- " | Jacobian function and has not indicated (by setting either band)\n",
- " | that the Jacobian is banded. In this case, `with_jacobian` specifies\n",
- " | whether the iteration method of the ODE solver's correction step is\n",
- " | chord iteration with an internally generated full Jacobian or\n",
- " | functional iteration with no Jacobian.\n",
- " | - nsteps : int\n",
- " | Maximum number of (internally defined) steps allowed during one\n",
- " | call to the solver.\n",
- " | - first_step : float\n",
- " | - min_step : float\n",
- " | - max_step : float\n",
- " | Limits for the step sizes used by the integrator.\n",
- " | - order : int\n",
- " | Maximum order used by the integrator,\n",
- " | order <= 12 for Adams, <= 5 for BDF.\n",
- " | \n",
- " | \"zvode\"\n",
- " | \n",
- " | Complex-valued Variable-coefficient Ordinary Differential Equation\n",
- " | solver, with fixed-leading-coefficient implementation. It provides\n",
- " | implicit Adams method (for non-stiff problems) and a method based on\n",
- " | backward differentiation formulas (BDF) (for stiff problems).\n",
- " | \n",
- " | Source: http://www.netlib.org/ode/zvode.f\n",
- " | \n",
- " | .. warning::\n",
- " | \n",
- " | This integrator is not re-entrant. You cannot have two `ode`\n",
- " | instances using the \"zvode\" integrator at the same time.\n",
- " | \n",
- " | This integrator accepts the same parameters in `set_integrator`\n",
- " | as the \"vode\" solver.\n",
- " | \n",
- " | .. note::\n",
- " | \n",
- " | When using ZVODE for a stiff system, it should only be used for\n",
- " | the case in which the function f is analytic, that is, when each f(i)\n",
- " | is an analytic function of each y(j). Analyticity means that the\n",
- " | partial derivative df(i)/dy(j) is a unique complex number, and this\n",
- " | fact is critical in the way ZVODE solves the dense or banded linear\n",
- " | systems that arise in the stiff case. For a complex stiff ODE system\n",
- " | in which f is not analytic, ZVODE is likely to have convergence\n",
- " | failures, and for this problem one should instead use DVODE on the\n",
- " | equivalent real system (in the real and imaginary parts of y).\n",
- " | \n",
- " | \"lsoda\"\n",
- " | \n",
- " | Real-valued Variable-coefficient Ordinary Differential Equation\n",
- " | solver, with fixed-leading-coefficient implementation. It provides\n",
- " | automatic method switching between implicit Adams method (for non-stiff\n",
- " | problems) and a method based on backward differentiation formulas (BDF)\n",
- " | (for stiff problems).\n",
- " | \n",
- " | Source: http://www.netlib.org/odepack\n",
- " | \n",
- " | .. warning::\n",
- " | \n",
- " | This integrator is not re-entrant. You cannot have two `ode`\n",
- " | instances using the \"lsoda\" integrator at the same time.\n",
- " | \n",
- " | This integrator accepts the following parameters in `set_integrator`\n",
- " | method of the `ode` class:\n",
- " | \n",
- " | - atol : float or sequence\n",
- " | absolute tolerance for solution\n",
- " | - rtol : float or sequence\n",
- " | relative tolerance for solution\n",
- " | - lband : None or int\n",
- " | - uband : None or int\n",
- " | Jacobian band width, jac[i,j] != 0 for i-lband <= j <= i+uband.\n",
- " | Setting these requires your jac routine to return the jacobian\n",
- " | in packed format, jac_packed[i-j+uband, j] = jac[i,j].\n",
- " | - with_jacobian : bool\n",
- " | *Not used.*\n",
- " | - nsteps : int\n",
- " | Maximum number of (internally defined) steps allowed during one\n",
- " | call to the solver.\n",
- " | - first_step : float\n",
- " | - min_step : float\n",
- " | - max_step : float\n",
- " | Limits for the step sizes used by the integrator.\n",
- " | - max_order_ns : int\n",
- " | Maximum order used in the nonstiff case (default 12).\n",
- " | - max_order_s : int\n",
- " | Maximum order used in the stiff case (default 5).\n",
- " | - max_hnil : int\n",
- " | Maximum number of messages reporting too small step size (t + h = t)\n",
- " | (default 0)\n",
- " | - ixpr : int\n",
- " | Whether to generate extra printing at method switches (default False).\n",
- " | \n",
- " | \"dopri5\"\n",
- " | \n",
- " | This is an explicit runge-kutta method of order (4)5 due to Dormand &\n",
- " | Prince (with stepsize control and dense output).\n",
- " | \n",
- " | Authors:\n",
- " | \n",
- " | E. Hairer and G. Wanner\n",
- " | Universite de Geneve, Dept. de Mathematiques\n",
- " | CH-1211 Geneve 24, Switzerland\n",
- " | e-mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch\n",
- " | \n",
- " | This code is described in [HNW93]_.\n",
- " | \n",
- " | This integrator accepts the following parameters in set_integrator()\n",
- " | method of the ode class:\n",
- " | \n",
- " | - atol : float or sequence\n",
- " | absolute tolerance for solution\n",
- " | - rtol : float or sequence\n",
- " | relative tolerance for solution\n",
- " | - nsteps : int\n",
- " | Maximum number of (internally defined) steps allowed during one\n",
- " | call to the solver.\n",
- " | - first_step : float\n",
- " | - max_step : float\n",
- " | - safety : float\n",
- " | Safety factor on new step selection (default 0.9)\n",
- " | - ifactor : float\n",
- " | - dfactor : float\n",
- " | Maximum factor to increase/decrease step size by in one step\n",
- " | - beta : float\n",
- " | Beta parameter for stabilised step size control.\n",
- " | - verbosity : int\n",
- " | Switch for printing messages (< 0 for no messages).\n",
- " | \n",
- " | \"dop853\"\n",
- " | \n",
- " | This is an explicit runge-kutta method of order 8(5,3) due to Dormand\n",
- " | & Prince (with stepsize control and dense output).\n",
- " | \n",
- " | Options and references the same as \"dopri5\".\n",
- " | \n",
- " | Examples\n",
- " | --------\n",
- " | \n",
- " | A problem to integrate and the corresponding jacobian:\n",
- " | \n",
- " | >>> from scipy.integrate import ode\n",
- " | >>>\n",
- " | >>> y0, t0 = [1.0j, 2.0], 0\n",
- " | >>>\n",
- " | >>> def f(t, y, arg1):\n",
- " | ... return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]\n",
- " | >>> def jac(t, y, arg1):\n",
- " | ... return [[1j*arg1, 1], [0, -arg1*2*y[1]]]\n",
- " | \n",
- " | The integration:\n",
- " | \n",
- " | >>> r = ode(f, jac).set_integrator('zvode', method='bdf')\n",
- " | >>> r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)\n",
- " | >>> t1 = 10\n",
- " | >>> dt = 1\n",
- " | >>> while r.successful() and r.t < t1:\n",
- " | ... print(r.t+dt, r.integrate(r.t+dt))\n",
- " | 1 [-0.71038232+0.23749653j 0.40000271+0.j ]\n",
- " | 2.0 [ 0.19098503-0.52359246j 0.22222356+0.j ]\n",
- " | 3.0 [ 0.47153208+0.52701229j 0.15384681+0.j ]\n",
- " | 4.0 [-0.61905937+0.30726255j 0.11764744+0.j ]\n",
- " | 5.0 [ 0.02340997-0.61418799j 0.09523835+0.j ]\n",
- " | 6.0 [ 0.58643071+0.339819j 0.08000018+0.j ]\n",
- " | 7.0 [-0.52070105+0.44525141j 0.06896565+0.j ]\n",
- " | 8.0 [-0.15986733-0.61234476j 0.06060616+0.j ]\n",
- " | 9.0 [ 0.64850462+0.15048982j 0.05405414+0.j ]\n",
- " | 10.0 [-0.38404699+0.56382299j 0.04878055+0.j ]\n",
- " | \n",
- " | References\n",
- " | ----------\n",
- " | .. [HNW93] E. Hairer, S.P. Norsett and G. Wanner, Solving Ordinary\n",
- " | Differential Equations i. Nonstiff Problems. 2nd edition.\n",
- " | Springer Series in Computational Mathematics,\n",
- " | Springer-Verlag (1993)\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, f, jac=None)\n",
- " | Initialize self. See help(type(self)) for accurate signature.\n",
- " | \n",
- " | get_return_code(self)\n",
- " | Extracts the return code for the integration to enable better control\n",
- " | if the integration fails.\n",
- " | \n",
- " | integrate(self, t, step=False, relax=False)\n",
- " | Find y=y(t), set y as an initial condition, and return y.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | t : float\n",
- " | The endpoint of the integration step.\n",
- " | step : bool\n",
- " | If True, and if the integrator supports the step method,\n",
- " | then perform a single integration step and return.\n",
- " | This parameter is provided in order to expose internals of\n",
- " | the implementation, and should not be changed from its default\n",
- " | value in most cases.\n",
- " | relax : bool\n",
- " | If True and if the integrator supports the run_relax method,\n",
- " | then integrate until t_1 >= t and return. ``relax`` is not\n",
- " | referenced if ``step=True``.\n",
- " | This parameter is provided in order to expose internals of\n",
- " | the implementation, and should not be changed from its default\n",
- " | value in most cases.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | y : float\n",
- " | The integrated value at t\n",
- " | \n",
- " | set_f_params(self, *args)\n",
- " | Set extra parameters for user-supplied function f.\n",
- " | \n",
- " | set_initial_value(self, y, t=0.0)\n",
- " | Set initial conditions y(t) = y.\n",
- " | \n",
- " | set_integrator(self, name, **integrator_params)\n",
- " | Set integrator by name.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | name : str\n",
- " | Name of the integrator.\n",
- " | integrator_params\n",
- " | Additional parameters for the integrator.\n",
- " | \n",
- " | set_jac_params(self, *args)\n",
- " | Set extra parameters for user-supplied function jac.\n",
- " | \n",
- " | set_solout(self, solout)\n",
- " | Set callable to be called at every successful integration step.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | solout : callable\n",
- " | ``solout(t, y)`` is called at each internal integrator step,\n",
- " | t is a scalar providing the current independent position\n",
- " | y is the current soloution ``y.shape == (n,)``\n",
- " | solout should return -1 to stop integration\n",
- " | otherwise it should return None or 0\n",
- " | \n",
- " | successful(self)\n",
- " | Check if integration was successful.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | y\n",
- "\n",
- "FUNCTIONS\n",
- " cumtrapz(y, x=None, dx=1.0, axis=-1, initial=None)\n",
- " Cumulatively integrate y(x) using the composite trapezoidal rule.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " y : array_like\n",
- " Values to integrate.\n",
- " x : array_like, optional\n",
- " The coordinate to integrate along. If None (default), use spacing `dx`\n",
- " between consecutive elements in `y`.\n",
- " dx : float, optional\n",
- " Spacing between elements of `y`. Only used if `x` is None.\n",
- " axis : int, optional\n",
- " Specifies the axis to cumulate. Default is -1 (last axis).\n",
- " initial : scalar, optional\n",
- " If given, uses this value as the first value in the returned result.\n",
- " Typically this value should be 0. Default is None, which means no\n",
- " value at ``x[0]`` is returned and `res` has one element less than `y`\n",
- " along the axis of integration.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " res : ndarray\n",
- " The result of cumulative integration of `y` along `axis`.\n",
- " If `initial` is None, the shape is such that the axis of integration\n",
- " has one less value than `y`. If `initial` is given, the shape is equal\n",
- " to that of `y`.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " numpy.cumsum, numpy.cumprod\n",
- " quad: adaptive quadrature using QUADPACK\n",
- " romberg: adaptive Romberg quadrature\n",
- " quadrature: adaptive Gaussian quadrature\n",
- " fixed_quad: fixed-order Gaussian quadrature\n",
- " dblquad: double integrals\n",
- " tplquad: triple integrals\n",
- " romb: integrators for sampled data\n",
- " ode: ODE integrators\n",
- " odeint: ODE integrators\n",
- " \n",
- " Examples\n",
- " --------\n",
- " >>> from scipy import integrate\n",
- " >>> import matplotlib.pyplot as plt\n",
- " \n",
- " >>> x = np.linspace(-2, 2, num=20)\n",
- " >>> y = x\n",
- " >>> y_int = integrate.cumtrapz(y, x, initial=0)\n",
- " >>> plt.plot(x, y_int, 'ro', x, y[0] + 0.5 * x**2, 'b-')\n",
- " >>> plt.show()\n",
- " \n",
- " dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)\n",
- " Compute a double integral.\n",
- " \n",
- " Return the double (definite) integral of ``func(y, x)`` from ``x = a..b``\n",
- " and ``y = gfun(x)..hfun(x)``.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : callable\n",
- " A Python function or method of at least two variables: y must be the\n",
- " first argument and x the second argument.\n",
- " a, b : float\n",
- " The limits of integration in x: `a` < `b`\n",
- " gfun : callable\n",
- " The lower boundary curve in y which is a function taking a single\n",
- " floating point argument (x) and returning a floating point result: a\n",
- " lambda function can be useful here.\n",
- " hfun : callable\n",
- " The upper boundary curve in y (same requirements as `gfun`).\n",
- " args : sequence, optional\n",
- " Extra arguments to pass to `func`.\n",
- " epsabs : float, optional\n",
- " Absolute tolerance passed directly to the inner 1-D quadrature\n",
- " integration. Default is 1.49e-8.\n",
- " epsrel : float, optional\n",
- " Relative tolerance of the inner 1-D integrals. Default is 1.49e-8.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " y : float\n",
- " The resultant integral.\n",
- " abserr : float\n",
- " An estimate of the error.\n",
- " \n",
- " See also\n",
- " --------\n",
- " quad : single integral\n",
- " tplquad : triple integral\n",
- " nquad : N-dimensional integrals\n",
- " fixed_quad : fixed-order Gaussian quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " odeint : ODE integrator\n",
- " ode : ODE integrator\n",
- " simps : integrator for sampled data\n",
- " romb : integrator for sampled data\n",
- " scipy.special : for coefficients and roots of orthogonal polynomials\n",
- " \n",
- " fixed_quad(func, a, b, args=(), n=5)\n",
- " Compute a definite integral using fixed-order Gaussian quadrature.\n",
- " \n",
- " Integrate `func` from `a` to `b` using Gaussian quadrature of\n",
- " order `n`.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : callable\n",
- " A Python function or method to integrate (must accept vector inputs).\n",
- " If integrating a vector-valued function, the returned array must have\n",
- " shape ``(..., len(x))``.\n",
- " a : float\n",
- " Lower limit of integration.\n",
- " b : float\n",
- " Upper limit of integration.\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to function, if any.\n",
- " n : int, optional\n",
- " Order of quadrature integration. Default is 5.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " val : float\n",
- " Gaussian quadrature approximation to the integral\n",
- " none : None\n",
- " Statically returned value of None\n",
- " \n",
- " \n",
- " See Also\n",
- " --------\n",
- " quad : adaptive quadrature using QUADPACK\n",
- " dblquad : double integrals\n",
- " tplquad : triple integrals\n",
- " romberg : adaptive Romberg quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " romb : integrators for sampled data\n",
- " simps : integrators for sampled data\n",
- " cumtrapz : cumulative integration for sampled data\n",
- " ode : ODE integrator\n",
- " odeint : ODE integrator\n",
- " \n",
- " newton_cotes(rn, equal=0)\n",
- " Return weights and error coefficient for Newton-Cotes integration.\n",
- " \n",
- " Suppose we have (N+1) samples of f at the positions\n",
- " x_0, x_1, ..., x_N. Then an N-point Newton-Cotes formula for the\n",
- " integral between x_0 and x_N is:\n",
- " \n",
- " :math:`\\int_{x_0}^{x_N} f(x)dx = \\Delta x \\sum_{i=0}^{N} a_i f(x_i)\n",
- " + B_N (\\Delta x)^{N+2} f^{N+1} (\\xi)`\n",
- " \n",
- " where :math:`\\xi \\in [x_0,x_N]`\n",
- " and :math:`\\Delta x = \\frac{x_N-x_0}{N}` is the average samples spacing.\n",
- " \n",
- " If the samples are equally-spaced and N is even, then the error\n",
- " term is :math:`B_N (\\Delta x)^{N+3} f^{N+2}(\\xi)`.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " rn : int\n",
- " The integer order for equally-spaced data or the relative positions of\n",
- " the samples with the first sample at 0 and the last at N, where N+1 is\n",
- " the length of `rn`. N is the order of the Newton-Cotes integration.\n",
- " equal : int, optional\n",
- " Set to 1 to enforce equally spaced data.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " an : ndarray\n",
- " 1-D array of weights to apply to the function at the provided sample\n",
- " positions.\n",
- " B : float\n",
- " Error coefficient.\n",
- " \n",
- " Notes\n",
- " -----\n",
- " Normally, the Newton-Cotes rules are used on smaller integration\n",
- " regions and a composite rule is used to return the total integral.\n",
- " \n",
- " nquad(func, ranges, args=None, opts=None, full_output=False)\n",
- " Integration over multiple variables.\n",
- " \n",
- " Wraps `quad` to enable integration over multiple variables.\n",
- " Various options allow improved integration of discontinuous functions, as\n",
- " well as the use of weighted integration, and generally finer control of the\n",
- " integration process.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : {callable, scipy.LowLevelCallable}\n",
- " The function to be integrated. Has arguments of ``x0, ... xn``,\n",
- " ``t0, tm``, where integration is carried out over ``x0, ... xn``, which\n",
- " must be floats. Function signature should be\n",
- " ``func(x0, x1, ..., xn, t0, t1, ..., tm)``. Integration is carried out\n",
- " in order. That is, integration over ``x0`` is the innermost integral,\n",
- " and ``xn`` is the outermost.\n",
- " \n",
- " If the user desires improved integration performance, then `f` may\n",
- " be a `scipy.LowLevelCallable` with one of the signatures::\n",
- " \n",
- " double func(int n, double *xx)\n",
- " double func(int n, double *xx, void *user_data)\n",
- " \n",
- " where ``n`` is the number of extra parameters and args is an array\n",
- " of doubles of the additional parameters, the ``xx`` array contains the \n",
- " coordinates. The ``user_data`` is the data contained in the\n",
- " `scipy.LowLevelCallable`.\n",
- " ranges : iterable object\n",
- " Each element of ranges may be either a sequence of 2 numbers, or else\n",
- " a callable that returns such a sequence. ``ranges[0]`` corresponds to\n",
- " integration over x0, and so on. If an element of ranges is a callable,\n",
- " then it will be called with all of the integration arguments available,\n",
- " as well as any parametric arguments. e.g. if \n",
- " ``func = f(x0, x1, x2, t0, t1)``, then ``ranges[0]`` may be defined as\n",
- " either ``(a, b)`` or else as ``(a, b) = range0(x1, x2, t0, t1)``.\n",
- " args : iterable object, optional\n",
- " Additional arguments ``t0, ..., tn``, required by `func`, `ranges`, and\n",
- " ``opts``.\n",
- " opts : iterable object or dict, optional\n",
- " Options to be passed to `quad`. May be empty, a dict, or\n",
- " a sequence of dicts or functions that return a dict. If empty, the\n",
- " default options from scipy.integrate.quad are used. If a dict, the same\n",
- " options are used for all levels of integraion. If a sequence, then each\n",
- " element of the sequence corresponds to a particular integration. e.g.\n",
- " opts[0] corresponds to integration over x0, and so on. If a callable, \n",
- " the signature must be the same as for ``ranges``. The available\n",
- " options together with their default values are:\n",
- " \n",
- " - epsabs = 1.49e-08\n",
- " - epsrel = 1.49e-08\n",
- " - limit = 50\n",
- " - points = None\n",
- " - weight = None\n",
- " - wvar = None\n",
- " - wopts = None\n",
- " \n",
- " For more information on these options, see `quad` and `quad_explain`.\n",
- " \n",
- " full_output : bool, optional\n",
- " Partial implementation of ``full_output`` from scipy.integrate.quad. \n",
- " The number of integrand function evaluations ``neval`` can be obtained \n",
- " by setting ``full_output=True`` when calling nquad.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " result : float\n",
- " The result of the integration.\n",
- " abserr : float\n",
- " The maximum of the estimates of the absolute error in the various\n",
- " integration results.\n",
- " out_dict : dict, optional\n",
- " A dict containing additional information on the integration. \n",
- " \n",
- " See Also\n",
- " --------\n",
- " quad : 1-dimensional numerical integration\n",
- " dblquad, tplquad : double and triple integrals\n",
- " fixed_quad : fixed-order Gaussian quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " \n",
- " Examples\n",
- " --------\n",
- " >>> from scipy import integrate\n",
- " >>> func = lambda x0,x1,x2,x3 : x0**2 + x1*x2 - x3**3 + np.sin(x0) + (\n",
- " ... 1 if (x0-.2*x3-.5-.25*x1>0) else 0)\n",
- " >>> points = [[lambda x1,x2,x3 : 0.2*x3 + 0.5 + 0.25*x1], [], [], []]\n",
- " >>> def opts0(*args, **kwargs):\n",
- " ... return {'points':[0.2*args[2] + 0.5 + 0.25*args[0]]}\n",
- " >>> integrate.nquad(func, [[0,1], [-1,1], [.13,.8], [-.15,1]],\n",
- " ... opts=[opts0,{},{},{}], full_output=True)\n",
- " (1.5267454070738633, 2.9437360001402324e-14, {'neval': 388962})\n",
- " \n",
- " >>> scale = .1\n",
- " >>> def func2(x0, x1, x2, x3, t0, t1):\n",
- " ... return x0*x1*x3**2 + np.sin(x2) + 1 + (1 if x0+t1*x1-t0>0 else 0)\n",
- " >>> def lim0(x1, x2, x3, t0, t1):\n",
- " ... return [scale * (x1**2 + x2 + np.cos(x3)*t0*t1 + 1) - 1,\n",
- " ... scale * (x1**2 + x2 + np.cos(x3)*t0*t1 + 1) + 1]\n",
- " >>> def lim1(x2, x3, t0, t1):\n",
- " ... return [scale * (t0*x2 + t1*x3) - 1,\n",
- " ... scale * (t0*x2 + t1*x3) + 1]\n",
- " >>> def lim2(x3, t0, t1):\n",
- " ... return [scale * (x3 + t0**2*t1**3) - 1,\n",
- " ... scale * (x3 + t0**2*t1**3) + 1]\n",
- " >>> def lim3(t0, t1):\n",
- " ... return [scale * (t0+t1) - 1, scale * (t0+t1) + 1]\n",
- " >>> def opts0(x1, x2, x3, t0, t1):\n",
- " ... return {'points' : [t0 - t1*x1]}\n",
- " >>> def opts1(x2, x3, t0, t1):\n",
- " ... return {}\n",
- " >>> def opts2(x3, t0, t1):\n",
- " ... return {}\n",
- " >>> def opts3(t0, t1):\n",
- " ... return {}\n",
- " >>> integrate.nquad(func2, [lim0, lim1, lim2, lim3], args=(0,0),\n",
- " ... opts=[opts0, opts1, opts2, opts3])\n",
- " (25.066666666666666, 2.7829590483937256e-13)\n",
- " \n",
- " odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)\n",
- " Integrate a system of ordinary differential equations.\n",
- " \n",
- " Solve a system of ordinary differential equations using lsoda from the\n",
- " FORTRAN library odepack.\n",
- " \n",
- " Solves the initial value problem for stiff or non-stiff systems\n",
- " of first order ode-s::\n",
- " \n",
- " dy/dt = func(y, t0, ...)\n",
- " \n",
- " where y can be a vector.\n",
- " \n",
- " *Note*: The first two arguments of ``func(y, t0, ...)`` are in the\n",
- " opposite order of the arguments in the system definition function used\n",
- " by the `scipy.integrate.ode` class.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : callable(y, t0, ...)\n",
- " Computes the derivative of y at t0.\n",
- " y0 : array\n",
- " Initial condition on y (can be a vector).\n",
- " t : array\n",
- " A sequence of time points for which to solve for y. The initial\n",
- " value point should be the first element of this sequence.\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to function.\n",
- " Dfun : callable(y, t0, ...)\n",
- " Gradient (Jacobian) of `func`.\n",
- " col_deriv : bool, optional\n",
- " True if `Dfun` defines derivatives down columns (faster),\n",
- " otherwise `Dfun` should define derivatives across rows.\n",
- " full_output : bool, optional\n",
- " True if to return a dictionary of optional outputs as the second output\n",
- " printmessg : bool, optional\n",
- " Whether to print the convergence message\n",
- " \n",
- " Returns\n",
- " -------\n",
- " y : array, shape (len(t), len(y0))\n",
- " Array containing the value of y for each desired time in t,\n",
- " with the initial value `y0` in the first row.\n",
- " infodict : dict, only returned if full_output == True\n",
- " Dictionary containing additional output information\n",
- " \n",
- " ======= ============================================================\n",
- " key meaning\n",
- " ======= ============================================================\n",
- " 'hu' vector of step sizes successfully used for each time step.\n",
- " 'tcur' vector with the value of t reached for each time step.\n",
- " (will always be at least as large as the input times).\n",
- " 'tolsf' vector of tolerance scale factors, greater than 1.0,\n",
- " computed when a request for too much accuracy was detected.\n",
- " 'tsw' value of t at the time of the last method switch\n",
- " (given for each time step)\n",
- " 'nst' cumulative number of time steps\n",
- " 'nfe' cumulative number of function evaluations for each time step\n",
- " 'nje' cumulative number of jacobian evaluations for each time step\n",
- " 'nqu' a vector of method orders for each successful step.\n",
- " 'imxer' index of the component of largest magnitude in the\n",
- " weighted local error vector (e / ewt) on an error return, -1\n",
- " otherwise.\n",
- " 'lenrw' the length of the double work array required.\n",
- " 'leniw' the length of integer work array required.\n",
- " 'mused' a vector of method indicators for each successful time step:\n",
- " 1: adams (nonstiff), 2: bdf (stiff)\n",
- " ======= ============================================================\n",
- " \n",
- " Other Parameters\n",
- " ----------------\n",
- " ml, mu : int, optional\n",
- " If either of these are not None or non-negative, then the\n",
- " Jacobian is assumed to be banded. These give the number of\n",
- " lower and upper non-zero diagonals in this banded matrix.\n",
- " For the banded case, `Dfun` should return a matrix whose\n",
- " rows contain the non-zero bands (starting with the lowest diagonal).\n",
- " Thus, the return matrix `jac` from `Dfun` should have shape\n",
- " ``(ml + mu + 1, len(y0))`` when ``ml >=0`` or ``mu >=0``.\n",
- " The data in `jac` must be stored such that ``jac[i - j + mu, j]``\n",
- " holds the derivative of the `i`th equation with respect to the `j`th\n",
- " state variable. If `col_deriv` is True, the transpose of this\n",
- " `jac` must be returned.\n",
- " rtol, atol : float, optional\n",
- " The input parameters `rtol` and `atol` determine the error\n",
- " control performed by the solver. The solver will control the\n",
- " vector, e, of estimated local errors in y, according to an\n",
- " inequality of the form ``max-norm of (e / ewt) <= 1``,\n",
- " where ewt is a vector of positive error weights computed as\n",
- " ``ewt = rtol * abs(y) + atol``.\n",
- " rtol and atol can be either vectors the same length as y or scalars.\n",
- " Defaults to 1.49012e-8.\n",
- " tcrit : ndarray, optional\n",
- " Vector of critical points (e.g. singularities) where integration\n",
- " care should be taken.\n",
- " h0 : float, (0: solver-determined), optional\n",
- " The step size to be attempted on the first step.\n",
- " hmax : float, (0: solver-determined), optional\n",
- " The maximum absolute step size allowed.\n",
- " hmin : float, (0: solver-determined), optional\n",
- " The minimum absolute step size allowed.\n",
- " ixpr : bool, optional\n",
- " Whether to generate extra printing at method switches.\n",
- " mxstep : int, (0: solver-determined), optional\n",
- " Maximum number of (internally defined) steps allowed for each\n",
- " integration point in t.\n",
- " mxhnil : int, (0: solver-determined), optional\n",
- " Maximum number of messages printed.\n",
- " mxordn : int, (0: solver-determined), optional\n",
- " Maximum order to be allowed for the non-stiff (Adams) method.\n",
- " mxords : int, (0: solver-determined), optional\n",
- " Maximum order to be allowed for the stiff (BDF) method.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " ode : a more object-oriented integrator based on VODE.\n",
- " quad : for finding the area under a curve.\n",
- " \n",
- " Examples\n",
- " --------\n",
- " The second order differential equation for the angle `theta` of a\n",
- " pendulum acted on by gravity with friction can be written::\n",
- " \n",
- " theta''(t) + b*theta'(t) + c*sin(theta(t)) = 0\n",
- " \n",
- " where `b` and `c` are positive constants, and a prime (') denotes a\n",
- " derivative. To solve this equation with `odeint`, we must first convert\n",
- " it to a system of first order equations. By defining the angular\n",
- " velocity ``omega(t) = theta'(t)``, we obtain the system::\n",
- " \n",
- " theta'(t) = omega(t)\n",
- " omega'(t) = -b*omega(t) - c*sin(theta(t))\n",
- " \n",
- " Let `y` be the vector [`theta`, `omega`]. We implement this system\n",
- " in python as:\n",
- " \n",
- " >>> def pend(y, t, b, c):\n",
- " ... theta, omega = y\n",
- " ... dydt = [omega, -b*omega - c*np.sin(theta)]\n",
- " ... return dydt\n",
- " ...\n",
- " \n",
- " We assume the constants are `b` = 0.25 and `c` = 5.0:\n",
- " \n",
- " >>> b = 0.25\n",
- " >>> c = 5.0\n",
- " \n",
- " For initial conditions, we assume the pendulum is nearly vertical\n",
- " with `theta(0)` = `pi` - 0.1, and it initially at rest, so\n",
- " `omega(0)` = 0. Then the vector of initial conditions is\n",
- " \n",
- " >>> y0 = [np.pi - 0.1, 0.0]\n",
- " \n",
- " We generate a solution 101 evenly spaced samples in the interval\n",
- " 0 <= `t` <= 10. So our array of times is:\n",
- " \n",
- " >>> t = np.linspace(0, 10, 101)\n",
- " \n",
- " Call `odeint` to generate the solution. To pass the parameters\n",
- " `b` and `c` to `pend`, we give them to `odeint` using the `args`\n",
- " argument.\n",
- " \n",
- " >>> from scipy.integrate import odeint\n",
- " >>> sol = odeint(pend, y0, t, args=(b, c))\n",
- " \n",
- " The solution is an array with shape (101, 2). The first column\n",
- " is `theta(t)`, and the second is `omega(t)`. The following code\n",
- " plots both components.\n",
- " \n",
- " >>> import matplotlib.pyplot as plt\n",
- " >>> plt.plot(t, sol[:, 0], 'b', label='theta(t)')\n",
- " >>> plt.plot(t, sol[:, 1], 'g', label='omega(t)')\n",
- " >>> plt.legend(loc='best')\n",
- " >>> plt.xlabel('t')\n",
- " >>> plt.grid()\n",
- " >>> plt.show()\n",
- " \n",
- " quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08, epsrel=1.49e-08, limit=50, points=None, weight=None, wvar=None, wopts=None, maxp1=50, limlst=50)\n",
- " Compute a definite integral.\n",
- " \n",
- " Integrate func from `a` to `b` (possibly infinite interval) using a\n",
- " technique from the Fortran library QUADPACK.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : {function, scipy.LowLevelCallable}\n",
- " A Python function or method to integrate. If `func` takes many\n",
- " arguments, it is integrated along the axis corresponding to the\n",
- " first argument.\n",
- " \n",
- " If the user desires improved integration performance, then `f` may\n",
- " be a `scipy.LowLevelCallable` with one of the signatures::\n",
- " \n",
- " double func(double x)\n",
- " double func(double x, void *user_data)\n",
- " double func(int n, double *xx)\n",
- " double func(int n, double *xx, void *user_data)\n",
- " \n",
- " The ``user_data`` is the data contained in the `scipy.LowLevelCallable`.\n",
- " In the call forms with ``xx``, ``n`` is the length of the ``xx`` \n",
- " array which contains ``xx[0] == x`` and the rest of the items are\n",
- " numbers contained in the ``args`` argument of quad.\n",
- " \n",
- " In addition, certain ctypes call signatures are supported for \n",
- " backward compatibility, but those should not be used in new code.\n",
- " a : float\n",
- " Lower limit of integration (use -numpy.inf for -infinity).\n",
- " b : float\n",
- " Upper limit of integration (use numpy.inf for +infinity).\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to `func`.\n",
- " full_output : int, optional\n",
- " Non-zero to return a dictionary of integration information.\n",
- " If non-zero, warning messages are also suppressed and the\n",
- " message is appended to the output tuple.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " y : float\n",
- " The integral of func from `a` to `b`.\n",
- " abserr : float\n",
- " An estimate of the absolute error in the result.\n",
- " infodict : dict\n",
- " A dictionary containing additional information.\n",
- " Run scipy.integrate.quad_explain() for more information.\n",
- " message\n",
- " A convergence message.\n",
- " explain\n",
- " Appended only with 'cos' or 'sin' weighting and infinite\n",
- " integration limits, it contains an explanation of the codes in\n",
- " infodict['ierlst']\n",
- " \n",
- " Other Parameters\n",
- " ----------------\n",
- " epsabs : float or int, optional\n",
- " Absolute error tolerance.\n",
- " epsrel : float or int, optional\n",
- " Relative error tolerance.\n",
- " limit : float or int, optional\n",
- " An upper bound on the number of subintervals used in the adaptive\n",
- " algorithm.\n",
- " points : (sequence of floats,ints), optional\n",
- " A sequence of break points in the bounded integration interval\n",
- " where local difficulties of the integrand may occur (e.g.,\n",
- " singularities, discontinuities). The sequence does not have\n",
- " to be sorted.\n",
- " weight : float or int, optional\n",
- " String indicating weighting function. Full explanation for this\n",
- " and the remaining arguments can be found below.\n",
- " wvar : optional\n",
- " Variables for use with weighting functions.\n",
- " wopts : optional\n",
- " Optional input for reusing Chebyshev moments.\n",
- " maxp1 : float or int, optional\n",
- " An upper bound on the number of Chebyshev moments.\n",
- " limlst : int, optional\n",
- " Upper bound on the number of cycles (>=3) for use with a sinusoidal\n",
- " weighting and an infinite end-point.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " dblquad : double integral\n",
- " tplquad : triple integral\n",
- " nquad : n-dimensional integrals (uses `quad` recursively)\n",
- " fixed_quad : fixed-order Gaussian quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " odeint : ODE integrator\n",
- " ode : ODE integrator\n",
- " simps : integrator for sampled data\n",
- " romb : integrator for sampled data\n",
- " scipy.special : for coefficients and roots of orthogonal polynomials\n",
- " \n",
- " Notes\n",
- " -----\n",
- " \n",
- " **Extra information for quad() inputs and outputs**\n",
- " \n",
- " If full_output is non-zero, then the third output argument\n",
- " (infodict) is a dictionary with entries as tabulated below. For\n",
- " infinite limits, the range is transformed to (0,1) and the\n",
- " optional outputs are given with respect to this transformed range.\n",
- " Let M be the input argument limit and let K be infodict['last'].\n",
- " The entries are:\n",
- " \n",
- " 'neval'\n",
- " The number of function evaluations.\n",
- " 'last'\n",
- " The number, K, of subintervals produced in the subdivision process.\n",
- " 'alist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " left end points of the subintervals in the partition of the\n",
- " integration range.\n",
- " 'blist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " right end points of the subintervals.\n",
- " 'rlist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " integral approximations on the subintervals.\n",
- " 'elist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " moduli of the absolute error estimates on the subintervals.\n",
- " 'iord'\n",
- " A rank-1 integer array of length M, the first L elements of\n",
- " which are pointers to the error estimates over the subintervals\n",
- " with ``L=K`` if ``K<=M/2+2`` or ``L=M+1-K`` otherwise. Let I be the\n",
- " sequence ``infodict['iord']`` and let E be the sequence\n",
- " ``infodict['elist']``. Then ``E[I[1]], ..., E[I[L]]`` forms a\n",
- " decreasing sequence.\n",
- " \n",
- " If the input argument points is provided (i.e. it is not None),\n",
- " the following additional outputs are placed in the output\n",
- " dictionary. Assume the points sequence is of length P.\n",
- " \n",
- " 'pts'\n",
- " A rank-1 array of length P+2 containing the integration limits\n",
- " and the break points of the intervals in ascending order.\n",
- " This is an array giving the subintervals over which integration\n",
- " will occur.\n",
- " 'level'\n",
- " A rank-1 integer array of length M (=limit), containing the\n",
- " subdivision levels of the subintervals, i.e., if (aa,bb) is a\n",
- " subinterval of ``(pts[1], pts[2])`` where ``pts[0]`` and ``pts[2]``\n",
- " are adjacent elements of ``infodict['pts']``, then (aa,bb) has level l\n",
- " if ``|bb-aa| = |pts[2]-pts[1]| * 2**(-l)``.\n",
- " 'ndin'\n",
- " A rank-1 integer array of length P+2. After the first integration\n",
- " over the intervals (pts[1], pts[2]), the error estimates over some\n",
- " of the intervals may have been increased artificially in order to\n",
- " put their subdivision forward. This array has ones in slots\n",
- " corresponding to the subintervals for which this happens.\n",
- " \n",
- " **Weighting the integrand**\n",
- " \n",
- " The input variables, *weight* and *wvar*, are used to weight the\n",
- " integrand by a select list of functions. Different integration\n",
- " methods are used to compute the integral with these weighting\n",
- " functions. The possible values of weight and the corresponding\n",
- " weighting functions are.\n",
- " \n",
- " ========== =================================== =====================\n",
- " ``weight`` Weight function used ``wvar``\n",
- " ========== =================================== =====================\n",
- " 'cos' cos(w*x) wvar = w\n",
- " 'sin' sin(w*x) wvar = w\n",
- " 'alg' g(x) = ((x-a)**alpha)*((b-x)**beta) wvar = (alpha, beta)\n",
- " 'alg-loga' g(x)*log(x-a) wvar = (alpha, beta)\n",
- " 'alg-logb' g(x)*log(b-x) wvar = (alpha, beta)\n",
- " 'alg-log' g(x)*log(x-a)*log(b-x) wvar = (alpha, beta)\n",
- " 'cauchy' 1/(x-c) wvar = c\n",
- " ========== =================================== =====================\n",
- " \n",
- " wvar holds the parameter w, (alpha, beta), or c depending on the weight\n",
- " selected. In these expressions, a and b are the integration limits.\n",
- " \n",
- " For the 'cos' and 'sin' weighting, additional inputs and outputs are\n",
- " available.\n",
- " \n",
- " For finite integration limits, the integration is performed using a\n",
- " Clenshaw-Curtis method which uses Chebyshev moments. For repeated\n",
- " calculations, these moments are saved in the output dictionary:\n",
- " \n",
- " 'momcom'\n",
- " The maximum level of Chebyshev moments that have been computed,\n",
- " i.e., if ``M_c`` is ``infodict['momcom']`` then the moments have been\n",
- " computed for intervals of length ``|b-a| * 2**(-l)``,\n",
- " ``l=0,1,...,M_c``.\n",
- " 'nnlog'\n",
- " A rank-1 integer array of length M(=limit), containing the\n",
- " subdivision levels of the subintervals, i.e., an element of this\n",
- " array is equal to l if the corresponding subinterval is\n",
- " ``|b-a|* 2**(-l)``.\n",
- " 'chebmo'\n",
- " A rank-2 array of shape (25, maxp1) containing the computed\n",
- " Chebyshev moments. These can be passed on to an integration\n",
- " over the same interval by passing this array as the second\n",
- " element of the sequence wopts and passing infodict['momcom'] as\n",
- " the first element.\n",
- " \n",
- " If one of the integration limits is infinite, then a Fourier integral is\n",
- " computed (assuming w neq 0). If full_output is 1 and a numerical error\n",
- " is encountered, besides the error message attached to the output tuple,\n",
- " a dictionary is also appended to the output tuple which translates the\n",
- " error codes in the array ``info['ierlst']`` to English messages. The\n",
- " output information dictionary contains the following entries instead of\n",
- " 'last', 'alist', 'blist', 'rlist', and 'elist':\n",
- " \n",
- " 'lst'\n",
- " The number of subintervals needed for the integration (call it ``K_f``).\n",
- " 'rslst'\n",
- " A rank-1 array of length M_f=limlst, whose first ``K_f`` elements\n",
- " contain the integral contribution over the interval\n",
- " ``(a+(k-1)c, a+kc)`` where ``c = (2*floor(|w|) + 1) * pi / |w|``\n",
- " and ``k=1,2,...,K_f``.\n",
- " 'erlst'\n",
- " A rank-1 array of length ``M_f`` containing the error estimate\n",
- " corresponding to the interval in the same position in\n",
- " ``infodict['rslist']``.\n",
- " 'ierlst'\n",
- " A rank-1 integer array of length ``M_f`` containing an error flag\n",
- " corresponding to the interval in the same position in\n",
- " ``infodict['rslist']``. See the explanation dictionary (last entry\n",
- " in the output tuple) for the meaning of the codes.\n",
- " \n",
- " Examples\n",
- " --------\n",
- " Calculate :math:`\\int^4_0 x^2 dx` and compare with an analytic result\n",
- " \n",
- " >>> from scipy import integrate\n",
- " >>> x2 = lambda x: x**2\n",
- " >>> integrate.quad(x2, 0, 4)\n",
- " (21.333333333333332, 2.3684757858670003e-13)\n",
- " >>> print(4**3 / 3.) # analytical result\n",
- " 21.3333333333\n",
- " \n",
- " Calculate :math:`\\int^\\infty_0 e^{-x} dx`\n",
- " \n",
- " >>> invexp = lambda x: np.exp(-x)\n",
- " >>> integrate.quad(invexp, 0, np.inf)\n",
- " (1.0, 5.842605999138044e-11)\n",
- " \n",
- " >>> f = lambda x,a : a*x\n",
- " >>> y, err = integrate.quad(f, 0, 1, args=(1,))\n",
- " >>> y\n",
- " 0.5\n",
- " >>> y, err = integrate.quad(f, 0, 1, args=(3,))\n",
- " >>> y\n",
- " 1.5\n",
- " \n",
- " Calculate :math:`\\int^1_0 x^2 + y^2 dx` with ctypes, holding\n",
- " y parameter as 1::\n",
- " \n",
- " testlib.c =>\n",
- " double func(int n, double args[n]){\n",
- " return args[0]*args[0] + args[1]*args[1];}\n",
- " compile to library testlib.*\n",
- " \n",
- " ::\n",
- " \n",
- " from scipy import integrate\n",
- " import ctypes\n",
- " lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path\n",
- " lib.func.restype = ctypes.c_double\n",
- " lib.func.argtypes = (ctypes.c_int,ctypes.c_double)\n",
- " integrate.quad(lib.func,0,1,(1))\n",
- " #(1.3333333333333333, 1.4802973661668752e-14)\n",
- " print((1.0**3/3.0 + 1.0) - (0.0**3/3.0 + 0.0)) #Analytic result\n",
- " # 1.3333333333333333\n",
- " \n",
- " quad_explain(output=)\n",
- " Print extra information about integrate.quad() parameters and returns.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " output : instance with \"write\" method, optional\n",
- " Information about `quad` is passed to ``output.write()``.\n",
- " Default is ``sys.stdout``.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " None\n",
- " \n",
- " quadrature(func, a, b, args=(), tol=1.49e-08, rtol=1.49e-08, maxiter=50, vec_func=True, miniter=1)\n",
- " Compute a definite integral using fixed-tolerance Gaussian quadrature.\n",
- " \n",
- " Integrate `func` from `a` to `b` using Gaussian quadrature\n",
- " with absolute tolerance `tol`.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : function\n",
- " A Python function or method to integrate.\n",
- " a : float\n",
- " Lower limit of integration.\n",
- " b : float\n",
- " Upper limit of integration.\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to function.\n",
- " tol, rtol : float, optional\n",
- " Iteration stops when error between last two iterates is less than\n",
- " `tol` OR the relative change is less than `rtol`.\n",
- " maxiter : int, optional\n",
- " Maximum order of Gaussian quadrature.\n",
- " vec_func : bool, optional\n",
- " True or False if func handles arrays as arguments (is\n",
- " a \"vector\" function). Default is True.\n",
- " miniter : int, optional\n",
- " Minimum order of Gaussian quadrature.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " val : float\n",
- " Gaussian quadrature approximation (within tolerance) to integral.\n",
- " err : float\n",
- " Difference between last two estimates of the integral.\n",
- " \n",
- " See also\n",
- " --------\n",
- " romberg: adaptive Romberg quadrature\n",
- " fixed_quad: fixed-order Gaussian quadrature\n",
- " quad: adaptive quadrature using QUADPACK\n",
- " dblquad: double integrals\n",
- " tplquad: triple integrals\n",
- " romb: integrator for sampled data\n",
- " simps: integrator for sampled data\n",
- " cumtrapz: cumulative integration for sampled data\n",
- " ode: ODE integrator\n",
- " odeint: ODE integrator\n",
- " \n",
- " romb(y, dx=1.0, axis=-1, show=False)\n",
- " Romberg integration using samples of a function.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " y : array_like\n",
- " A vector of ``2**k + 1`` equally-spaced samples of a function.\n",
- " dx : float, optional\n",
- " The sample spacing. Default is 1.\n",
- " axis : int, optional\n",
- " The axis along which to integrate. Default is -1 (last axis).\n",
- " show : bool, optional\n",
- " When `y` is a single 1-D array, then if this argument is True\n",
- " print the table showing Richardson extrapolation from the\n",
- " samples. Default is False.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " romb : ndarray\n",
- " The integrated result for `axis`.\n",
- " \n",
- " See also\n",
- " --------\n",
- " quad : adaptive quadrature using QUADPACK\n",
- " romberg : adaptive Romberg quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " fixed_quad : fixed-order Gaussian quadrature\n",
- " dblquad : double integrals\n",
- " tplquad : triple integrals\n",
- " simps : integrators for sampled data\n",
- " cumtrapz : cumulative integration for sampled data\n",
- " ode : ODE integrators\n",
- " odeint : ODE integrators\n",
- " \n",
- " romberg(function, a, b, args=(), tol=1.48e-08, rtol=1.48e-08, show=False, divmax=10, vec_func=False)\n",
- " Romberg integration of a callable function or method.\n",
- " \n",
- " Returns the integral of `function` (a function of one variable)\n",
- " over the interval (`a`, `b`).\n",
- " \n",
- " If `show` is 1, the triangular array of the intermediate results\n",
- " will be printed. If `vec_func` is True (default is False), then\n",
- " `function` is assumed to support vector arguments.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " function : callable\n",
- " Function to be integrated.\n",
- " a : float\n",
- " Lower limit of integration.\n",
- " b : float\n",
- " Upper limit of integration.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " results : float\n",
- " Result of the integration.\n",
- " \n",
- " Other Parameters\n",
- " ----------------\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to function. Each element of `args` will\n",
- " be passed as a single argument to `func`. Default is to pass no\n",
- " extra arguments.\n",
- " tol, rtol : float, optional\n",
- " The desired absolute and relative tolerances. Defaults are 1.48e-8.\n",
- " show : bool, optional\n",
- " Whether to print the results. Default is False.\n",
- " divmax : int, optional\n",
- " Maximum order of extrapolation. Default is 10.\n",
- " vec_func : bool, optional\n",
- " Whether `func` handles arrays as arguments (i.e whether it is a\n",
- " \"vector\" function). Default is False.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " fixed_quad : Fixed-order Gaussian quadrature.\n",
- " quad : Adaptive quadrature using QUADPACK.\n",
- " dblquad : Double integrals.\n",
- " tplquad : Triple integrals.\n",
- " romb : Integrators for sampled data.\n",
- " simps : Integrators for sampled data.\n",
- " cumtrapz : Cumulative integration for sampled data.\n",
- " ode : ODE integrator.\n",
- " odeint : ODE integrator.\n",
- " \n",
- " References\n",
- " ----------\n",
- " .. [1] 'Romberg's method' http://en.wikipedia.org/wiki/Romberg%27s_method\n",
- " \n",
- " Examples\n",
- " --------\n",
- " Integrate a gaussian from 0 to 1 and compare to the error function.\n",
- " \n",
- " >>> from scipy import integrate\n",
- " >>> from scipy.special import erf\n",
- " >>> gaussian = lambda x: 1/np.sqrt(np.pi) * np.exp(-x**2)\n",
- " >>> result = integrate.romberg(gaussian, 0, 1, show=True)\n",
- " Romberg integration of from [0, 1]\n",
- " \n",
- " ::\n",
- " \n",
- " Steps StepSize Results\n",
- " 1 1.000000 0.385872\n",
- " 2 0.500000 0.412631 0.421551\n",
- " 4 0.250000 0.419184 0.421368 0.421356\n",
- " 8 0.125000 0.420810 0.421352 0.421350 0.421350\n",
- " 16 0.062500 0.421215 0.421350 0.421350 0.421350 0.421350\n",
- " 32 0.031250 0.421317 0.421350 0.421350 0.421350 0.421350 0.421350\n",
- " \n",
- " The final result is 0.421350396475 after 33 function evaluations.\n",
- " \n",
- " >>> print(\"%g %g\" % (2*result, erf(1)))\n",
- " 0.842701 0.842701\n",
- " \n",
- " simps(y, x=None, dx=1, axis=-1, even='avg')\n",
- " Integrate y(x) using samples along the given axis and the composite\n",
- " Simpson's rule. If x is None, spacing of dx is assumed.\n",
- " \n",
- " If there are an even number of samples, N, then there are an odd\n",
- " number of intervals (N-1), but Simpson's rule requires an even number\n",
- " of intervals. The parameter 'even' controls how this is handled.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " y : array_like\n",
- " Array to be integrated.\n",
- " x : array_like, optional\n",
- " If given, the points at which `y` is sampled.\n",
- " dx : int, optional\n",
- " Spacing of integration points along axis of `y`. Only used when\n",
- " `x` is None. Default is 1.\n",
- " axis : int, optional\n",
- " Axis along which to integrate. Default is the last axis.\n",
- " even : str {'avg', 'first', 'last'}, optional\n",
- " 'avg' : Average two results:1) use the first N-2 intervals with\n",
- " a trapezoidal rule on the last interval and 2) use the last\n",
- " N-2 intervals with a trapezoidal rule on the first interval.\n",
- " \n",
- " 'first' : Use Simpson's rule for the first N-2 intervals with\n",
- " a trapezoidal rule on the last interval.\n",
- " \n",
- " 'last' : Use Simpson's rule for the last N-2 intervals with a\n",
- " trapezoidal rule on the first interval.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " quad: adaptive quadrature using QUADPACK\n",
- " romberg: adaptive Romberg quadrature\n",
- " quadrature: adaptive Gaussian quadrature\n",
- " fixed_quad: fixed-order Gaussian quadrature\n",
- " dblquad: double integrals\n",
- " tplquad: triple integrals\n",
- " romb: integrators for sampled data\n",
- " cumtrapz: cumulative integration for sampled data\n",
- " ode: ODE integrators\n",
- " odeint: ODE integrators\n",
- " \n",
- " Notes\n",
- " -----\n",
- " For an odd number of samples that are equally spaced the result is\n",
- " exact if the function is a polynomial of order 3 or less. If\n",
- " the samples are not equally spaced, then the result is exact only\n",
- " if the function is a polynomial of order 2 or less.\n",
- " \n",
- " solve_bvp(fun, bc, x, y, p=None, S=None, fun_jac=None, bc_jac=None, tol=0.001, max_nodes=1000, verbose=0)\n",
- " Solve a boundary-value problem for a system of ODEs.\n",
- " \n",
- " This function numerically solves a first order system of ODEs subject to\n",
- " two-point boundary conditions::\n",
- " \n",
- " dy / dx = f(x, y, p) + S * y / (x - a), a <= x <= b\n",
- " bc(y(a), y(b), p) = 0\n",
- " \n",
- " Here x is a 1-dimensional independent variable, y(x) is a n-dimensional\n",
- " vector-valued function and p is a k-dimensional vector of unknown\n",
- " parameters which is to be found along with y(x). For the problem to be\n",
- " determined there must be n + k boundary conditions, i.e. bc must be\n",
- " (n + k)-dimensional function.\n",
- " \n",
- " The last singular term in the right-hand side of the system is optional.\n",
- " It is defined by an n-by-n matrix S, such that the solution must satisfy\n",
- " S y(a) = 0. This condition will be forced during iterations, so it must not\n",
- " contradict boundary conditions. See [2]_ for the explanation how this term\n",
- " is handled when solving BVPs numerically.\n",
- " \n",
- " Problems in a complex domain can be solved as well. In this case y and p\n",
- " are considered to be complex, and f and bc are assumed to be complex-valued\n",
- " functions, but x stays real. Note that f and bc must be complex\n",
- " differentiable (satisfy Cauchy-Riemann equations [4]_), otherwise you\n",
- " should rewrite your problem for real and imaginary parts separately. To\n",
- " solve a problem in a complex domain, pass an initial guess for y with a\n",
- " complex data type (see below).\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " fun : callable\n",
- " Right-hand side of the system. The calling signature is ``fun(x, y)``,\n",
- " or ``fun(x, y, p)`` if parameters are present. All arguments are\n",
- " ndarray: ``x`` with shape (m,), ``y`` with shape (n, m), meaning that\n",
- " ``y[:, i]`` corresponds to ``x[i]``, and ``p`` with shape (k,). The\n",
- " return value must be an array with shape (n, m) and with the same\n",
- " layout as ``y``.\n",
- " bc : callable\n",
- " Function evaluating residuals of the boundary conditions. The calling\n",
- " signature is ``bc(ya, yb)``, or ``bc(ya, yb, p)`` if parameters are\n",
- " present. All arguments are ndarray: ``ya`` and ``yb`` with shape (n,),\n",
- " and ``p`` with shape (k,). The return value must be an array with\n",
- " shape (n + k,).\n",
- " x : array_like, shape (m,)\n",
- " Initial mesh. Must be a strictly increasing sequence of real numbers\n",
- " with ``x[0]=a`` and ``x[-1]=b``.\n",
- " y : array_like, shape (n, m)\n",
- " Initial guess for the function values at the mesh nodes, i-th column\n",
- " corresponds to ``x[i]``. For problems in a complex domain pass `y`\n",
- " with a complex data type (even if the initial guess is purely real).\n",
- " p : array_like with shape (k,) or None, optional\n",
- " Initial guess for the unknown parameters. If None (default), it is\n",
- " assumed that the problem doesn't depend on any parameters.\n",
- " S : array_like with shape (n, n) or None\n",
- " Matrix defining the singular term. If None (default), the problem is\n",
- " solved without the singular term.\n",
- " fun_jac : callable or None, optional\n",
- " Function computing derivatives of f with respect to y and p. The\n",
- " calling signature is ``fun_jac(x, y)``, or ``fun_jac(x, y, p)`` if\n",
- " parameters are present. The return must contain 1 or 2 elements in the\n",
- " following order:\n",
- " \n",
- " * df_dy : array_like with shape (n, n, m) where an element\n",
- " (i, j, q) equals to d f_i(x_q, y_q, p) / d (y_q)_j.\n",
- " * df_dp : array_like with shape (n, k, m) where an element\n",
- " (i, j, q) equals to d f_i(x_q, y_q, p) / d p_j.\n",
- " \n",
- " Here q numbers nodes at which x and y are defined, whereas i and j\n",
- " number vector components. If the problem is solved without unknown\n",
- " parameters df_dp should not be returned.\n",
- " \n",
- " If `fun_jac` is None (default), the derivatives will be estimated\n",
- " by the forward finite differences.\n",
- " bc_jac : callable or None, optional\n",
- " Function computing derivatives of bc with respect to ya, yb and p.\n",
- " The calling signature is ``bc_jac(ya, yb)``, or ``bc_jac(ya, yb, p)``\n",
- " if parameters are present. The return must contain 2 or 3 elements in\n",
- " the following order:\n",
- " \n",
- " * dbc_dya : array_like with shape (n, n) where an element (i, j)\n",
- " equals to d bc_i(ya, yb, p) / d ya_j.\n",
- " * dbc_dyb : array_like with shape (n, n) where an element (i, j)\n",
- " equals to d bc_i(ya, yb, p) / d yb_j.\n",
- " * dbc_dp : array_like with shape (n, k) where an element (i, j)\n",
- " equals to d bc_i(ya, yb, p) / d p_j.\n",
- " \n",
- " If the problem is solved without unknown parameters dbc_dp should not\n",
- " be returned.\n",
- " \n",
- " If `bc_jac` is None (default), the derivatives will be estimated by\n",
- " the forward finite differences.\n",
- " tol : float, optional\n",
- " Desired tolerance of the solution. If we define ``r = y' - f(x, y)``\n",
- " where y is the found solution, then the solver tries to achieve on each\n",
- " mesh interval ``norm(r / (1 + abs(f)) < tol``, where ``norm`` is\n",
- " estimated in a root mean squared sense (using a numerical quadrature\n",
- " formula). Default is 1e-3.\n",
- " max_nodes : int, optional\n",
- " Maximum allowed number of the mesh nodes. If exceeded, the algorithm\n",
- " terminates. Default is 1000.\n",
- " verbose : {0, 1, 2}, optional\n",
- " Level of algorithm's verbosity:\n",
- " \n",
- " * 0 (default) : work silently.\n",
- " * 1 : display a termination report.\n",
- " * 2 : display progress during iterations.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " Bunch object with the following fields defined:\n",
- " sol : PPoly\n",
- " Found solution for y as `scipy.interpolate.PPoly` instance, a C1\n",
- " continuous cubic spline.\n",
- " p : ndarray or None, shape (k,)\n",
- " Found parameters. None, if the parameters were not present in the\n",
- " problem.\n",
- " x : ndarray, shape (m,)\n",
- " Nodes of the final mesh.\n",
- " y : ndarray, shape (n, m)\n",
- " Solution values at the mesh nodes.\n",
- " yp : ndarray, shape (n, m)\n",
- " Solution derivatives at the mesh nodes.\n",
- " rms_residuals : ndarray, shape (m - 1,)\n",
- " RMS values of the relative residuals over each mesh interval (see the\n",
- " description of `tol` parameter).\n",
- " niter : int\n",
- " Number of completed iterations.\n",
- " status : int\n",
- " Reason for algorithm termination:\n",
- " \n",
- " * 0: The algorithm converged to the desired accuracy.\n",
- " * 1: The maximum number of mesh nodes is exceeded.\n",
- " * 2: A singular Jacobian encountered when solving the collocation\n",
- " system.\n",
- " \n",
- " message : string\n",
- " Verbal description of the termination reason.\n",
- " success : bool\n",
- " True if the algorithm converged to the desired accuracy (``status=0``).\n",
- " \n",
- " Notes\n",
- " -----\n",
- " This function implements a 4-th order collocation algorithm with the\n",
- " control of residuals similar to [1]_. A collocation system is solved\n",
- " by a damped Newton method with an affine-invariant criterion function as\n",
- " described in [3]_.\n",
- " \n",
- " Note that in [1]_ integral residuals are defined without normalization\n",
- " by interval lengths. So their definition is different by a multiplier of\n",
- " h**0.5 (h is an interval length) from the definition used here.\n",
- " \n",
- " .. versionadded:: 0.18.0\n",
- " \n",
- " References\n",
- " ----------\n",
- " .. [1] J. Kierzenka, L. F. Shampine, \"A BVP Solver Based on Residual\n",
- " Control and the Maltab PSE\", ACM Trans. Math. Softw., Vol. 27,\n",
- " Number 3, pp. 299-316, 2001.\n",
- " .. [2] L.F. Shampine, P. H. Muir and H. Xu, \"A User-Friendly Fortran BVP\n",
- " Solver\".\n",
- " .. [3] U. Ascher, R. Mattheij and R. Russell \"Numerical Solution of\n",
- " Boundary Value Problems for Ordinary Differential Equations\".\n",
- " .. [4] `Cauchy-Riemann equations\n",
- " `_ on\n",
- " Wikipedia.\n",
- " \n",
- " Examples\n",
- " --------\n",
- " In the first example we solve Bratu's problem::\n",
- " \n",
- " y'' + k * exp(y) = 0\n",
- " y(0) = y(1) = 0\n",
- " \n",
- " for k = 1.\n",
- " \n",
- " We rewrite the equation as a first order system and implement its\n",
- " right-hand side evaluation::\n",
- " \n",
- " y1' = y2\n",
- " y2' = -exp(y1)\n",
- " \n",
- " >>> def fun(x, y):\n",
- " ... return np.vstack((y[1], -np.exp(y[0])))\n",
- " \n",
- " Implement evaluation of the boundary condition residuals:\n",
- " \n",
- " >>> def bc(ya, yb):\n",
- " ... return np.array([ya[0], yb[0]])\n",
- " \n",
- " Define the initial mesh with 5 nodes:\n",
- " \n",
- " >>> x = np.linspace(0, 1, 5)\n",
- " \n",
- " This problem is known to have two solutions. To obtain both of them we\n",
- " use two different initial guesses for y. We denote them by subscripts\n",
- " a and b.\n",
- " \n",
- " >>> y_a = np.zeros((2, x.size))\n",
- " >>> y_b = np.zeros((2, x.size))\n",
- " >>> y_b[0] = 3\n",
- " \n",
- " Now we are ready to run the solver.\n",
- " \n",
- " >>> from scipy.integrate import solve_bvp\n",
- " >>> res_a = solve_bvp(fun, bc, x, y_a)\n",
- " >>> res_b = solve_bvp(fun, bc, x, y_b)\n",
- " \n",
- " Let's plot the two found solutions. We take an advantage of having the\n",
- " solution in a spline form to produce a smooth plot.\n",
- " \n",
- " >>> x_plot = np.linspace(0, 1, 100)\n",
- " >>> y_plot_a = res_a.sol(x_plot)[0]\n",
- " >>> y_plot_b = res_b.sol(x_plot)[0]\n",
- " >>> import matplotlib.pyplot as plt\n",
- " >>> plt.plot(x_plot, y_plot_a, label='y_a')\n",
- " >>> plt.plot(x_plot, y_plot_b, label='y_b')\n",
- " >>> plt.legend()\n",
- " >>> plt.xlabel(\"x\")\n",
- " >>> plt.ylabel(\"y\")\n",
- " >>> plt.show()\n",
- " \n",
- " We see that the two solutions have similar shape, but differ in scale\n",
- " significantly.\n",
- " \n",
- " In the second example we solve a simple Sturm-Liouville problem::\n",
- " \n",
- " y'' + k**2 * y = 0\n",
- " y(0) = y(1) = 0\n",
- " \n",
- " It is known that a non-trivial solution y = A * sin(k * x) is possible for\n",
- " k = pi * n, where n is an integer. To establish the normalization constant\n",
- " A = 1 we add a boundary condition::\n",
- " \n",
- " y'(0) = k\n",
- " \n",
- " Again we rewrite our equation as a first order system and implement its\n",
- " right-hand side evaluation::\n",
- " \n",
- " y1' = y2\n",
- " y2' = -k**2 * y1\n",
- " \n",
- " >>> def fun(x, y, p):\n",
- " ... k = p[0]\n",
- " ... return np.vstack((y[1], -k**2 * y[0]))\n",
- " \n",
- " Note that parameters p are passed as a vector (with one element in our\n",
- " case).\n",
- " \n",
- " Implement the boundary conditions:\n",
- " \n",
- " >>> def bc(ya, yb, p):\n",
- " ... k = p[0]\n",
- " ... return np.array([ya[0], yb[0], ya[1] - k])\n",
- " \n",
- " Setup the initial mesh and guess for y. We aim to find the solution for\n",
- " k = 2 * pi, to achieve that we set values of y to approximately follow\n",
- " sin(2 * pi * x):\n",
- " \n",
- " >>> x = np.linspace(0, 1, 5)\n",
- " >>> y = np.zeros((2, x.size))\n",
- " >>> y[0, 1] = 1\n",
- " >>> y[0, 3] = -1\n",
- " \n",
- " Run the solver with 6 as an initial guess for k.\n",
- " \n",
- " >>> sol = solve_bvp(fun, bc, x, y, p=[6])\n",
- " \n",
- " We see that the found k is approximately correct:\n",
- " \n",
- " >>> sol.p[0]\n",
- " 6.28329460046\n",
- " \n",
- " And finally plot the solution to see the anticipated sinusoid:\n",
- " \n",
- " >>> x_plot = np.linspace(0, 1, 100)\n",
- " >>> y_plot = sol.sol(x_plot)[0]\n",
- " >>> plt.plot(x_plot, y_plot)\n",
- " >>> plt.xlabel(\"x\")\n",
- " >>> plt.ylabel(\"y\")\n",
- " >>> plt.show()\n",
- " \n",
- " solve_ivp(fun, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, **options)\n",
- " Solve an initial value problem for a system of ODEs.\n",
- " \n",
- " This function numerically integrates a system of ordinary differential\n",
- " equations given an initial value::\n",
- " \n",
- " dy / dt = f(t, y)\n",
- " y(t0) = y0\n",
- " \n",
- " Here t is a 1-dimensional independent variable (time), y(t) is an\n",
- " n-dimensional vector-valued function (state) and an n-dimensional\n",
- " vector-valued function f(t, y) determines the differential equations.\n",
- " The goal is to find y(t) approximately satisfying the differential\n",
- " equations, given an initial value y(t0)=y0.\n",
- " \n",
- " Some of the solvers support integration in a complex domain, but note that\n",
- " for stiff ODE solvers the right hand side must be complex differentiable\n",
- " (satisfy Cauchy-Riemann equations [11]_). To solve a problem in a complex\n",
- " domain, pass y0 with a complex data type. Another option always available\n",
- " is to rewrite your problem for real and imaginary parts separately.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " fun : callable\n",
- " Right-hand side of the system. The calling signature is ``fun(t, y)``.\n",
- " Here ``t`` is a scalar and there are two options for ndarray ``y``.\n",
- " It can either have shape (n,), then ``fun`` must return array_like with\n",
- " shape (n,). Or alternatively it can have shape (n, k), then ``fun``\n",
- " must return array_like with shape (n, k), i.e. each column\n",
- " corresponds to a single column in ``y``. The choice between the two\n",
- " options is determined by `vectorized` argument (see below). The\n",
- " vectorized implementation allows faster approximation of the Jacobian\n",
- " by finite differences (required for stiff solvers).\n",
- " t_span : 2-tuple of floats\n",
- " Interval of integration (t0, tf). The solver starts with t=t0 and\n",
- " integrates until it reaches t=tf.\n",
- " y0 : array_like, shape (n,)\n",
- " Initial state. For problems in a complex domain pass `y0` with a\n",
- " complex data type (even if the initial guess is purely real).\n",
- " method : string or `OdeSolver`, optional\n",
- " Integration method to use:\n",
- " \n",
- " * 'RK45' (default): Explicit Runge-Kutta method of order 5(4) [1]_.\n",
- " The error is controlled assuming 4th order accuracy, but steps\n",
- " are taken using a 5th oder accurate formula (local extrapolation\n",
- " is done). A quartic interpolation polynomial is used for the\n",
- " dense output [2]_. Can be applied in a complex domain.\n",
- " * 'RK23': Explicit Runge-Kutta method of order 3(2) [3]_. The error\n",
- " is controlled assuming 2nd order accuracy, but steps are taken\n",
- " using a 3rd oder accurate formula (local extrapolation is done).\n",
- " A cubic Hermit polynomial is used for the dense output.\n",
- " Can be applied in a complex domain.\n",
- " * 'Radau': Implicit Runge-Kutta method of Radau IIA family of\n",
- " order 5 [4]_. The error is controlled for a 3rd order accurate\n",
- " embedded formula. A cubic polynomial which satisfies the\n",
- " collocation conditions is used for the dense output.\n",
- " * 'BDF': Implicit multi-step variable order (1 to 5) method based\n",
- " on a Backward Differentiation Formulas for the derivative\n",
- " approximation [5]_. An implementation approach follows the one\n",
- " described in [6]_. A quasi-constant step scheme is used\n",
- " and accuracy enhancement using NDF modification is also\n",
- " implemented. Can be applied in a complex domain.\n",
- " * 'LSODA': Adams/BDF method with automatic stiffness detection and\n",
- " switching [7]_, [8]_. This is a wrapper of the Fortran solver\n",
- " from ODEPACK.\n",
- " \n",
- " You should use 'RK45' or 'RK23' methods for non-stiff problems and\n",
- " 'Radau' or 'BDF' for stiff problems [9]_. If not sure, first try to run\n",
- " 'RK45' and if it does unusual many iterations or diverges then your\n",
- " problem is likely to be stiff and you should use 'Radau' or 'BDF'.\n",
- " 'LSODA' can also be a good universal choice, but it might be somewhat\n",
- " less convenient to work with as it wraps an old Fortran code.\n",
- " \n",
- " You can also pass an arbitrary class derived from `OdeSolver` which\n",
- " implements the solver.\n",
- " dense_output : bool, optional\n",
- " Whether to compute a continuous solution. Default is False.\n",
- " t_eval : array_like or None, optional\n",
- " Times at which to store the computed solution, must be sorted and lie\n",
- " within `t_span`. If None (default), use points selected by a solver.\n",
- " events : callable, list of callables or None, optional\n",
- " Events to track. Events are defined by functions which take\n",
- " a zero value at a point of an event. Each function must have a\n",
- " signature ``event(t, y)`` and return float, the solver will find an\n",
- " accurate value of ``t`` at which ``event(t, y(t)) = 0`` using a root\n",
- " finding algorithm. Additionally each ``event`` function might have\n",
- " attributes:\n",
- " \n",
- " * terminal: bool, whether to terminate integration if this\n",
- " event occurs. Implicitly False if not assigned.\n",
- " * direction: float, direction of crossing a zero. If `direction`\n",
- " is positive then `event` must go from negative to positive, and\n",
- " vice-versa if `direction` is negative. If 0, then either way will\n",
- " count. Implicitly 0 if not assigned.\n",
- " \n",
- " You can assign attributes like ``event.terminal = True`` to any\n",
- " function in Python. If None (default), events won't be tracked.\n",
- " vectorized : bool, optional\n",
- " Whether `fun` is implemented in a vectorized fashion. Default is False.\n",
- " options\n",
- " Options passed to a chosen solver constructor. All options available\n",
- " for already implemented solvers are listed below.\n",
- " max_step : float, optional\n",
- " Maximum allowed step size. Default is np.inf, i.e. step is not\n",
- " bounded and determined solely by the solver.\n",
- " rtol, atol : float and array_like, optional\n",
- " Relative and absolute tolerances. The solver keeps the local error\n",
- " estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a\n",
- " relative accuracy (number of correct digits). But if a component of `y`\n",
- " is approximately below `atol` then the error only needs to fall within\n",
- " the same `atol` threshold, and the number of correct digits is not\n",
- " guaranteed. If components of y have different scales, it might be\n",
- " beneficial to set different `atol` values for different components by\n",
- " passing array_like with shape (n,) for `atol`. Default values are\n",
- " 1e-3 for `rtol` and 1e-6 for `atol`.\n",
- " jac : {None, array_like, sparse_matrix, callable}, optional\n",
- " Jacobian matrix of the right-hand side of the system with respect to\n",
- " y, required by 'Radau', 'BDF' and 'LSODA' methods. The Jacobian matrix\n",
- " has shape (n, n) and its element (i, j) is equal to ``d f_i / d y_j``.\n",
- " There are 3 ways to define the Jacobian:\n",
- " \n",
- " * If array_like or sparse_matrix, then the Jacobian is assumed to\n",
- " be constant. Not supported by 'LSODA'.\n",
- " * If callable, then the Jacobian is assumed to depend on both\n",
- " t and y, and will be called as ``jac(t, y)`` as necessary.\n",
- " For 'Radau' and 'BDF' methods the return value might be a sparse\n",
- " matrix.\n",
- " * If None (default), then the Jacobian will be approximated by\n",
- " finite differences.\n",
- " \n",
- " It is generally recommended to provide the Jacobian rather than\n",
- " relying on a finite difference approximation.\n",
- " jac_sparsity : {None, array_like, sparse matrix}, optional\n",
- " Defines a sparsity structure of the Jacobian matrix for a finite\n",
- " difference approximation, its shape must be (n, n). If the Jacobian has\n",
- " only few non-zero elements in *each* row, providing the sparsity\n",
- " structure will greatly speed up the computations [10]_. A zero\n",
- " entry means that a corresponding element in the Jacobian is identically\n",
- " zero. If None (default), the Jacobian is assumed to be dense.\n",
- " Not supported by 'LSODA', see `lband` and `uband` instead.\n",
- " lband, uband : int or None\n",
- " Parameters defining the Jacobian matrix bandwidth for 'LSODA' method.\n",
- " The Jacobian bandwidth means that\n",
- " ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Setting these\n",
- " requires your jac routine to return the Jacobian in the packed format:\n",
- " the returned array must have ``n`` columns and ``uband + lband + 1``\n",
- " rows in which Jacobian diagonals are written. Specifically\n",
- " ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format is used\n",
- " in `scipy.linalg.solve_banded` (check for an illustration).\n",
- " These parameters can be also used with ``jac=None`` to reduce the\n",
- " number of Jacobian elements estimated by finite differences.\n",
- " min_step, first_step : float, optional\n",
- " The minimum allowed step size and the initial step size respectively\n",
- " for 'LSODA' method. By default `min_step` is zero and `first_step` is\n",
- " selected automatically.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " Bunch object with the following fields defined:\n",
- " t : ndarray, shape (n_points,)\n",
- " Time points.\n",
- " y : ndarray, shape (n, n_points)\n",
- " Solution values at `t`.\n",
- " sol : `OdeSolution` or None\n",
- " Found solution as `OdeSolution` instance, None if `dense_output` was\n",
- " set to False.\n",
- " t_events : list of ndarray or None\n",
- " Contains arrays with times at each a corresponding event was detected,\n",
- " the length of the list equals to the number of events. None if `events`\n",
- " was None.\n",
- " nfev : int\n",
- " Number of the system rhs evaluations.\n",
- " njev : int\n",
- " Number of the Jacobian evaluations.\n",
- " nlu : int\n",
- " Number of LU decompositions.\n",
- " status : int\n",
- " Reason for algorithm termination:\n",
- " \n",
- " * -1: Integration step failed.\n",
- " * 0: The solver successfully reached the interval end.\n",
- " * 1: A termination event occurred.\n",
- " \n",
- " message : string\n",
- " Verbal description of the termination reason.\n",
- " success : bool\n",
- " True if the solver reached the interval end or a termination event\n",
- " occurred (``status >= 0``).\n",
- " \n",
- " References\n",
- " ----------\n",
- " .. [1] J. R. Dormand, P. J. Prince, \"A family of embedded Runge-Kutta\n",
- " formulae\", Journal of Computational and Applied Mathematics, Vol. 6,\n",
- " No. 1, pp. 19-26, 1980.\n",
- " .. [2] L. W. Shampine, \"Some Practical Runge-Kutta Formulas\", Mathematics\n",
- " of Computation,, Vol. 46, No. 173, pp. 135-150, 1986.\n",
- " .. [3] P. Bogacki, L.F. Shampine, \"A 3(2) Pair of Runge-Kutta Formulas\",\n",
- " Appl. Math. Lett. Vol. 2, No. 4. pp. 321-325, 1989.\n",
- " .. [4] E. Hairer, G. Wanner, \"Solving Ordinary Differential Equations II:\n",
- " Stiff and Differential-Algebraic Problems\", Sec. IV.8.\n",
- " .. [5] `Backward Differentiation Formula\n",
- " `_\n",
- " on Wikipedia.\n",
- " .. [6] L. F. Shampine, M. W. Reichelt, \"THE MATLAB ODE SUITE\", SIAM J. SCI.\n",
- " COMPUTE., Vol. 18, No. 1, pp. 1-22, January 1997.\n",
- " .. [7] A. C. Hindmarsh, \"ODEPACK, A Systematized Collection of ODE\n",
- " Solvers,\" IMACS Transactions on Scientific Computation, Vol 1.,\n",
- " pp. 55-64, 1983.\n",
- " .. [8] L. Petzold, \"Automatic selection of methods for solving stiff and\n",
- " nonstiff systems of ordinary differential equations\", SIAM Journal\n",
- " on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148,\n",
- " 1983.\n",
- " .. [9] `Stiff equation `_ on\n",
- " Wikipedia.\n",
- " .. [10] A. Curtis, M. J. D. Powell, and J. Reid, \"On the estimation of\n",
- " sparse Jacobian matrices\", Journal of the Institute of Mathematics\n",
- " and its Applications, 13, pp. 117-120, 1974.\n",
- " .. [11] `Cauchy-Riemann equations\n",
- " `_ on\n",
- " Wikipedia.\n",
- " \n",
- " Examples\n",
- " --------\n",
- " Basic exponential decay showing automatically chosen time points.\n",
- " \n",
- " >>> from scipy.integrate import solve_ivp\n",
- " >>> def exponential_decay(t, y): return -0.5 * y\n",
- " >>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8])\n",
- " >>> print(sol.t)\n",
- " [ 0. 0.11487653 1.26364188 3.06061781 4.85759374\n",
- " 6.65456967 8.4515456 10. ]\n",
- " >>> print(sol.y)\n",
- " [[ 2. 1.88836035 1.06327177 0.43319312 0.17648948 0.0719045\n",
- " 0.02929499 0.01350938]\n",
- " [ 4. 3.7767207 2.12654355 0.86638624 0.35297895 0.143809\n",
- " 0.05858998 0.02701876]\n",
- " [ 8. 7.5534414 4.25308709 1.73277247 0.7059579 0.287618\n",
- " 0.11717996 0.05403753]]\n",
- " \n",
- " Specifying points where the solution is desired.\n",
- " \n",
- " >>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8], \n",
- " ... t_eval=[0, 1, 2, 4, 10])\n",
- " >>> print(sol.t)\n",
- " [ 0 1 2 4 10]\n",
- " >>> print(sol.y)\n",
- " [[ 2. 1.21305369 0.73534021 0.27066736 0.01350938]\n",
- " [ 4. 2.42610739 1.47068043 0.54133472 0.02701876]\n",
- " [ 8. 4.85221478 2.94136085 1.08266944 0.05403753]]\n",
- " \n",
- " Cannon fired upward with terminal event upon impact. The ``terminal`` and \n",
- " ``direction`` fields of an event are applied by monkey patching a function.\n",
- " Here ``y[0]`` is position and ``y[1]`` is velocity. The projectile starts at\n",
- " position 0 with velocity +10. Note that the integration never reaches t=100\n",
- " because the event is terminal.\n",
- " \n",
- " >>> def upward_cannon(t, y): return [y[1], -0.5]\n",
- " >>> def hit_ground(t, y): return y[1]\n",
- " >>> hit_ground.terminal = True\n",
- " >>> hit_ground.direction = -1\n",
- " >>> sol = solve_ivp(upward_cannon, [0, 100], [0, 10], events=hit_ground)\n",
- " >>> print(sol.t_events)\n",
- " [array([ 20.])]\n",
- " >>> print(sol.t)\n",
- " [ 0.00000000e+00 9.99900010e-05 1.09989001e-03 1.10988901e-02\n",
- " 1.11088891e-01 1.11098890e+00 1.11099890e+01 2.00000000e+01]\n",
- " \n",
- " tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)\n",
- " Compute a triple (definite) integral.\n",
- " \n",
- " Return the triple integral of ``func(z, y, x)`` from ``x = a..b``,\n",
- " ``y = gfun(x)..hfun(x)``, and ``z = qfun(x,y)..rfun(x,y)``.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : function\n",
- " A Python function or method of at least three variables in the\n",
- " order (z, y, x).\n",
- " a, b : float\n",
- " The limits of integration in x: `a` < `b`\n",
- " gfun : function\n",
- " The lower boundary curve in y which is a function taking a single\n",
- " floating point argument (x) and returning a floating point result:\n",
- " a lambda function can be useful here.\n",
- " hfun : function\n",
- " The upper boundary curve in y (same requirements as `gfun`).\n",
- " qfun : function\n",
- " The lower boundary surface in z. It must be a function that takes\n",
- " two floats in the order (x, y) and returns a float.\n",
- " rfun : function\n",
- " The upper boundary surface in z. (Same requirements as `qfun`.)\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to `func`.\n",
- " epsabs : float, optional\n",
- " Absolute tolerance passed directly to the innermost 1-D quadrature\n",
- " integration. Default is 1.49e-8.\n",
- " epsrel : float, optional\n",
- " Relative tolerance of the innermost 1-D integrals. Default is 1.49e-8.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " y : float\n",
- " The resultant integral.\n",
- " abserr : float\n",
- " An estimate of the error.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " quad: Adaptive quadrature using QUADPACK\n",
- " quadrature: Adaptive Gaussian quadrature\n",
- " fixed_quad: Fixed-order Gaussian quadrature\n",
- " dblquad: Double integrals\n",
- " nquad : N-dimensional integrals\n",
- " romb: Integrators for sampled data\n",
- " simps: Integrators for sampled data\n",
- " ode: ODE integrators\n",
- " odeint: ODE integrators\n",
- " scipy.special: For coefficients and roots of orthogonal polynomials\n",
- " \n",
- " trapz(y, x=None, dx=1.0, axis=-1)\n",
- " Integrate along the given axis using the composite trapezoidal rule.\n",
- " \n",
- " Integrate `y` (`x`) along given axis.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " y : array_like\n",
- " Input array to integrate.\n",
- " x : array_like, optional\n",
- " The sample points corresponding to the `y` values. If `x` is None,\n",
- " the sample points are assumed to be evenly spaced `dx` apart. The\n",
- " default is None.\n",
- " dx : scalar, optional\n",
- " The spacing between sample points when `x` is None. The default is 1.\n",
- " axis : int, optional\n",
- " The axis along which to integrate.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " trapz : float\n",
- " Definite integral as approximated by trapezoidal rule.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " sum, cumsum\n",
- " \n",
- " Notes\n",
- " -----\n",
- " Image [2]_ illustrates trapezoidal rule -- y-axis locations of points\n",
- " will be taken from `y` array, by default x-axis distances between\n",
- " points will be 1.0, alternatively they can be provided with `x` array\n",
- " or with `dx` scalar. Return value will be equal to combined area under\n",
- " the red lines.\n",
- " \n",
- " \n",
- " References\n",
- " ----------\n",
- " .. [1] Wikipedia page: http://en.wikipedia.org/wiki/Trapezoidal_rule\n",
- " \n",
- " .. [2] Illustration image:\n",
- " http://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png\n",
- " \n",
- " Examples\n",
- " --------\n",
- " >>> np.trapz([1,2,3])\n",
- " 4.0\n",
- " >>> np.trapz([1,2,3], x=[4,6,8])\n",
- " 8.0\n",
- " >>> np.trapz([1,2,3], dx=2)\n",
- " 8.0\n",
- " >>> a = np.arange(6).reshape(2, 3)\n",
- " >>> a\n",
- " array([[0, 1, 2],\n",
- " [3, 4, 5]])\n",
- " >>> np.trapz(a, axis=0)\n",
- " array([ 1.5, 2.5, 3.5])\n",
- " >>> np.trapz(a, axis=1)\n",
- " array([ 2., 8.])\n",
- "\n",
- "DATA\n",
- " __all__ = ['BDF', 'DenseOutput', 'IntegrationWarning', 'LSODA', 'OdeSo...\n",
- " absolute_import = _Feature((2, 5, 0, 'alpha', 1), (3, 0, 0, 'alpha', 0...\n",
- " division = _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192...\n",
- " print_function = _Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0)...\n",
- "\n",
- "FILE\n",
- " /usr/lib64/python3.6/site-packages/scipy/integrate/__init__.py\n",
- "\n",
- "\n"
- ]
- }
- ],
- "source": [
- "from scipy import integrate\n",
- "help(integrate)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "quad is the basic integrator for a general (not sampled) function. It uses a general-interface from the Fortran package QUADPACK (QAGS or QAGI). It will return the integral in an interval and an estimate of the error in the approximation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "def f(x):\n",
- " return np.sin(x)**2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "3.141592653589793\n",
- "2.3058791671639882e-09\n"
- ]
- }
- ],
- "source": [
- "I, err = integrate.quad(f, 0.0, 2.0*np.pi, epsabs=1.e-14)\n",
- "print(I)\n",
- "print(err)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Help on function quad in module scipy.integrate.quadpack:\n",
- "\n",
- "quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08, epsrel=1.49e-08, limit=50, points=None, weight=None, wvar=None, wopts=None, maxp1=50, limlst=50)\n",
- " Compute a definite integral.\n",
- " \n",
- " Integrate func from `a` to `b` (possibly infinite interval) using a\n",
- " technique from the Fortran library QUADPACK.\n",
- " \n",
- " Parameters\n",
- " ----------\n",
- " func : {function, scipy.LowLevelCallable}\n",
- " A Python function or method to integrate. If `func` takes many\n",
- " arguments, it is integrated along the axis corresponding to the\n",
- " first argument.\n",
- " \n",
- " If the user desires improved integration performance, then `f` may\n",
- " be a `scipy.LowLevelCallable` with one of the signatures::\n",
- " \n",
- " double func(double x)\n",
- " double func(double x, void *user_data)\n",
- " double func(int n, double *xx)\n",
- " double func(int n, double *xx, void *user_data)\n",
- " \n",
- " The ``user_data`` is the data contained in the `scipy.LowLevelCallable`.\n",
- " In the call forms with ``xx``, ``n`` is the length of the ``xx`` \n",
- " array which contains ``xx[0] == x`` and the rest of the items are\n",
- " numbers contained in the ``args`` argument of quad.\n",
- " \n",
- " In addition, certain ctypes call signatures are supported for \n",
- " backward compatibility, but those should not be used in new code.\n",
- " a : float\n",
- " Lower limit of integration (use -numpy.inf for -infinity).\n",
- " b : float\n",
- " Upper limit of integration (use numpy.inf for +infinity).\n",
- " args : tuple, optional\n",
- " Extra arguments to pass to `func`.\n",
- " full_output : int, optional\n",
- " Non-zero to return a dictionary of integration information.\n",
- " If non-zero, warning messages are also suppressed and the\n",
- " message is appended to the output tuple.\n",
- " \n",
- " Returns\n",
- " -------\n",
- " y : float\n",
- " The integral of func from `a` to `b`.\n",
- " abserr : float\n",
- " An estimate of the absolute error in the result.\n",
- " infodict : dict\n",
- " A dictionary containing additional information.\n",
- " Run scipy.integrate.quad_explain() for more information.\n",
- " message\n",
- " A convergence message.\n",
- " explain\n",
- " Appended only with 'cos' or 'sin' weighting and infinite\n",
- " integration limits, it contains an explanation of the codes in\n",
- " infodict['ierlst']\n",
- " \n",
- " Other Parameters\n",
- " ----------------\n",
- " epsabs : float or int, optional\n",
- " Absolute error tolerance.\n",
- " epsrel : float or int, optional\n",
- " Relative error tolerance.\n",
- " limit : float or int, optional\n",
- " An upper bound on the number of subintervals used in the adaptive\n",
- " algorithm.\n",
- " points : (sequence of floats,ints), optional\n",
- " A sequence of break points in the bounded integration interval\n",
- " where local difficulties of the integrand may occur (e.g.,\n",
- " singularities, discontinuities). The sequence does not have\n",
- " to be sorted.\n",
- " weight : float or int, optional\n",
- " String indicating weighting function. Full explanation for this\n",
- " and the remaining arguments can be found below.\n",
- " wvar : optional\n",
- " Variables for use with weighting functions.\n",
- " wopts : optional\n",
- " Optional input for reusing Chebyshev moments.\n",
- " maxp1 : float or int, optional\n",
- " An upper bound on the number of Chebyshev moments.\n",
- " limlst : int, optional\n",
- " Upper bound on the number of cycles (>=3) for use with a sinusoidal\n",
- " weighting and an infinite end-point.\n",
- " \n",
- " See Also\n",
- " --------\n",
- " dblquad : double integral\n",
- " tplquad : triple integral\n",
- " nquad : n-dimensional integrals (uses `quad` recursively)\n",
- " fixed_quad : fixed-order Gaussian quadrature\n",
- " quadrature : adaptive Gaussian quadrature\n",
- " odeint : ODE integrator\n",
- " ode : ODE integrator\n",
- " simps : integrator for sampled data\n",
- " romb : integrator for sampled data\n",
- " scipy.special : for coefficients and roots of orthogonal polynomials\n",
- " \n",
- " Notes\n",
- " -----\n",
- " \n",
- " **Extra information for quad() inputs and outputs**\n",
- " \n",
- " If full_output is non-zero, then the third output argument\n",
- " (infodict) is a dictionary with entries as tabulated below. For\n",
- " infinite limits, the range is transformed to (0,1) and the\n",
- " optional outputs are given with respect to this transformed range.\n",
- " Let M be the input argument limit and let K be infodict['last'].\n",
- " The entries are:\n",
- " \n",
- " 'neval'\n",
- " The number of function evaluations.\n",
- " 'last'\n",
- " The number, K, of subintervals produced in the subdivision process.\n",
- " 'alist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " left end points of the subintervals in the partition of the\n",
- " integration range.\n",
- " 'blist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " right end points of the subintervals.\n",
- " 'rlist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " integral approximations on the subintervals.\n",
- " 'elist'\n",
- " A rank-1 array of length M, the first K elements of which are the\n",
- " moduli of the absolute error estimates on the subintervals.\n",
- " 'iord'\n",
- " A rank-1 integer array of length M, the first L elements of\n",
- " which are pointers to the error estimates over the subintervals\n",
- " with ``L=K`` if ``K<=M/2+2`` or ``L=M+1-K`` otherwise. Let I be the\n",
- " sequence ``infodict['iord']`` and let E be the sequence\n",
- " ``infodict['elist']``. Then ``E[I[1]], ..., E[I[L]]`` forms a\n",
- " decreasing sequence.\n",
- " \n",
- " If the input argument points is provided (i.e. it is not None),\n",
- " the following additional outputs are placed in the output\n",
- " dictionary. Assume the points sequence is of length P.\n",
- " \n",
- " 'pts'\n",
- " A rank-1 array of length P+2 containing the integration limits\n",
- " and the break points of the intervals in ascending order.\n",
- " This is an array giving the subintervals over which integration\n",
- " will occur.\n",
- " 'level'\n",
- " A rank-1 integer array of length M (=limit), containing the\n",
- " subdivision levels of the subintervals, i.e., if (aa,bb) is a\n",
- " subinterval of ``(pts[1], pts[2])`` where ``pts[0]`` and ``pts[2]``\n",
- " are adjacent elements of ``infodict['pts']``, then (aa,bb) has level l\n",
- " if ``|bb-aa| = |pts[2]-pts[1]| * 2**(-l)``.\n",
- " 'ndin'\n",
- " A rank-1 integer array of length P+2. After the first integration\n",
- " over the intervals (pts[1], pts[2]), the error estimates over some\n",
- " of the intervals may have been increased artificially in order to\n",
- " put their subdivision forward. This array has ones in slots\n",
- " corresponding to the subintervals for which this happens.\n",
- " \n",
- " **Weighting the integrand**\n",
- " \n",
- " The input variables, *weight* and *wvar*, are used to weight the\n",
- " integrand by a select list of functions. Different integration\n",
- " methods are used to compute the integral with these weighting\n",
- " functions. The possible values of weight and the corresponding\n",
- " weighting functions are.\n",
- " \n",
- " ========== =================================== =====================\n",
- " ``weight`` Weight function used ``wvar``\n",
- " ========== =================================== =====================\n",
- " 'cos' cos(w*x) wvar = w\n",
- " 'sin' sin(w*x) wvar = w\n",
- " 'alg' g(x) = ((x-a)**alpha)*((b-x)**beta) wvar = (alpha, beta)\n",
- " 'alg-loga' g(x)*log(x-a) wvar = (alpha, beta)\n",
- " 'alg-logb' g(x)*log(b-x) wvar = (alpha, beta)\n",
- " 'alg-log' g(x)*log(x-a)*log(b-x) wvar = (alpha, beta)\n",
- " 'cauchy' 1/(x-c) wvar = c\n",
- " ========== =================================== =====================\n",
- " \n",
- " wvar holds the parameter w, (alpha, beta), or c depending on the weight\n",
- " selected. In these expressions, a and b are the integration limits.\n",
- " \n",
- " For the 'cos' and 'sin' weighting, additional inputs and outputs are\n",
- " available.\n",
- " \n",
- " For finite integration limits, the integration is performed using a\n",
- " Clenshaw-Curtis method which uses Chebyshev moments. For repeated\n",
- " calculations, these moments are saved in the output dictionary:\n",
- " \n",
- " 'momcom'\n",
- " The maximum level of Chebyshev moments that have been computed,\n",
- " i.e., if ``M_c`` is ``infodict['momcom']`` then the moments have been\n",
- " computed for intervals of length ``|b-a| * 2**(-l)``,\n",
- " ``l=0,1,...,M_c``.\n",
- " 'nnlog'\n",
- " A rank-1 integer array of length M(=limit), containing the\n",
- " subdivision levels of the subintervals, i.e., an element of this\n",
- " array is equal to l if the corresponding subinterval is\n",
- " ``|b-a|* 2**(-l)``.\n",
- " 'chebmo'\n",
- " A rank-2 array of shape (25, maxp1) containing the computed\n",
- " Chebyshev moments. These can be passed on to an integration\n",
- " over the same interval by passing this array as the second\n",
- " element of the sequence wopts and passing infodict['momcom'] as\n",
- " the first element.\n",
- " \n",
- " If one of the integration limits is infinite, then a Fourier integral is\n",
- " computed (assuming w neq 0). If full_output is 1 and a numerical error\n",
- " is encountered, besides the error message attached to the output tuple,\n",
- " a dictionary is also appended to the output tuple which translates the\n",
- " error codes in the array ``info['ierlst']`` to English messages. The\n",
- " output information dictionary contains the following entries instead of\n",
- " 'last', 'alist', 'blist', 'rlist', and 'elist':\n",
- " \n",
- " 'lst'\n",
- " The number of subintervals needed for the integration (call it ``K_f``).\n",
- " 'rslst'\n",
- " A rank-1 array of length M_f=limlst, whose first ``K_f`` elements\n",
- " contain the integral contribution over the interval\n",
- " ``(a+(k-1)c, a+kc)`` where ``c = (2*floor(|w|) + 1) * pi / |w|``\n",
- " and ``k=1,2,...,K_f``.\n",
- " 'erlst'\n",
- " A rank-1 array of length ``M_f`` containing the error estimate\n",
- " corresponding to the interval in the same position in\n",
- " ``infodict['rslist']``.\n",
- " 'ierlst'\n",
- " A rank-1 integer array of length ``M_f`` containing an error flag\n",
- " corresponding to the interval in the same position in\n",
- " ``infodict['rslist']``. See the explanation dictionary (last entry\n",
- " in the output tuple) for the meaning of the codes.\n",
- " \n",
- " Examples\n",
- " --------\n",
- " Calculate :math:`\\int^4_0 x^2 dx` and compare with an analytic result\n",
- " \n",
- " >>> from scipy import integrate\n",
- " >>> x2 = lambda x: x**2\n",
- " >>> integrate.quad(x2, 0, 4)\n",
- " (21.333333333333332, 2.3684757858670003e-13)\n",
- " >>> print(4**3 / 3.) # analytical result\n",
- " 21.3333333333\n",
- " \n",
- " Calculate :math:`\\int^\\infty_0 e^{-x} dx`\n",
- " \n",
- " >>> invexp = lambda x: np.exp(-x)\n",
- " >>> integrate.quad(invexp, 0, np.inf)\n",
- " (1.0, 5.842605999138044e-11)\n",
- " \n",
- " >>> f = lambda x,a : a*x\n",
- " >>> y, err = integrate.quad(f, 0, 1, args=(1,))\n",
- " >>> y\n",
- " 0.5\n",
- " >>> y, err = integrate.quad(f, 0, 1, args=(3,))\n",
- " >>> y\n",
- " 1.5\n",
- " \n",
- " Calculate :math:`\\int^1_0 x^2 + y^2 dx` with ctypes, holding\n",
- " y parameter as 1::\n",
- " \n",
- " testlib.c =>\n",
- " double func(int n, double args[n]){\n",
- " return args[0]*args[0] + args[1]*args[1];}\n",
- " compile to library testlib.*\n",
- " \n",
- " ::\n",
- " \n",
- " from scipy import integrate\n",
- " import ctypes\n",
- " lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path\n",
- " lib.func.restype = ctypes.c_double\n",
- " lib.func.argtypes = (ctypes.c_int,ctypes.c_double)\n",
- " integrate.quad(lib.func,0,1,(1))\n",
- " #(1.3333333333333333, 1.4802973661668752e-14)\n",
- " print((1.0**3/3.0 + 1.0) - (0.0**3/3.0 + 0.0)) #Analytic result\n",
- " # 1.3333333333333333\n",
- "\n"
- ]
- }
- ],
- "source": [
- "help(integrate.quad)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "sometimes our integrand function takes optional arguments"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "def g(x, A, sigma):\n",
- " return A*np.exp(-x**2/sigma**2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1.8451240256511698 2.0484991765669867e-14\n"
- ]
- }
- ],
- "source": [
- "I, err = integrate.quad(g, -1.0, 1.0, args=(1.0, 2.0))\n",
- "print(I, err)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "numpy defines the inf quantity which can be used in the integration limits. We can integrate a Gaussian (we know the answer is sqrt(pi)\n",
- "\n",
- "Note: behind the scenes, what the integration function does is do a variable transform like: $t = 1/x$. This works when one limit is $\\infty$, giving\n",
- "\n",
- "$$\\int_a^b f(x) dx = \\int_{1/b}^{1/a} \\frac{1}{t^2} f\\left (\\frac{1}{t}\\right) dt$$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1.7724538509055159 1.4202636780944923e-08\n"
- ]
- }
- ],
- "source": [
- "I, err = integrate.quad(g, -np.inf, np.inf, args=(1.0, 1.0))\n",
- "print(I, err)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Multidimensional integrals"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "multidimensional integration can be done with successive calls to quad(), but there are wrappers that help"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Let's compute \n",
- "\n",
- "$$I = \\int_{y=0}^{1/2} \\int_{x=0}^{1-2y} xy dxdy = \\frac{1}{96}$$\n",
- "\n",
- "(this example comes from the SciPy tutorial)\n",
- "\n",
- "Notice that the limits of integration in x depend on y.\n",
- "\n",
- "Note the form of the function:\n",
- "\n",
- "```\n",
- "dblquad(f, a, b, ylo, yhi)\n",
- "```\n",
- "where `f` = `f(y, x)` -- the y argument is first\n",
- "\n",
- "The integral will be from: $x = [a,b]$, and $y$ = `ylo(x)`, $y$ = `yhi(x)`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0.010416666666666668 95.99999999999999\n"
- ]
- }
- ],
- "source": [
- "def integrand(x,y):\n",
- " return x*y\n",
- "\n",
- "def x_lower_lim(y):\n",
- " return 0\n",
- " \n",
- "def x_upper_lim(y):\n",
- " return 1-2*y\n",
- "\n",
- "# we change the definitions of x and y in this call\n",
- "I, err = integrate.dblquad(integrand, 0.0, 0.5, x_lower_lim, x_upper_lim)\n",
- "print(I, 1.0/I)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you remember the python lambda functions (one expression functions), you can do this more compactly:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0.010416666666666668\n"
- ]
- }
- ],
- "source": [
- "I, err = integrate.dblquad(lambda x, y: x*y, 0.0, 0.5, lambda y: 0, lambda y: 1-2*y)\n",
- "print(I)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### integration of a sampled function"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "here we integrate a function that is defined only at a sequece of points. Recall that Simpson's rule will use piecewise parabola data. Let's compute\n",
- "\n",
- "$$I = \\int_0^{2\\pi} f(x_i) dx$$\n",
- "\n",
- "with $x_i = 0, \\ldots, 2\\pi$ defined at $N$ points"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "3.14159265359\n"
- ]
- }
- ],
- "source": [
- "N = 17\n",
- "x = np.linspace(0.0, 2.0*np.pi, N, endpoint=True)\n",
- "y = np.sin(x)**2\n",
- "\n",
- "I = integrate.simps(y, x)\n",
- "print(I)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Romberg integration is specific to equally-spaced samples, where $N = 2^k + 1$ and can be more converge faster (it uses extrapolation of coarser integration results to achieve higher accuracy)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "3.14306583533\n"
- ]
- }
- ],
- "source": [
- "N = 17\n",
- "x = np.linspace(0.0, 2.0*np.pi, N, endpoint=True)\n",
- "y = np.sin(x)**2\n",
- "\n",
- "I = integrate.romb(y, dx=x[1]-x[0])\n",
- "print(I)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Interpolation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Interpolation fills in the gaps between a discrete number of points by making an assumption about the behavior of the functional form of the data.\n",
- "\n",
- "Many different types of interpolation exist\n",
- "* some ensure no new extrema are introduced\n",
- "* some conserve the quantity being interpolated\n",
- "* some match derivative at end points\n",
- "\n",
- "Pathologies exist -- it is not always best to use a high-order polynomial to pass through all of the points in your dataset."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "the `interp1d()` function allows for a variety of 1-d interpolation methods. It returns an object that acts as a function, which can be evaluated at any point."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "import scipy.interpolate as interpolate"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Help on class interp1d in module scipy.interpolate.interpolate:\n",
- "\n",
- "class interp1d(scipy.interpolate.polyint._Interpolator1D)\n",
- " | Interpolate a 1-D function.\n",
- " | \n",
- " | `x` and `y` are arrays of values used to approximate some function f:\n",
- " | ``y = f(x)``. This class returns a function whose call method uses\n",
- " | interpolation to find the value of new points.\n",
- " | \n",
- " | Note that calling `interp1d` with NaNs present in input values results in\n",
- " | undefined behaviour.\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | x : (N,) array_like\n",
- " | A 1-D array of real values.\n",
- " | y : (...,N,...) array_like\n",
- " | A N-D array of real values. The length of `y` along the interpolation\n",
- " | axis must be equal to the length of `x`.\n",
- " | kind : str or int, optional\n",
- " | Specifies the kind of interpolation as a string\n",
- " | ('linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic'\n",
- " | where 'zero', 'slinear', 'quadratic' and 'cubic' refer to a spline\n",
- " | interpolation of zeroth, first, second or third order) or as an\n",
- " | integer specifying the order of the spline interpolator to use.\n",
- " | Default is 'linear'.\n",
- " | axis : int, optional\n",
- " | Specifies the axis of `y` along which to interpolate.\n",
- " | Interpolation defaults to the last axis of `y`.\n",
- " | copy : bool, optional\n",
- " | If True, the class makes internal copies of x and y.\n",
- " | If False, references to `x` and `y` are used. The default is to copy.\n",
- " | bounds_error : bool, optional\n",
- " | If True, a ValueError is raised any time interpolation is attempted on\n",
- " | a value outside of the range of x (where extrapolation is\n",
- " | necessary). If False, out of bounds values are assigned `fill_value`.\n",
- " | By default, an error is raised unless `fill_value=\"extrapolate\"`.\n",
- " | fill_value : array-like or (array-like, array_like) or \"extrapolate\", optional\n",
- " | - if a ndarray (or float), this value will be used to fill in for\n",
- " | requested points outside of the data range. If not provided, then\n",
- " | the default is NaN. The array-like must broadcast properly to the\n",
- " | dimensions of the non-interpolation axes.\n",
- " | - If a two-element tuple, then the first element is used as a\n",
- " | fill value for ``x_new < x[0]`` and the second element is used for\n",
- " | ``x_new > x[-1]``. Anything that is not a 2-element tuple (e.g.,\n",
- " | list or ndarray, regardless of shape) is taken to be a single\n",
- " | array-like argument meant to be used for both bounds as\n",
- " | ``below, above = fill_value, fill_value``.\n",
- " | \n",
- " | .. versionadded:: 0.17.0\n",
- " | - If \"extrapolate\", then points outside the data range will be\n",
- " | extrapolated.\n",
- " | \n",
- " | .. versionadded:: 0.17.0\n",
- " | assume_sorted : bool, optional\n",
- " | If False, values of `x` can be in any order and they are sorted first.\n",
- " | If True, `x` has to be an array of monotonically increasing values.\n",
- " | \n",
- " | Methods\n",
- " | -------\n",
- " | __call__\n",
- " | \n",
- " | See Also\n",
- " | --------\n",
- " | splrep, splev\n",
- " | Spline interpolation/smoothing based on FITPACK.\n",
- " | UnivariateSpline : An object-oriented wrapper of the FITPACK routines.\n",
- " | interp2d : 2-D interpolation\n",
- " | \n",
- " | Examples\n",
- " | --------\n",
- " | >>> import matplotlib.pyplot as plt\n",
- " | >>> from scipy import interpolate\n",
- " | >>> x = np.arange(0, 10)\n",
- " | >>> y = np.exp(-x/3.0)\n",
- " | >>> f = interpolate.interp1d(x, y)\n",
- " | \n",
- " | >>> xnew = np.arange(0, 9, 0.1)\n",
- " | >>> ynew = f(xnew) # use interpolation function returned by `interp1d`\n",
- " | >>> plt.plot(x, y, 'o', xnew, ynew, '-')\n",
- " | >>> plt.show()\n",
- " | \n",
- " | Method resolution order:\n",
- " | interp1d\n",
- " | scipy.interpolate.polyint._Interpolator1D\n",
- " | builtins.object\n",
- " | \n",
- " | Methods defined here:\n",
- " | \n",
- " | __init__(self, x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)\n",
- " | Initialize a 1D linear interpolation class.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors defined here:\n",
- " | \n",
- " | __dict__\n",
- " | dictionary for instance variables (if defined)\n",
- " | \n",
- " | __weakref__\n",
- " | list of weak references to the object (if defined)\n",
- " | \n",
- " | fill_value\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Methods inherited from scipy.interpolate.polyint._Interpolator1D:\n",
- " | \n",
- " | __call__(self, x)\n",
- " | Evaluate the interpolant\n",
- " | \n",
- " | Parameters\n",
- " | ----------\n",
- " | x : array_like\n",
- " | Points to evaluate the interpolant at.\n",
- " | \n",
- " | Returns\n",
- " | -------\n",
- " | y : array_like\n",
- " | Interpolated values. Shape is determined by replacing\n",
- " | the interpolation axis in the original array with the shape of x.\n",
- " | \n",
- " | ----------------------------------------------------------------------\n",
- " | Data descriptors inherited from scipy.interpolate.polyint._Interpolator1D:\n",
- " | \n",
- " | dtype\n",
- "\n"
- ]
- }
- ],
- "source": [
- "help (interpolate.interp1d)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "def f_exact(x):\n",
- " return np.sin(x)*x\n",
- "\n",
- "N = 10\n",
- "x = np.linspace(0, 20, N)\n",
- "\n",
- "y = f_exact(x)\n",
- "\n",
- "fInterp = interpolate.interp1d(x, y, kind=3)\n",
- "\n",
- "# use finer points when we plot\n",
- "xplot = np.linspace(0, 20, 10*N)\n",
- "\n",
- "plt.plot(x, y, \"ro\", label=\"known points\")\n",
- "plt.plot(xplot, f_exact(xplot), \"b:\", label=\"exact function\")\n",
- "plt.plot(xplot, fInterp(xplot), \"r-\", label=\"interpolant\")\n",
- "\n",
- "plt.legend(frameon=False, loc=\"best\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Multi-d interpolation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's an example of mult-d interpolation from the official tutorial.\n",
- "\n",
- "First we define the \"answer\" -- this is the true function that we will sample at a number of points and then try to use interpolation to recover"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "def func(x, y):\n",
- " return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "here will use mgrid to create the grid of (x,y) where we know func exactly -- this will be for plotting. Note the fun trick here, this is not really a function, but rather something that can magically look like an array, and we index it with the start:stop:stride. If we set stride to an imaginary number, then it is interpreted as the number of points to put between the start and stop"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(100, 200)\n",
- "(100, 200)\n"
- ]
- }
- ],
- "source": [
- "print(grid_x.shape)\n",
- "print(grid_y.shape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "here's what the exact function looks like -- note that our function is defined in x,y, but imshow is meant for plotting an array, so the first index is the row. We take the transpose when plotting"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 20,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.imshow(func(grid_x, grid_y).T, extent=(0,1,0,1), origin=\"lower\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "now we'll define 1000 random points where we'll sample the function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "points = np.random.rand(1000, 2)\n",
- "values = func(points[:,0], points[:,1])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's what those points look like:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(0, 1)"
- ]
- },
- "execution_count": 22,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.scatter(points[:,0], points[:,1], s=1)\n",
- "plt.xlim(0,1)\n",
- "plt.ylim(0,1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The interpolate.griddata() function provides many ways to interpolate a collection of points into a uniform grid. There are many different interpolation methods within this function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 23,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "grid_z0 = interpolate.griddata(points, values, (grid_x, grid_y), method='nearest')\n",
- "plt.imshow(grid_z0.T, extent=(0,1,0,1), origin=\"lower\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "grid_z0 = interpolate.griddata(points, values, (grid_x, grid_y), method='linear')\n",
- "plt.imshow(grid_z0.T, extent=(0,1,0,1), origin=\"lower\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 25,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "grid_z0 = interpolate.griddata(points, values, (grid_x, grid_y), method='cubic')\n",
- "plt.imshow(grid_z0.T, extent=(0,1,0,1), origin=\"lower\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Root Finding"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Often we need to find a value of a variable that zeros a function -- this is _root finding_. Sometimes, this is a multidimensional problem."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The `brentq()` routine offers a very robust method for find roots from a scalar function. You do need to provide an interval that bounds the root."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "$f(x) = \\frac{x e^x}{e^x - 1} - 5$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "4.965114231744287\n",
- "True\n"
- ]
- }
- ],
- "source": [
- "import scipy.optimize as optimize\n",
- "\n",
- "def f(x):\n",
- " # this is the non-linear equation that comes up in deriving Wien's law for radiation\n",
- " return (x*np.exp(x)/(np.exp(x) - 1.0) - 5.0)\n",
- "\n",
- "root, r = optimize.brentq(f, 0.1, 10.0, full_output=True)\n",
- "\n",
- "print(root)\n",
- "print(r.converged)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "x = np.linspace(0.1, 10.0, 1000)\n",
- "plt.plot(x, f(x))\n",
- "plt.plot(np.array([root]), np.array([f(root)]), 'ro')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# ODEs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Many methods exist for integrating ordinary differential equations. Most will want you to write your ODEs as a system of first order equations."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This system of ODEs is the Lorenz system:\n",
- "\n",
- "$$\\frac{dx}{dt} = \\sigma (y - x)$$\n",
- "$$\\frac{dy}{dt} = rx - y - xz$$\n",
- "$$\\frac{dz}{dt} = xy - bz$$\n",
- "\n",
- "the steady states of this system correspond to:\n",
- "\n",
- "$${\\bf f}({\\bf x}) = \n",
- "\\left (\n",
- "\\sigma (y -x), \n",
- "rx - y -xz, \n",
- "xy - bz\n",
- "\\right )^\\intercal\n",
- "= 0$$\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [],
- "source": [
- "# system parameters\n",
- "sigma = 10.0\n",
- "b = 8./3.\n",
- "r = 28.0\n",
- "\n",
- "def rhs(t, x):\n",
- " xdot = sigma*(x[1] - x[0])\n",
- " ydot = r*x[0] - x[1] - x[0]*x[2]\n",
- " zdot = x[0]*x[1] - b*x[2]\n",
- "\n",
- " return np.array([xdot, ydot, zdot])\n",
- "\n",
- "def jac(t, x):\n",
- "\n",
- " return np.array(\n",
- " [ [-sigma, sigma, 0.0], \n",
- " [r - x[2], -1.0, -x[0]],\n",
- " [x[1], x[0], -b] ])\n",
- "\n",
- "def f(x):\n",
- " return rhs(0.,x), jac(0.,x)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "SciPy >= 1.0.0 has a uniform interface to the different ODE solvers, `solve_ivp()` -- we use that here. Note, some (but not all) solvers provide a way to get the solution data at intermediate times (called dense output)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [],
- "source": [
- "def ode_integrate(X0, dt, tmax):\n",
- " \"\"\" integrate using the VODE method, storing the solution each dt \"\"\"\n",
- "\n",
- " r = integrate.solve_ivp(rhs, (0.0, tmax), X0,\n",
- " method=\"RK45\", dense_output=True)\n",
- "\n",
- " # get the solution at intermediate times\n",
- " ts = np.arange(0.0, tmax, dt)\n",
- " \n",
- " Xs = r.sol(ts)\n",
- " return ts, Xs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "t, X = ode_integrate([1.0, 1.0, 20.0], 0.02, 30)\n",
- "from mpl_toolkits.mplot3d import Axes3D\n",
- "\n",
- "fig = plt.figure()\n",
- "ax = fig.gca(projection='3d')\n",
- "ax.plot(X[0,:], X[1,:], X[2,:])\n",
- "fig.set_size_inches(8.0,6.0)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Multi-variate root find"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we can find the steady points in this system by doing a multi-variate root find on the RHS vector"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 0. 0. 0.]\n",
- "[ 8.48528137 8.48528137 27. ]\n",
- "[ -8.48528137 -8.48528137 27. ]\n"
- ]
- }
- ],
- "source": [
- "sol1 = optimize.root(f, [1., 1., 1.], jac=True)\n",
- "print(sol1.x)\n",
- "\n",
- "sol2 = optimize.root(f, [10., 10., 10.], jac=True)\n",
- "print(sol2.x)\n",
- "\n",
- "sol3 = optimize.root(f, [-10., -10., -10.], jac=True)\n",
- "print(sol3.x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 32,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "fig = plt.figure()\n",
- "ax = fig.gca(projection='3d')\n",
- "ax.plot(X[0,:], X[1,:], X[2,:])\n",
- "\n",
- "ax.scatter(sol1.x[0], sol1.x[1], sol1.x[2], marker=\"x\", color=\"r\")\n",
- "ax.scatter(sol2.x[0], sol2.x[1], sol2.x[2], marker=\"x\", color=\"r\")\n",
- "ax.scatter(sol3.x[0], sol3.x[1], sol3.x[2], marker=\"x\", color=\"r\")\n",
- "\n",
- "ax.set_xlabel(\"x\")\n",
- "ax.set_ylabel(\"y\")\n",
- "ax.set_zlabel(\"z\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Stiff system of ODEs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A stiff system of ODEs is one where there are multiple disparate timescales for change and we need to respect all of them to get an accurate solution\n",
- "\n",
- "Here is an example from Chemical Kinetics (see, ex. Byrne & Hindmarsh 1986, or the VODE source code)\n",
- "\n",
- "\\begin{equation}\n",
- "\\frac{d}{dt} \\left (\n",
- " \\begin{array}{c} y_1 \\newline y_2 \\newline y_3 \\end{array}\n",
- " \\right ) =\n",
- "%\n",
- "\\left (\n",
- " \\begin{array}{rrr}\n",
- " -0.04 y_1 & + 10^4 y_2 y_3 & \\newline\n",
- " 0.04 y_1 & - 10^4 y_2 y_3 & -3\\times 10^7 y_2^2 \\newline\n",
- " & & 3\\times 10^7 y_2^2 \n",
- "\\end{array}\n",
- "\\right )\n",
- "\\end{equation}\n",
- "\n",
- "\\begin{equation}\n",
- "{\\bf J} = \\left (\n",
- "\\begin{array}{ccc}\n",
- " -0.04 & 10^4 y_3 & 10^4 y_2 \\newline\n",
- " 0.04 & -10^4 y_3 - 6\\times 10^7 y_2 & -10^4 y_2 \\newline\n",
- " 0 & 6\\times 10^7 y_2 & 0 \n",
- "\\end{array}\n",
- "\\right )\n",
- "\\end{equation}\n",
- "\n",
- "start with $y_1(0) = 1, y_2(0) = y_3(0) = 0$. Long term behavior is $y_1, y_2 \\rightarrow 0; y_3 \\rightarrow 1$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [],
- "source": [
- "def rhs(t, Y):\n",
- " \"\"\" RHS of the system -- using 0-based indexing \"\"\"\n",
- " y1 = Y[0]\n",
- " y2 = Y[1]\n",
- " y3 = Y[2]\n",
- "\n",
- " dy1dt = -0.04*y1 + 1.e4*y2*y3\n",
- " dy2dt = 0.04*y1 - 1.e4*y2*y3 - 3.e7*y2**2\n",
- " dy3dt = 3.e7*y2**2\n",
- "\n",
- " return np.array([dy1dt, dy2dt, dy3dt])\n",
- "\n",
- "\n",
- "def jac(t, Y):\n",
- " \"\"\" J_{i,j} = df_i/dy_j \"\"\"\n",
- "\n",
- " y1 = Y[0]\n",
- " y2 = Y[1]\n",
- " y3 = Y[2]\n",
- "\n",
- " df1dy1 = -0.04\n",
- " df1dy2 = 1.e4*y3\n",
- " df1dy3 = 1.e4*y2\n",
- "\n",
- " df2dy1 = 0.04\n",
- " df2dy2 = -1.e4*y3 - 6.e7*y2\n",
- " df2dy3 = -1.e4*y2\n",
- "\n",
- " df3dy1 = 0.0\n",
- " df3dy2 = 6.e7*y2\n",
- " df3dy3 = 0.0\n",
- "\n",
- " return np.array([ [ df1dy1, df1dy2, df1dy3 ],\n",
- " [ df2dy1, df2dy2, df2dy3 ],\n",
- " [ df3dy1, df3dy2, df3dy3 ] ])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [],
- "source": [
- "def vode_integrate(Y0, tmax):\n",
- " \"\"\" integrate using the NDF method \"\"\"\n",
- "\n",
- " r = integrate.solve_ivp(rhs, (0.0, tmax), Y0,\n",
- " method=\"BDF\", jac=jac, rtol=1.e-7, atol=1.e-10)\n",
- "\n",
- " # Note: this solver does not have a dens_output method, instead we \n",
- " # access the solution data where it was evaluated internally via\n",
- " # the return object\n",
- " \n",
- " return r.t, r.y"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 35,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "Y0 = np.array([1.0, 0.0, 0.0])\n",
- "tmax = 4.e7\n",
- "\n",
- "ts, Ys = vode_integrate(Y0, tmax)\n",
- "\n",
- "ax = plt.gca()\n",
- "ax.set_xscale('log')\n",
- "ax.set_yscale('log')\n",
- "\n",
- "plt.plot(ts, Ys[0,:], label=r\"$y_1$\")\n",
- "plt.plot(ts, Ys[1,:], label=r\"$y_2$\")\n",
- "plt.plot(ts, Ys[2,:], label=r\"$y_3$\")\n",
- "\n",
- "plt.legend(loc=\"best\", frameon=False)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Fitting\n",
- "\n",
- "Fitting is used to match a model to experimental data. E.g. we have N points of $(x_i, y_i)$ with associated errors, $\\sigma_i$, and we want to find a simply function that best represents the data.\n",
- "\n",
- "Usually this means that we will need to define a metric, often called the residual, for how well our function matches the data, and then minimize this residual. Least-squares fitting is a popular formulation.\n",
- "\n",
- "We want to fit our data to a function $Y(x, \\{a_j\\})$, where $a_j$ are model parameters we can adjust. We want to find the optimal $a_j$ to minimize the distance of $Y$ from our data:\n",
- "$$\\Delta_i = Y(x_i, \\{a_j\\}) - y_i$$\n",
- "\n",
- "Least-squares minimizes $\\chi^2$:\n",
- "$$\\chi^2(\\{a_j\\}) = \\sum_{i=1}^N \\left ( \\frac{\\Delta_i}{\\sigma_i} \\right )^2$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### general linear least squares"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "First we'll make some experimental data (a quadratic with random fashion). We use the randn() function to provide Gaussian normalized errors."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/lib64/python3.6/site-packages/matplotlib/axes/_axes.py:2818: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n",
- " warnings.warn(msg, mplDeprecation, stacklevel=1)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "def y_experiment2(a1, a2, a3, sigma, x):\n",
- " \"\"\" return the experimental data in a quadratic + random fashion, \n",
- " with a1, a2, a3 the coefficients of the quadratic and sigma is \n",
- " the error. This will be poorly matched to a linear fit for \n",
- " a3 != 0 \"\"\"\n",
- "\n",
- " N = len(x)\n",
- "\n",
- " # randn gives samples from the \"standard normal\" distribution \n",
- " r = np.random.randn(N)\n",
- "\n",
- " y = a1 + a2*x + a3*x*x + sigma*r\n",
- "\n",
- " return y\n",
- "\n",
- "N = 40\n",
- "sigma = 5.0*np.ones(N)\n",
- "\n",
- "x = np.linspace(0, 100.0, N)\n",
- "y = y_experiment2(2.0, 1.50, -0.02, sigma, x)\n",
- "\n",
- "plt.scatter(x,y)\n",
- "plt.errorbar(x, y, yerr=sigma, fmt=None)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 0.2392447 1.54861457 -0.02025217]\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/lib64/python3.6/site-packages/matplotlib/axes/_axes.py:2818: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n",
- " warnings.warn(msg, mplDeprecation, stacklevel=1)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 37,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "def resid(avec, x, y, sigma):\n",
- " \"\"\" the residual function -- this is what will be minimized by the\n",
- " scipy.optimize.leastsq() routine. avec is the parameters we\n",
- " are optimizing -- they are packed in here, so we unpack to\n",
- " begin. (x, y) are the data points \n",
- "\n",
- " scipy.optimize.leastsq() minimizes:\n",
- "\n",
- " x = arg min(sum(func(y)**2,axis=0))\n",
- " y\n",
- "\n",
- " so this should just be the distance from a point to the curve,\n",
- " and it will square it and sum over the points\n",
- " \"\"\"\n",
- "\n",
- " a0, a1, a2 = avec\n",
- " \n",
- " return (y - (a0 + a1*x + a2*x**2))/sigma\n",
- "\n",
- "\n",
- "# initial guesses\n",
- "a0, a1, a2 = 1, 1, 1\n",
- "\n",
- "afit, flag = optimize.leastsq(resid, [a0, a1, a2], args=(x, y, sigma))\n",
- "\n",
- "print(afit)\n",
- "\n",
- "plt.plot(x, afit[0] + afit[1]*x + afit[2]*x*x )\n",
- "plt.scatter(x,y)\n",
- "plt.errorbar(x, y, yerr=sigma, fmt=None)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "$\\chi^2$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0.811373197043\n"
- ]
- }
- ],
- "source": [
- "chisq = sum(np.power(resid(afit, x, y, sigma),2))\n",
- "normalization = len(x)-len(afit)\n",
- "print(chisq/normalization)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### a nonlinear example"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "our experiemental data -- an exponential"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/lib64/python3.6/site-packages/matplotlib/axes/_axes.py:2818: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n",
- " warnings.warn(msg, mplDeprecation, stacklevel=1)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 39,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAEWVJREFUeJzt3X2MXNV5x/HvU2PKSrRdETaJWeMuragVGhpMV5TKUhVBImiCwKI0ImopVFSW2kZNlIoU8kerVK0gQkrom4rcgOqkaQARalxCZKUYFFVqSRYMIdR14yDSeI1iJ8GQqKuA4ekfcw1mM+t52Zk7d858P9LK83J259HxzO/eOfeceyMzkSSNv58YdQGSpMEw0CWpEAa6JBXCQJekQhjoklQIA12SCmGgS1IhDHRJKoSBLkmFOKnbhhGxBlgAFjPzsog4C7gLOA14HLgmM1860d84/fTTc25ubhXlStLkeeyxx76bmTOd2nUd6MAHgb3AT1f3Pw58MjPviojbgeuBvz/RH5ibm2NhYaGHl5QkRcS3umnX1ZBLRKwH3gt8qrofwEXAvVWT7cCW3suUJA1Kt2PotwEfAV6t7r8JOJKZR6v7B4DZdr8YEVsjYiEiFg4fPryqYiVJK+sY6BFxGXAoMx87/uE2TduetjEzt2XmfGbOz8x0HAKSJPWpmzH0zcDlEfEe4BRaY+i3AdMRcVK1l74eODi8MiVJnXTcQ8/MmzJzfWbOAVcDuzPzt4CHgauqZtcC9w+tSklSR6uZh/4nwIcjYj+tMfU7BlOSJKkfvUxbJDMfAR6pbj8DXDD4kiRJ/XClqCQVwkCXpEIY6JJUCANdkgphoEtSIQx0SSqEgS5JhTDQJakQBrokFcJAl6RCGOiSVAgDXZIKYaBLUiEMdEkqhIEuSYUw0CWpEAa6JBXCQJekQhjoklQIA12SCtHTRaIlaVLt2LPIrbv2cfDIEmdMT3HDJRvZsml21GW9gYEuSR3s2LPITfc9xdLLrwCweGSJm+57CqBRoe6QiyR1cOuufa+F+TFLL7/Crbv2jaii9gx0Serg4JGlnh4fFYdcJKmDM6anWGwT3mdMT53w9+oed3cPXZI6uOGSjUytXfOGx6bWruGGSzau+DvHxt0XjyyRvD7uvmPP4tDqNNAlqYMtm2a5+cpzmZ2eIoDZ6SluvvLcE+5tj2Lc3SEXSerClk2zPQ2XjGLc3T10SRqClcbXO427r4aBLklD0M+4+2o55CJJQ3BseKbOWS4GuiQNSa/j7qvlkIskFcJAl6RCdAz0iDglIr4SEU9GxNMR8bHq8bMi4tGI+EZE3B0RJw+/XEnSSrrZQ/8RcFFmvgM4D7g0Ii4EPg58MjPPBp4Hrh9emZKkTjoGerb8sLq7tvpJ4CLg3urx7cCWoVQoSepKV2PoEbEmIp4ADgFfAr4JHMnMo1WTA0DbQ7kRsTUiFiJi4fDhw4OoWZLURlfTFjPzFeC8iJgG/gV4W7tmK/zuNmAbwPz8fNs2klSncbj6UD96moeemUci4hHgQmA6Ik6q9tLXAweHUJ8kDdS4XH2oH93Mcpmp9syJiCngXcBe4GHgqqrZtcD9wypSkgZlXK4+1I9u9tDXAdsjYg2tDcA9mflARPwXcFdE/AWwB7hjiHVK0kCMy9WH+tEx0DPza8CmNo8/A1wwjKIkaVj6vfrQOHClqKSJMoqzINbFk3NJmiijOAtiXQx0SY1Sx5TCus+CWBcDXVJjlDylsA6OoUtqjJKnFNbBQJfUGCVPKayDgS6pMUZxYeWSGOiSGqPkKYV18KCopMYoeUphHQx0SY1S6pTCOjjkIkmFMNAlqRAGuiQVwkCXpEIY6JJUCANdkgphoEtSIQx0SSqEgS5JhTDQJakQBrokFcJAl6RCGOiSVAgDXZIKYaBLUiEMdEkqhIEuSYXwikWSxt6OPYtetg4DXdKY27FnkZvue4qll18BYPHIEjfd9xTAxIW6Qy6Sxtqtu/a9FubHLL38Crfu2jeiikbHQJc01g4eWerp8ZIZ6JLG2hnTUz09XjIDXdJYu+GSjUytXfOGx6bWruGGSzaOqKLR8aCopLF27MCns1y6CPSIOBP4NPBW4FVgW2b+VUScBtwNzAHPAu/LzOeHV6oktbdl0+xEBvhy3Qy5HAX+ODPfBlwI/GFEnAPcCDyUmWcDD1X3JUkj0jHQM/O5zHy8uv0DYC8wC1wBbK+abQe2DKtISVJnPR0UjYg5YBPwKPCWzHwOWqEPvHnQxUmSutf1QdGIOBX4PPChzHwxIrr9va3AVoANGzb0U6OkMeay/Pp0tYceEWtphflnM/O+6uHvRMS66vl1wKF2v5uZ2zJzPjPnZ2ZmBlGzpDFxbFn+4pElkteX5e/Yszjq0orUMdCjtSt+B7A3Mz9x3FM7gWur29cC9w++PEnjzGX59epmyGUzcA3wVEQ8UT32UeAW4J6IuB74X+A3h1OipHHlsvx6dQz0zPx3YKUB84sHW46kkpwxPcVim/CexGX5dXDpv6ShcVl+vVz6L2loXJZfLwNd0lC5LL8+BrrUQM7dVj8MdKlh6rqkmhuN8nhQVGqYOuZuu+CnTAa61DB1zN12wU+ZDHSpYeq4pJoLfspkoEsNU8fcba/DWSYDXWqYLZtmufnKc5mdniKA2ekpbr7y3IEesHTBT5mc5SI10LDnbve74MeZMc1moEsTqteNRl3TKdU/h1wkdcWZMc1noEvqijNjms9Al9QVZ8Y0n4EuqSvOjGk+D4pK6oqnwm0+A11S1zwVbrM55CJJhTDQJakQBrokFcJAl6RCGOiSVAgDXZIK4bRFqRCeCVEGulQAz4QoMNDVJ/cGm+VEZ0L0/2VyGOjqWV17g3VsNErZMHkmRIEHRdWHOs6LfWyjsXhkieT1jcaOPYtj9Rp18UyIAgNdfahjb7COjUZJF2zwTIgCA119qGNvsI6NRknDFHVcWFrN5xi6enbDJRvfMIYOg98bPGN6isU2wTrIjUYdr1Enz4Qo99DVszr2BusYQnCYQqVxD119GfbeYB0XU+j3NUqZGaPyRGaeuEHEncBlwKHMfHv12GnA3cAc8Czwvsx8vtOLzc/P58LCwipLlkZn+ZRNaO3VO16tYYqIxzJzvlO7boZc/hG4dNljNwIPZebZwEPVfal4Jc2MUXk6Bnpmfhn4/rKHrwC2V7e3A1sGXJfUSCXNjFF5+j0o+pbMfA6g+vfNgytJai4X8KjJhj7LJSK2RsRCRCwcPnx42C/XaDv2LLL5lt2cdeMX2HzL7rFckTjpnBmjJus30L8TEesAqn8PrdQwM7dl5nxmzs/MzPT5cuOvpGXmk8wFPGqyfqct7gSuBW6p/r1/YBUVyrPhlcMFPGqqjnvoEfE54D+AjRFxICKupxXk746IbwDvru7rBDyYJmnYOu6hZ+b7V3jq4gHXUrTSlplLah6X/tfEg2mShs2l/zWpYym7pMlmoNeon4NpnjekN/aXJpmB3mBe+Lc39pcmnWPoDeZ5Q3pjf2nSjcUe+qR+jXaqY2+a2l+T+v5V/Rq/hz7JKyw9b0hvmthfk/z+Vf0aH+iT/DXaqY69aWJ/TfL7V/Vr/JBLU79G18Gpjr1pYn9N8vtX9Wt8oE/6CkvPG9KbpvXXpL9/Va/GD7k08Wu01C3fv6pT4/fQm/g1WuqW71/VqeNFogfJi0Q3k9PqpGbr9iLRjd9D13C5ulIqR+PH0DVcTquTymGgTzin1UnlMNAnXBNXV0rqj4E+4ZxWJ5XDg6ITzml1UjkM9ML0MwWxaasrJfXHQF+Fps3fdgqiNNkcQ+9TE0+L6hREabIZ6H1qYng6BVGabAZ6n5oYnk5BlCabgd6nJoZnk6cg7tizyOZbdnPWjV9g8y27vWKPNAQGep+aGJ5bNs1y85XnMjs9RQCz01PcfOW5Iz8g2sTjDVKJnOXSp6bO327iFMQTHW9oWq3SODPQV6GJ4dlETTzeIJXIIRcNXROPN0glMtA1dE083iCVyCEXDV1TjzdIpTHQVQuPN0jD55CLJBXCQJekQqwq0CPi0ojYFxH7I+LGQRUlSepd34EeEWuAvwN+HTgHeH9EnDOowiRJvVnNHvoFwP7MfCYzXwLuAq4YTFmSpF6tZpbLLPDt4+4fAH5ldeWMTtMuViFJvVpNoEebx/LHGkVsBbYCbNiwYRUvNzxe6UdSCVYz5HIAOPO4++uBg8sbZea2zJzPzPmZmZlVvNzwNPFiFZLUq9UE+leBsyPirIg4Gbga2DmYsurlyaMklaDvQM/Mo8AHgF3AXuCezHx6UIXVyZNHSSrBquahZ+aDmfkLmfnzmfmXgyqqbp48SlIJPJcLnjxKUhkM9Ionj5I07ooMdOeUS5pExQW6c8olTarizrbonHJJk6q4QHdOuaRJVVygO6dc0qQqLtCdUy5pUhV3UNQ55ZImVXGBDs4plzSZihtykaRJZaBLUiEMdEkqhIEuSYUw0CWpEAa6JBXCQJekQhjoklQIA12SCmGgS1IhDHRJKoSBLkmFMNAlqRAGuiQVwkCXpEIY6JJUCANdkgphoEtSIQx0SSqEgS5JhTDQJakQBrokFcJAl6RCGOiSVAgDXZIKYaBLUiEMdEkqRGRmfS8WcRj41ir+xOnAdwdUziA1sa4m1gTW1Svr6k2pdf1sZs50alRroK9WRCxk5vyo61iuiXU1sSawrl5ZV28mvS6HXCSpEAa6JBVi3AJ926gLWEET62piTWBdvbKu3kx0XWM1hi5JWtm47aFLklbQuECPiEsjYl9E7I+IG9s8/5MRcXf1/KMRMdeQuq6LiMMR8UT183s11XVnRByKiK+v8HxExF9XdX8tIs5vQE3vjIgXjuurPx12TdXrnhkRD0fE3oh4OiI+2KbNKPqrm7pq77OIOCUivhIRT1Z1faxNm9o/j13WNarP45qI2BMRD7R5bvh9lZmN+QHWAN8Efg44GXgSOGdZmz8Abq9uXw3c3ZC6rgP+dgR99mvA+cDXV3j+PcAXgQAuBB5tQE3vBB4YQV+tA86vbv8U8D9t/h9H0V/d1FV7n1V9cGp1ey3wKHDhsjaj+Dx2U9eoPo8fBv653f9VHX3VtD30C4D9mflMZr4E3AVcsazNFcD26va9wMUREQ2oayQy88vA90/Q5Arg09nyn8B0RKwbcU0jkZnPZebj1e0fAHuB2WXNRtFf3dRVu6oPfljdXVv9LD/oVvvnscu6ahcR64H3Ap9aocnQ+6ppgT4LfPu4+wf48Tf2a20y8yjwAvCmBtQF8BvV1/R7I+LMIdfUrW5rr9uvVl+ZvxgRv1j3i1dfdzfR2rs73kj76wR1wQj6rBpCeAI4BHwpM1fsrxo/j93UBfV/Hm8DPgK8usLzQ++rpgV6u63V8i1vN20GrZvX/FdgLjN/Cfg3Xt8Sj9oo+quTx2ktZX4H8DfAjjpfPCJOBT4PfCgzX1z+dJtfqaW/OtQ1kj7LzFcy8zxgPXBBRLx9WZOR9FcXddX6eYyIy4BDmfnYiZq1eWygfdW0QD8AHL8lXQ8cXKlNRJwE/AzD/3rfsa7M/F5m/qi6+w/ALw+5pm5106e1yswXj31lzswHgbURcXodrx0Ra2mF5mcz8742TUbSX53qGmWfVa95BHgEuHTZU6P4PHasawSfx83A5RHxLK0h2Ysi4p+WtRl6XzUt0L8KnB0RZ0XEybQOHOxc1mYncG11+ypgd1ZHGUZZ17Jx1stpjYM2wU7gd6rZGxcCL2Tmc6MsKCLeemzsMCIuoPU+/F4NrxvAHcDezPzECs1q769u6hpFn0XETERMV7engHcB/72sWe2fx27qqvvzmJk3Zeb6zJyjlQ+7M/O3lzUbel+dNMg/tlqZeTQiPgDsojWz5M7MfDoi/hxYyMydtN74n4mI/bS2blc3pK4/iojLgaNVXdcNuy6AiPgcrRkQp0fEAeDPaB0kIjNvBx6kNXNjP/B/wO82oKargN+PiKPAEnB1DRtlaO1FXQM8VY2/AnwU2HBcbbX3V5d1jaLP1gHbI2INrQ3IPZn5wKg/j13WNZLP43J195UrRSWpEE0bcpEk9clAl6RCGOiSVAgDXZIKYaBLUiEMdEkqhIEuSYUw0CWpEP8Pj/xNwIJWOKsAAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "a0 = 2.5\n",
- "a1 = 2./3.\n",
- "sigma = 5.0\n",
- "\n",
- "a0_orig, a1_orig = a0, a1\n",
- "\n",
- "x = np.linspace(0.0, 4.0, 25)\n",
- "y = a0*np.exp(a1*x) + sigma*np.random.randn(len(x))\n",
- "\n",
- "plt.scatter(x,y)\n",
- "plt.errorbar(x, y, yerr=sigma, fmt=None, label=\"_nolegend_\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "our function to minimize"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {},
- "outputs": [],
- "source": [
- "def resid(avec, x, y):\n",
- " \"\"\" the residual function -- this is what will be minimized by the \n",
- " scipy.optimize.leastsq() routine. avec is the parameters we \n",
- " are optimizing -- they are packed in here, so we unpack to \n",
- " begin. (x, y) are the data points \n",
- " \n",
- " scipy.optimize.leastsq() minimizes: \n",
- " \n",
- " x = arg min(sum(func(y)**2,axis=0)) \n",
- " y \n",
- " \n",
- " so this should just be the distance from a point to the curve, \n",
- " and it will square it and sum over the points \n",
- " \"\"\"\n",
- "\n",
- " a0, a1 = avec\n",
- "\n",
- " # note: if we wanted to deal with error bars, we would weight each \n",
- " # residual accordingly \n",
- " return y - a0*np.exp(a1*x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1\n",
- "[ 2.8409826 0.62230606]\n"
- ]
- }
- ],
- "source": [
- "a0, a1 = 1, 1\n",
- "afit, flag = optimize.leastsq(resid, [a0, a1], args=(x, y))\n",
- "\n",
- "print(flag)\n",
- "print(afit)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/lib64/python3.6/site-packages/matplotlib/axes/_axes.py:2818: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n",
- " warnings.warn(msg, mplDeprecation, stacklevel=1)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 42,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VFX6wPHvSUIIIRBaqCEJgdASCL03RRQsqBQFQcEV0XVdcV1X1h+rrOvGskUs68rGjsa2KCsC4sIqgqK00KWTRg+k9zLv749JIoSUSZjMTCbv53nmYcq597xzyLxz59xzzzEiglJKqfrPw9kBKKWUsg9N6Eop5SY0oSullJvQhK6UUm5CE7pSSrkJTehKKeUmNKErpZSb0ISulFJuQhO6Ukq5CS9bCxpjPIHtwEkRudEY0wX4CGgFxAJ3ikhBVfto06aNhISEXEG4SinV8OzYseO8iARUV87mhA4sAA4AzUsePw8sEZGPjDFLgXuA16raQUhICNu3b69BlUoppYwxCbaUs6nLxRgTCNwAvFHy2ABXA8tLirwL3FLzMJVSStmLrX3oLwKPAZaSx62BNBEpKnl8AuhU0YbGmPnGmO3GmO3JyclXFKxSSqnKVZvQjTE3AudEZMfFT1dQtMJpG0UkWkQGiciggIBqu4CUUkrVki196COBycaY6wEfrH3oLwItjDFeJUfpgcCpugtTKaVUdao9QheRx0UkUERCgBnA1yIyC/gGmFZSbA7weZ1FqZRSqlpXMg59IfCIMeYo1j71N+0TklJKqdqoybBFRGQDsKHk/nFgiP1DUkopVRt6pahSSrkJTehKKeUmNKE7UFJSEldddRW9evUiPDycl156qcJyS5YsITw8nIiICGbOnEleXt4lrxcXF9O/f39uvPHGsufWrl1Ljx496NatG88991zZ8y+99BIRERGEh4fz4osvVltPXl4eQ4YMITIykvDwcBYvXmzHFrhylb3P8tLS0pg2bRo9e/akV69e/PDDD1W2f2WvVdUeVcVSUf1K1TkRcdht4MCB0pCdOnVKduzYISIiGRkZEhYWJvv377+kzIkTJyQkJERycnJERGT69Ony9ttvX1Lm73//u8ycOVNuuOEGEREpKiqS0NBQOXbsmOTn50vfvn1l//79snfvXgkPD5fs7GwpLCyU8ePHy+HDh6usx2KxSGZmpoiIFBQUyJAhQ+SHH36oszapicreZ0Xuuusuef3110VEJD8/X1JTU6ts/8peq6w9qoulovqVqi1g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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(x, afit[0]*np.exp(afit[1]*x),\n",
- " label=r\"$a_0 = $ %f; $a_1 = $ %f\" % (afit[0], afit[1]))\n",
- "plt.plot(x, a0_orig*np.exp(a1_orig*x), \":\", label=\"original function\")\n",
- "plt.legend(numpoints=1, frameon=False)\n",
- "plt.scatter(x,y, c=\"k\")\n",
- "plt.errorbar(x, y, yerr=sigma, fmt=None, label=\"_nolegend_\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# FFTs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Fourier transforms convert a physical-space (or time series) representation of a function into frequency space. This provides an equivalent representation of the data with a new view.\n",
- "\n",
- "The FFT and its inverse in NumPy use:\n",
- "$$F_k = \\sum_{n=0}^{N-1} f_n e^{-2\\pi i nk/N}$$\n",
- "\n",
- "$$f_n = \\frac{1}{N} \\sum_{k=0}^{N-1} F_k \n",
- " e^{2\\pi i n k/N}$$\n",
- " \n",
- "\n",
- "Both NumPy and SciPy have FFT routines that are similar. However, the NumPy version returns the data in a more convenient form.\n",
- "\n",
- "It's always best to start with something you understand -- let's do a simple sine wave. Since our function is real, we can use the rfft routines in NumPy -- the understand that we are working with real data and they don't return the negative frequency components.\n",
- "\n",
- "One important caveat -- FFTs assume that you are periodic. If you include both endpoints of the domain in the points that comprise your sample then you will not match this assumption. Here we use endpoint=False with linspace()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 43,
- "metadata": {},
- "outputs": [],
- "source": [
- "def single_freq_sine(npts):\n",
- "\n",
- " # a pure sine with no phase shift will result in pure imaginary \n",
- " # signal \n",
- " f_0 = 0.2\n",
- "\n",
- " xmax = 10.0/f_0\n",
- " \n",
- " xx = np.linspace(0.0, xmax, npts, endpoint=False)\n",
- "\n",
- " f = np.sin(2.0*np.pi*f_0*xx)\n",
- "\n",
- " return xx, f"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "To make our life easier, we'll define a function that plots all the stages of the FFT process"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 44,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_FFT(xx, f):\n",
- "\n",
- " npts = len(xx)\n",
- "\n",
- " # Forward transform: f(x) -> F(k) \n",
- " fk = np.fft.rfft(f)\n",
- "\n",
- " # Normalization -- the '2' here comes from the fact that we are \n",
- " # neglecting the negative portion of the frequency space, since \n",
- " # the FFT of a real function contains redundant information, so \n",
- " # we are only dealing with 1/2 of the frequency space. \n",
- " # \n",
- " # technically, we should only scale the 0 bin by N, since k=0 is \n",
- " # not duplicated -- we won't worry about that for these plots \n",
- " norm = 2.0/npts\n",
- "\n",
- " fk = fk*norm\n",
- "\n",
- " fk_r = fk.real\n",
- " fk_i = fk.imag\n",
- "\n",
- " # the fftfreq returns the postive and negative (and 0) frequencies \n",
- " # the newer versions of numpy (>=1.8) have an rfftfreq() function \n",
- " # that really does what we want -- we'll use that here. \n",
- " k = np.fft.rfftfreq(npts)\n",
- "\n",
- " # to make these dimensional, we need to divide by dx. Note that \n",
- " # max(xx) is not the true length, since we didn't have a point \n",
- " # at the endpoint of the domain. \n",
- " kfreq = k*npts/(max(xx) + xx[1])\n",
- "\n",
- " # Inverse transform: F(k) -> f(x) -- without the normalization \n",
- " fkinv = np.fft.irfft(fk/norm)\n",
- "\n",
- " # plots\n",
- " plt.subplot(411)\n",
- "\n",
- " plt.plot(xx, f)\n",
- " plt.xlabel(\"x\")\n",
- " plt.ylabel(\"f(x)\")\n",
- "\n",
- " plt.subplot(412)\n",
- "\n",
- " plt.plot(kfreq, fk_r, label=r\"Re($\\mathcal{F}$)\")\n",
- " plt.plot(kfreq, fk_i, ls=\":\", label=r\"Im($\\mathcal{F}$)\")\n",
- " plt.xlabel(r\"$\\nu_k$\")\n",
- " plt.ylabel(\"F(k)\")\n",
- "\n",
- " plt.legend(fontsize=\"small\", frameon=False)\n",
- "\n",
- " plt.subplot(413)\n",
- "\n",
- " plt.plot(kfreq, np.abs(fk))\n",
- " plt.xlabel(r\"$\\nu_k$\")\n",
- " plt.ylabel(r\"|F(k)|\")\n",
- "\n",
- " plt.subplot(414)\n",
- "\n",
- " plt.plot(xx, fkinv.real)\n",
- " plt.xlabel(r\"$\\nu_k$\")\n",
- " plt.ylabel(r\"inverse F(k)\")\n",
- "\n",
- " f = plt.gcf()\n",
- " \n",
- " f.set_size_inches(10,8)\n",
- " plt.tight_layout()\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 45,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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48YlNXdKysyCza9HRoubCuTGRsAhIzPQaCIiIhIuWsWiC2VnZ3PmmWeyb98+duzYwbRp05g2bRoPPPAABQUFZGRkUF1dDcBTTz1FQ0MD55133oeOsWDBAs4+++wg4qeeaTfD2OkfbG9fDT8aDKv+HlwmERERCR1z96AzJNTUqVN90aJFQceIyxNPPMG2bdu4/PLLm91fXFzM7bffzh133JHcYOlizTPwp0/DFf+AUScEnUZERERSnJktdvepbbZTgSxpo3Q5lC2HyRdHtqsrI5eaHjIecvsEm01ERERSXrwFsqZYSPpYNR8e+wo01EW28/pC0XEqjkVERCShVCBL+uh/CAweHxk5Blg0G57/72AziYiISOioQJb0MfkiuGYh9BoQ2V79VORLREREJIG0zJukF3dobIgs+3bwNGisCzqRiIiIhIxGkCV97NsFPy6E1++ObJ9wDZz0tWAziYiISOioQJb0kZcf+bfyfaivhQ3/hqryYDOJiIhIhq3R9gAAIABJREFU6KhAlvRhBpf9HU68DiqKYc4n4N1/BJ1KREREQkYFcoJt2LCBWbNmxdX2iSee4IEHHmhxf3FxMd/4xjcSFS0cRh4DfQojI8eZudBnaNCJREREJGR0kl6A7rnnHh5++GHcnblz57JgwQLq6+sZPHgwF110EePHj6e0tJRdu3ZRUFAQdNzUsGwuFL8O5/4Mbi6LnLQnIiIikkDdbwT5vk9Evra/F9l++VeR7Zd/Fdne/t4HbZrMvz6y3Y4lxV544QXOOussZs6cyeTJk5k7dy4zZszgmGOOYevWrezatYuqqipycnJYsmQJEyZM4IUXXuC6667juuuu45prrgHg5JNP5umnn07Ud5/+St+GxfdBY2NkykVG9/sRFhERka6lEeQu5O7MmzePe++9lz//+c/Mnz+fO++8k8cff5wjjzySoqIiAKZMmcL27dupra1l/PjxuDuzZ88G4OCDD+aVV14J8ttILaNPhvoa+Nd3YfMiuEp/PIiIiEhidb8C+YonPrx90vWRryYDx3y0zYxfdeipJk2aBMDw4cM/dHvt2rUA5OXl7W87b948evbsybXXXsuMGTM466yzgEiRLTHGfDzy9fDnoXpX0GlEREQkhLpfgZxEZtbsbXdn7NixrF+/fv99jz76KLfccgszZsz40DHWr1/PuHHjuj5suqivgZK3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2sHd683sWuBpIBOY7e4rzOxWYJG7zwfuJfKR3BoiI8cXB5c4vcXZ3z8HegOPRM+F3OTuMwILncbi7G9JoDj7/GngLDNbCTQAN2jUp2Pi7O9vAn80s28Q+aj/cg1ydJyZ/YXI9KCB0Xnd3weyAdz990TmeZ8LrAGqgCuCSRoOcfT394icF/Xb6O/MenfXp4DN0JX0RERERERiaIqFiIiIiEgMFcgiIiIiIjFUIIuIiIiIxFCBLCIiIiISQwWyiIiIiEgMFcgiIiIiIjFUIIuIiIiIxFCBLCISEmZWYGalMduLzSw/yEwiIulIBbKISEi4+y6gl5llR+96C5gUYCQRkbSkAllEJFzKgMLo7cOBMjObHWAeEZG0owJZRCRctgDDzOwiYDuwGagws2lm9lMzyws2nohI6ssKOoCIiCTUFuACYDrwcWAKcCSw2t2/FWQwEZF0oQJZRCRc3gdmAae7+3YzOwZ4DdgbbCwRkfShKRYiIiHi7t909zHuXhy9azxwE3C4mZ0cYDQRkbRh7h50BhERERGRlKERZBERERGRGCqQRURERERiqEAWEREREYmhAllEREREJIYKZBERERGRGCqQRURERERiqEAWEREREYmhAllEREREJIYKZBERERGRGCqQRURERERiqEAWEREREYmhAllEREREJIYKZBERERGRGCqQRURERERiqEAWEREREYmhAllEREREJEZW0AESbeDAgT569OigY4iIiIhIilm8ePF2dx/UVruUL5DNbDZwHrDV3Se21X706NEsWrSo64OJiIiISFoxs43xtEuHKRZzgOlBhxARERGR7iHlC2R3XwCUB52jK7y+vpw3N+0MOkbSvFe2mx/+fSUV++qCjpIU7s7TK0rZuGNv0FFEOqSuoZHHlmymfG9t0FGS5uE3NvHQ65uCjpE0O/fW8tiSzdQ1NAYdRSSlpPwUi3iY2dXA1QBFRUUBp4nP2m17uPTe16ipb+TS40fxrXMOp3duKF6OZhWXV/G5e15j6+4alm2u4IGrjiUvOzPoWF2muLyKG//2Ni+v2cHBA3vx5NdODu33u7emnrc272LJpshXbUMjd196dCi/33v/vZ6nlpUwaUQBRxUVMGVUP4bl52FmQUfrEr99fi2/fOZdBvTK4daZE/nEpKFBR+pSf3p1Izc/vhyAukbn0uNHBZyoaz25rITvzVvO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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "npts = 128\n",
- "xx, f = single_freq_sine(npts)\n",
- "plot_FFT(xx, f)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A cosine is shifted in phase by pi/2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 46,
- "metadata": {},
- "outputs": [],
- "source": [
- "def single_freq_cosine(npts):\n",
- "\n",
- " # a pure cosine with no phase shift will result in pure real \n",
- " # signal \n",
- " f_0 = 0.2\n",
- "\n",
- " xmax = 10.0/f_0\n",
- "\n",
- " xx = np.linspace(0.0, xmax, npts, endpoint=False)\n",
- "\n",
- " f = np.cos(2.0*np.pi*f_0*xx)\n",
- "\n",
- " return xx, f"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 47,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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Cp///Oc55ZRT+MY3vsFFF13EN77xDQDa29vZvXs369at2+v8+++/nxtvvJE5c+Z071u3bh1HHnlkUuvSGGTJOLExx9Xl6kEWERHJZYWFhZx55pns2bOHrVu3csYZZ3DGGWdw5513Mnz4cPLy8giHI7ngscceo7Ozk/PPP3+v51i8eDHnnHNOUutSD7JknNiY46qKEqorStne0k64vZOSwvyAKxMREZGBqq2tZf78+d3b3/ve9wC4+OKL33Pu1Vdfzd13380VV1zBueeey7nnnrvX8Q0bNlBVVcWIESOSWqMCsmSc7h7kihKqyku699VWDg2yLBEREUmz2bNn93m8pqaGW265Jem/V0MsJOPUh8IU5ecxcmgR1RUl3ftERERE0kEBWTJOQ2gPVRUlmBlV0YDc0KxxyCIiIpIeCsiScepD4e6hFVXqQRYREZE0U0CWjNPQHO4OxkOKCqgoLdRqeiIiIpI2CsiSUdyd+lC4e+wxQFV5iXqQRUREJG0UkCWjbG9pp62jq7sHGYjOhayALCIiIumhgCwZpT66KEh8D3J1hXqQRUREJH0UkCWjNHQvElLava+qooQtu1pp6+gKqiwREREZRBSQJaPUxy0SEhN7vLlZvcgiIiLZbv369VxwwQUJnfvII49w55139np8w4YNXH/99ckqrZtW0pOM0hAKk59nVA4r7t4X601uaA5TM3JIUKWJiIhImt12223cc889uDvz589n8eLFdHR0MGbMGC6++GKmTJlCQ0MDO3bsYPjw4Un7vepBlozS0BxmbFkx+XnWvS/Wg6wb9URERNLg17Mjf7a8Edl+5qeR7Wd+Gtne8sa758QsuC6yveaxhH/NokWLOPvss5k7dy7Tpk1j/vz5zJkzhxNOOIHGxkZ27NhBS0sLRUVFLF++nKOOOopFixZx7bXXcu211/L5z38egNNOO42FCxcm628PKCBLhmkIhfeawQLeXSxEAVlERCS3uDsPPfQQ1113Hb/73e9YsGABl112GQ8++CCvv/46EyZMAOD4449nzJgxtLW1MWXKFEaNGsW8efMAOOSQQ1i1alVS69IQC8ko9aE9HFFVvte+suIChhblayYLERGRdPjUI3tvn3pd5E9M5aT3njPnpwf0q6ZOnQrAuHHj9nr85ptvAlBS8m6n2UMPPcSQIUO45pprmDNnDmeffTYQCdnJpoAs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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "xx, f = single_freq_cosine(npts)\n",
- "plot_FFT(xx, f)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now let's look at a sine with a pi/4 phase shift"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 48,
- "metadata": {},
- "outputs": [],
- "source": [
- "def single_freq_sine_plus_shift(npts):\n",
- "\n",
- " # a pure sine with no phase shift will result in pure imaginary \n",
- " # signal \n",
- " f_0 = 0.2\n",
- "\n",
- " xmax = 10.0/f_0\n",
- "\n",
- " xx = np.linspace(0.0, xmax, npts, endpoint=False)\n",
- "\n",
- " f = np.sin(2.0*np.pi*f_0*xx + np.pi/4)\n",
- "\n",
- " return xx, f"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 49,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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q5mlA6+Z2afd/cWgs4mIJDqNIIuIiIiIRNAcZBERERGRCCqQRUREREQiqEAWEREREYmgAllEREREJIIKZBERERGRCCqQRUREREQiqEAWEREREYmgAllEREREJIIKZBERERGRCCqQRUREREQiqEAWEREREYmgAllEREREJIIKZBERERGRCCqQRUREREQiqEAWEREREYmgAllEREREJEJG0AFiraCgwEtLS4OOISIiIiIJZsGCBZvcfcj+2qVcgVxaWkpZWVnQMUREREQkwZjZh9G00xQLEREREZEIKpAl6dQ3tVCxZWfQMURERCRFqUCWpPOHeas456557GhoDjqKiIiIpCAVyJJ05q/ewq6mFt79qDboKCIiIpKCVCBLUmltdd6pqAFgYfhfERERkVhSgSxJZdWm7WwLT61YuFYFsoiIiMSeCmRJKuXhonjM8FyNIIuIiEiPUIEsSaW8ooYBORl8bvwIqurqWV+7K+hIIiIikmJUIEtSWbi2hnHF+Rx7wMDd2yIiIpI81qxZw5AhQzjjjDM48cQTWbBgwT7bPv300zz00EP73F9RUcG3vvWtmGdMuZX0JHXtamxhWfU2rjviYEYPzyUrPY2FFTVMPqoo6GgiIiLSCaeffjozZ87ktdde4yc/+QmPPfZYu+3uu+8+HnnkEQDcnZkzZzJv3jyam5sZOnQol1xyCVVVVdTU1JCfnx+zfBpBlqTx7ke1tLQ644rzyc5I54jhuZRrHrKIiEjSqqmpwd1xd6ZPn87EiRM5++yzqayspKamhp07d5KVlQVAeXk5Y8aMYe7cuUyfPp3p06dz3XXXcdpppzFnzpyY5tIIsiSNhRVbARhXHPqEOL44n0feqqC5pZWMdH3WExER6a7b/76Epevqun2c0cNzue0zY/a5/+WXX+aEE05g5cqVvPjiizz99NMMHDiQl156iQULFvCTn/yEK6+8kpKSkt2POeaYY9i0aRONjY2MHj0ad2fGjBksX76c119/vduZIwVaVZjZJDNbZmYrzOz77eyfZmYbzWxh+OcrQeSUxLCwoobiQX0Y3D8bCBXKu5paWF69PeBkIiIi0hmnn3468+fP55ZbbmH+/PksXbqUJ598kjPOOINvf/vb1NSEviHOycnZ43GzZs2ib9++XH/99Tz33HMcdNBBuHvM8wU2gmxm6cA9wNlAJfCWmc1296V7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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "xx, f = single_freq_sine_plus_shift(npts)\n",
- "plot_FFT(xx, f)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### A frequency filter"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we'll setup a simple two-frequency sine wave and filter a component"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 50,
- "metadata": {},
- "outputs": [],
- "source": [
- "def two_freq_sine(npts):\n",
- "\n",
- " # a pure sine with no phase shift will result in pure imaginary \n",
- " # signal \n",
- " f_0 = 0.2\n",
- " f_1 = 0.5\n",
- "\n",
- " xmax = 10.0/f_0\n",
- "\n",
- " # we call with endpoint=False -- if we include the endpoint, then for \n",
- " # a periodic function, the first and last point are identical -- this \n",
- " # shows up as a signal in the FFT. \n",
- " xx = np.linspace(0.0, xmax, npts, endpoint=False)\n",
- "\n",
- " f = 0.5*(np.sin(2.0*np.pi*f_0*xx) + np.sin(2.0*np.pi*f_1*xx))\n",
- "\n",
- " return xx, f"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 51,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 51,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "npts = 256\n",
- "\n",
- "xx, f = two_freq_sine(npts)\n",
- "\n",
- "plt.plot(xx, f)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we'll take the transform: f(x) -> F(k)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 52,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# normalization factor: the 2 here comes from the fact that we neglect \n",
- "# the negative portion of frequency space because our input function \n",
- "# is real \n",
- "norm = 2.0/npts\n",
- "fk = norm*np.fft.rfft(f)\n",
- "\n",
- "ofk_r = fk.real.copy()\n",
- "ofk_i = fk.imag.copy()\n",
- "\n",
- "# get the frequencies\n",
- "k = np.fft.rfftfreq(len(xx))\n",
- "\n",
- "# since we don't include the endpoint in xx, to normalize things, we need \n",
- "# max(xx) + dx to get the true length of the domain\n",
- "#\n",
- "# This makes the frequencies essentially multiples of 1/dx\n",
- "kfreq = k*npts/(max(xx) + xx[1])\n",
- "\n",
- "\n",
- "plt.plot(kfreq, fk.real, label=\"real\")\n",
- "plt.plot(kfreq, fk.imag, \":\", label=\"imaginary\")\n",
- "plt.legend(frameon=False)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Filter out the higher frequencies"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 53,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "fk[kfreq > 0.4] = 0.0\n",
- "\n",
- "# element 0 of fk is the DC component \n",
- "fk_r = fk.real\n",
- "fk_i = fk.imag\n",
- "\n",
- "\n",
- "# Inverse transform: F(k) -> f(x) \n",
- "fkinv = np.fft.irfft(fk/norm)\n",
- "\n",
- "plt.plot(xx, fkinv.real)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Linear Algebra"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### general manipulations of matrices"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "you can use regular NumPy arrays or you can use a special matrix class that offers some short cuts"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = np.array([[1.0, 2.0], [3.0, 4.0]])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 1. 2.]\n",
- " [ 3. 4.]]\n",
- "[[ 1. 3.]\n",
- " [ 2. 4.]]\n",
- "[[ 1. 3.]\n",
- " [ 2. 4.]]\n"
- ]
- }
- ],
- "source": [
- "print(a)\n",
- "print(a.transpose())\n",
- "print(a.T)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 56,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[-2. 1. ]\n",
- " [ 1.5 -0.5]]\n"
- ]
- }
- ],
- "source": [
- "ainv = np.linalg.inv(a)\n",
- "print(ainv)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 57,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 1.00000000e+00 0.00000000e+00]\n",
- " [ 8.88178420e-16 1.00000000e+00]]\n"
- ]
- }
- ],
- "source": [
- "print(np.dot(a, ainv))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "the eye() function will generate an identity matrix (as will the identity())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 58,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 1. 0.]\n",
- " [ 0. 1.]]\n",
- "[[ 1. 0.]\n",
- " [ 0. 1.]]\n"
- ]
- }
- ],
- "source": [
- "print(np.eye(2))\n",
- "print(np.identity(2))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we can solve Ax = b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 59,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[-3. 4.]\n"
- ]
- }
- ],
- "source": [
- "b = np.array([5, 7])\n",
- "x = np.linalg.solve(a, b)\n",
- "print(x)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### The matrix class"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 60,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 1. 2.]\n",
- " [ 3. 4.]]\n",
- "[[ 1. 3.]\n",
- " [ 2. 4.]]\n"
- ]
- }
- ],
- "source": [
- "A = np.matrix('1.0 2.0; 3.0 4.0')\n",
- "print(A)\n",
- "print(A.T)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 61,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 19.]\n",
- " [ 43.]]\n"
- ]
- }
- ],
- "source": [
- "X = np.matrix('5.0 7.0')\n",
- "Y = X.T\n",
- "\n",
- "print(A*Y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[-3.]\n",
- " [ 4.]]\n"
- ]
- }
- ],
- "source": [
- "print(A.I*Y)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### tridiagonal matrix solve"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here we'll solve the equation:\n",
- "\n",
- "$$f^{\\prime\\prime} = g(x)$$\n",
- "\n",
- "with $g(x) = sin(x)$, and the domain $x \\in [0, 2\\pi]$, with boundary conditions $f(0) = f(2\\pi) = 0$. The solution is simply $f(x) = -sin(x)$.\n",
- "\n",
- "We'll use a grid of $N$ points with $x_0$ on the left boundary and $x_{N-1}$ on the right boundary.\n",
- "\n",
- "We difference our equation as:\n",
- "\n",
- "$$f_{i+1} - 2 f_i + f_{i-1} = \\Delta x^2 g_i$$\n",
- "\n",
- "We keep the boundary points fixed, so we only need to solve for the $N-2$ interior points. Near the boundaries, our difference is:\n",
- "$$f_2 - 2 f_1 = \\Delta x^2 g_1$$\n",
- "\n",
- "and\n",
- "\n",
- "$$-2f_{N-1} + f_{N-2} = \\Delta x^2 g_{N-1}$$.\n",
- "\n",
- "We can write the system of equations for solving for the $N-2$ interior points as:\n",
- "\n",
- "\\begin{equation}\n",
- "A = \\left (\n",
- "\\begin{array}{ccccccc}\n",
- "-2 & 1 & & & & & \\newline\n",
- "1 & -2 & 1 & & & & \\newline\n",
- " & 1 & -2 & 1 & & & \\newline\n",
- " & & \\ddots & \\ddots & \\ddots & & \\newline\n",
- " & & & \\ddots & \\ddots & \\ddots & \\newline\n",
- " & & & & 1 & -2 & 1 \\newline\n",
- " & & & & & 1 & -2 \\newline\n",
- "\\end{array}\n",
- "\\right )\n",
- "\\end{equation}\n",
- "\n",
- "\\begin{equation}\n",
- "x = \\left (\n",
- "\\begin{array}{c}\n",
- "f_\\mathrm{1} \\\\\\\n",
- "f_\\mathrm{2} \\\\\\\n",
- "f_\\mathrm{3} \\\\\\\n",
- "\\vdots \\\\\\\n",
- "\\vdots \\\\\\\n",
- "f_\\mathrm{N-2} \\\\\\\n",
- "f_\\mathrm{N-1} \\\\\\\n",
- "\\end{array}\n",
- "\\right )\n",
- "\\end{equation}\n",
- "\n",
- "\\begin{equation}\n",
- "b = \\Delta x^2 \\left (\n",
- "\\begin{array}{c}\n",
- "g_\\mathrm{1} \\\\\\\n",
- "g_\\mathrm{2} \\\\\\\n",
- "g_\\mathrm{3} \\\\\\\n",
- "\\vdots \\\\\\\n",
- "\\vdots \\\\\\\n",
- "g_\\mathrm{N-2} \\\\\\\n",
- "g_\\mathrm{N-1}\\\\\\\n",
- "\\end{array}\n",
- "\\right )\n",
- "\\end{equation}\n",
- "\n",
- "Then we just solve $A x = b$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 63,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "import scipy.linalg as linalg\n",
- "\n",
- "# our grid -- including endpoints\n",
- "N = 100\n",
- "x = np.linspace(0.0, 2.0*np.pi, N, endpoint=True)\n",
- "dx = x[1]-x[0]\n",
- "\n",
- "# our source\n",
- "g = np.sin(x)\n",
- "\n",
- "# our matrix will be tridiagonal, with [1, -2, 1] on the diagonals\n",
- "# we only solve for the N-2 interior points\n",
- "\n",
- "# diagonal\n",
- "d = -2*np.ones(N-2)\n",
- "\n",
- "# upper -- note that the upper diagonal has 1 less element than the\n",
- "# main diagonal. The SciPy banded solver wants the matrix in the \n",
- "# form:\n",
- "#\n",
- "# * a01 a12 a23 a34 a45 <- upper diagonal\n",
- "# a00 a11 a22 a33 a44 a55 <- diagonal\n",
- "# a10 a21 a32 a43 a54 * <- lower diagonal\n",
- "#\n",
- "\n",
- "u = np.ones(N-2)\n",
- "u[0] = 0.0\n",
- "\n",
- "# lower\n",
- "l = np.ones(N-2)\n",
- "l[N-3] = 0.0\n",
- "\n",
- "# put the upper, diagonal, and lower parts together as a banded matrix\n",
- "A = np.matrix([u,d,l])\n",
- "\n",
- "# solve A sol = dx**2 g for the inner N-2 points\n",
- "sol = linalg.solve_banded((1,1), A, dx**2*g[1:N-1])\n",
- "\n",
- "plt.plot(x[1:N-1], sol)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
-}
diff --git a/lectures/05-scipy/scipy-exercises-2.ipynb b/lectures/05-scipy/scipy-exercises-2.ipynb
deleted file mode 100644
index fe58651b..00000000
--- a/lectures/05-scipy/scipy-exercises-2.ipynb
+++ /dev/null
@@ -1,394 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "%matplotlib inline\n",
- "import matplotlib.pyplot as plt"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Linear Algebra"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q1: Condition number\n",
- "\n",
- "For a linear system, ${\\bf A x} = {\\bf b}$, we can only solve for $x$ if the determinant of the matrix ${\\bf A}$ is non-zero. If the determinant is zero, then we call the matrix _singular_. The _condition number_ of a matrix is a measure of how close we are to being singular. The formal definition is:\n",
- "\\begin{equation}\n",
- "\\mathrm{cond}({\\bf A}) = \\| {\\bf A}\\| \\| {\\bf A}^{-1} \\|\n",
- "\\end{equation}\n",
- "But we can think of it as a measure of how much ${\\bf x}$ would change due to a small change in ${\\bf b}$. A large condition number means that our solution for ${\\bf x}$ could be inaccurate.\n",
- "\n",
- "A _Hilbert matrix_ has $H_{ij} = (i + j + 1)^{-1}$, and is known to have a large condition number. Here's a routine to generate a Hilbert matrix"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "def hilbert(n):\n",
- " \"\"\" return a Hilbert matrix, H_ij = (i + j - 1)^{-1} \"\"\"\n",
- "\n",
- " H = np.zeros((n,n), dtype=np.float64)\n",
- "\n",
- " for i in range(1, n+1):\n",
- " for j in range(1, n+1):\n",
- " H[i-1,j-1] = 1.0/(i + j - 1.0)\n",
- " return H"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "Let's solve ${\\bf Hx} ={\\bf b}$. Create a linear system by picking an ${\\bf x}$ and generating a ${\\bf b}$ by multiplying by the matrix ${\\bf H}$. Then use the `scipy.linalg.solve()` function to recover ${\\bf x}$. Compute the error in ${\\bf x}$ as a function of the size of the matrix.\n",
- "\n",
- "You won't need a large matrix, $n \\sim 13$ or so, will start showing big errors.\n",
- "\n",
- "You can compute the condition number with `numpy.linalg.cond()`\n",
- "\n",
- "There are methods that can do a better job with nearly-singular matricies. Take a look at `scipy.linalg.lstsq()` for example."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "x = np.arange(13)\n",
- "A = hilbert(13)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(array([ 1.20651400e-07, 9.99985193e-01, 2.00044484e+00,\n",
- " 2.99430401e+00, 4.03835041e+00, 4.85081620e+00,\n",
- " 6.34405283e+00, 6.55787325e+00, 8.20220729e+00,\n",
- " 9.23611572e+00, 9.58340889e+00, 1.12467970e+01,\n",
- " 1.19456441e+01]),\n",
- " array([], dtype=float64),\n",
- " 12,\n",
- " array([ 1.81383012e+00, 3.96833076e-01, 4.90294194e-02,\n",
- " 4.34875507e-03, 2.95177714e-04, 1.56237036e-05,\n",
- " 6.46641856e-07, 2.07632142e-08, 5.07655186e-10,\n",
- " 9.14127833e-12, 1.14354232e-13, 8.87566335e-16,\n",
- " 3.19134976e-18]))"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "b = A @ x\n",
- "import scipy.linalg\n",
- "x = scipy.linalg.lstsq(A, b)\n",
- "x"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# FFTs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q2: Noisy signal"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A convolution is defined as: \n",
- " \\begin{equation} \n",
- " (f \\star g)(t) \\equiv \\int_{-\\infty}^{\\infty} f(\\tau) g(t - \\tau) d\\tau \n",
- " \\end{equation} \n",
- " It is easy to compute this with FFTs, via the {\\em convolution theorem}, \n",
- " \\begin{equation} \n",
- " \\mathcal{F}\\{f \\star g\\} = \\mathcal{F}\\{f\\} \\, \\mathcal{F}\\{g\\} \n",
- " \\end{equation} \n",
- " That is the Fourier transform of the convolution of $f$ and $g$ is simply\n",
- " the product of the individual transforms of $f$ and $g$. This allows us\n",
- " to compute the convolution via multiplication in Fourier space and then take\n",
- " the inverse transform, $\\mathcal{F}^{-1}\\{\\}$, to recover the convolution in real space: \n",
- " \\begin{equation} f \\star g = \\mathcal{F}^{-1}\\{ \\mathcal{F}\\{f\\} \\, \\mathcal{F}\\{g\\}\\} \\end{equation} \n",
- " \n",
- "A common use of a convolution is to smooth noisy data, for example by convolving noisy data with a Gaussian. We'll do that here."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's some noisy data we'll work with"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def fdata(x, L):\n",
- " A = L/10.0\n",
- " return 2*np.sin(2*np.pi*x/L) + x*(L-x)**2/L**3 * np.cos(x) + \\\n",
- " 5*x*(L-x)/L**2 + A/2 + 0.1*A*np.sin(13*np.pi*x/L)\n",
- "\n",
- "N = 2048\n",
- "L = 50.0\n",
- "x = np.linspace(0, L, N, endpoint=False)\n",
- "orig = fdata(x, L)\n",
- "noisy = orig + 0.5*np.random.randn(N)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(x, noisy)\n",
- "plt.plot(x, orig)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "SciPy provides a convolution function `scipy.signal.convolve()` that can do the convolution for us directly. To smooth the data, we want to use a Gaussian, which can be produced by `scipy.signal.gaussian()`.\n",
- "\n",
- "Convolve the noisy data with a Gaussian and plot the result together with the original data `orig`. You'll need to play with the width of the Gaussian to get a nice smoothing. You also will need to normalize the Gaussian so that it sums to 1, otherwise, your convolved data will be shifted verfically from the original function."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q3: FFT of chaotic pendulum\n",
- "\n",
- "Last time we looked at ODEs and the chaotic pendulum, and were interested in writing a method to integrate the pendulum in time.\n",
- "\n",
- "Here we want to examine its behavior in frequency space. The code below will integrate the chaotic pendulum, while requesting that the solution be stored at points spaced with a fixed dt, which makes it suitable for taking the FFT."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "from functools import partial\n",
- "from scipy.integrate import solve_ivp\n",
- "\n",
- "def rhs(t, Y, q, omega_d, b):\n",
- " \"\"\" damped driven pendulum system derivatives. Here, Y = (theta, omega) are\n",
- " the solution variables. \"\"\"\n",
- " f = np.zeros_like(Y)\n",
- " \n",
- " f[0] = Y[1]\n",
- " f[1] = -q*Y[1] - np.sin(Y[0]) + b*np.cos(omega_d*t)\n",
- "\n",
- " return f\n",
- "\n",
- "def restrict_theta(theta):\n",
- " \"\"\" convert theta to be restricted to lie between -pi and pi\"\"\"\n",
- " tnew = theta + np.pi\n",
- " tnew += -2.0*np.pi*np.floor(tnew/(2.0*np.pi))\n",
- " tnew -= np.pi\n",
- " return tnew\n",
- "\n",
- "def int_pendulum(theta0, q, omega_d, b, tend, dt):\n",
- " \"\"\" integrate the pendulum and return solution with dt\"\"\"\n",
- "\n",
- " # points in time where we'll request the solution\n",
- " tpoints = np.arange(0.0, tend, dt)\n",
- " \n",
- " r = solve_ivp(partial(rhs, q=q, omega_d=omega_d, b=b),\n",
- " [0.0, tend], [theta0, 0.0],\n",
- " method='RK45', t_eval=tpoints)\n",
- "\n",
- " return r.t, r.y"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The call below will give an undamped pendulum. For a small amplitude, since we have $L = g$ in our pendulum, the period is simply $T = 2\\pi$, and the frequency is $\\nu_k = 1/(2\\pi)$. We plot things in terms of angular frequency, $\\omega_k = 2\\pi \\nu_k$, so all the power will be at $\\omega_k = 1$."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "t, y = int_pendulum(np.radians(10), 0.0, 0.6666, 0.0, 200.0, 0.1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Your task is to complete the power spectrum routine below to calculate the FFT of theta and plot it. Experiment with the damping and driving parameters to see the complexity of the pendulum in frequency space when it becomes chaotic. For reference, here's a plot of the solution theta"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(t, restrict_theta(y[0,:]))\n",
- "plt.xlabel(\"t\")\n",
- "plt.ylabel(r\"$\\theta$\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "def power_spectrum(t, theta0):\n",
- " \"\"\" return the power spectrum of theta. For the frequency\n",
- " component, return it in terms of omega \"\"\"\n",
- "\n",
- " theta = restrict_theta(theta0)\n",
- " \n",
- " # fill in the rest -- take the FFT of theta and return omega_k and \n",
- " # the transform of theta\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Fitting"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Q4: Let's find the errors on our fit\n",
- "\n",
- "We looked at fits, but not what the errors are on the fit. Look at `scipy.optimize.curve_fit()`. This is a simplified wrapper on the least squares fitting. It can return the convariance matrix, the diagonals of which can give the error of the fit for the parameters. \n",
- "\n",
- "Make up some data that models a non-linear function (by introducing some random noise) and perform a fit and find the errors on the parameters."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.4"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/lectures/05-scipy/scipy.fodp b/lectures/05-scipy/scipy.fodp
deleted file mode 100644
index cd72dd77..00000000
--- a/lectures/05-scipy/scipy.fodp
+++ /dev/null
@@ -1,40799 +0,0 @@
-
-
-
- Michael Zingale2013-01-02T12:36:142016-04-11T14:45:24.223539525Michael ZingalePT18H15M16S74LibreOffice/5.0.5.2$Linux_X86_64 LibreOffice_project/00$Build-2
-
-
- -4146
- -434
- 29140
- 26612
-
-
- view1
- true
- false
- true
- true
- true
- true
- false
- false
- true
- 1500
- false
- //////////////////////////////////////////8=
- //////////////////////////////////////////8=
-
- false
- true
- false
- 0
- 78
- false
- true
- true
- 4
- 0
- 0
- 1
- -320
- -1425
- 31024
- 21749
- 2540
- 2540
- 254
- 254
- 254
- 1
- 254
- 1
- false
- 1500
- true
-
-
-
-
- true
- $(user)/config/standard.sob
- 0
- $(user)/config/standard.soc
- $(user)/config/standard.sod
- 1270
- false
-
-
- en
- US
-
-
-
-
-
- $(user)/config/standard.sog
- true
- $(user)/config/standard.soh
- false
- false
- true
- true
- false
- true
- false
- false
- true
- false
- false
- false
- false
- false
- $(user)/config/standard.soe
- false
- 4
- false
- 0
- low-resolution
- hp
- sgH+/2hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpocAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMA0wAAAAAAAAAIAFZUAAAkbQAASm9iRGF0YSAxCnByaW50ZXI9aHAKb3JpZW50YXRpb249UG9ydHJhaXQKY29waWVzPTEKY29sbGF0ZT1mYWxzZQptYXJnaW5kYWp1c3RtZW50PTAsMCwwLDAKY29sb3JkZXB0aD0yNApwc2xldmVsPTAKcGRmZGV2aWNlPTEKY29sb3JkZXZpY2U9MApQUERDb250ZXhEYXRhClBhZ2VTaXplOkxldHRlcgBJbnB1dFNsb3Q6RGVmYXVsdABEdXBsZXg6RHVwbGV4Tm9UdW1ibGUAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEVVBMRVhfTE9OR0VER0U=
- false
- 6
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-