Errata
Wenn Sie einen Fehler im Buch finden, eine Frage haben, oder eine Verbesserung vorschlagen möchten, können Sie mich gerne unter der im Impressum angegebenen E-Mail-Adresse kontaktieren.
Änderungen mit Matplotlib 3.7
Mit Matplotlib 3.7 haben sich einige Änderungen ergeben, die dazu führen, dass einige Programme aus dem Buch nicht mehr korrekt ausgeführt werden oder eine Warnung liefern. Fehler beim Aufruf von
set_data
Bis zur Version 3.6 von Matplotlib konnte man, wenn ein Plot nur aus einem Punkt besteht, für die Koordinaten jeweils eine Zahl angeben. Wenn der Plot aus mehreren Punkten besteht, musste man entsprechend für jede Koordinate eine Sequenz (Liste, Tupel oder ein Array) übergeben. Seit Matplotlib 3.7 muss man stets eine Sequenz übergeben.
Examplarisch sei die Änderung an dem Programm Programm 4.5 erläutert. Dort wurde in Zeile 111 die Position des Hundes wie folgt aktualisiert:
hund.set_data(r_hund[n])
Dabei ist r_hund
ein 599×2-Array mit den Koordinaten des Hundes zu jedem berechneten Zeitpunkt. Demzufolge ist r_hund[n]
ein
eindimensionales Array mit 2 Elementen. Matplotlib 3.7 beschwert sich nun,
dass es sich bei den einzelnen Koordinaten um Zahlen handelt und nicht
um Sequenzen. Wir müssen daher aus dem Array mit 2 Elementen zunächst ein
2×1-Array erzeugen. Dies gelingt am einfachsten wir folgt:
hund.set_data(r_hund[n].reshape(-1, 1))
Betroffen sind alle Programme, in denen ein Plot mit nur einem einzelnen Punkt erzeugt wird. Die auf dieser Webseite bereitgestellten Programme wurden bereits entsprechend korrigiert.
Warnung beim Erzeugen eines Farbbalkens mit
fig.colorbar
In einigen Programmen werden physikalische Größen mithilfe einer Farbtabelle dargestellt. In einigen Fällen wird dazu explizit ein sogenannter Mapper erzeugt, beispielsweise in den Programm Programm 5.4:
mapper = mpl.cm.ScalarMappable(cmap=mpl.cm.jet)
Später wird dann ein Farbalken wie folgt erzeugt:
fig.colorbar(mapper, label='Kraft [N]')
Dabei kommt es zu einer Warnung: Der Mapper enthält keinerlei Information
darüber, auf welche Axis sich die Farbdarstellung bezieht. Um den
Farbbalken darzustellen, muss aber der Platz für den Balken von einer Axis
weggenommen werden. Matplotlib muss also erraten, zu welcher Axis der
Farbbalken gehört. Dieses Verhalten wird in zukünftigen Versionen von
Matplotlib wegfallen. Daher muss man die Axis, auf die sich der Farbbalken
bezieht, explizit mithilfe des Arguments
ax=
angeben:
fig.colorbar(mapper, label='Kraft [N]', ax=ax)
Betroffen sind alle Programme, in denen ein Farbalken für einen explizit erzeugten Mapper dargestellt werden soll. Die auf dieser Webseite bereitgestellten Programme wurden bereits entsprechend korrigiert.
Kapitel 2
S. 37:
In der vorletzten Zeile von Abschn. 2.16 muss es anstelle von »in Zeile 10« korrekt »in Zeile 6« heißen.S. 44:
In der ersten Zeile von Tab. 2.4 muss es anstelle von »$2^4-1=127$« korrekt »$2^7-1=127$« heißen.Kapitel 3
S. 82:
Die Beschreibung des Arraysp
, das von der Methode ax.hist
zurückgegeben
wird, ist ungenau: Das Array gibt nicht die relative Häufigkeit in jeder
Gruppe an, sondern die Wahrscheinlichkeitsdichte. Dazu werden die relativen
Häufigkeiten so normiert, dass das Integral des Histogramms eins ergibt.
S. 83:
Die vertikale Achse in Abb. 3.2 muss mit dem Begriff »Wahrscheinlichkeitsdichte« anstelle »Wahrscheinlichkeit« beschriftet werden.S. 83:
Im Programm 3.8 sollte der Datentyp besser mitdtype=float
anstelle von
dtype=np.float
angegeben werden.
Neuere Versionen von Numpy (ab Version 1.20) geben sonst eine Warnung aus.
S. 86:
Im Programm 3.9 fehlen bei der Ausgabe der Fit-Ergebnisse Klammern um das Ergebnis:
# Gib das Ergebnis der Kurvenanpassung aus.
print(f'Ergebnis der Kurvenanpassung:')
print(f' n_u = {n_u:4.0f} +- {d_n_u:2.0f} 1/min.')
print(f' n_0 = {n_0:4.0f} +- {d_n_0:2.0f} 1/min.')
print(f' alpha = {alpha:.2f} +- {d_alpha:.2f} 1/mm.')
Die korrekte Angabe der Mittelwerte und der Fehler erhält man mit dem
folgenden Code:
# Gib das Ergebnis der Kurvenanpassung aus.
print(f'Ergebnis der Kurvenanpassung:')
print(f' n_u = ({n_u:4.0f} +- {d_n_u:2.0f}) 1/min.')
print(f' n_0 = ({n_0:4.0f} +- {d_n_0:2.0f}) 1/min.')
print(f' alpha = ({alpha:.2f} +- {d_alpha:.2f}) 1/mm.')
Das herunterladbare Programm wurde bereits
entsprechend korrigiert.
S. 86:
Im letzten Absatz muss es »in Zeile 31« anstelle von »in Zeile 29« heißen.Kapitel 4
S. 91:
Die Beschreibung der mittleren Geschwindigkeit unterhalb von Gleichung (4.2) ist ungenau. Korrekt muss es heißen: »Die mittlere Geschwindigkeit $\langle \vec v\rangle$, die der Körper in diesem Zeitintervall hat« anstelle von: »Die mittlere Geschwindigkeit $\langle \vec v\rangle$, die der Körper in dieser Zeit zurückgelegt hat«.S. 109:
Damit das Programm 4.7 auch mit Matplotlib 3.5.0 korrekt funktioniert, muss der Aufruf vonset_data
wir folgt korrigiert werden:
punkt.set_data(np.array([r[n, 0]]), np.array([r[n, 1]]))
punkt.set_3d_properties(np.array([r[n, 2]]))
Das herunterladbare Programm wurde bereits entsprechend korrigiert.
Hinweis: Seit Matplotlib 3.1.0 kann man die Daten eines 3D-Plots auch mit nur
einem Aufruf der Methode set_data_3d
aktualisieren:
punkt.set_data3d(r[n, :])
Kapitel 5
S. 125:
In Abb. 5.8. müssen die Stäbe besser von 0 bis 6 anstelle von 1 bis 7 nummeriert werden, damit die Indizes in Programm 5.2 konsistent mit der Abbildung sind.S. 126:
Im Programm 5.2 wurden die Stäbe Nr. 6 und Nr. 7 gegenüber der Abb. 5.8 vertauscht. Korrekt muss es heißen:
# Jeder Stab verbindet genau zwei Punkte. Wir legen dazu die
# Indizes der zugehörigen Punkte in einem Array ab.
staebe = np.array([[1, 2], [2, 3], [3, 0],
[0, 4], [1, 4], [3, 4], [2, 4]])
Die grafische Ausgabe des Programms ändert sich dadurch nicht, da der Fehler
nur die Nummerierung der Stäbe und der Stabkräfte betrifft. Das
herunterladbare Programm wurde bereits entsprechend korrigiert.
Kapitel 6
S. 157:
In dem Code zur Verwendung vonscipy.interpolate.interp1d
muss es anstelle von
>>> x1 = np.linspace(0, 2, 8)
korrekt heißen:
>>> x1 = np.linspace(0, 2, 4)
S. 157 / 158:
In Programm Programm 6.5 in Zeile 24 und im Text auf S. 158 muss das Wort »Luftdruck« durch »Luftdichte« ersetzt werden.Kapitel 7
S. 179:
Im Programm 7.1 hat die Zeile 151 keinerlei Funktion und kann entfernt werden. Im herunterladbaren Programmcode wurde diese Zeile durch eine Leerzeile ersetzt, damit die nachfolgenden Zeilennummern mit dem Buchtext übereinstimmen.S. 186:
Im Programm 7.5 wurde eine Zeile zu wenig abgedruckt, die die Variablenm
,
t
,
r
und
v
zuordnet. Das herunterladbare Programm ist korrekt.
Kapitel 8
S. 221:
In Abb. 8.4 steht der Vektor der Gesamtkraft im Allgemeinen nicht wie eingezeichnet tangential zur Bahn des Pendelkörpers. Das Bild stellt lediglich die Situation an einem der Umkehrpunkte des Pendels dar. Während der Bewegung des Pendels muss die Zwangskraft zusätzlich noch die notwendige Zentripetalkraft aufbringen, sodass die Gesamtkraft im Allgemeinen schräg nach innen zeigt.S. 232:
Gleichung (8.53) lautet korrekt: \[ \tag{8.53} m_i \ddot {\vec r_i} = \vec F_i + \lambda_1 \frac{\partial h_1}{\partial \vec r_i} + \lambda_2 \frac{\partial h_2}{\partial \vec r_i} + \lambda_3 \frac{\partial h_3}{\partial \vec r_i} \qquad \text{mit} \qquad i=1\dots N \] Im Buch steht im dritten Term auf der rechten Seite anstelle von $h_3$ ein $h_2$.Kapitel 10
S. 320:
Im Programm 10.5 sollte der Datentyp besser mitdtype=complex
anstelle von
dtype=np.complex
angegeben werden.
Neuere Versionen von Numpy (ab Version 1.20) geben sonst eine Warnung aus.
Kapitel 11
S. 346
In dem blauen Kasten zur Installtion von Qt muss espython3-pyqt5
anstelle von
python3-pytqt5
heißen.