{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Introduction to Jupyter with Python \n",
"\n",
" \n",
"**Anne Kværnø (and modified by André Massing)** \n",
"Minor modifications by **Markus Grasmair**\n",
"\n",
"\n",
"Date: **Mar 10, 2020** \n",
"Updated: **Sep 21, 2020**\n",
"\n",
"# Introduction\n",
"In the numerics part of TMA4125/30/35 Mathematics 4N/D all material\n",
"will be made available in the form of Jupyter notebooks. This is a\n",
"web-based system, making it possible to combine written text and\n",
"executable code in one document. And this is quite convenient for a\n",
"course in Numerical methods, as implementation is a crucial element of\n",
"the topic. But implementing code is as you probably have experienced\n",
"exhaustingly time-consuming. In the notebooks of this course the\n",
"algorithms are already implemented, and they can be used\n",
"immediately. But you are supposed to be able to perform your own tests, and\n",
"also to make minor changes and improvements to the already implemented\n",
"algorithms.\n",
"\n",
"However, please note that you will not learn programming in this\n",
"course. In fact, you are expected to be able to read, understand and\n",
"modify simple code. Some knowledge of Python or Matlab is a\n",
"prerequisite. This note gives you a very short introduction to the\n",
"most important constructions for the use of Python for numerical\n",
"simulations. For those of you who are only familiar with MATLAB, take\n",
"a look at [NumPy for Matlab\n",
"users](https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html).\n",
"\n",
"All the course notes can be downloaded from the course\n",
"[wiki-pages](https://wiki.math.ntnu.no/tma4130/2020h/lecture_plan)\n",
"and then used on your own computer. See\n",
"[How to install and use Anaconda](https://wiki.math.ntnu.no/anaconda/start)\n",
"if you would like to try this option.\n",
"\n",
"For more advanced programmers, there will also be pdf-versions of the\n",
"documents (not this one), with the python code available in a separate\n",
"file. These can be found on the wiki-page. But as all figures and\n",
"tables are generated using the python codes, these are most useful if\n",
"you run the code in parallel with your reading.\n",
"\n",
"# How to use a Jupyter notebook\n",
"A Jupyter notebook is composed of cells. These can contain either text\n",
"(like this one) or code (as demonstrated below). As soon as you have\n",
"copied the Jupyter note file to your own domain, you are free to use\n",
"it and change it as you like. You are encouraged to experiment with\n",
"the codes. You can not make any harm, if your note is completely\n",
"messed up, just make a new copy.\n",
"\n",
"If you have installed the Anaconda Python distribution as suggested above,\n",
"you can use [Anaconda Navigator](https://docs.anaconda.com/anaconda/navigator/)\n",
"to start the Jupyter notebook application. If you prefer the command line\n",
"in a terminal, you can just type `jupyter notebook`.\n",
"\n",
"There is plenty of documentation regarding the Jupyter Notebook which\n",
"is part of the [Jupyter project](http://jupyter.org/), see\n",
"for instance\n",
"\n",
"* [Jupyter notebook documentation](https://jupyter-notebook.readthedocs.io/en/stable/)\n",
"\n",
"* [A gallery of interesting Jupyter Notebooks](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks)\n",
"\n",
"Also, the [JupyterLab](https://jupyterlab.readthedocs.io/en/latest/)\n",
"is a modernized alternative to the Jupyter Notebook. It can be\n",
"launched from the Anaconda Navigator as well.\n",
"\n",
"As soon as your first notebook is open, we recommend that you to make\n",
"yourself more familiar with the Jupyter environment. Take a look at\n",
"the tool menu, and see what is available. There are also many keyboard\n",
"shortcuts (see Help -> Keyboard Shortcuts); learning some of those\n",
"will make your work faster\n",
"\n",
"Let us start: Below, you will find a short example of code. You can\n",
"run this either by pressing either one of the following short cuts:\n",
"\n",
"* **shift+enter**: executes cell and takes you to the next cell (if there is one)\n",
"\n",
"* **ctrl+enter**: executes cell but stays in the same cell\n",
"\n",
"* **alt+enter**: executes cell, insert a new cell below and takes you there\n",
"\n",
"Alternatively, you can use `Run` from the menu."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"a = 2\n",
"b = 6\n",
"c = a+b\n",
"print(c)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When a cell has been executed, the data are stored and can be used later."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"print(a, b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**NB!** New cells can be inserted from the menu (`Insert`) or by\n",
"pressing `Esc b`. This is useful if you just want to try something\n",
"without making changes in the existing code.\n",
"\n",
"Executing the following cell loads a non-default css style for the notebook. \n",
"Make sure that you download the corresponding css file `tma4125.css` from the course web page."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.core.display import HTML\n",
"def css_styling():\n",
" styles = open(\"tma4125.css\", \"r\").read()\n",
" return HTML(styles)\n",
"\n",
"# Comment out next line and execute this cell to restore the default notebook style \n",
"css_styling()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The code cells are executed in the sequence you choose. There is a\n",
"number to the left of each cell helping you to keep track of this.\n",
"So if you go back and re-execute one of the first cells, data from\n",
"previous executed cells are still available. This may sometimes cause\n",
"strange errors. So once in a while it may be useful to restart\n",
"completely, which can be done from `Kernel` in the menu.\n",
"\n",
"# Numerical computations in Python\n",
"The implementation of numerical methods is not necessarily very\n",
"complicated, most of the time we can rely on the following\n",
"constructions:\n",
"\n",
"* Functions\n",
"\n",
"* Loops and control statements\n",
"\n",
"* Vectors and matrices\n",
"\n",
"* Plots and visualization\n",
"\n",
"The use of those will be demonstrated later in this introductory note. \n",
"\n",
"Our computations will heavily rely on two modules: \n",
"* [Numpy](http://www.numpy.org): Arrays (vectors and matrices), and all the standard mathematical functions.\n",
"\n",
"* [Matplotlib](https://matplotlib.org): Graphs and figures.\n",
"\n",
"* [SciPy Library](https://scipy.org/scipylib/index.html):\n",
" Fundamental library for Scientific computing, including numerical\n",
" routines for e.g. numerical integration, interpolation,\n",
" optimization, linear algebra, and statistics.\n",
"\n",
"Occassionally, we might also use\n",
"* [Sympy](http://www.sympy.org/): Python library for symbolic mathematics.\n",
"\n",
"* [pandas](https://pandas.pydata.org/): Sophisticated Python data analysis libray.\n",
"\n",
"A good entry point to all these libraries is the\n",
"[SciPy web-page](https://scipy.org).\n",
"\n",
"\n",
"In this course, the first cell will always be something similar to the\n",
"next one below. All required modules and functions are imported, and\n",
"Jupyter is made ready for showing plots inside the the document.\n",
"*This cell should always be executed first!*"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"# Import required modules.\n",
"import numpy as np\n",
"from numpy import pi\t\t # Import the number pi\t\n",
"from numpy.linalg import solve # To solve Ax=b\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# For plotting. \n",
"newparams = {'figure.figsize': (8.0, 4.0), 'axes.grid': True,\n",
" 'lines.markersize': 8, 'lines.linewidth': 2,\n",
" 'font.size': 16}\n",
"plt.rcParams.update(newparams)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You may change the parameters in `newparams` to your own\n",
"preferences. Then make your first plot:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = np.linspace(0,1,101)\n",
"plt.plot(x, np.cos(2*pi*x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function `linspace` deserves closer attention, since we will be using it extensively throughout the course.\n",
" `x = np.linspace(a,b,n+1)` generates an array of $n+1$ equidistributed points, that is"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"x = [x_0, x_1, \\dotsc, x_n], \\qquad x_i=a+ih, \\quad h=(b-a)/n, \\quad i=0,1,\\dotsc,n.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So `x = np.linspace(-1,3,5)` generates the array $[-1,0,1,2,3]$. Try it yourself:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Insert your code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Functions defined on some intervals are only computed on discrete\n",
"points $x_i$, and plots are made as straight lines between those. If\n",
"the intervals between the points are small, it will look like a\n",
"continuous function. In the preceeding notes, we always will represent\n",
"the $x$-values of a certain interval $(a,b)$ by `x =\n",
"linspace(a,b,n+1)`, with `n` large (typically 100). The function will\n",
"also be used whenever a uniform distribution of points is requested.\n",
"\n",
"\n",
"## Numpy:\n",
"Numpy is the Python module handling vectors and matrices and all\n",
"different kind of linear algebra. Vectors and matrices are considered\n",
"as 1- and 2-dimensional arrays. Contrary to MATLAB, there is no\n",
"distinction between row- and column vectors.\n",
"\n",
"The following demonstrates some use of this module. Let $A$ and $b$ be given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"A = \\left(\\begin{array}{rrr} 1.4 & 2.2 & -1.0 \\\\ 1.6 & -2.7 & 1.2 \\\\ -3.2 & 1.2 &-1.8 \\end{array} \\right),\n",
"\\qquad\n",
"\\mathbf{x} = \\left(\\begin{array}{r} 1.0 \\\\ -2.0 \\\\ 3.0 \\end{array}\\right)\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In Python, these are represented by"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A = \n",
" [[ 1.4 2.2 -1. ]\n",
" [ 1.6 -2.7 1.2]\n",
" [-3.2 1.2 -1.8]]\n",
"\n",
"x = [ 1. -2. 3.]\n"
]
}
],
"source": [
"A = np.array([[1.4, 2.2, -1.0], # A: A 2-dimensional array \n",
" [ 1.6, -2.7, 1.2],\n",
" [ -3.2, 1.2, -1.8]]) \n",
"x = np.array([1.0, -2.0, 3.0]) # x: A 1-dimensional array\n",
"print('A = \\n', A)\n",
"print('\\nx = ', x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that the index starts with 0 in Python, but usually with 1 in mathematics. \n",
"Thus $x_3$ in mathematics corresponds to `x[2]` in Python, and $a_{21}$ to `A[1,0]`."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.6\n",
"3.0\n"
]
}
],
"source": [
"print(A[1,0])\n",
"print(x[2])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If `a` and `b` are two arrays of the same dimension, standard\n",
"operations as `+`, `-`, `*` and `/` are always element by element\n",
"operations. The same is the case for `a**p`, returning each element of\n",
"`a` taken to the power of `p`."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a+b = [4 6 8]\n",
"a-b = [-2 -2 -2]\n",
"a/b = [ 0.33333333 0.5 0.6 ]\n",
"a*b = [ 3 8 15]\n",
"a**b = [ 1 16 243]\n",
"a**2 = [1 4 9]\n"
]
}
],
"source": [
"a = np.array([1, 2, 3])\n",
"b = np.array([3, 4, 5])\n",
"print('a+b = ', a+b)\n",
"print('a-b = ', a-b)\n",
"print('a/b = ', a/b)\n",
"print('a*b = ', a*b)\n",
"print('a**b = ', a**b)\n",
"print('a**2 = ', a**2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similar things happen if you perform this operations between an array\n",
"`a` and scalar `p`, which just means that you perform the\n",
"corresponding operation elment-wise. Try it out:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Insert code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The usual matrix-vector product is performed by the command `A@x` or\n",
"`dot(A,x)`. You can also use these operators to compute the inner\n",
"product between two vectors `x` and `y`."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ -6. 10.6 -11. ]\n",
"-60.2\n"
]
}
],
"source": [
"y = A@x\n",
"print(y)\n",
"ip = y@x\n",
"print(ip)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here is a list of quite useful linear algebra functions: \n",
"* `solve(A,b)` : Solves a linear system $ A \\mathbf{x} = \\mathbf{b} $. Needs to be imported from `numpy.linalg`. \n",
"\n",
"* `ones(n)` : returns $[1,1,\\dotsc,1]\\in\\mathbb{R}^n$\n",
"\n",
"* `zeros(n)` : returns $[0,0,\\dotsc,0]\\in\\mathbb{R}^n$\n",
"\n",
"* `len(x)` : The length of an array\n",
"\n",
"* `shape(A)` : The size of an array. Returns $(n, m)$ if $A\\in \\mathbb{R}^{n\\times m}$\n",
"\n",
"* `eye(n)` : The $ n \\times n$ identity matrix $I_n$. \n",
"\n",
"Test them out, and make yourself familiar with them."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Insert your code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Matplotlib\n",
"\n",
"Matplotlib is the module taking care of plots.\n",
"\n",
"**Example:**\n",
"Make a plot of the function $f(x) = cos(2\\pi x)$ on $[0,1]$."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"x = np.linspace(0,1,100)\n",
"y = np.cos(2*pi*x)\n",
"plt.plot(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a very minimalistic example. The next example shows how to add\n",
"things like labels and legends, and to choose different colors or line\n",
"styles.\n",
"\n",
"**Example:**\n",
"Make a plot of the function\n",
"\n",
"$$ f(x) = x^2 + 2x, \\qquad \\qquad g(x) = 2x\\sin(2\\pi x) \\text{ and } h(x)=x^3 $$\n",
"\n",
"on the interval $-1 \\leq x \\leq 1$."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = np.linspace(-1, 1, 101) # The x-values of the interval (-1,1)\n",
"f = x**2 + 2*x # Notice the element by element operations.\n",
"g = 2*x*np.sin(2*pi*x)\n",
"h = x**3\n",
"plt.plot(x, f, 'r--') # Plot f, red stapled line\n",
"plt.plot(x, g, 'b-.') # Plot g, blue line\n",
"plt.plot(x, h, 'g-') # Plot g, blue line\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.title('A nice plot of the functions f,g and h')\n",
"plt.legend(['f(x)', 'g(x)','h(x)'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You may notice that there is some output before the plot. If you find\n",
"this annoying, it can be removed by adding a semicolon `;` after the\n",
"last command in the cell (try it).\n",
"\n",
"\n",
"## Loops and control statements\n",
"Contrary to most other programming languages, MATLAB included, there\n",
"are no `end` type expression in Python. Blocks to be executed within a\n",
"loop or similar have to be indented, and the length of the indentation\n",
"must be consistent (in these notes we use 4spaces). A block ends when\n",
"the indentation ends.\n",
"\n",
"In the following, some loop and control structures are demonstrated. \n",
"\n",
"**For loop:**\n",
"The aim of this program is to make a nice formatted output of the element of an array."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"i = 0, x = 1.30\n",
"i = 1, x = 4.60\n",
"i = 2, x = 2.10\n",
"i = 3, x = -5.80\n",
"i = 4, x = 2.30\n",
"i = 5, x = -3.20\n",
"\n",
"And this concludes the loop\n"
]
}
],
"source": [
"x = np.array([1.3, 4.6, 2.1, -5.8, 2.3, -3.2]) # The array\n",
"n = len(x) # The length of the array\n",
"for i in range(n): # Start of the loop\n",
" print('i = {:2d}, x = {:6.2f}'.format(i, x[i])) # Formatted output \n",
"print('\\nAnd this concludes the loop') # End of the loop"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that \n",
"`for i in range(n)` corresponds to $i=0,1,\\dotsc,n-1$. \n",
"\n",
"Now write every second term, starting with the second one:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i in range(1,n,2): # Loops over i=1,3,5\n",
" print('i = {:2d}, x = {:6.2f}'.format(i, x[i])) # Formatted output"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**While loop:**\n",
"Alternatively, you could use a while loop:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"i = 0\n",
"while (i= 1: # Break the loop if i >= 1. \n",
" break"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Functions\n",
"\n",
"Let us present an example from physics. Throw a ball straight up in\n",
"the air. Ignore the air resistance. Let the initial velocity be\n",
"$v_0$. The position (height) of the ball and its velocity as a\n",
"function of time $t$ is given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\begin{align*}\n",
" y(t) &= v_0t - \\frac{1}{2} g t^2 && \\text{position} \\\\ \n",
" v(t) &= v_0 - gt && \\text{velocity}\n",
"\\end{align*}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $g=9.81\\, m/s^2$ is the gravitational acceleration at the surface of the earth. The function\n",
"below takes time, initial velocity and gravitational acceleration as\n",
"inputs, and returns the velocity and the position. Notice that the\n",
"initial velocity and the gravitational constant are given default\n",
"values."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def ball(t, v0=0, g=9.81):\n",
" y = v0*t - 0.5*g*t**2\n",
" v = v0 - g*t\n",
" return y, v"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function can be used to answer some questions, e.g.:\n",
"* What is the velocity and the position after 2 seconds if the initial velocity is 0 m/s?"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"v0= 0.0 , t= 2.0 , y= -19.62 , v= -19.62\n"
]
}
],
"source": [
"t = 2.0\n",
"y1, v1 = ball(t) \n",
"print('v0=',0.0,', t=', t, ', y=', y1, ', v=', v1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* What is the velocity and the position after 2 seconds if the initial velocity is 1 m/s?"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"v0= 1.0 , t= 2.0 , y= -17.62 , v= -18.62\n"
]
}
],
"source": [
"v_start = 1.0\n",
"y2, v2 = ball(t, v0=v_start) \n",
"print('v0=', v_start,', t=', t, ', y=', y2, ', v=', v2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* What is the velocity and the position after 2 seconds if the initial\n",
" velocity is 1 m/s and the ball is thrown on the moon ($g=1.625 \\,\n",
" m/s^2$)?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"y3, v3 = ball(t, v0=v_start, g=1.625) \n",
"print('v0=', 1.0,', t=', t, ', y=', y3, ', v=', v3, ' on the moon.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whenever possible, write your functions such that if the input is an\n",
"array, so is the output. This is the case here, and it makes it easy\n",
"to generate a graph of the function, e.g. the position as a function\n",
"of time when the initial velocity is 10 m/s."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = np.linspace(0,2,101)\n",
"v_start = 10\n",
"y, v = ball(t, v0=v_start)\n",
"plt.plot(t,y)\n",
"plt.xlabel('t')\n",
"plt.ylabel('y')\n",
"plt.title('Position of the ball when v0 = {} m/s'.format(v_start));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Help!\n",
"This note provides only a very short introduction to some useful\n",
"functions and constructions in Python. More will be used throughout\n",
"the course. We hope that most of it will be understandable or\n",
"explained along the course, but if there are functions or structures\n",
"you do not understand, please look them up yourself, for instance by\n",
"\n",
"* Write `?function`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"?np.linspace"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Or look it up in Google or something similar.\n",
"\n",
"## Further reading\n",
"For a nice introduction for scientific computing in Python, we can recommend\n",
"* Hans Petter Langtangen: [A Primer on Scientific Programming with Python](https://link.springer.com/book/10.1007/978-3-662-49887-3), Springer Verlag, 2016."
]
}
],
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}