"Mit den folgenden Code-Fragmenten zeigen wir Ihnen: \n",
"\n",
" * Wie man *csv*-Datei mit Hilfe von PhyPraKit oder *pandas* **einließt**.\n",
" * Wie man die eingelesenen Daten auf ein handhabbares Maß **reduziert**.\n",
" * Wie man die Daten mit Hilfe von [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.\n",
" * Wie man die angepassten *Spline*-Funktionen numerisch **differenziert** oder **integriert**. \n",
" * Wie man die eingelesenen Daten mit Hilfe von *matplotlib* **darstellt**.\n",
" * Wir demonstrieren hierzu die Berechnung der durch die Hystereseschleife eingeschlossenen Fläche mit der folgende Strategie: \n",
" * Die Datenpunkte $(t, U_{H})$ werden mit Hilfe einer *Spline*-Funktion **interpoliert**.\n",
" * Mit Hilfe der Ableitung dieser *Spline*-Funktion lassen sich die **Zweige für mit $t$ zu- und abnehmende Werte von $U_{H}$**, für die spätere Integration, in die Datenreihen $U_{H}^{(+)}$ (`UHp`)und $U_{H}^{(-)}$ (`UHm`) aufspalten.\n",
" * Die Datenpunkte $(U_{H}^{(+)}, U_{B})$ (unterer Teil der Hystereseschleife) und $(U_{H}^{(-)}, U_{B})$ (oberer Teil der Hystereseschleife) werden wieder mit Hilfe von *Spline*-Funktionen **interpoliert**.\n",
" * Das **Integral des unteren Zweigs (`UHp`) wird schließlich vom Integral des oberen Zweigs (`UHm`) abgezogen**.\n",
"\n",
"Alle im Folgenden gezeigten Code-Fragmente lassen sich geeignet kombinieren. "
]
},
{
"cell_type": "markdown",
"id": "f19a05d2-1fe0-48f8-b0d2-cd0d5347774d",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## Einlesen der Daten im *csv*-Format mit *pandas*"
]
},
{
"cell_type": "markdown",
"id": "44cc2032-e170-411d-bb06-bd1347bdc80f",
"metadata": {},
"source": [
"Mit dem folgenden Code-Fragment zeigen wir Ihnen:\n",
" \n",
" * Wie man mit *pandas* Daten aus einer *csv*-Datei aus dem PicoScope **einließt**.\n",
" * Wir verwenden hierzu die Beispiel-Datei `Hysterese.csv`, aus dem *tools*-Verzeichnis."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "9d186433-2215-4c20-85c1-31fc6936e134",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"# Read cvs file as pandas dataframe\n",
"df = pd.read_csv(\"Hysterese.csv\")\n",
"# Translate dataframe columns into native python lists\n",
"t = df[\"Frequency\"].to_list()[1:]\n",
"UB = df[\"Channel A\"].to_list()[1:] \n",
"UH = df[\"Channel B\"].to_list()[1:] "
]
},
{
"cell_type": "markdown",
"id": "d7c21a7c-b21d-474a-8692-715e51386cd1",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## Einlesen der Daten im *csv*-Format mit PhyPraKit"
]
},
{
"cell_type": "markdown",
"id": "6b48a8c8-ffe3-484b-8434-0ffbc9006ece",
"metadata": {},
"source": [
"Mit dem folgenden Code-Fragment zeigen wir Ihnen:\n",
" \n",
" * Wie man mit der PhyPrakit Funktion *readPicoScope* Daten aus einer *csv*-Datei aus dem PicoScope **einließt**.\n",
" * Wir verwenden hierzu die Beispiel-Datei `Hysterese.csv`, aus dem *tools*-Verzeichnis."
"# * \"data\" is a list of lists which correspond to the columns in the csv file; \n",
"# * \"units\" is the list of units per column; \n",
"# check help(readPicoScope) to learn more about this function\n",
"units, data = readPicoScope(\"Hysterese.csv\", delim=\",\")\n",
"# The association of data[1] and data[2] depends on the cabling of the PicoScope!\n",
"t = data[0] # column 0 in csv file: sampling time (not really needed)\n",
"UB = data[1] # column 1 in csv file: proportional to B-Field\n",
"UH = data[2] # column 2 in csv file: proportional to H-Field"
]
},
{
"cell_type": "markdown",
"id": "bd214272-52ad-411c-9843-b9eccd0dd98b",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## Smoothing und down sampling mit PhyPraKit"
]
},
{
"cell_type": "markdown",
"id": "5575a8c5-2748-4e59-8941-ae6065718215",
"metadata": {},
"source": [
"Mit dem folgenden Code-Fragment zeigen wir Ihnen:\n",
" \n",
" * Wie man mit der PhyPrakit Funktion *meanFilter* eine Datenreihe durch laufende Mittelwertbildung (*running mean*) über $n$ Nachbarn **glättet**.\n",
" * Wie man eine Datenreihe mit der PhyPraKit Funktion *resample* durch Mittelwertbildung über $n$ Nachbarn reduziert (**down sampling**)."
"# If length is too large, resample by an appropriate factor, we are fine with \n",
"# 150 data points\n",
"if il > 150:\n",
" n = int(il/150)\n",
" # This is an example of smoothing by averaging over n neighbors\n",
" #print(\"Smoothing with window size \", n)\n",
" #t = meanFilter(vUH, width=n)\n",
" #UH = meanFilter(vUH, width=n)\n",
" #UB = meanFilter(vUB, width=n)\n",
" # This is an example of down sampling by averaging over n neighbors\n",
" print(\"Resampling by factor\", n)\n",
" t = resample(t , n=n)\n",
" UH = resample(UH, n=n)\n",
" UB = resample(UB, n=n)"
]
},
{
"cell_type": "markdown",
"id": "3df7241a-0c74-4122-ad04-689c1c5a72e2",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## Interpolation durch *Spline*-Funktionen und Darstellung mit *matplotlib*"
]
},
{
"cell_type": "markdown",
"id": "22c6a38a-066c-466d-bcf2-7a5d7ced2c39",
"metadata": {},
"source": [
"Mit dem folgenden Code-Fragment zeigen wir Ihnen:\n",
" \n",
" * Wie man mit der scipy Klasse [interpolate.UnivariateSpline](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html#scipy.interpolate.UnivariateSpline) eine (beliebige) Datenreihe druch [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.\n",
" * Wie man die Datenreihe und die daraus gewonnenen *Spline*-Funktionen für der Hystereseschleife mit den Methoden von *matplotlib* darstellt."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c0dfb476-6c59-44f2-9df0-33278d831abf",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy import interpolate\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# In a real example you have to calibrate your data e.g. at this point; we add \n",
"# some fake calibration constants for demonstration purposes, here\n",
"CALIB_UH2H = 200.0 # U_H -> H <-- adjust !\n",
"CALIB_UB2B = 1.3 # U_B -> B <-- adjust !\n",
"H = UH * CALIB_UH2H\n",
"B = UB * CALIB_UB2B\n",
"# Interpolate the points of (t,H) by spline functions; s=0 means that no extra \n",
"# smoothing will be applied, each point of H will be used for the spline\n",
"## Differentiation und Integration von *Spline*-Funktionen"
]
},
{
"cell_type": "markdown",
"id": "c0c27c8a-88df-40b1-92cc-b741b35bc3df",
"metadata": {},
"source": [
"Mit dem folgenden Code-Fragment zeigen wir Ihnen:\n",
" \n",
" * Wie man mit der scipy Klasse [interpolate.UnivariateSpline](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html#scipy.interpolate.UnivariateSpline) eine (beliebige) Datenreihe druch [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.\n",
" * Wie man nach der Interpolation die *Spline*-Funktion mit der Funktion [derive](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.derivative.html#scipy.interpolate.UnivariateSpline.derivative) **numerisch ableitet**.\n",
" * Wie man nach der Interpolation die *Spline*-Funktion mit der Funktion [integrate](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.integral.html#scipy.interpolate.UnivariateSpline.integral) **numerisch integriert**.\n",
" * Wir folgen dabei der in Zelle 2 dargelegten Strategie."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ebc3ecb9-4579-4b5d-a6fe-9bfdecce7c09",
"metadata": {},
"outputs": [],
"source": [
"# The derivatives of H(t) will be used to determine the upper and lower branches \n",
"# of the hysteresis slope\n",
"spl_Ht_deriv = spl_Ht.derivative()\n",
"Hp = []; Bp = []; Hm = []; Bm = []\n",
"for i, ti in enumerate(t):\n",
" if spl_Ht_deriv(ti) > 0.0:\n",
" # The branch when H was increased (lower branch)\n",
" Hp.append(H[i])\n",
" Bp.append(B[i])\n",
" else:\n",
" # The branch when H was decreased (upper branch)\n",
" Hm.append(H[i])\n",
" Bm.append(B[i])\n",
"# Convert to numpy arrays and sort at the same time increasing in H\n",
"ip = np.argsort(Hp)\n",
"Hp = np.array(Hp)[ip]\n",
"Bp = np.array(Bp)[ip]\n",
"im = np.argsort(Hm)\n",
"Hm = np.array(Hm)[im]\n",
"Bm = np.array(Bm)[im]\n",
"# Provide spline approximations for the upper and lower bracnches of the curve; \n",
"# adjusting the parameter s is a cruical ingredient here to get useful and \n",
"Führen Sie zur Wiederholung des Gelernten und zum Test Ihres Verständnisses noch einmal die folgenden Operationen durch:\n",
"\n",
" * Stellen Sie die [differenzielle Permeabilität](https://de.wikipedia.org/wiki/Magnetische_Permeabilit%C3%A4t#Abh%C3%A4ngigkeit_von_der_Feldst%C3%A4rke:_Differentielle_Permeabilit%C3%A4t) $\\mu_{D}(H)$ graphish dar"
Mit den folgenden Code-Fragmenten zeigen wir Ihnen:
* Wie man *csv*-Datei mit Hilfe von PhyPraKit oder *pandas***einließt**.
* Wie man die eingelesenen Daten auf ein handhabbares Maß **reduziert**.
* Wie man die Daten mit Hilfe von [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.
* Wie man die angepassten *Spline*-Funktionen numerisch **differenziert** oder **integriert**.
* Wie man die eingelesenen Daten mit Hilfe von *matplotlib***darstellt**.
* Wir demonstrieren hierzu die Berechnung der durch die Hystereseschleife eingeschlossenen Fläche mit der folgende Strategie:
* Die Datenpunkte $(t, U_{H})$ werden mit Hilfe einer *Spline*-Funktion **interpoliert**.
* Mit Hilfe der Ableitung dieser *Spline*-Funktion lassen sich die **Zweige für mit $t$ zu- und abnehmende Werte von $U_{H}$**, für die spätere Integration, in die Datenreihen $U_{H}^{(+)}$ (`UHp`)und $U_{H}^{(-)}$ (`UHm`) aufspalten.
* Die Datenpunkte $(U_{H}^{(+)}, U_{B})$ (unterer Teil der Hystereseschleife) und $(U_{H}^{(-)}, U_{B})$ (oberer Teil der Hystereseschleife) werden wieder mit Hilfe von *Spline*-Funktionen **interpoliert**.
* Das **Integral des unteren Zweigs (`UHp`) wird schließlich vom Integral des oberen Zweigs (`UHm`) abgezogen**.
Alle im Folgenden gezeigten Code-Fragmente lassen sich geeignet kombinieren.
* Wie man mit der scipy Klasse [interpolate.UnivariateSpline](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html#scipy.interpolate.UnivariateSpline) eine (beliebige) Datenreihe druch [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.
* Wie man die Datenreihe und die daraus gewonnenen *Spline*-Funktionen für der Hystereseschleife mit den Methoden von *matplotlib* darstellt.
* Wie man mit der scipy Klasse [interpolate.UnivariateSpline](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html#scipy.interpolate.UnivariateSpline) eine (beliebige) Datenreihe druch [*Spline*](https://de.wikipedia.org/wiki/Spline)-Funktionen **interpoliert**.
* Wie man nach der Interpolation die *Spline*-Funktion mit der Funktion [derive](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.derivative.html#scipy.interpolate.UnivariateSpline.derivative)**numerisch ableitet**.
* Wie man nach der Interpolation die *Spline*-Funktion mit der Funktion [integrate](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.integral.html#scipy.interpolate.UnivariateSpline.integral)**numerisch integriert**.
* Wir folgen dabei der in Zelle 2 dargelegten Strategie.
Führen Sie zur Wiederholung des Gelernten und zum Test Ihres Verständnisses noch einmal die folgenden Operationen durch:
* Stellen Sie die [differenzielle Permeabilität](https://de.wikipedia.org/wiki/Magnetische_Permeabilit%C3%A4t#Abh%C3%A4ngigkeit_von_der_Feldst%C3%A4rke:_Differentielle_Permeabilit%C3%A4t) $\mu_{D}(H)$ graphish dar