{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 1 - Introduction To Jupyter and NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Welcome to the code side of [*Introduction to Fluid Dynamics*](https://josephmacmillan.github.io/IntroductionToFluidDynamics/). This is a [Jupyter Notebook](https://jupyter.org/), which is a nice way to present both text and code all in one convenient package.\n", "\n", "This introductory notebook will take us through some of the basic of writing and running Jupyter notebooks, as well as using [NumPy](https://numpy.org/) and [MatPlotLib](https://matplotlib.org/) to handle numerical calculation and plotting." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 Jupyter and Python Basics\n", "\n", "So, this is a \"markdown\" type cell in Jupyter -- it's how you display text, equations (using Latex code), and images. There's also a \"code\" cell type, and we'll get to that in a moment. But regardless of the type of cell, you \"compile\" it by either clicking the Run button above or pressing ctrl-Enter (or shift-Enter if you also want to select the next cell down). You can double-click on the cell to see and edit the underlying markdown.\n", "\n", "Let's try a code cell; we're using Python 3 for the code, so we'll enter a simple line of Python and see what happens." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, world!\n" ] } ], "source": [ "print(\"Hello, world!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once again, to run the code, just hit ctrl-Enter, and the notebook should print out the statement.\n", "\n", "Now, I'll assume you have some familiarity with Python -- if not, there are some great tutorials out there (like [this one from SciPy](https://scipy-lectures.org/intro/)). To refresh your memory and get us started let's do something pretty simple: calculate the sine of an angle.\n", "\n", "To start, we'll create a variable, assign it an angle, and print out the sine of that angle:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sin(1.047) = 0.866\n" ] } ], "source": [ "from math import pi, sin\n", "\n", "theta = pi / 3\n", "\n", "print(f\"sin({theta:.3f}) = {sin(theta):.3f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we imported the sine function (and the number pi!) from the math library, assigned the value to the variable theta, and printed out the answer. If you're not familiar with [Python's f-strings](https://docs.python.org/3/tutorial/inputoutput.html#tut-f-strings), I highly recommend using them.\n", "\n", "What if we wanted to calculate the sine of a whole bunch of angles? Here's one way we could do that:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.0, 0.3490658503988659, 0.6981317007977318, 1.0471975511965976, 1.3962634015954636, 1.7453292519943295, 2.0943951023931953, 2.443460952792061, 2.792526803190927, 3.141592653589793]\n", "[0.0, 0.3420201433256687, 0.6427876096865393, 0.8660254037844386, 0.984807753012208, 0.984807753012208, 0.8660254037844387, 0.6427876096865395, 0.3420201433256689, 1.2246467991473532e-16]\n" ] } ], "source": [ "# first create a list of all the angles we want\n", "N = 10\n", "angles = []\n", "for i in range(N):\n", " angles.append(i/(N-1) * pi)\n", "\n", "# then calculate the sines\n", "sines = []\n", "for i in range(N):\n", " sines.append(sin(angles[i]))\n", " \n", "print(angles)\n", "print(sines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I could have been more concide with this, of course, but the fact remains that Python doesn't do lists or arrays very well (and is usually quite slow with them). That's where NumPy comes in." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 NumPy Basics\n", "\n", "Let's do the same calculation, but this time using NumPy arrays. We'll have to import the NumPy library, which we'll call \"np\" in the code, and preface the functions and variables we want to use with np. Here goes -- first the simple calculation:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sin(1.047) = 0.866\n" ] } ], "source": [ "import numpy as np\n", "\n", "theta = np.pi / 3\n", "\n", "print(f\"sin({theta:.3f}) = {np.sin(theta):.3f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the range of values:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.34906585 0.6981317 1.04719755 1.3962634 1.74532925\n", " 2.0943951 2.44346095 2.7925268 3.14159265]\n", "[0.00000000e+00 3.42020143e-01 6.42787610e-01 8.66025404e-01\n", " 9.84807753e-01 9.84807753e-01 8.66025404e-01 6.42787610e-01\n", " 3.42020143e-01 1.22464680e-16]\n" ] } ], "source": [ "angles = np.linspace(0, np.pi, 10)\n", "sines = np.sin(angles)\n", "\n", "print(angles)\n", "print(sines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's quite a bit shorter, faster (especially when there's a lot of elements -- try changing N), and easier to do.\n", "\n", "Let's run through some of the most common things to do with Numpy, starting with creating arrays. I used np.linspace in the code above to create an array -- you specify how many array elements you want with that. But you can also specify the step size with np.arange:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n", " 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1]\n" ] } ], "source": [ "angles = np.arange(0, np.pi, 0.1)\n", "print(angles)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you want something more complicated that a range of numbers, you might need to create an array that just contains zeros:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" ] } ], "source": [ "x = np.zeros(N)\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once you have an array, you can operate on it in a variety of ways. For example, you can quickly find the maximum value:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The maximum value of the sines array is 0.984807753012208, which is at position 4 in the array.\n" ] } ], "source": [ "print(f\"The maximum value of the sines array is {sines.max()}, which is at position {sines.argmax()} in the array.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The best thing about NumPy arrays is that you can operate on the entire array at once, without building a loop. For example, we can add a number to every element like this:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7\n", " 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1]\n" ] } ], "source": [ "angles += 1.0\n", "print(angles)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same goes for multiplying or using a NumPy function like np.sin().\n", "\n", "Before we move on to plotting, let's make a complicated function to plot." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.05050505 0.1010101 0.15151515 0.2020202 0.25252525\n", " 0.3030303 0.35353535 0.4040404 0.45454545 0.50505051 0.55555556\n", " 0.60606061 0.65656566 0.70707071 0.75757576 0.80808081 0.85858586\n", " 0.90909091 0.95959596 1.01010101 1.06060606 1.11111111 1.16161616\n", " 1.21212121 1.26262626 1.31313131 1.36363636 1.41414141 1.46464646\n", " 1.51515152 1.56565657 1.61616162 1.66666667 1.71717172 1.76767677\n", " 1.81818182 1.86868687 1.91919192 1.96969697 2.02020202 2.07070707\n", " 2.12121212 2.17171717 2.22222222 2.27272727 2.32323232 2.37373737\n", " 2.42424242 2.47474747 2.52525253 2.57575758 2.62626263 2.67676768\n", " 2.72727273 2.77777778 2.82828283 2.87878788 2.92929293 2.97979798\n", " 3.03030303 3.08080808 3.13131313 3.18181818 3.23232323 3.28282828\n", " 3.33333333 3.38383838 3.43434343 3.48484848 3.53535354 3.58585859\n", " 3.63636364 3.68686869 3.73737374 3.78787879 3.83838384 3.88888889\n", " 3.93939394 3.98989899 4.04040404 4.09090909 4.14141414 4.19191919\n", " 4.24242424 4.29292929 4.34343434 4.39393939 4.44444444 4.49494949\n", " 4.54545455 4.5959596 4.64646465 4.6969697 4.74747475 4.7979798\n", " 4.84848485 4.8989899 4.94949495 5. ] [0. 0.23523367 0.34539782 0.43642879 0.51727117 0.59114611\n", " 0.65961964 0.72359171 0.78364108 0.84017197 0.89348511 0.94381549\n", " 0.99135396 1.03626029 1.07867147 1.11870722 1.15647373 1.19206633\n", " 1.22557146 1.25706812 1.28662898 1.31432129 1.34020756 1.36434615\n", " 1.38679178 1.40759589 1.42680706 1.44447124 1.4606321 1.47533122\n", " 1.48860831 1.50050143 1.51104715 1.52028074 1.52823628 1.53494683\n", " 1.54044457 1.54476088 1.5479265 1.54997163 1.55092601 1.55081904\n", " 1.54967985 1.54753743 1.54442067 1.54035849 1.53537988 1.52951399\n", " 1.52279022 1.51523829 1.50688831 1.49777087 1.48791707 1.47735866\n", " 1.46612807 1.45425848 1.44178393 1.42873937 1.41516072 1.40108502\n", " 1.3865504 1.37159626 1.35626328 1.34059354 1.32463056 1.3084194\n", " 1.29200671 1.27544081 1.25877175 1.24205132 1.22533313 1.20867256\n", " 1.19212684 1.17575493 1.1596175 1.14377683 1.12829665 1.11324194\n", " 1.09867869 1.08467357 1.07129356 1.0586055 1.04667556 1.03556865\n", " 1.02534778 1.01607331 1.00780226 1.00058746 0.99447684 0.98951267\n", " 0.9857308 0.98316013 0.98182203 0.98173001 0.98288943 0.98529747\n", " 0.98894323 0.99380792 0.99986533 1.00708229]\n" ] } ], "source": [ "N = 100\n", "x = np.linspace(0, 5, N)\n", "f = np.sqrt(np.sin(x) + 2.0 * (np.exp(-x)-1)**2)\n", "\n", "print(x, f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 Plotting with MatPlotLib\n", "\n", "We'll be using MatPlotLib, a Python plotting library, for graphing and visualziation. It can be as simple to use as just importing the library and calling the \"plot\" function:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.plot(x, f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, my preference is to use a more object-oriented approach by creating an axis and modifying that:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, '$f(x)$')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEHCAYAAABBW1qbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAoiUlEQVR4nO3deXRV9bnG8e9LAJmCYplBCpVJkNHIICqDoYCAgiIyKNWLIo61YtW2FhzXLS2oIJM4lKsyiFAUI8gQAeUiNhERiIAgiEDQRBEwYTLhvX8k5tIYIEBy9knO81kry+yzf9nnOYtlnuzpt83dERERASgRdAAREQkfKgUREcmhUhARkRwqBRERyaFSEBGRHCoFERHJUTIUb2JmrwC9gBR3v/gEYzoBzwGlgO/cveOptlu5cmWvW7dugeUUEYkEn3zyyXfuXiWvdSEpBWAaMAF4Na+VZnYeMAno7u5fm1nV/Gy0bt26JCYmFlRGEZGIYGY7TrQuJIeP3P0DYO9JhgwC/uXuX2ePTwlFLhER+U/hck6hIVDJzJab2SdmNiToQCIikShUh49OpSRwCXAVUBb4yMxWu/sXuQea2TBgGECdOnVCGlJEpLgLlz2FXcB77p7u7t8BHwAt8hro7lPdPcbdY6pUyfM8iYiInKFwKYW3gSvMrKSZlQPaAhsDziQiEnFCdUnqTKATUNnMdgGjyLr0FHef4u4bzew9YB1wDHjJ3TeEIpuIiPy/kJSCuw/Mx5h/AP8IQRwRETmBcDnRLHJWDh48yM6dO0lJSSE1NZXvv/+egwcPkp6ezuHDhzEzzIyoqCjKly9P+fLliY6OpkqVKlSrVo1q1apRtWpVzCzojyISKJWCFCn79u1jzZo1rFu3jvXr17Nx40a2b9/ON998c9bbLlOmDHXr1qVevXo0btyYpk2b0rRpU5o1a0b58uULIL1I+FMpSFhLSUlhyZIlrFixglWrVpGUlJSzrkqVKjRt2pSePXvym9/8hjp16uT8xX/++edToUIFypUrR+nSpTEz3J3MzEwOHjzIjz/+yIEDB0hNTSUlJYU9e/awY8cOtm/fzrZt21i2bBmHDx8GoESJEjRt2pRLL72U9u3b07FjR+rXr6+9CimWrCg/jjMmJsY1zUXx4u6sX7+eOXPm8O6777JmzRoAzjvvPNq3b89ll11GmzZtaNGiBdWqVSu0HJmZmWzfvp0NGzawZs0aEhISSEhI4PvvvwegevXqdOnShW7duvHb3/6W6tWrF1oWkYJmZp+4e0ye61QKEg6+/PJLpk2bxhtvvMGWLVsoUaIEHTp0oFu3bnTr1o3WrVtTokSwV1C7O5s3b+aDDz5gxYoVLF26lJSUrBlZWrduTZ8+fejbty9NmzbVXoSENZWChKUjR44wZ84cXnrpJZYvX06JEiXo0qULN9xwA3369KFq1XzNixiYY8eOsXbtWt577z3i4uL46KOPAGjQoAEDBgxg4MCBXHTRRQGnFPkllYKElZSUFKZMmcLkyZP55ptvuPDCC/mv//ovhgwZQu3atYOOd8b27NnD/PnzmT17NsuWLcPdadmyJbfccguDBw+mcuXKQUcUAVQKEiZ2797N6NGjmTp1KkeOHKFHjx7cf//9dO3atdgdbtmzZw9vvvkmr776Kp988gmlSpXimmuu4Y477uCqq64K/FCYRDaVggTqm2++4amnnuLFF18kMzOTIUOG8NBDD9G4ceOgo4XE+vXrmTZtGq+++irfffcd9evXZ/jw4QwdOpTzzjsv6HgSgU5WCvpzRQpNeno6TzzxBPXr1+eFF17gd7/7HVu2bOGVV16JmEIAaNasGWPHjmXXrl28/vrrVKtWjQcffJDatWtzzz33sGXLlqAjiuRQKUiBc3dmzpxJw4YNGTVqFN26dePzzz9n6tSp1KtXL+h4gTnnnHMYPHgwK1euZM2aNfTr148XX3yRRo0acd111/Hxxx8HHVFEpSAFa9OmTcTGxjJo0CBq1KjBypUrmTt3Lg0aNAg6Wlhp1aoV06ZNY8eOHfz5z39m2bJltGvXjs6dOxMfH09RPqwrRZtKQQpERkYGTz/9NM2bN2fNmjVMmjSJjz/+mA4dOgQdLaxVr16dp556iq+//pqxY8fyxRdfEBsby+WXX86iRYtUDhJyKgU5axs2bKBdu3Y8+uijXHfddWzatIk777yTqKiooKMVGdHR0TzwwAN8+eWXTJo0iZ07d9K9e3cuv/xyli1bFnQ8iSAqBTlj7s6zzz7LJZdcwtdff82cOXOYNWtWoU4/UdyVKVOGO++8k61btzJ58mR27NhBly5diI2NJSEhIeh4EgFUCnJGUlNT6dWrFw888AA9evQgKSmJ66+/PuhYxUbp0qUZPnw4W7du5dlnn2XdunW0adOG/v3762olKVQqBTltH374IS1atCA+Pp4JEyYwb9489LzswlGmTBnuv/9+vvzyS0aNGsWCBQto0qQJ9913X87kfCIFKSSlYGavmFmKmZ30EZtmdqmZZZpZv1DkktPj7kyYMIEuXbpQoUIFPv74Y+6+++5idzdyOIqOjuaxxx7jyy+/5LbbbmPixInUr1+fZ555hqNHjwYdT4qRUO0pTAO6n2yAmUUBo4FFoQgkp+fQoUPceuut3HvvvfTo0YOEhARatGgRdKyIU61aNSZPnsy6deto164dI0aM4OKLL2bBggVBR5NiIiSl4O4fAHtPMexeYC6QUviJ5HSkpKTQpUsX/ud//ofHHnuMt956i3PPPTfoWBGtadOmLFy4kAULFlCiRAl69uxJz549db5BzlpYnFMws1pAX2BKPsYOM7NEM0tMTU0t/HARbtOmTbRr147PPvuMuXPnMmrUKE3mFkZ69OjBunXrGDNmDB9++CEXX3wxjz76KAcPHgw6mhRR4fJ/93PAw+6eeaqB7j7V3WPcPUYnNwvXBx98QPv27UlPT2f58uVcd911QUeSPJQuXZoRI0awefNm+vfvz9NPP02TJk2YP39+0NGkCAqXUogBZpnZV0A/YJKZ9Qk0UYSLi4ujW7duVK9endWrV9OmTZugI8kp1KhRg9dee40VK1ZQoUIFrr32Wvr06cPOnTuDjiZFSFiUgrvXc/e67l4XmAPc5e5vBZsqck2fPp0+ffrQrFkzPvzww4iexK4ouvLKK/n0008ZPXo0ixcv5qKLLuKZZ54hIyMj6GhSBITqktSZwEdAIzPbZWZDzWy4mQ0PxftL/k2ZMoWbbrqJjh07Eh8fr6eFFVGlSpXioYce4vPPP6dTp06MGDGCdu3a8emnnwYdTcKduxfZr0suucSl4EycONEB7927tx86dCjoOFJAjh075m+88YZXq1bNo6Ki/KGHHvKDBw8GHUsCBCT6CX6vhsXhIwnepEmTuPvuu7nmmmuYM2cOZcqUCTqSFBAzo3///mzcuJFbb72Vv//977Ro0YIPPvgg6GgShlQKwpQpU3IK4c0336R06dJBR5JCUKlSJV588UXi4+PJyMigY8eO3HXXXfz4449BR5MwolKIcNOnT+fOO++kV69eKoQI0aVLF9avX8/999/PlClTaNasGUuXLg06loQJlUIEe+edd/jd735H586dVQgRpnz58jz77LOsXLmSc845h65duzJs2DAOHDgQdDQJmEohQq1YsYL+/fvTqlUr3n77bZ1DiFCXXXYZa9eu5Y9//CMvv/wyzZo1Iz4+PuhYEiCVQgRKSkri2muvpW7duixcuJDo6OigI0mAypYty9///ndWrlxJmTJliI2N5a677iItLS3oaBIAlUKE2bNnD1dffTVly5blvffe030IkqN9+/asXbuWBx54gClTptCiRQs+/PDDoGNJiKkUIkhaWhq9evXi+++/59133+XXv/510JEkzJQtW5axY8eyYsUKADp27MiDDz7I4cOHA04moaJSiBCZmZkMHDiQtWvXMnv2bFq3bh10JAljV1xxBZ999hl33HEHY8eO5ZJLLmHNmjVBx5IQUClEiL/85S/ExcUxfvx4rr766qDjSBFQoUIFJk+ezHvvvce+ffto27YtTz75pOZQKuZUChFgxowZjB49mjvuuIO777476DhSxHTr1o0NGzZwww03MHLkSDp06MAXX3wRdCwpJCqFYi4xMZGhQ4dyxRVXMH78+KDjSBFVqVIlZsyYwRtvvMGWLVto2bIlEydOJGsaHSlOVArFWGpqKn379qVq1arMmTNHN6fJWevfvz8bNmzgyiuv5J577qFHjx4kJycHHUsKkEqhmMrMzOSmm24iNTWVefPmUbVq1aAjSTFRs2ZNFi5cyKRJk3IeATp79uygY0kBUSkUU0899RSLFy/m+eef15VGUuDMjDvvvJO1a9fSsGFDbrzxRgYPHswPP/wQdDQ5SyqFYmjx4sU8/vjjDBkyhNtuuy3oOFKMNWjQgJUrV/LEE08we/ZsTa5XDITqyWuvmFmKmW04wfrBZrYu+2uVmbUIRa7iaM+ePQwePJimTZsyadIkzCzoSFLMlSxZkr/+9a989NFHREdH07VrV37/+99z6NChoKPJGQjVnsI0oPtJ1m8HOrp7c+BJYGooQhU3x44dY8iQIaSnpzN79mzKly8fdCSJIDExMaxZs4b77ruP8ePH07p1axISEoKOJacpJKXg7h8Ae0+yfpW7/3wwcjVQOxS5ipuxY8eydOlSxo0bx0UXXRR0HIlAZcuWZdy4cSxZsoS0tDTat2/P448/zk8//RR0NMmncDynMBRYGHSIoiYxMZE///nPXH/99TqPIIGLjY1l3bp1DBgwgMcee4zLLruM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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(6, 4))\n", "ax = fig.add_subplot(1, 1, 1)\n", "\n", "ax.plot(x, f, color=\"black\")\n", "ax.set_xlabel(\"$x$\")\n", "ax.set_ylabel(\"$f(x)$\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just one last thing to cover before we move on; I'd like to make sure the fonts that I use in the plots like nice. Here's the code for that:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from matplotlib import rc\n", "\n", "rc('text.latex',preamble='\\\\usepackage{libertine}\\n\\\\usepackage[libertine]{newtxmath}')\n", "rc('font',**{'family':'serif','serif':['Linux Libertine O']}, size=18)\n", "rc('text', usetex=True)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, '$f(x)$')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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mTVr1hASEsKBAweIjY1l+PDhbN++3enymiwFRxOXkJDAwYMH6devH3PmzHG6HJFGxxhDXFwcn332GYsXL6ZDhw4kJyczdOhQYmNj2bVrl9MlNjkKjibs5MmTPP7444BrRlXz5s0drkik8WrRogVz584lKyuL//mf/6F169a8/fbbREREMH78eFJSUpwusclQcDRhTz75JKdOneK2225j/PjxTpcj0iS0a9eOJ598kqysLObNm0erVq3YsGED0dHRjB49mnfffVdjIFUw3v4PFBUVZb3xm8TBgwcZOHAgxcXF7Nq1i2uuucbpkkSapGPHjvHss8/y4osv8v333wMQGRnJvHnziIuL89mWvDEm1VobVdFtanE0UY8++igXLlzgnnvuUWiI1EKXLl1YuHAhX375JQsWLKBz586kpqYydepUevXqxeOPP05OTo7TZTYqjrU4jDEhwEIg3lqbVY37xwCz3VezrLXx1Xkeb2xxfPTRR9x0000EBgaSkZFB9+7dnS5JxGv88MMPLF++nBdeeIH9+/cDrqXdx4wZw/Tp0xk3bpxPtEIaVYvDGBNsjFkKpAJx1dwnAlgDzLTWTgQijDHz67HMRstaS3y8KzMffPBBhYZIHWvVqhWzZs1i7969vP/++8TFxeHv78/GjRuJi4ujW7duzJw5k61bt1JUVOR0uZdlreXkyZP18tgN3uIwxgS7f40CtgChVbU4jDFbcLUyZruvxwHLrLXtq3o+b2txvP3228TGxtKxY0cyMzNp166d0yWJeL3c3FxWrFjBa6+9xr59+0q3d+zYkdtvv51x48YxatQox/8eCwsLSU5OJjExkQ0bNtC6desaLzdfWYvDya6qCFytjvbW2rwq7muB2dbal93XQ4BMYKS1Nqmyfb0pOIqKirj++uvZt28ff/7zn3nwwQedLknE5+zfv5/Vq1ezatUqMjIySrf7+fkRGRnJrbfeyi233EJ0dHS9n0Tthx9+YPfu3SQnJ/Pee++xbdu20gF+gE6dOnHo0CHat6/yO/YlmnRwVBQS7lbLKcqESbl9ZgGzAHr16hV55MiROq/fCcuXL+euu+6iV69eHDx4kJYtWzpdkojPstaSnp7Ohg0bSExM5KOPPrpkLazevXsTERFBWFgYV199Nf3796dnz55069YNf3//aj9PXl4eOTk5fP755xw6dIj09HTS0tL4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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(6, 4))\n", "ax = fig.add_subplot(1, 1, 1)\n", "\n", "ax.plot(x, f, color=\"black\", linewidth=2)\n", "ax.set_xlabel(\"$x$\")\n", "ax.set_ylabel(\"$f(x)$\")" ] } ], "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.10.5" } }, "nbformat": 4, "nbformat_minor": 4 }