From b6d3c5c91bd9714de3bca098eb4c1648f83231e0 Mon Sep 17 00:00:00 2001 From: svoboj68 <svoboj68@fjfi.cvut.cz> Date: Tue, 15 Feb 2022 17:18:42 +0100 Subject: [PATCH 1/4] WIP: pridan ntb s teorii k chybam --- README.md | 5 +- chyby.ipynb | 267 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 chyby.ipynb diff --git a/README.md b/README.md index 4f932b6..04f44c2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Výukový nastroj pro použití programovacího jazyka python při zpracování Využívá interaktviní prostředí pro python [jupyter notebook](https://jupyter.readthedocs.io/en/latest/install/notebook-classic.html). Bývá součástí distribucí python jako například [annaconda](https://www.anaconda.com/products/individual). -Obsah: +Tutorialy: - základy práce s proměnnými v pythonu [prace_s_daty](prace_s_daty.ipynb) - indexování - načítání z txt @@ -21,6 +21,9 @@ Obsah: - odvození vzorce pro chybu nepřímého měření pomoci symbolického počítání [symbolics](symbolics.ipynb) - vykreslení dvourozměrných dat [2D_grafy](2D_grafy.ipynb) +Teorie: + - Chyby a rozdelovaci funkce [chyby](chyby.ipynb) + Příklady: - [Extrapolace](Extrapolace.ipynb) - [Hobit](Hobit.ipynb) diff --git a/chyby.ipynb b/chyby.ipynb new file mode 100644 index 0000000..a5c0682 --- /dev/null +++ b/chyby.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NEDOKONCENO, muze obsahovat chyby" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chyby statisticke, systematicke a rozdelovaci funkce" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "pri mereni se prirozene vykytuji chyby, tyto chyby se nedaji zcela ostranit a jejich vliv na mereni muze byt ruzny. Chyby delime na statisticke, systematicke a hrube, podle jejich puvodu pripadne vlivu na mereni\n", + "statisticke jsou nahodile nahodne se vyskytujici\n", + "systematicke jsou dane pouzitymi pristroji nebo metodou\n", + "hrube chyby jsou zpusobeny lidskym faktorem pripadne selhanim mericich pristroju\n", + "kazda " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO remove\n", + "np.random.seed(931031)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rozdelovaci funkce\n", + "pokud se vyskytuje nekonecne mnoho malych nahodnych vlivu -> pravdepodobnost namereni urcite hodnoty se ridi normalnim rozdelenim.\n", + "\n", + "pravdepodobnost namereni hodnoty $p(x)$\n", + "$$ p(x) = \\frac{1}{\\sigma\\sqrt{2\\pi}} \\mathrm{e}^{ -\\frac{1}{2} \\left( \\frac{x - \\mu}{ \\sigma} \\right)^2 }$$\n", + "kde $\\mu$ je prumer a $\\sigma$ je rozptyl" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mu = 100\n", + "sigma = 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(-4*sigma, 4*sigma, 101)\n", + "y = 1 / (sigma * (2 * np.pi)**0.5 ) * np.exp(-0.5 * x/sigma * x/sigma)\n", + "\n", + "plt.figure(dpi=100)\n", + "plt.plot(x+mu, y, label=r'$ \\frac{1}{10 \\sqrt{2\\pi}} \\mathrm{e}^{ -\\frac{1}{2} \\left( \\frac{x - 100}{10} \\right)^2} $')\n", + "plt.axvline(mu, c='k', lw=1, ls='--')\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('p(x) [-]')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# generovani 10000 vzorku s rozdelenim vyse\n", + "n = 10000\n", + "d1 = np.random.normal(mu, sigma, n)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# chybove intervaly\n", + "interval1 = (d1 < mu + sigma) * (d1 > mu - sigma)\n", + "interval2 = (d1 < mu + 2 * sigma) * (d1 > mu - 2 * sigma)\n", + "interval3 = (d1 < mu + 3 * sigma) * (d1 > mu - 3 * sigma)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pravdepodobnosti s jakymi se vyskytuji vygenerovane hodnoty v chybovych intervalech\n", + "interval1.sum() / n, interval2.sum() / n, interval3.sum() / n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "67% hodnot v intervalu $\\pm\\sigma$, 99,7% hodnot v intervalu $\\pm 3 \\sigma$, s velkou pravdepodobnosti hodnoty mimo tento interval jsou dusledkem hrube chyby, lze je tedy vyradit ze zpracovani mereni" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure()\n", + "plt.hist(d1, bins=np.linspace(60, 140, 17), density=True)\n", + "plt.plot(x+mu, y, label='rozdelovaci fuknce')\n", + "plt.axvline(mu, c='k', label='$\\mu$')\n", + "plt.axvline(mu-sigma, ls='--', c='k')\n", + "plt.axvline(mu+sigma, ls='--', c='k', label='$\\mu\\pm\\sigma$')\n", + "plt.axvline(mu-3*sigma, ls='--', c='r')\n", + "plt.axvline(mu+3*sigma, ls='--', c='r', label='$\\mu\\pm 3\\sigma$')\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('Pravdepodobnost [-]')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Statisticka chyba\n", + " - nelze ji zcela odstranit\n", + " - dobre popsana teorii\n", + " - jeji vliv lze zmensit opakovanim mereni" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 10, 20 a 100 mereni s rozdelenim stejnym jako u prikladu vyse\n", + "d10 = np.random.normal(mu, sigma, 10)\n", + "d20 = np.random.normal(mu, sigma, 20)\n", + "d100 = np.random.normal(mu, sigma, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.hist([d10, d20, d100], density=True)\n", + "plt.plot(x+mu, y, c='k', label='rozdelovaci fuknce')\n", + "\n", + "# vyplneni legendy\n", + "plt.plot([], ls='', marker='s', c='C0', label='10')\n", + "plt.plot([], ls='', marker='s', c='C1', label='20')\n", + "plt.plot([], ls='', marker='s', c='C2', label='100')\n", + "\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(d10, 'x')\n", + "plt.axhline(mu, c='k', label='prumer rozdelovaci funkce')\n", + "plt.axhline(d10.mean(), ls='--', label='prumer vzorku')\n", + "plt.xlabel('Index [-]')\n", + "plt.xticks(range(10))\n", + "plt.ylabel('x [-]')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mask = np.ones_like(d10, dtype=bool)\n", + "mask[1] = 0\n", + "d10[mask].std() / (d10[mask].size - 1)**.5 , d10[mask].mean() - mu" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Systematicka chyba" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# spatne zkalibrovany pristroj posune merene hodnoty o konstantu\n", + "posun = d1 + 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.hist([d1, posun], bins=25)\n", + "plt.show()" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "b3ba2566441a7c06988d0923437866b63cedc61552a5af99d1f4fb67d367b25f" + }, + "kernelspec": { + "display_name": "Python 3.8.3 64-bit ('base': conda)", + "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.8.3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab From 0799965be0c0305613986ed656682841bc7a573a Mon Sep 17 00:00:00 2001 From: svoboj68 <svoboj68@fjfi.cvut.cz> Date: Mon, 4 Apr 2022 09:09:55 +0200 Subject: [PATCH 2/4] Pridany zakladni definice a notebook --- definice.py | 30 +++++++++++++ spousteni.ipynb | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 definice.py create mode 100644 spousteni.ipynb diff --git a/definice.py b/definice.py new file mode 100644 index 0000000..622aa9d --- /dev/null +++ b/definice.py @@ -0,0 +1,30 @@ +import numpy as np + + +def sem(pole): + """standard error of mea""" + return pole.std() / np.sqrt(pole.size-1) + + +def sem_annotated(pole: np.ndarray) -> float: + """ + Spocita chybu prumeru + + Funguje uplne stejne jako sem, akorat jsou zaneseny typy parametru a vystupu + + Parameters + ---------- + pole : np.ndarray + hodnoty + + Returns + ------- + float + chyba prumeru + """ + return pole.std() / np.sqrt(pole.size-1) + + +def foo(): + print('bar') + return diff --git a/spousteni.ipynb b/spousteni.ipynb new file mode 100644 index 0000000..f5e6da9 --- /dev/null +++ b/spousteni.ipynb @@ -0,0 +1,112 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Spouštění skriptů uvnitř ipython notebooku" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(os.getcwd()) # vypise pracovni adresar" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pokud je pracovni slozkou prakpy, lze soubor definice.py spustit primo prikazem\n", + "%run definice.py\n", + "# pokud ne, je potreba zadat cestu k souboru, napr.\n", + "# %run c:\\Users\\student\\prakpy\\definice.py # windows\n", + "# %run /home/student/prakpy/definice.py # unix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%run /cesta/k/souboru/definice.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "foo()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "np.random.seed(15022022)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = np.random.normal(10, 2, size=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.mean(), sem(a), sem_annotated(a)" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "b3ba2566441a7c06988d0923437866b63cedc61552a5af99d1f4fb67d367b25f" + }, + "kernelspec": { + "display_name": "Python 3.8.3 ('base')", + "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.8.3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab From 1408d7a5b07d7d75d8c970703867b8a7b3c341d7 Mon Sep 17 00:00:00 2001 From: svoboj68 <svoboj68@fjfi.cvut.cz> Date: Tue, 7 Jun 2022 18:26:23 +0200 Subject: [PATCH 3/4] Pridana numericka integrace --- README.md | 4 ++ numerika.ipynb | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 numerika.ipynb diff --git a/README.md b/README.md index 04f44c2..99cc64e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Využívá interaktviní prostředí pro python [jupyter notebook](https://jupyt Bývá součástí distribucí python jako například [annaconda](https://www.anaconda.com/products/individual). Tutorialy: +********** - základy práce s proměnnými v pythonu [prace_s_daty](prace_s_daty.ipynb) - indexování - načítání z txt @@ -20,11 +21,14 @@ Tutorialy: - prokládání dat [fity](fity.ipynb) - odvození vzorce pro chybu nepřímého měření pomoci symbolického počítání [symbolics](symbolics.ipynb) - vykreslení dvourozměrných dat [2D_grafy](2D_grafy.ipynb) + - numerická integrace dat [numerika](numerika.ipynb) Teorie: +****** - Chyby a rozdelovaci funkce [chyby](chyby.ipynb) Příklady: +********* - [Extrapolace](Extrapolace.ipynb) - [Hobit](Hobit.ipynb) diff --git a/numerika.ipynb b/numerika.ipynb new file mode 100644 index 0000000..37fa57c --- /dev/null +++ b/numerika.ipynb @@ -0,0 +1,127 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerická integrace\n", + "Numerická integrace dat (rozpracováno)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from scipy.integrate import trapz, cumtrapz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(0, np.pi, 200)\n", + "y = np.sin(x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure()\n", + "plt.plot(x, y, '.', ms=1, label='sin')\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pocatek = 0\n", + "y_integral = cumtrapz(y, x, initial=0) # postupná integrace a počáteční podmínka\n", + "y_integrated = trapz(y, x) # plocha pod křivkou\n", + "\n", + "plt.figure()\n", + "plt.plot(x, y_integral, '.', ms=1, label=r'$\\int\\sin(x) \\,\\mathrm{d} x$')\n", + "plt.plot(x, -np.cos(x), label=r'$-\\cos (x)$') # referenční funkce, analyticky určený integrál\n", + "plt.text(2, 0, r'$\\int_0^\\pi sin(x) \\,\\mathrm{{d}} x = {:.3f}$'.format(y_integrated)) # vloženi textu do grafu\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "delta = 0.1 # konstantní posunuti dat (systematická chyba)\n", + "y_offset = np.sin(x) + delta\n", + "\n", + "plt.figure()\n", + "plt.plot(x, y, '.', ms=1, label=r'$\\sin(x)$')\n", + "plt.plot(x, y_offset, '.', ms=1, label=r'$\\sin(x) + \\Delta$')\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_int_offset = cumtrapz(y_offset, x, initial=pocatek) # integrace posunutých dat\n", + "\n", + "plt.figure()\n", + "plt.plot(x, y_integral, '.', ms=1, label=r'$\\int \\sin(x) \\,\\mathrm{d}x$')\n", + "plt.plot(x, y_int_offset, '.', ms=1, label=r'$\\int ( \\sin(x) + \\Delta ) \\,\\mathrm{d}x$')\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "ad2bdc8ecc057115af97d19610ffacc2b4e99fae6737bb82f5d7fb13d2f2c186" + }, + "kernelspec": { + "display_name": "Python 3.8.3 ('base')", + "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.8.3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab From 924702b3a7443b856b7f30458436ae0d6d45b5a8 Mon Sep 17 00:00:00 2001 From: svoboj68 <svoboj68@fjfi.cvut.cz> Date: Thu, 18 Aug 2022 15:16:14 +0200 Subject: [PATCH 4/4] Pridana numericka derivace a komentare --- numerika.ipynb | 108 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 5 deletions(-) diff --git a/numerika.ipynb b/numerika.ipynb index 37fa57c..412be62 100644 --- a/numerika.ipynb +++ b/numerika.ipynb @@ -4,8 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Numerická integrace\n", - "Numerická integrace dat (rozpracováno)" + "# Numerické zpracování signálů" ] }, { @@ -19,6 +18,16 @@ "from scipy.integrate import trapz, cumtrapz" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Vytvoříme rozsah od 0 do $\\pi$ a jako signál zvolíme funkci sinus, u které je triviální určit primitivní funkci a derivaci.\n", + "\n", + " - $\\int \\sin(x) \\mathrm{d}x = - \\cos(x) + c $\n", + " - $\\frac{\\mathrm{d}}{\\mathrm{d}x} \\sin(x) = \\cos(x)$" + ] + }, { "cell_type": "code", "execution_count": null, @@ -43,6 +52,13 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrace" + ] + }, { "cell_type": "code", "execution_count": null, @@ -50,13 +66,14 @@ "outputs": [], "source": [ "pocatek = 0\n", - "y_integral = cumtrapz(y, x, initial=0) # postupná integrace a počáteční podmínka\n", - "y_integrated = trapz(y, x) # plocha pod křivkou\n", + "y_integral = cumtrapz(y, x, initial=pocatek) # postupná (kumulativní) numerická integrace a počáteční podmínka\n", + "y_integrated = trapz(y, x) # určitý numerický integrál ~ plocha pod křivkou\n", "\n", "plt.figure()\n", "plt.plot(x, y_integral, '.', ms=1, label=r'$\\int\\sin(x) \\,\\mathrm{d} x$')\n", "plt.plot(x, -np.cos(x), label=r'$-\\cos (x)$') # referenční funkce, analyticky určený integrál\n", "plt.text(2, 0, r'$\\int_0^\\pi sin(x) \\,\\mathrm{{d}} x = {:.3f}$'.format(y_integrated)) # vloženi textu do grafu\n", + "plt.axhline(y_integrated, lw=1, color='k')\n", "plt.legend()\n", "plt.xlabel('x [-]')\n", "plt.ylabel('y [-]')\n", @@ -69,7 +86,30 @@ "metadata": {}, "outputs": [], "source": [ - "delta = 0.1 # konstantní posunuti dat (systematická chyba)\n", + "print('numerická integrace:', y_integrated)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$\\int_0^\\pi \\sin(x) \\,\\mathrm{{d}} x = [\\cos(x)]_0^\\pi = \\cos(0) - \\cos(\\pi) = 1 - (-1) = 2$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Posunutí dat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "delta = 0.1 # konstantní posunuti dat (systematická chyba, offset na osciloskopu)\n", "y_offset = np.sin(x) + delta\n", "\n", "plt.figure()\n", @@ -97,6 +137,64 @@ "plt.ylabel('y [-]')\n", "plt.show()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivace" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dx = np.diff(x) # rozdíly mezi hodnotami nezávisle proměnné\n", + "dydx = np.gradient(y, x) # derivace\n", + "\n", + "plt.figure()\n", + "plt.plot(x, dydx, '.', ms=1, label=r'$\\frac{\\mathrm{d} y}{\\mathrm{d} x}$')\n", + "plt.plot(x, np.cos(x), label=r'$\\cos (x)$', alpha=.5)\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(x.size, dx.size) # počet členů se derivací zmenší" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Posunutí dat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dydx_offset = np.gradient(y_offset, x)\n", + "\n", + "plt.figure()\n", + "plt.plot(x, dydx_offset, '.', ms=1, label=r'$\\frac{\\mathrm{d}}{\\mathrm{d} x} (y + \\Delta)$')\n", + "plt.plot(x, np.cos(x), label=r'$\\cos (x)$', alpha=.5)\n", + "plt.legend()\n", + "plt.xlabel('x [-]')\n", + "plt.ylabel('y [-]')\n", + "plt.show()" + ] } ], "metadata": { -- GitLab