From 3ba04215d28740012770de6eaca65bcf40972c03 Mon Sep 17 00:00:00 2001
From: Roger Wolf <roger.wolf@kit.edu>
Date: Wed, 6 Nov 2024 16:02:00 +0100
Subject: [PATCH] adding a new file as tool

---
 .../tools/Kennlinienfeld.ipynb                | 190 ++++++++++++++++++
 1 file changed, 190 insertions(+)
 create mode 100644 Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb

diff --git a/Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb b/Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb
new file mode 100644
index 0000000..315a668
--- /dev/null
+++ b/Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb
@@ -0,0 +1,190 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "83e1bf17-8b43-4cff-a92f-0089ca5f7e67",
+   "metadata": {
+    "jp-MarkdownHeadingCollapsed": true
+   },
+   "source": [
+    "# Darstellung des Transistorkennlinienfelds"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5b1cba86-fcfd-460e-97f3-2b12c992e3f6",
+   "metadata": {},
+   "source": [
+    "Mit dem folgenden Code-Fragment erhalten Sie ein Template mit dem Sie das **Transistor Kennlinienfeld** mit Hilfe der Bibliothek *matplotlib* graphisch darstellen können."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b7c01ade-e0c4-430f-9f3d-c40aeb0debe3",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "# Datenstruktur für die Ausgangskennlinien: Eine Liste von Drei-Tupeln für \n",
+    "# jeden gemessenen Basisstrom I_B. Jedes Tuple enthält I_B als ersten Eintrag, \n",
+    "# gefolgt von zwei Listen mit den Werten zu den Wertepaaren (U_CE, I_C). \n",
+    "# Eine typische Kurve für einen exemplarischen Wert von I_B ist gegeben. \n",
+    "# Tauschen Sie für Ihre Darstellung die angegebenen Beispielwerte aus \n",
+    "ausgangskennlinien = [\n",
+    "    # I_B (mA), U_CE (V), I_C (mA) \n",
+    "    (30,\n",
+    "    # U_CE (V)\n",
+    "     [0.1, 0.2, 0.3, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 3.0, 4.0, 5.0, 10.], \n",
+    "    # I_C (mA)\n",
+    "     [0.1, 0.6, 0.9, 1.5, 2.25, 3.0, 3.75, 4.5, 5.25, 6.0, 9.0, 12.0, 13., 15.]),\n",
+    "]\n",
+    "# Datenstruktur für die Eingangskennlinie: Hier gibt es nur eine Kennlinie. Die \n",
+    "# Struktur besteht aus einem Tuple aus zwei Listen mit Werten für die Wertepaare \n",
+    "# (U_BE, I_B)\n",
+    "eingangskennlinie = (\n",
+    "    # I_B (muA)\n",
+    "    [ 1.,  2.,  3.,  4.,  5.,   6.,  7.,   10., 12.5,   15.,  22.5,  30.,  37.5, 42.,  55., 75.],\n",
+    "    # U_BE (V)\n",
+    "    [0.1, 0.2, 0.3, 0.4, 0.5, 0.55, 0.6, 0.625, 0.65, 0.675, 0.725, 0.75, 0.775, 0.8, 0.82, 0.84])\n",
+    "# Datenstruktur für die Übertragungskennlinie: Hier gibt es nur eine Kennlinie. \n",
+    "# Die Struktur besteht aus einem Tuple aus zwei Listen mit Werten für die \n",
+    "# Wertepaare (I_B, I_C)\n",
+    "uebertragungskennlinie = (\n",
+    "    # I_B (muA)\n",
+    "    [5., 10., 20., 25., 30., 35., 40., 50.], \n",
+    "    # I_C (mA)\n",
+    "    [1., 2., 4., 4.8, 5.0, 5.2, 5.6, 6.5])\n",
+    "# Datenstruktur für die Übertragungskennlinie aus einer Anpassung die Daten.\n",
+    "# Zur Datenstruktur s.o.\n",
+    "fit_uebertragungskennlinie = (\n",
+    "   # I_B (muA)\n",
+    "    [5., 10., 20., 25., 30., 35., 40., 50.], \n",
+    "    # I_C (mA)\n",
+    "    [1., 2., 4., 4.8, 5.0, 5.2, 5.5, 6.5])    \n",
+    "\n",
+    "# Die folgenden Hilfsfunktionen entfernen das tick lable im gemeinsamen Ursprung \n",
+    "# des Diagramms. Von diesen Funktionen können Sie Gebrauch machen, wenn Sie \n",
+    "# möchten, es findet sich wieter unten jedoch eine alternative Vorgehensweise. \n",
+    "def axNoZero(ax, axis=(\"x\", \"y\")):\n",
+    "    \"\"\"\n",
+    "    Entfernt das label für die 0 auf der angegebenen Achse\n",
+    "\n",
+    "    ax: matplotlib.pyplot.Axes  -   Achsen Objekt, bei dem die 0 entfernt werden soll\n",
+    "    axis: Tuple[str]            -   Bezeichner der Achesn (\"x\", \"y\") für die die 0 entfernt werden soll\n",
+    "    \"\"\"\n",
+    "    if \"x\" in axis:\n",
+    "        ax.xaxis.set_ticks(ax.get_xticks())\n",
+    "        ax.set_xticklabels(ticklabelsRemoveZero(ax.get_xticklabels()))\n",
+    "    if \"y\" in axis:\n",
+    "        ax.yaxis.set_ticks(ax.get_yticks())\n",
+    "        ax.set_yticklabels(ticklabelsRemoveZero(ax.get_yticklabels()))\n",
+    "\n",
+    "def ticklabelsRemoveZero(labels):\n",
+    "    \"\"\"\n",
+    "    Setzt das label bei 0 auf einen leeren String\n",
+    "\n",
+    "    labels: List[matplotlib.text.Text]   -   Liste der Labels\n",
+    "    returns List[matplotlib.text.Text]   -   Liste der Labels, bei denen das Label für 0 entfernt wurde\n",
+    "    \"\"\"\n",
+    "    for label in labels:\n",
+    "        if label.get_position()[0] == 0:\n",
+    "            label.set_text(\"\")\n",
+    "            break\n",
+    "    return labels\n",
+    "\n",
+    "# Defninition der drei Quadranten\n",
+    "fig = plt.figure(figsize=(10., 10.))\n",
+    "axUebertragungskennlinie = fig.add_axes([0.1, 0.5, 0.4, 0.4], zorder=2)\n",
+    "axEingangskennlinie = fig.add_axes([0.1, 0.1, 0.4, 0.4], sharex=axUebertragungskennlinie, zorder=1)\n",
+    "axAusgangskennlinie = fig.add_axes([0.5, 0.5, 0.4, 0.4], sharey=axUebertragungskennlinie, zorder=3)\n",
+    "\n",
+    "# QUADANT I : Ausgangskennlinie\n",
+    "axAusgangskennlinie.minorticks_on()\n",
+    "# Darstellung der u.U. einzelnen Kennlinien mit entsprechendem label für I_B\n",
+    "for I_B, U_CE, I_C in ausgangskennlinien:\n",
+    "    axAusgangskennlinie.plot(U_CE, I_C)\n",
+    "    axAusgangskennlinie.annotate(\"${I_B:.1f}$\".format(I_B=I_B), (U_CE[-1], I_C[-1]), textcoords=\"offset points\", xytext=(5, 0), ha=\"left\", va=\"center\")\n",
+    "# Label für die angegebenen Zahlen für I_B\n",
+    "axAusgangskennlinie.text(1.02, 1.0, r\"$I_{\\mathrm{B}}\\,/\\,\\mathrm{\\mu\\, A}$\", transform=axAusgangskennlinie.transAxes, ha=\"left\", va=\"bottom\")\n",
+    "# x/y-Achsen labels\n",
+    "axAusgangskennlinie.set_xlabel(r\"$U_\\mathrm{CE}\\,/\\,\\mathrm{V}$\")\n",
+    "axAusgangskennlinie.set_ylabel(r\"$I_\\mathrm{C}\\,/\\,\\mathrm{mA}$\")\n",
+    "# x/y-Achsen limits\n",
+    "axAusgangskennlinie.set_xlim(0, 10.)\n",
+    "axAusgangskennlinie.set_ylim(0, 16.)\n",
+    "# Anpassen der label Koordinaten\n",
+    "axAusgangskennlinie.xaxis.set_label_coords(1.08, 0.1)\n",
+    "axAusgangskennlinie.xaxis.label.set_rotation(-90)\n",
+    "axAusgangskennlinie.yaxis.set_label_coords(0, 1.05)\n",
+    "axAusgangskennlinie.yaxis.label.set_rotation(\"horizontal\")\n",
+    "# Ausblenden der ersten und letzten tick labels, die u.U. mit den Diagramm-\n",
+    "#genzen überlappen\n",
+    "plt.setp(axAusgangskennlinie.get_yticklabels()[ 0], visible=False)\n",
+    "plt.setp(axAusgangskennlinie.get_yticklabels()[-1], visible=False)\n",
+    "plt.setp(axAusgangskennlinie.get_xticklabels()[ 0], visible=False)\n",
+    "plt.setp(axAusgangskennlinie.get_xticklabels()[-1], visible=False)\n",
+    "#axNoZero(axAusgangskennlinie)\n",
+    "\n",
+    "# Eingangskennlinie\n",
+    "axEingangskennlinie.minorticks_on()\n",
+    "axEingangskennlinie.plot(eingangskennlinie[0], eingangskennlinie[1])\n",
+    "axEingangskennlinie.set_ylabel(r\"$U_\\mathrm{BE}\\,/\\,\\mathrm{V}$\")\n",
+    "axEingangskennlinie.yaxis.set_label_coords(1, -0.05)\n",
+    "axEingangskennlinie.yaxis.label.set_rotation(\"horizontal\")\n",
+    "axEingangskennlinie.set_ylim(0., 1.)\n",
+    "axEingangskennlinie.yaxis.reset_ticks()\n",
+    "axEingangskennlinie.xaxis.set_visible(False)\n",
+    "axEingangskennlinie.yaxis.set_inverted(True)\n",
+    "axEingangskennlinie.yaxis.tick_right()\n",
+    "axEingangskennlinie.yaxis.set_label_position(\"right\")\n",
+    "plt.setp(axEingangskennlinie.get_yticklabels()[ 0], visible=False)\n",
+    "plt.setp(axEingangskennlinie.get_yticklabels()[-1], visible=False)\n",
+    "plt.setp(axEingangskennlinie.get_xticklabels()[ 0], visible=False)\n",
+    "plt.setp(axEingangskennlinie.get_xticklabels()[-1], visible=False)\n",
+    "#axNoZero(axEingangskennlinie, axis=(\"y\",))\n",
+    "\n",
+    "# Ãœbertragungskennlinie\n",
+    "axUebertragungskennlinie.minorticks_on()\n",
+    "axUebertragungskennlinie.scatter(uebertragungskennlinie[0], uebertragungskennlinie[1], marker=\"x\", color=\"red\", zorder=2)\n",
+    "axUebertragungskennlinie.plot(fit_uebertragungskennlinie[0], fit_uebertragungskennlinie[1], color=\"black\")\n",
+    "axUebertragungskennlinie.set_ylim(0)\n",
+    "axUebertragungskennlinie.set_xlim(0, 70)\n",
+    "axUebertragungskennlinie.set_xlabel(r\"$I_\\mathrm{B}\\,/\\,\\mathrm{\\mu \\,A}$\")\n",
+    "axUebertragungskennlinie.xaxis.set_label_coords(-0.08, 0.1)\n",
+    "axUebertragungskennlinie.xaxis.label.set_rotation(\"vertical\")\n",
+    "axUebertragungskennlinie.yaxis.set_visible(False)\n",
+    "axUebertragungskennlinie.xaxis.set_inverted(True)\n",
+    "plt.setp(axUebertragungskennlinie.get_yticklabels()[ 0], visible=False)\n",
+    "plt.setp(axUebertragungskennlinie.get_yticklabels()[-1], visible=False)\n",
+    "plt.setp(axUebertragungskennlinie.get_xticklabels()[ 0], visible=False)\n",
+    "plt.setp(axUebertragungskennlinie.get_xticklabels()[-1], visible=False)\n",
+    "#axNoZero(axUebertragungskennlinie, axis=(\"x\",))\n",
+    "# Zeige den plot an\n",
+    "plt.show()"
+   ]
+  }
+ ],
+ "metadata": {
+  "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.12.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
-- 
GitLab