diff --git a/Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb b/Transistor_und_Operationsverstaerker/tools/Kennlinienfeld.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..315a6683b2c145c21080a670e45c19fa50ecfbc5 --- /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 +}