{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Numerical Calculus"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "eO3RE1_E1BYj"
},
"source": [
"Throughout this section and the next ones, we shall cover the topic of numerical calculus. Calculus has been identified since ancient times as a powerful toolkit for analysing and handling geometrical problems. Since differential calculus was developed by Newton and Leibniz (in its actual notation), many different applications have been found, at the point that most of the current science is founded on it (e.g. differential and integral equations). Due to the ever increasing complexity of analytical expressions used in physics and astronomy, their usage becomes more and more impractical, and numerical approaches are more than necessary when one wants to go deeper. This issue has been identified since long ago and many numerical techniques have been developed. We shall cover only the most basic schemes, but also providing a basis for more formal approaches.\n",
"\n",
"---\n",
"* [Class activities with CoCalc](https://cocalc.com/projects/a8330cfb-9dfb-442e-9b2b-ba664e31a685/files/numerical-calculus.ipynb?fullscreen=default&session=default)\n",
"---\n",
"#### Bibliography\n",
"* https://github.com/restrepo/Calculus\n",
"* Thomas J. Sargent John Stachurski, [Python Programming for Quantitative Economics GitHub](https://python-programming.quantecon.org/scipy.html)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "zHstPwHZ1BYl"
},
"source": [
"- - -\n",
"- [Numerical Differentiation](#Numerical-Differentiation) \n",
" - [Example 1](#Example-1)\n",
" - [(n+1)-point formula](#n+1-point-formula)\n",
" - [Endpoint formulas](#Endpoint-formulas)\n",
" - [Midpoint formulas](#Midpoint-formulas)\n",
"- [Numerical Integration](./numerical-calculus-integration.ipynb) \n",
"- - -"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 107
},
"colab_type": "code",
"id": "hcjVuVTO1BYm",
"outputId": "c40b3faa-983c-4f43-86ac-1cb36961789f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"%pylab is deprecated, use %matplotlib inline and import the required libraries.\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline\n",
"import numpy as np\n",
"import scipy.interpolate as interp"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Yab8XIB91BYu"
},
"source": [
"- - - "
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "t4sf-c691BYu",
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## Numerical Differentiation"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "xoc_KCCQ1BYv"
},
"source": [
"According to the formal definition of differentiation, given a function $f(x)$ such that $f(x)\\in C^1[a,b]$, the first order derivative is given by\n",
"\n",
"$$\\frac{d}{dx}f(x) = f'(x) = \\lim_{h\\rightarrow 0} \\frac{f(x+h)-f(x)}{h}$$\n",
"\n",
"However, when $f(x)$ exhibits a complex form or is a numerical function (only a discrete set of points are known), this expression becomes unfeasible. In spite of this, this formula gives us a very first rough way to calculate numerical derivatives by taking a finite interval $h$, i.e.\n",
"\n",
"$$f'(x) \\approx \\frac{f(x+h)-f(x)}{h}$$\n",
"\n",
"where the function must be known at least in $x_0$ and $x_1 = x_0+h$, and $h$ should be small enough."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "wRMWf0971BYw"
},
"source": [
"### Example 1"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "n9Znyue31BYx"
},
"source": [
"Evaluate the first derivative of the next function using the previous numerical scheme at the point $x_0=2.0$ and using $h=0.5,\\ 0.1,\\ 0.05,...$\n",
"\n",
"$f(x) = \\sqrt{1+\\cos^2(x)}$\n",
"\n",
"Compare with the real function and plot the tangent line using the found values of the slope."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "kTtRKqJf1BYy"
},
"outputs": [],
"source": [
"from scipy import misc"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "j-N2UYMH1BY3"
},
"source": [
"It is used as:\n",
"```python\n",
"misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)\n",
"```\n",
"__Parameters__
\n",
"`func` : function →\n",
" Input function.
\n",
"`x0` : float →\n",
" The point at which `n`-th derivative is found.
\n",
"`dx` : float, optional →\n",
" Spacing.
\n",
"`n` : int, optional →\n",
" Order of the derivative. Default is 1.
\n",
"`args` : tuple, optional →\n",
" Arguments
\n",
"`order` : int, optional → \n",
" Number of points to use, must be odd.
\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"colab_type": "code",
"id": "yCfkx5_y1BY4",
"outputId": "cccddcf0-5c46-4847-a983-01538e24650f"
},
"outputs": [],
"source": [
"def f(x):\n",
" return np.sqrt( 1+np.cos(x)**2 )\n",
"x0 = 2"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "kPSLAADO1BY8"
},
"source": [
"__Activity__: We now check for the impact of the change of the spacing `dx`. Try from `dx=0.5` and then small values"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.7071067811865475"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eval('np.cos(np.pi)/np.sqrt(2)')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 193
},
"colab_type": "code",
"id": "jSd5QoUu1BY9",
"outputId": "bf03d036-5c20-4de8-fb01-f23dae0327e4"
},
"outputs": [
{
"name": "stdin",
"output_type": "stream",
"text": [
"dx= 1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.13526274947015327\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"dx= 0.1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3462499420237386\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"dx= 0.01\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3493266965195363\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"dx= 1e-3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.34935758881293744\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"dx= 1e-6\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3493579009417047\n"
]
}
],
"source": [
"for i in range(5):\n",
" dx=eval(input('dx='))\n",
" print( misc.derivative(f,x0,dx=dx) )"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "CChKCiNR3bEA"
},
"source": [
"Compare with:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "4uAHftGy1BZR",
"outputId": "781b95bc-d31f-483b-d51e-3080bf478fbe"
},
"outputs": [
{
"data": {
"text/plain": [
"0.34935789816614715"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"misc.derivative(f,x0,dx=1E-8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$f'(x)=-\\frac{\\cos x\\sin x }{\\sqrt{1+\\cos^2x}}$$"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.3493579008690488"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fp=lambda x:-np.cos(x)*np.sin(x)/f(x)\n",
"fp(2)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"m=misc.derivative(f,x0,dx=1E-6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$y_0=f(x_0)=m x_0+b$$\n",
"$$b=f(x_0)-m x_0$$"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"b=f(x0)-m*x0"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, '$f(x) = \\\\sqrt{1+\\\\cos^2(x)}$')"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"xmin = 1.6\n",
"xmax = 2.4\n",
"x = np.linspace( xmin, xmax, 100 )\n",
"plt.plot( x, f(x), color=\"black\", label=\"function\", linewidth=1 )\n",
"plt.plot( x, m*x+b,\"r--\", label=f\"derivative at $x={x0}$\")\n",
"plt.plot(x0,f(x0),'y*',markersize=10)\n",
"plt.grid()\n",
"plt.legend(fontsize=15)\n",
"plt.xlabel('$x$',size=15)\n",
"plt.ylabel(r'$f(x) = \\sqrt{1+\\cos^2(x)}$',size=15)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tjUi1m_gJYQf"
},
"source": [
"\n",
"\n",
"---\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "7N5o9BA31BZW"
},
"source": [
"### Implementation of the derivate of the function inside a full range\n",
"We now generalize the `derivative` function to allow the evaluation of the derivate in a full range of values. It will be designed such that the evaluation in just one point can be still possible. In this way, the new function can be used as a full replacement of `derivative` function.\n",
"\n",
"To implement this function we need three keys ingredients of `python`:\n",
"1. `try` and `except` python progamming sctructure\n",
"1. Function definition with generic mandatory and optional arguments\n",
"1. Conversion of a float function into a vectorized fuction\n",
"\n",
"#### `try` and `except` python progamming sctructure\n",
"First we introduce the `try` and `except` python progamming sctructure, wich is used to bypass one python error. For example a zero dimension array has not a shape attribute, so that the following error, of type `IndexError`, is generated:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"ename": "IndexError",
"evalue": "tuple index out of range",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [20]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\n",
"\u001b[0;31mIndexError\u001b[0m: tuple index out of range"
]
}
],
"source": [
"(1,)[1]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(3)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array(3)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 169
},
"colab_type": "code",
"id": "4EA4HauF1BZX",
"outputId": "c3774744-3f37-471f-9860-53f0419ac71a"
},
"outputs": [
{
"ename": "IndexError",
"evalue": "tuple index out of range",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [33]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m nn\u001b[38;5;241m=\u001b[39m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 2\u001b[0m nn\n",
"\u001b[0;31mIndexError\u001b[0m: tuple index out of range"
]
}
],
"source": [
"nn=np.array(3).shape[0]\n",
"nn"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "4EwENlK51BZa"
},
"source": [
"To bypass that error we use the following code:"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "object of type 'int' has no len()",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_57720/4138546388.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: object of type 'int' has no len()"
]
}
],
"source": [
"x=3\n",
"len(3)"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0,)"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array([]).shape"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "j0d-XAbO1BZb"
},
"outputs": [],
"source": [
"x='3' #[2,3] #3 #[2,3], array([])\n",
"try: \n",
" nn=np.array(x).shape[0]\n",
"except IndexError:\n",
" nn=-1"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "YAJh5KNU1BZg"
},
"source": [
"so that `nn` takes the values assigned in the `except` part:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "Syk6hkS11BZg",
"outputId": "f5dbc48e-6105-4416-b706-f930b9b09b18"
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nn"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "XB1PCVJ17GJc"
},
"source": [
"\n",
"\n",
"---\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "bJJTeN-O-ZUA"
},
"source": [
"__Activity__: A float has the method `is_integer()` to check if the decimal part is zero. Creates a function `is_integer(x)` which works even in the case that the number is already an integer"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x=2.\n",
"x.is_integer()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 186
},
"colab_type": "code",
"id": "jr_RHXSO-MMa",
"outputId": "b1708c38-99a0-4959-b022-59afdf2235ff"
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'int' object has no attribute 'is_integer'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [50]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m x\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m\n\u001b[0;32m----> 2\u001b[0m \u001b[43mx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_integer\u001b[49m()\n",
"\u001b[0;31mAttributeError\u001b[0m: 'int' object has no attribute 'is_integer'"
]
}
],
"source": [
"x=2\n",
"x.is_integer()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "TCUydLpH7VQe",
"outputId": "0894df44-b441-42ad-e6e5-34287e437dea"
},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x=2.3\n",
"x.is_integer()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"isinstance(2,int)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Objetos:\n",
"```\n",
"str,int,float,list,dict\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"isinstance(2,list)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'hola' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [58]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43meval\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mhola\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m:1\u001b[0m, in \u001b[0;36m\u001b[0;34m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'hola' is not defined"
]
}
],
"source": [
"eval('hola')"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "unexpected EOF while parsing (, line 1)",
"output_type": "error",
"traceback": [
"Traceback \u001b[0;36m(most recent call last)\u001b[0m:\n",
" File \u001b[1;32m~/anaconda3/lib/python3.9/site-packages/IPython/core/interactiveshell.py:3369\u001b[0m in \u001b[1;35mrun_code\u001b[0m\n exec(code_obj, self.user_global_ns, self.user_ns)\n",
"\u001b[0;36m Input \u001b[0;32mIn [59]\u001b[0;36m in \u001b[0;35m\u001b[0;36m\u001b[0m\n\u001b[0;31m eval('hola mundo')\u001b[0m\n",
"\u001b[0;36m File \u001b[0;32m:1\u001b[0;36m\u001b[0m\n\u001b[0;31m hola mundo\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m unexpected EOF while parsing\n"
]
}
],
"source": [
"eval('hola mundo')"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "7-R7lC39-PJj"
},
"outputs": [],
"source": [
"def is_integer(x):\n",
" '''\n",
" Returns true if x is integer even if x is integer\n",
" '''\n",
" try:\n",
" return x.is_integer()\n",
" except AttributeError:\n",
" if isinstance(x,int):\n",
" return True\n",
" elif isinstance(x,str):\n",
" try:\n",
" #recursive\n",
" return is_integer(eval(x))\n",
" except (NameError,SyntaxError):\n",
" return False\n",
" else:\n",
" return False\n",
"\n",
"## Test the functions for typical cases \n",
"assert is_integer(3.)\n",
"assert is_integer(3.5)==False\n",
"assert is_integer(3)\n",
"assert is_integer('3')\n",
"assert is_integer('3+9+11')\n",
"assert is_integer('3.5')==False\n",
"assert is_integer('a')==False\n",
"assert is_integer('a b')==False\n",
"assert is_integer('1/2+1/2')\n",
"assert is_integer([1,3,5])==False\n",
"assert is_integer({'A':1})==False"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Testing"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"assert True"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"ename": "AssertionError",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [61]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
"\u001b[0;31mAssertionError\u001b[0m: "
]
}
],
"source": [
"assert False"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 115,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"assert is_integer(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`assert` is trivial for `True`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`assert` generates an error for `False`"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "en-iZeiD_jqG"
},
"source": [
"\n",
"\n",
"---\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Function parameters\n",
"In python the function can be defined with mandatory and optional arguments"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "5ITeOGi4OkL7"
},
"outputs": [],
"source": [
"def f(a,b,c=2,d=3):\n",
" return a+b-c+d"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* `a`,`b`: is like a _tuple_ of mandatory arguments → `(a,b)`\n",
"* `c=2`,`d=3`: is like a _dictionary_ of optional arguments → `{'c':2,'d':3}`"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "NMDk53KY1BZl"
},
"source": [
"#### Function definition with generic mandatory and optional arguments\n",
"We need to introduce another important concept about functions. There is a powerfull way to define a function with generic arguments:\n",
"1. Instead of the mandatory arguments we can use the generic list pointer: `*args`\n",
"1. Instead of the optional arguments we can use the generic dictionary pointer: `**kwargs`"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "Gqaf6NTq1BZl"
},
"outputs": [],
"source": [
"def f(*args,**kwargs):\n",
" if args:\n",
" print('*args is the tuple of mandatory arguments: {}'.format(args))\n",
" print('This allows to have a dynamic return according to input:')\n",
" return type(args[0])\n",
" if kwargs:\n",
" print('*kwargs is the dictionary of optional arguments: {}'.format(kwargs))\n",
" print('This allows to have a dynamic return according to input:')\n",
" return type(list(kwargs.keys())[0]),type(list(kwargs.values())[0])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "SjrTYl6LBfqJ"
},
"source": [
"\n",
"\n",
"---\n",
"\n",
"__Activity__; Check the function with any type of mandatory or optional argument"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab": {},
"colab_type": "code",
"id": "0osOmM-x1BZo"
},
"source": [
"* Check the function without arguments"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"f()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab": {},
"colab_type": "code",
"id": "DKmpMvlU1BZr"
},
"source": [
"* Check the function with a mandatory argument"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "KLqJ1S7W1BZt"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"*args is the tuple of mandatory arguments: ('hola mundo',)\n",
"This allows to have a dynamic return according to input:\n"
]
},
{
"data": {
"text/plain": [
"str"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f('hola mundo')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Check the function with several mandatory arguments"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"*args is the tuple of mandatory arguments: (2, [1, 2], (1+3j))\n",
"This allows to have a dynamic return according to input:\n"
]
},
{
"data": {
"text/plain": [
"int"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f(2,[1,2],1+3j)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Check the function with several optional arguments"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Check the function with one of the optional arguments equal to some list"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "eOETuwIa1BZ1"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"*kwargs is the dictionary of optional arguments: {'d': 3, 'h': [1, 2], 'k': 'kk'}\n",
"This allows to have a dynamic return according to input:\n"
]
},
{
"data": {
"text/plain": [
"(str, int)"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f(d=3,h=[1,2],k='kk')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Check the function with one string as mandatory argument, and with one of the optional arguments equal to some list"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "pDiWTY4gB_gg"
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "K372aP-a1BZ5"
},
"source": [
"#### Conversion of a float function into a vectorized function\n",
"An important `numpy` function is:"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "V6M_B9ek1BZ8"
},
"source": [
"Which convert a function which takes a float as an argument into a new function which que takes `numpy arrays` as an argument. The problem is that the converted function does not longer return a float when the argument is a float:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is used as:\n",
"```python\n",
"np.vectorize(pyfunc,...)\n",
"```\n",
"\n",
"__Parameters__:\n",
"`pyfunc`: A python function or method.\n",
"\n",
"..."
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.479425538604203"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math as m\n",
"m.sin(0.5)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "must be real number, not list",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [80]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0.7\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[0;31mTypeError\u001b[0m: must be real number, not list"
]
}
],
"source": [
"m.sin([0.5,0.7])"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.47942554, 0.64421769])"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math as m\n",
"sin=np.vectorize(m.sin)\n",
"sin([0.5,0.7])"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(0.47942554)"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sin(0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Vectorization of Scipy method `derivative`\n",
"\n",
"The problem is that `derivative` only works for one a point"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5403023058958567"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"misc.derivative(np.sin,1,dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 312
},
"colab_type": "code",
"id": "rk_Pqwkn1BZ8",
"outputId": "893e818d-7bdc-4a79-a9a7-61c1c15e82bd"
},
"outputs": [
{
"ename": "TypeError",
"evalue": "can only concatenate list (not \"float\") to list",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [84]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mmisc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mderivative\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msin\u001b[49m\u001b[43m,\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m1.2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43mdx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1E-6\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/anaconda3/lib/python3.9/site-packages/scipy/misc/_common.py:144\u001b[0m, in \u001b[0;36mderivative\u001b[0;34m(func, x0, dx, n, args, order)\u001b[0m\n\u001b[1;32m 142\u001b[0m ho \u001b[38;5;241m=\u001b[39m order \u001b[38;5;241m>>\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 143\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(order):\n\u001b[0;32m--> 144\u001b[0m val \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m weights[k]\u001b[38;5;241m*\u001b[39mfunc(\u001b[43mx0\u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mk\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mho\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdx\u001b[49m,\u001b[38;5;241m*\u001b[39margs)\n\u001b[1;32m 145\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m val \u001b[38;5;241m/\u001b[39m prod((dx,)\u001b[38;5;241m*\u001b[39mn,axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n",
"\u001b[0;31mTypeError\u001b[0m: can only concatenate list (not \"float\") to list"
]
}
],
"source": [
"misc.derivative(np.sin,[1,1.2],dx=1E-6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is easily fixed with `np.vectorize`"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "IgFtXQ5Q1BaA",
"outputId": "0c50a2fc-1f4d-48e8-8b38-355dd3c6f3d4"
},
"outputs": [],
"source": [
"derivative=np.vectorize(misc.derivative)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.54030231, 0.36235775])"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,[1,1.2],dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "IcH_mZIU1BaC",
"outputId": "1f2ea325-9bd6-49c8-9a8b-bfdf1b73f080"
},
"outputs": [
{
"data": {
"text/plain": [
"array(0.54030231)"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,1,dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5403023058958567"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"misc.derivative(np.sin,1,dx=1E-6)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GgksedR51BaG"
},
"source": [
"### Code for the derivate of the function inside a full range\n",
"\n",
"To recover the evaluation of a float into a float we can force the `IndexError` in order to use of the pure `scipy` `derivative` function when a float is given as input. The full implemention combine the three previos ingredients into a very compact pythonic-way function definition as shwon below"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pylab inline"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "H_IYjZo71BaG"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy import misc\n",
"def derivative(func,x0,**kwargs):\n",
" '''\n",
" Vectorized replacement of scipy.misc derivative:\n",
" from scipy.misc import derivative\n",
" For usage check the derivative help, e.g, in jupyter: \n",
" from scipy.misc import derivative\n",
" derivative?\n",
" '''\n",
" try:\n",
" #x0: can be an array or a list \n",
" nn=np.asarray(x0).shape[0] ## force error if float is used \n",
" fp=np.vectorize(misc.derivative)\n",
" except IndexError:\n",
" fp=misc.derivative\n",
" \n",
" return fp(func,x0,**kwargs)\n",
"\n",
"assert isinstance(derivative(np.sin,1,dx=1E-6),float)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.int64"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"A=np.array([2])\n",
"type(A[0])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numbers.Real"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numbers.Real"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numbers\n",
"x=2#A[0]\n",
"isinstance(x, numbers.Real)#numbers.Integral)"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy import misc\n",
"def derivative(func,x0,**kwargs):\n",
" '''\n",
" Vectorized replacement of scipy.misc derivative:\n",
" from scipy.misc import derivative\n",
" For usage check the derivative help, e.g, in jupyter: \n",
" from scipy.misc import derivative\n",
" derivative?\n",
" '''\n",
" try:\n",
" #x0: can be an array or a list \n",
" nn=np.asarray(x0).shape[0] ## force error if float is used \n",
" fp=np.vectorize(misc.derivative)\n",
" except IndexError:\n",
" fp=misc.derivative\n",
" \n",
" return fp(func,x0,**kwargs)\n",
"\n",
"assert isinstance(derivative(np.sin,1,dx=1E-6),float)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "beuKXTnh1BaJ"
},
"source": [
"which behaves exactly as the `scipy` `derivative` function when a float argument is used:"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "vG4Av7Pd1BaJ",
"outputId": "87f847ab-e628-4f43-f3a4-3c5e7a9a389e"
},
"outputs": [
{
"data": {
"text/plain": [
"0.5403023058958567"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,1,dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "474mzOsq1BaN",
"outputId": "1e4dd5ab-222a-4925-aa60-ccf155edd23c"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.54030231, 0.0707372 ])"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,[1,1.5],dx=1E-6)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "6a3PfPVo1BaR"
},
"source": [
"and as a vectorized function when an array argument is used:"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "0mJvX1561BaS",
"outputId": "a0a4d6b6-b319-4dd7-c286-16427adae0f4"
},
"outputs": [
{
"data": {
"text/plain": [
"(0.5403023058958567, 0.0707372017072494)"
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"misc.derivative(np.sin,1,dx=1E-6),misc.derivative(np.sin,1.5,dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.54030231, 0.0707372 ])"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,[1.,1.5],dx=1E-6)"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "O63KV62a1BaW",
"outputId": "84c60609-4259-4672-d03c-dd329c95a01d"
},
"outputs": [
{
"data": {
"text/plain": [
"array([-7.77156117e+08, -1.11022302e+09])"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(np.sin,[1.,1.5],dx=1E-6,n=4,order=5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "cv9xBqP91BaZ"
},
"source": [
"Let see now the implementation of the `derivate` function as full replacement of the `derivative` function:"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "KsNQouL31Baa"
},
"source": [
"#### Test\n",
"Let us check the implementation with the previous function"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "aa56hgqX1Baa"
},
"outputs": [],
"source": [
"func=lambda x: np.sqrt( 1+np.cos(x)**2 )"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "XlXohBsG1Bad"
},
"source": [
"but now evaluated for a list of values"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "dt0fr0XR1Bae",
"outputId": "ae20a2aa-9d3e-4fbd-b14b-0c3f05bc2ed3"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.21576117, 0.34935759, 0.41006125])"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x=[1.8,2,2.2]\n",
"funcp=derivative(func,x,dx=1E-3)\n",
"funcp"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "lVMFkWTC1Bah"
},
"source": [
"For the prevous `X` array:"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "uLAHiUVR1Bah"
},
"outputs": [],
"source": [
"x0 = 2\n",
"xmin = 1.6\n",
"xmax = 2.4\n",
"\n",
"x = np.linspace( xmin, xmax, 100 )"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "RnkFkOUf1Bak"
},
"source": [
"We have:"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "Ahr4gVsg1Bam",
"outputId": "96e378e8-ac17-4270-f8d9-ca843205ae43"
},
"outputs": [
{
"data": {
"text/plain": [
"(100,)"
]
},
"execution_count": 102,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivative(func,x,dx=1E-3).shape"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 304
},
"colab_type": "code",
"id": "vDqThzl01Bau",
"outputId": "b5c67208-fb78-4fa2-daa5-c79f85d03b09"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"xmin = 1.6\n",
"xmax = 2.4\n",
"\n",
"X = np.linspace( xmin, xmax, 100 )\n",
"\n",
"plt.plot( X, func(X) , color=\"black\", label=\"$f(x)$\", linewidth=3)\n",
"plt.plot( X, derivative(func,X,dx=1E-3), color=\"red\", label=\"$f'(x)$\", linewidth=3)\n",
"plt.plot( X, derivative(func,X,dx=1E-3,n=2), color=\"blue\", label=\"$f''(x)$\", linewidth=3)\n",
"plt.legend(loc='best',fontsize=15)\n",
"plt.xlabel('$x$',size=15)\n",
"plt.grid()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "fJsq3pgq1Bay"
},
"source": [
"#### Example\n",
"Finally we check the function $f(x)=\\cos x$ in the range $[0,2\\pi]$"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 302
},
"colab_type": "code",
"id": "v9he6Ob91Baz",
"outputId": "88af69fd-b4ca-4f4b-8d47-afb418522ab3"
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, '$x$')"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"xmin = 0\n",
"xmax = 2*np.pi\n",
"\n",
"X = np.linspace( xmin, xmax, 100 )\n",
"\n",
"plt.plot( X, np.cos(X) , \"g-\", label=\"$f(x)=\\cos x$\", linewidth=3)\n",
"plt.plot( X, derivative(np.cos,X,dx=1E-3), color=\"red\", label=\"$f'(x)$\", linewidth=3)\n",
"plt.plot( X, -np.sin(X) , 'b:', label=\"$-\\sin x$\", linewidth=3, zorder=10 )\n",
"plt.plot( X, derivative(np.cos,X,dx=1E-3,n=4,order=5), 'k:', label=\"$f^{(iv)}(x)$\", linewidth=3)\n",
"plt.legend(loc='best',fontsize=15)\n",
"plt.xlabel('$x$',size=15)"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "fPmUiXf6TqK0",
"outputId": "e3978ea8-4e6c-4d60-add6-8364e39276e5"
},
"outputs": [
{
"data": {
"text/plain": [
"-1.3010426069826051e-06"
]
},
"execution_count": 107,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"misc.derivative(np.cos,np.pi/2,n=4,dx=1E-3,order=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__Activity__: Implement the full derivative function by using `isinstance()` instead of `try` and `except` "
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
"from scipy import misc\n",
"\n",
"def derivate(func,x0,**kwargs):\n",
" '''\n",
" Vectorized replacement of scipy.misc derivative:\n",
" from scipy.misc import derivative\n",
" For usage check the derivative help, e.g, in jupyter: \n",
" from scipy.misc import derivative\n",
" derivative?\n",
" '''\n",
" if isinstance(x0,list): ## or ... or ...\n",
" print(x0)\n",
" fp=np.vectorize(misc.derivative)\n",
" else:\n",
" fp=misc.derivative\n",
" return fp(func,x0,**kwargs)"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"isinstance( np.array([2,3]),numpy.ndarray )"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.90929743, -0.14112001])"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"derivate(np.cos,np.array([2,3]),dx=1E-6)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ZyOV6qnu1BbC"
},
"source": [
"### Example: Heat transfer in a 1D bar "
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "mVKIAs3C1BbD"
},
"source": [
"Fourier's Law of thermal conduction describes the diffusion of heat. Situations in which there are gradients of heat, a flux that tends to homogenise the temperature arises as a consequence of collisions of particles within a body. The Fourier's Law is giving by \n",
"\n",
"$$ q = -k\\nabla T = -k\\left( \\frac{dT}{dx}\\hat{i} + \\frac{dT}{dy}\\hat{j} + \\frac{dT}{dz}\\hat{k}\\right)$$\n",
"\n",
"where T is the temperature, $\\nabla T$ its gradient and k is the material's conductivity. In the next example it is shown the magnitud of the heat flux in a 1D bar(wire)."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "EbScQhDk1BbE"
},
"outputs": [],
"source": [
"def Temp(x):\n",
" return x**3 + 3*x-1"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "aWcqS60O1BbI"
},
"outputs": [],
"source": [
"Xn = np.linspace(0,10,100)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "aWrKzI751BbK",
"outputId": "8db28f4a-cd32-4b31-e12e-ddb8618366b9"
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5,1,' Magnitud heat flux transfer in 1D bar')"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Temperature profile \n",
"def Temp(x):\n",
" return x**3 + 3*x-1\n",
"\n",
"## Points where function is known\n",
"Xn = np.linspace(0,10,100)\n",
"\n",
"plt.figure( figsize=(8,7) )\n",
"plt.plot(Xn,derivate(Temp,Xn)*10)\n",
"\n",
"plt.grid()\n",
"plt.xlabel( \"$x$\",fontsize =15 )\n",
"plt.ylabel( r\"$\\frac{dT}{dx}$\",fontsize =20 )\n",
"plt.title( \" Magnitud heat flux transfer in 1D bar\" )"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "HXUbjyh81BbP"
},
"source": [
"### Activity"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "0pH9meLR1BbP"
},
"source": [
"Construct a density map of the magnitud of the heat flux of a 2D bar. Consider the temperature profile as \n",
"$$ T(x,y) = x^3 + 3x-1+y^2 $$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "QtPqZYqG1BbU"
},
"source": [
"### Activity\n",
"\n",
" \n",
"The Poisson's equation relates the matter content of a body with the gravitational potential through the next equation\n",
"\n",
"$$\\nabla^2 \\phi = 4\\pi G \\rho$$\n",
"\n",
"$$\\frac{1}{r^2}\\frac{d}{dr}\\left(r^2\\frac{d\\phi}{dr}\\right)= 4\\pi G \\rho$$\n",
"where $\\phi$ is the potential, $\\rho$ the density and $G$ the gravitational constant.\n",
"\n",
"\n",
"Taking [these data](https://raw.githubusercontent.com/sbustamante/ComputationalMethods/master/data/M1.00-STRUC.dat) and using the three-point Midpoint formula, find the density field from the potential (seventh column in the file) and plot it against the radial coordinate. (**Tip:** Use $G=1$)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "uIC7_pDp1BbU"
},
"source": [
"### Activity"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "A8vjhE1G1BbU"
},
"source": [
"The radar stations A and B, separated by the distance a = 500 m, track the plane\n",
"C by recording the angles $\\alpha$ and $\\beta$ at 1-second intervals. The successive readings are \n",
"\n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ksiCizBr1BbV"
},
"source": [
"calculate the speed v using the 3 point approximantion at t = 10 ,12 and 14 s. Calculate the x component of the acceleration of the plane at = 12 s. The coordinates of the plane can be shown to be\n",
"\n",
"\\begin{equation}\n",
"x = a\\frac{\\tan \\beta}{\\tan \\beta- \\tan \\alpha}\\\\\n",
"y = a\\frac{\\tan \\alpha\\tan \\beta}{\\tan \\beta- \\tan \\alpha}\n",
"\\end{equation}\n",
"\n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "K57Qpz9W1BbW"
},
"source": [
"- - -"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "MR7WLv5v1BbX",
"tags": []
},
"source": [
"## [Numerical Integration](./numerical-calculus-integration.ipynb) "
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": []
},
"source": [
"## Appendix"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tZz5pIMR1Ba3"
},
"source": [
"#### One implementation of `derivative` algorithm"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "nV7lFSb51Ba5",
"outputId": "e091b064-928e-4400-b84c-34d62dd98215"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"#Function to evaluate\n",
"def function(x):\n",
" return np.sqrt( 1+np.cos(x)**2 )\n",
"\n",
"#X value\n",
"x0 = 2\n",
"xmin = 1.8\n",
"xmax = 2.2\n",
"#h step\n",
"hs = [0.5,0.1,0.05]\n",
"\n",
"#Calculating derivatives\n",
"dfs = []\n",
"for h in hs:\n",
" dfs.append( (function(x0+h)-function(x0))/h )\n",
" \n",
"#Plotting\n",
"plt.figure( figsize=(10,8) )\n",
"#X array\n",
"X = np.linspace( xmin, xmax, 100 )\n",
"Y = function(X)\n",
"plt.plot( X, Y, color=\"black\", label=\"function\", linewidth=3, zorder=10 )\n",
"#Slopes\n",
"Xslp = [1,x0,3]\n",
"Yslp = [0,0,0]\n",
"for df, h in zip(dfs, hs):\n",
" #First point\n",
" Yslp[0] = function(x0)+df*(Xslp[0]-Xslp[1])\n",
" #Second point\n",
" Yslp[1] = function(x0)\n",
" #Third point\n",
" Yslp[2] = function(x0)+df*(Xslp[2]-Xslp[1])\n",
" #Plotting this slope\n",
" plt.plot( Xslp, Yslp, linewidth = 2, label=\"slope$=%1.2f$ for $h=%1.2f$\"%(df,h) )\n",
"\n",
"#Format\n",
"plt.grid()\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"plt.xlim( xmin, xmax )\n",
"plt.ylim( 1, 1.15 )\n",
"plt.legend( loc = \"upper left\" )"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "lGExPWl81Ba-"
},
"source": [
"### n+1-point formula"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "EabBBRXA1Ba-"
},
"source": [
"A generalization of the previous formula is given by the (n+1)-point formula, where first-order derivatives are calculated using more than one point, what makes it a much better approximation for many problems. it is controled by the `order` option of the `derivative` function of `scipy.misc`\n",
"\n",
"**Theorem**\n",
"\n",
"For a function $f(x)$ such that $f(x)\\in C^{n+1}[a,b]$, the next expression is always satisfied\n",
"\n",
"$$f(x) = P(x) + \\frac{f^{(n+1)}(\\xi(x))}{(n+1)!}(x-x_0)(x-x_1)\\cdots(x-x_n)$$\n",
"\n",
"where $\\{x_i\\}_i$ is a set of point where the function is mapped, $\\xi(x)$ is some function of $x$ such that $\\xi\\in[a,b]$, and $P(x)$ is the associated Lagrange interpolant polynomial.\n",
"\n",
"As $n$ becomes higher, the approximation should be better as the error term becomes neglectable."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "PSgHXywE1Ba-"
},
"source": [
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "lMl1p2Kt1Ba_"
},
"source": [
"Taking the previous expression, and differenciating, we obtain\n",
"\n",
"$$f(x) = \\sum_{k=0}^n f(x_k)L_{n,k}(x) + \\frac{(x-x_0)(x-x_1)\\cdots(x-x_n)}{(n+1)!}f^{(n+1)}(\\xi(x))$$\n",
"\n",
"$$f'(x_j) = \\sum_{k=0}^n f(x_k)L'_{n,k}(x_j) + \\frac{f^{(n+1)}(\\xi(x_j))}{(n+1)!} \\prod_{k=0,k\\neq j}^{n}(x_j-x_k)$$\n",
"\n",
"where $L_{n,k}$ is the $k$-th Lagrange basis functions for $n$ points, $L'_{n,k}$ is its first derivative.\n",
"\n",
"Note that the last expressions is evaluated in $x_j$ rather than a general $x$ value, the cause of this is because this expression is not longer valid for another value not within the set $\\{x_i\\}_i$, however this is not an inconvenient when handling real applications.\n",
"\n",
"This formula constitutes the **(n+1)-point approximation** and it comprises a generalization of almost all the existing schemes to differentiate numerically. Next, we shall derive some very used formulas.\n",
"\n",
"For example, the form that takes this derivative polynomial for 3 points $(x_i,y_i)$ is the following\n",
"\n",
"$$f'(x_j) = f(x_0)\\left[ \\frac{2x_j-x_1-x_2}{(x_0-x_1)(x_0-x_2)}\\right] + \n",
"f(x_1)\\left[ \\frac{2x_j-x_0-x_2}{(x_1-x_0)(x_1-x_2)}\\right] +\n",
"f(x_2)\\left[ \\frac{2x_j-x_0-x_1}{(x_2-x_0)(x_2-x_1)}\\right] $$ \n",
"$$\\hspace{2cm} + \\frac{1}{6} f^{(3)}(\\epsilon_j) \\prod_{k=0,k\\neq j}^{n}(x_j-x_k)$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "73Bfd3Bb1BbA"
},
"source": [
"### Endpoint formulas"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ravzokPL1BbA"
},
"source": [
"Endpoint formulas are based on evaluating the derivative at the first of a set of points, i.e., if we want to evaluate $f'(x)$ at $x_i$, we then need $(x_i$, $x_{i+1}=x_i+h$, $x_{i+2}=x_i+2h$, $\\cdots)$. For the sake of simplicity, it is usually assumed that the set $\\{x_i\\}_i$ is equally spaced such that $x_k = x_0+k\\cdot h$.\n",
"\n",
"**Three-point Endpoint Formula**\n",
"\n",
"$$f'(x_i) = \\frac{1}{2h}[-3f(x_i)+4f(x_i+h)-f(x_i+2h)] + \\frac{h^2}{3}f^{(3)}(\\xi)$$\n",
"\n",
"with $\\xi\\in[x_i,x_i+2h]$\n",
"\n",
"**Five-point Endpoint Formula**\n",
"\n",
"$$f'(x_i) = \\frac{1}{12h}[-25f(x_i)+48f(x_i+h)-36f(x_i+2h)+16f(x_i+3h)-3f(x_i+4h)] + \\frac{h^4}{5}f^{(5)}(\\xi)$$\n",
"\n",
"with $\\xi\\in[x_i,x_i+4h]$\n",
"\n",
"\n",
"Endpoint formulas are especially useful near to the end of a set of points, where no further points exist."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "xPu3StrM1BbB"
},
"source": [
"### Midpoint formulas"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "X-aX0yP01BbB"
},
"source": [
"On the other hand, Midpoint formulas are based on evaluating the derivative at the middle of a set of points, i.e., if we want to evaluate $f'(x)$ at $x_i$, we then need $(\\cdots$, $x_{i-2} = x_i - 2h$, $x_{i-1} = x_i - h$, $x_i$, $x_{i+1}=x_i+h$, $x_{i+2}=x_i+2h$, $\\cdots)$.\n",
"\n",
"**Three-point Midpoint Formula**\n",
"\n",
"$$f'(x_i) = \\frac{1}{2h}[f(x_i+h)-f(x_i-h)] + \\frac{h^2}{6}f^{(3)}(\\xi)$$\n",
"\n",
"with $\\xi\\in[x_i-h,x_i+h]$\n",
"\n",
"**Five-point Midpoint Formula**\n",
"\n",
"$$f'(x_i) = \\frac{1}{12h}[f(x_i-2h)-8f(x_i-h)+8f(x_i+h)-f(x_i+2h)] + \\frac{h^4}{30}f^{(5)}(\\xi)$$\n",
"\n",
"with $\\xi\\in[x_i-2h,x_i+2h]$\n",
"\n",
"\n",
"As Midpoint formulas required one iteration less than Endpoint ones, they are more often used for numerical applications. Furthermore, the round-off error is smaller as well. However, near to the end of a set of points, they are no longer useful as no further points exists, and Endpoint formulas are preferable."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "8d2DDKhq1BbM"
},
"source": [
"Example with custom implementation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "gdXTYANs1BbN",
"outputId": "3337d176-776c-4829-b021-4f5668f2d690"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 106,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"#Temperature profile \n",
"def Temp(x):\n",
" return x**3 + 3*x-1\n",
"\n",
"#Derivative three end point \n",
"\n",
"def TEP( Yn,i, h=0.01,right=0 ):\n",
" suma = -3*Yn[i]+4*Yn[i+(-1)**right*1]-Yn[i+(-1)**right*2]\n",
" return suma/(2*h*(-1)**right)\n",
"\n",
"#Derivative mid point \n",
"def TMP( Ynh,Ynmh, h = 0.01 ): \n",
" return (Ynh-Ynmh)/(2*h)\n",
"\n",
"## Points where function is known\n",
"Xn = np.linspace(0,10,100)\n",
"Tn = Temp(Xn)\n",
"#Magnitude of heat flux array\n",
"Q = np.zeros(len(Xn))\n",
"#Left end derivative\n",
"Q[0] = TEP(Tn,0)\n",
"\n",
"#Mid point derivatives\n",
"index = len(Xn)-1\n",
"for i in xrange( 1,index ): \n",
" Q[i] = TMP( Tn[i+1],Tn[i-1] )\n",
"\n",
"#Right end derivative \n",
"Q[-1] = TEP( Tn,index,right=1 ) \n",
"\n",
"#Plotting \n",
"plt.figure( figsize=(8,7) )\n",
"plt.plot(Xn,Q)\n",
"\n",
"plt.grid()\n",
"plt.xlabel( \"x\",fontsize =15 )\n",
"plt.ylabel( \"$\\\\frac{dT}{dx}$\",fontsize =20 )\n",
"plt.title( \" Magnitud heat flux transfer in 1D bar\" )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"include_colab_link": true,
"name": "numerical-calculus.ipynb",
"provenance": [],
"version": "0.3.2"
},
"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.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
| | | | | | | |