Am Ende von Kapitel 13 blieb eine Frage offen. Wir hatten zwei Stücke Metall hintereinandergeschweißt — links Aluminium, rechts Stahl — und beide erwärmt. Das Aluminium wollte sich weiter dehnen als der Stahl, aber weil sie hintereinander lagen, durfte jedes für sich wachsen: keine Spannung, nur verschieden weit gewanderte Knoten. Der Cliffhanger war: Was, wenn ein Längenunterschied nicht ausweichen darf, weil zwei verschieden lange Fasern nebeneinander liegen und untrennbar aneinanderhängen? Dann hält die eine die andere fest, der Überschuss an Länge kann nirgends hin — und der Verbund krümmt sich. Das ist das Bimetall, das jeden Thermostat, jeden alten Blinkgeber schaltet.
Genau diese Lage stellt der Brand unter unserem Träger her. Die Flammen und heißen Brandgase treffen die Unterseite; die Betondecke darüber hält die Oberseite kühl. So steht dauerhaft ein Temperaturgefälle über die Höhe: unten heiß, oben kalt. Der Träger ist damit ein kontinuierliches Bimetall aus einem einzigen Stück Stahl — die heiße untere Faser will länger sein als die kalte obere, beide sitzen untrennbar aneinander, und der ganze Träger wölbt sich zu einem Bogen, vom Brand weg nach oben. Ingenieure kennen das aus Brandversuchen unter dem Namen thermal bowing(Usmani u. a. 2001). Es ist der Moment, auf den das Buch seit Kapitel 1 zuläuft: Dort zeigte die Blackbox einen Träger, der sich unter Hitze verzog, und wir haben es geglaubt, ohne es zu verstehen. Jetzt rechnet dein Programm die Krümmung selbst aus — und wir prüfen sie gegen eine Handformel, die auf einen Bierdeckel passt.
Abbildung 14.1: Das kontinuierliche Bimetall. Links der kalte Träger, gerade. Rechts derselbe Träger mit einem Temperaturgefälle über die Höhe: die untere Faser (heiß, vom Brand) will länger sein als die obere (kalt, unter der Betondecke), aber beide hängen zusammen — also weicht der Längenunterschied in eine Krümmung aus. Der Träger wölbt sich zu einem Kreisbogen nach oben, vom Brand weg, die heiße Unterseite außen. Genau diese Krümmung rechnet das Kapitel aus.
Was man hier sieht: links der kalte Träger, rechts der vom Brand einseitig erwärmte. Weil die untere Faser heißer ist, will sie länger werden als die obere. Da beide Fasern untrennbar am selben Stück Stahl hängen, kann der Längenunterschied nicht als Verschiebung ausweichen wie in Kapitel 13 — er weicht in eine Krümmung aus. Der Träger wölbt sich in einen Kreisbogen nach oben, weg vom Brand, die heiße Unterseite außen. Der ganze Rest des Kapitels baut die Werkzeuge, um den Radius dieses Bogens auszurechnen.
Lernziele
Nach diesem Kapitel kannst du …
… erklären, warum ein Knoten in der Fläche zwei Verschiebungszahlen braucht (eine nach rechts, eine nach oben) und was das für die Größe des Gleichungssystems bedeutet (\(2\cdot n\) statt \(n\)),
… die drei ebenen Dehnungen anschaulich deuten — strecken in \(x\), strecken in \(y\), den rechten Winkel kippen (Schub) — am verformten Gitterbild,
… die Querkontraktion erklären (ein gedrückter Radiergummi wird dicker) und sagen, was \(\nu = 0{,}30\) bedeutet,
… den Rechenweg der FEM-Kette nennen: Eckverschiebungen → Dehnungen (konstant pro Dreieck!) → Spannungen (Hooke mit \(\nu\)) → Knotenkräfte,
… erklären, warum sich der einseitig erhitzte Träger krümmt — das Bimetall-Prinzip aus Kapitel 13, jetzt kontinuierlich über die Höhe,
… Starrkörpermoden diagnostizieren („der Träger schwimmt”) — die 2D-Fassung des schwimmenden Systems aus Kapitel 8.
WarnungNaheliegende Vermutung
Vermutung:„2D-Mechanik ist doppelt so schwer wie 1D — mehr Richtungen, mehr Formeln, eine ganz neue Maschine.”
Warum sie naheliegt: Die Fläche hat mehr Nachbarn, mehr Richtungen, mehr zu bedenken. Jeder Knoten trägt jetzt zwei Zahlen statt einer, die Elementmatrix wächst von \(2\times 2\) auf \(6\times 6\), und die Dehnung hat plötzlich drei Gesichter. Das fühlt sich nach einem großen Sprung an.
Was stattdessen stimmt: Es ist dasselbe Netz wie in 1, dieselbe Assemblierung, derselbe Löser. Die FEM-Maschinerie läuft unverändert weiter — sie merkt gar nicht, ob ein Knoten eine Temperatur oder zwei Verschiebungen trägt. Neu ist genau eine Zutat: die Querkontraktion, das seitliche Ausweichen des Materials. Und die kennt jeder, der je einen Radiergummi zusammengedrückt hat. Der reichere Steckbrief (\(6\times 6\)) und die drei Dehnungen sind bloß Buchhaltung — die Physik steckt in dem einen neuen Wort.
14.1 Schritt 1 — Zwei Zahlen pro Knoten
In Kapitel 13 hatte jeder Knoten des Trägers eine Unbekannte: seine Verschiebung \(u\) nach rechts. Der Träger konnte nur länger oder kürzer werden. In der Fläche kann ein Punkt in zwei Richtungen wandern: nach rechts (in \(x\)) und nach oben (in \(y\)). Also braucht jeder Knoten jetzt zwei Zahlen, sein Verschiebungspaar \((u, v)\) — \(u\) misst die Wanderung nach rechts, \(v\) die nach oben. Zusammengenommen bilden die Pfeile aller Knoten das Verschiebungsfeld: An jedem Knoten ein kleiner Pfeil, der zeigt, wohin er sich bewegt hat.
Code
import matplotlib.pyplot as pltimport os, syssys.path.insert(0, os.path.join("..", "programme", "gemeinsam"))from elastik2d import (assembliere_elastik, assembliere_thermokraefte, loese_elastik)from dreiecke import strukturiertes_dreiecksnetzE, NU, TIEFE, ALPHA =210e9, 0.30, 0.1, 12e-6L, H, REF =1.0, 0.1, 20.0knoten, dreiecke = strukturiertes_dreiecksnetz(8, 2, L, H)delta_t = []for d in dreiecke: mittel =sum(220.0-200.0* knoten[d[k]][1] / H for k inrange(3)) /3.0 delta_t.append(mittel - REF)K = assembliere_elastik(knoten, dreiecke, E, NU, TIEFE)F = assembliere_thermokraefte(knoten, dreiecke, E, NU, TIEFE, ALPHA, delta_t)lager = {}for i, (x, y) inenumerate(knoten):ifabs(x) <1e-12: lager[2* i] =0.0 lager[2* i +1] =0.0u = loese_elastik(K, F, lager)ueberhoehung =12.0fig, ax = plt.subplots(figsize=(10.0, 2.4))bx = [p[0] for p in knoten]by = [p[1] for p in knoten]ax.triplot(bx, by, dreiecke, color="0.75", lw=0.9)for i, (x, y) inenumerate(knoten): du = u[2* i] * ueberhoehung dv = u[2* i +1] * ueberhoehung ax.annotate("", xy=(x + du, y + dv), xytext=(x, y), arrowprops=dict(arrowstyle="-|>", color="tab:red", lw=1.3))ax.set_xlabel("Länge x (m)")ax.set_ylabel("Höhe y (m)")ax.set_title("Verschiebungsfeld (× %d überhöht): jeder Knoten wandert um (u, v)"% ueberhoehung)ax.set_aspect("equal")plt.tight_layout()plt.show()
Abbildung 14.2: Das Verschiebungsfeld auf dem Dreiecksnetz. Grau das unverformte Netz, an jedem Knoten ein roter Pfeil, der zeigt, wohin er wandert (stark überhöht). Jeder Pfeil ist ein Paar (u, v): u nach rechts, v nach oben. Der links eingespannte Träger mit unten-heißer Temperatur wölbt sich nach oben — die Pfeile werden nach rechts hin immer länger und drehen nach oben. Das ist die gesuchte Größe dieses Kapitels: nicht eine Zahl pro Knoten, sondern zwei.
Was man hier sieht: das unverformte Netz in Grau, an jedem Knoten einen roten Pfeil (stark überhöht) zu seiner neuen Lage. Am festen linken Rand sind die Pfeile null — dort ist der Träger eingespannt. Nach rechts hin werden sie länger und drehen nach oben: Der Träger wölbt sich vom Brand weg. Jeder einzelne Pfeil ist ein Zahlenpaar \((u, v)\), und diese Paare sind die Unbekannten, die das Gleichungssystem gleich bestimmen muss.
Das hat eine schlichte, aber wichtige Folge für die Buchhaltung. Bei \(n\) Knoten gibt es jetzt \(2n\) Unbekannte, also ein \(2n \times 2n\)-Gleichungssystem. Wir müssen uns nur einigen, in welcher Reihenfolge die beiden Zahlen eines Knotens im großen Vektor stehen. Die Abmachung dieses Buches ist die einfachste denkbare: Knoten \(i\) besetzt zwei aufeinanderfolgende Zeilen — Zeile \(2i\) für seine Verschiebung \(u\) nach rechts, Zeile \(2i+1\) für seine Verschiebung \(v\) nach oben.
HinweisFreiheitsgrad — jetzt zu zweit
In Kapitel 13 hat jeder Knoten einenFreiheitsgrad getragen (seine Verschiebung \(u\)); fünf Knoten gaben ein \(5\times 5\)-System. In der Fläche hat jeder Knoten zwei Freiheitsgrade, \(u\) und \(v\). Ein winziges Beispiel: Ein Netz mit vier Knoten hat acht Freiheitsgrade und ein \(8\times 8\)-System. Knoten 0 sitzt in den Zeilen 0 und 1, Knoten 1 in den Zeilen 2 und 3, Knoten \(i\) allgemein in den Zeilen \(2i\) (das \(u\)) und \(2i+1\) (das \(v\)). Wer diese eine Regel — „mal zwei, plus null oder plus eins” — im Kopf hat, kann jede 2D-Elementmatrix richtig in die große Matrix einsortieren. Mehr Buchhaltung ist es nicht.
14.2 Schritt 2 — Die drei Dehnungen: ein Messprotokoll der Verformung
In Kapitel 13 gab es genau eine Dehnung: Der Träger wurde länger, \(\varepsilon =
\Delta L / L\). In der Fläche kann sich ein Materialstück auf drei Arten verformen, und die schauen wir uns am besten an einem kleinen Gitterquadrat an, das man verzieht. Stell dir ein aufgemaltes Quadrat auf einem Radiergummi vor — was kann damit passieren?
Erstens kann es in \(x\)-Richtung gestreckt werden: Es wird breiter, die senkrechten Linien wandern auseinander. Das misst die Dehnung \(\varepsilon_{xx}\) — genau die Dehnung aus Kapitel 13, nur jetzt ausdrücklich in \(x\)-Richtung. Zweitens kann es in \(y\)-Richtung gestreckt werden: Es wird höher, das misst \(\varepsilon_{yy}\). Und drittens — das ist neu — kann der rechte Winkel des Quadrats kippen: Die senkrechten Linien neigen sich, aus dem Quadrat wird ein Parallelogramm, ohne dass es breiter oder höher würde. Diese Winkeländerung heißt Schub und wird mit \(\gamma_{xy}\) gemessen (der griechische Buchstabe Gamma). Sie zählt, um wie viel der ursprünglich rechte Winkel von 90° abweicht.
Abbildung 14.3: Das Dehnungs-Trio: die drei Arten, ein Gitterquadrat zu verziehen. Grau gestrichelt das unverformte Einheitsquadrat, blau das verformte. Links Streckung in x (breiter, ε_xx > 0), Mitte Streckung in y (höher, ε_yy > 0), rechts Schub (der rechte Winkel kippt zum Parallelogramm, γ_xy > 0 — weder breiter noch höher, nur schräg). Jede echte Verformung ist eine Mischung dieser drei; zusammen sind sie das vollständige Messprotokoll dessen, was mit dem Material geschieht.
Was man hier sieht: die drei Grundverformungen einzeln. Streckung in \(x\) macht breiter, Streckung in \(y\) macht höher — beides misst, wie weit sich Nachbarpunkte voneinander entfernen. Der Schub dagegen macht weder breiter noch höher; er kippt nur den rechten Winkel, aus dem Quadrat wird ein Parallelogramm. Jede wirkliche Verformung eines Materialstücks ist eine Mischung dieser drei — mehr Grundzutaten gibt es in der Fläche nicht. Damit haben wir ein vollständiges „Messprotokoll”, das festhält, was mit einem Materialstückchen passiert ist: drei Zahlen, \(\varepsilon_{xx}\), \(\varepsilon_{yy}\), \(\gamma_{xy}\).
Warum genau diese drei und keine vierte? Weil eine Bewegung, die keine dieser drei Zahlen verändert, gar keine Formänderung ist — sie verschiebt oder dreht das Stück bloß als Ganzes, und dagegen wehrt sich kein Material. Das ist derselbe Gedanke wie in Kapitel 8, wo der Träger „schwamm”: Wer alles gleich verschiebt, erzeugt keine Kraft. In Schritt 6 kommen wir darauf zurück; hier merken wir uns nur, dass die drei Dehnungen genau das erfassen, was Spannung kostet.
HinweisDie Voigt-Spalte: nur ein Ordnungsschema
Damit das Programm mit den drei Dehnungen rechnen kann, schreiben wir sie ordentlich untereinander in eine Spalte — immer in derselben Reihenfolge:
Genauso schreibt man die drei Spannungen als Spalte \((\sigma_{xx}, \sigma_{yy}, \tau_{xy})\): zweimal ein Ziehen/Drücken senkrecht zu einer Schnittfläche und einmal eine Schub-Spannung \(\tau\), die tangential zerrt. Diese Drei-Zeilen-Schreibweise heißt nach dem Physiker Woldemar VoigtVoigt-Schreibweise. Sie ist kein neues Konzept, sondern nur eine Sortierregel — welche Größe in welcher Zeile steht —, damit die Materialtabelle im nächsten Schritt eine handliche \(3\times 3\)-Tabelle wird. Mehr steckt nicht dahinter.
14.3 Schritt 3 — Die Querkontraktion: das seitliche Ausweichen
Jetzt kommt die einzige wirklich neue Physik des Kapitels. Nimm einen Radiergummi und drücke ihn zwischen zwei Fingern zusammen. Er wird nicht nur kürzer — er wird auch dicker. Das Material, das du in einer Richtung zusammenschiebst, weicht in die Querrichtung aus. Umgekehrt: Ziehst du an einem Gummiband, wird es länger und dünner. Dieses seitliche Ausweichen heißt Querkontraktion, und es ist der Grund, warum Mechanik in der Fläche „vernetzter” ist als die Wärmeleitung: Eine Dehnung in \(x\) zieht automatisch eine Verformung in \(y\) nach sich.
Wie stark ein Material seitlich ausweicht, sagt die Querkontraktionszahl\(\nu\) (der griechische Buchstabe Ny). Sie ist das Verhältnis „seitliches Einschnüren geteilt durch Längsdehnung”. Ziehe ich ein Material um 1 % in die Länge und es schnürt sich dabei um \(0{,}30\,\%\) seitlich ein, dann ist \(\nu =
0{,}30\) — der Wert unseres Baustahls. \(\nu\) ist eine reine Zahl ohne Einheit und liegt für gewöhnliche Feststoffe zwischen \(0\) und \(\tfrac{1}{2}\).
Abbildung 14.4: Die Querkontraktion am gezogenen Block. Grau gestrichelt der Ausgangszustand, blau der in x gezogene Block: Er wird länger UND dünner — das seitliche Einschnüren ist die Querkontraktion. Rechts die Querkontraktionszahl ν einiger Materialien: Kork weicht kaum aus (ν ≈ 0, deshalb lässt sich ein Korken in den Flaschenhals drücken, ohne dick zu werden), Metalle liegen um 0,3 (unser Stahl 0,30, hervorgehoben), Gummi geht gegen 0,5 (es weicht vollständig aus, das Volumen bleibt gleich).
Was man hier sieht: links das seitliche Einschnüren beim Ziehen, rechts die \(\nu\)-Werte einiger Stoffe. Kork weicht fast gar nicht aus (\(\nu \approx 0\)) — genau deshalb lässt sich ein Korken in den Flaschenhals drücken, ohne dass er seitlich dicker wird und klemmt. Metalle liegen um \(0{,}3\), unser Stahl bei \(0{,}30\), Aluminium mit \(0{,}33\) knapp darüber. Gummi geht gegen \(0{,}5\): Es weicht so vollständig zur Seite aus, dass sein Volumen praktisch gleich bleibt — man kann es kaum zusammendrücken, nur umformen. (Bei genau \(\nu = \tfrac{1}{2}\) bekommt die Standard-FEM übrigens Schwierigkeiten; das ist der Grund, warum Gummi und wassergesättigter Boden Spezialverfahren brauchen — für unser \(\nu = 0{,}30\) ist alles harmlos.)
Mit \(\nu\) können wir das Hookesche Gesetz für die Fläche aufschreiben. In Kapitel 13 war es eine einzige Zeile, \(\sigma = E\,\varepsilon\). Jetzt verknüpft es die drei Dehnungen mit den drei Spannungen, und weil die Querkontraktion \(x\) und \(y\) koppelt, wird daraus eine \(3\times 3\)-Materialtabelle:
Lies die Tabelle Zeile für Zeile. Die erste Zeile sagt: Die Spannung in \(x\)-Richtung kommt aus der Dehnung in \(x\) (der Eintrag \(1\)) und — über die Querkontraktion — aus der Dehnung in \(y\) (der Eintrag \(\nu\)). Genau das ist die neue Kopplung: Ziehen in \(y\) erzeugt Spannung in \(x\). Die zweite Zeile ist dieselbe Geschichte mit vertauschten Richtungen. Die dritte Zeile steht für sich allein: Der Schub \(\gamma_{xy}\) erzeugt nur Schubspannung \(\tau_{xy}\), über den Faktor \(\tfrac{1-\nu}{2}\), und mischt sich nicht mit den beiden Streckungen. Setzt man \(\nu = 0\), zerfällt die Tabelle in drei entkoppelte Federn — dann ist \(x\) von \(y\) unabhängig, und man hätte dreimal Kapitel 13 nebeneinander. Erst \(\nu > 0\) macht aus dem Nebeneinander ein echtes Miteinander.
TippWarum der ebene Spannungszustand für unseren Träger passt
Die Tabelle oben gilt für den ebenen Spannungszustand: ein Bauteil, das in der dritten Richtung (der Tiefe, aus dem Papier heraus) frei ist und dort keine Spannung aufbaut. Das passt genau zu unserem Träger: Er ist mit \(0{,}1\ \mathrm{m}\) dünn, und nichts hindert ihn daran, in die Tiefe ein Härchen dicker oder dünner zu werden. Deshalb ist die Spannung quer zur Zeichenebene null — „ebener Spannungszustand”.
Das Gegenstück heißt ebener Verzerrungszustand: ein sehr langer Körper, der in die Tiefe nicht ausweichen kann (ein Tunnel, ein Staudamm, eine lange Schweißnaht). Dort ist die Dehnung quer null statt der Spannung, und die Materialtabelle sieht etwas anders aus. Für den dünnen, frei liegenden Träger dieses Buches ist der ebene Spannungszustand die richtige Wahl; den anderen Fall erwähnen wir nur, damit du weißt, dass es ihn gibt — die Verwechslung der beiden ist einer der häufigsten Fehler in der Praxis.
14.4 Schritt 4 — Vom Dreieck zum Steckbrief: die 6×6-Matrix
Jetzt fügen wir die Teile zum Element-Steckbrief zusammen. Der Rechenweg ist eine kurze Kette, und jedes Glied kennst du schon:
Eckverschiebungen → Dehnungen. Ein P1-Dreieck hat drei Ecken, jede mit ihrem Paar \((u, v)\) — zusammen sechs Zahlen. Aus diesen sechs Zahlen die drei Dehnungen zu machen, ist genau die Arbeit der Zeltflächen-Steigungen aus
Dort hatte jede Zeltfunktion über dem Dreieck eine konstante Steigung in \(x\) und eine in \(y\); die Dehnung \(\varepsilon_{xx}\) ist die Summe der \(x\)-Steigungen mal den \(u\)-Werten, \(\varepsilon_{yy}\) die Summe der \(y\)-Steigungen mal den \(v\)-Werten, und der Schub \(\gamma_{xy}\) mischt beide. Weil die Steigungen über das Dreieck konstant sind, ist auch die Dehnung konstant über das ganze Dreieck — ein P1-Dreieck kennt genau einen Verformungszustand. (Das hat einen Preis, auf den wir im Finale ehrlich zu sprechen kommen.)
Dehnungen → Spannungen. Das erledigt die \(3\times 3\)-Materialtabelle aus Schritt 3.
Spannungen → Knotenkräfte. Rückwärts über dieselben Steigungen, mal Tiefe mal Dreiecksfläche.
Setzt man alle drei Glieder hintereinander, entsteht der 6×6-Steckbrief des Dreiecks: eine Tabelle, die sagt, welche Kraft an jedem der sechs Freiheitsgrade entsteht, wenn man einen anderen um eins verschiebt. Das ist das flächenhafte Gegenstück zur \(2\times 2\)-Feder aus Kapitel 13 — nur eben reicher, weil ein Dreieck sechs Freiheitsgrade hat statt zwei.
Und hier sind wir ehrlich: Diese \(6\times 6\)-Tabelle von Hand auszurechnen wäre eine Zumutung — sechsunddreißig Einträge, jeder eine kleine Rechnung. Kein Mensch tut das, und du sollst es auch nicht. Stattdessen lassen wir das Programm die Tabelle für ein Dreieck ausrechnen und lesen sie Zeile für Zeile, um zu prüfen, ob sie plausibel ist. Das ist der ehrliche Umgang mit einer Formel, die zu groß fürs Kopfrechnen ist: nicht herleiten, sondern nachrechnen lassen und verstehen, was herauskommt. Der Baustein steckt im gemeinsamen Modul programme/gemeinsam/elastik2d.py, das die Kapitel 14 und 15 tragen wird.
Code
import os, syssys.path.insert(0, os.path.join("..", "programme", "gemeinsam"))from elastik2d import baue_element_6x6, starrkoerper_check# Ein einzelnes Träger-Dreieck, wie es im 8-Dreiecke-Netz vorkommt.ECKEN = [(0.0, 0.0), (0.5, 0.0), (0.5, 0.05)]E_MODUL =210e9# Pa (Baustahl S235)QUERKONTRAKTION =0.30TIEFE =0.1# msteckbrief = baue_element_6x6(ECKEN, E_MODUL, QUERKONTRAKTION, TIEFE)namen = ["u0", "v0", "u1", "v1", "u2", "v2"]print("6x6-Steckbrief (Werte in MN/m):")print(" "+"".join("%8s"% n for n in namen))for i inrange(6): zeile =" %2s "% namen[i]for j inrange(6): zeile = zeile +"%8.1f"% (steckbrief[i][j] /1e6)print(zeile)
Interpretation der Ausgabe — Zeile für Zeile gelesen. Drei Dinge muss eine brauchbare Steifigkeitstabelle erfüllen, und alle drei kann man der Ausgabe ansehen:
Die Diagonale ist positiv. Auf der Diagonale steht die Kraft, die an einem Freiheitsgrad entsteht, wenn man ihn selbst verschiebt und alles andere festhält. Sie muss positiv sein — das Material drückt zurück, nicht mit. Bei u1, v1, u2, v2 (den Ecken auf der langen Seite) stehen große Werte: Diese Freiheitsgrade sitzen an kurzen, steifen Kanten und wehren sich heftig.
Die Tabelle ist symmetrisch. Der Eintrag in Zeile u0, Spalte v2 ist derselbe wie in Zeile v2, Spalte u0. Das ist kein Zufall, sondern ein tiefes Gesetz (es heißt Reziprozität): Die Kraft, die eine Verschiebung hierdort auslöst, ist dieselbe wie umgekehrt. Genau diese Symmetrie hatten schon die Federkette (Kapitel 3) und die Wärmematrix (1).
Die Zeilensummen der drei u-Spalten sind null (ebenso die der drei v-Spalten). Verschiebt man alle drei Ecken um denselben Betrag nach rechts — alle \(u = 1\), alle \(v = 0\) —, entsteht keine Kraft: Das Dreieck wandert bloß als Ganzes, ohne die Form zu ändern. Das ist die Starrkörper-Probe, die wir gleich formalisieren.
Diese letzte Eigenschaft prüft man am ehrlichsten, indem man dem Programm die drei starren Bewegungen — nach rechts schieben, nach oben schieben, drehen — vorlegt und die entstehende Kraft misst. Sie muss null sein:
Code
moden = starrkoerper_check(ECKEN, E_MODUL, QUERKONTRAKTION, TIEFE)print("Starrkörper-Probe (Länge der entstehenden Knotenkraft, sollte 0 sein):")for name in ("schieben_x", "schieben_y", "drehen"):print(" %-11s: %.2e N"% (name, moden[name]))
Starrkörper-Probe (Länge der entstehenden Knotenkraft, sollte 0 sein):
schieben_x : 7.63e-06 N
schieben_y : 3.05e-05 N
drehen : 1.19e-07 N
Interpretation der Ausgabe: Alle drei Werte sind praktisch null (Größenordnung \(10^{-6}\ \mathrm{N}\) — nur Rundungsstaub gegen die \(10^{9}\ \mathrm{N/m}\) der Steifigkeit). Das Dreieck „merkt” eine starre Verschiebung oder Drehung nicht, weil sie keine Formänderung ist — genau wie es sein muss. Diese drei Nullbewegungen (zweimal schieben, einmal drehen) werden in Schritt 6 wichtig: Sie sind der Grund, warum ein ungelagerter Träger davonschwimmt.
14.5 Schritt 5 — Die thermische Kraft in der Fläche
In Kapitel 13 hat ein erwärmtes Stab-Element seine beiden Knoten mit dem Kraftpaar \(E\,A\,\alpha\,\Delta T\) auseinandergedrückt. In der Fläche ist der Trick derselbe, nur wirkt die Wärme jetzt in zwei Richtungen zugleich: Ein erwärmtes Dreieck will sich in \(x\)und in \(y\) ausdehnen, in beide Richtungen gleich stark. Seine freie Wärmedehnung ist darum die Voigt-Spalte
\[
\boldsymbol{\varepsilon}_{\text{therm}}
= \begin{pmatrix} \alpha\,\Delta T \\ \alpha\,\Delta T \\ 0 \end{pmatrix}
\qquad\text{(strecken in }x\text{, strecken in }y\text{, kein Schub).}
\]
Der Schub ist null, denn Wärme kippt keinen Winkel — sie bläht das Material gleichmäßig auf. Aus dieser Vordehnung werden wieder Knotenkräfte, genau wie in Kapitel 13: Man hält das Dreieck gedanklich auf Form (dabei entsteht eine Druckspannung), rechnet die Haltekraft aus und nimmt sie dann wieder weg. Das Ergebnis ist ein Sechser-Kraftpaket, eines für jeden der sechs Freiheitsgrade des Dreiecks, das seine Ecken nach außen drückt.
HinweisRezept: die thermische Kraft eines Dreiecks
Für jedes Dreieck:
Bestimme seine mittlere Übertemperatur \(\Delta T\) (Mittel der drei Knotentemperaturen minus der spannungsfreien Referenz \(20\,°\mathrm{C}\)).
Bilde die Vordehnung \([\alpha\,\Delta T,\ \alpha\,\Delta T,\ 0]\).
Schicke sie rückwärts durch dieselbe Steigungs-Rechnung wie den Steckbrief (Materialtabelle, dann Steigungen, mal Tiefe mal Fläche). Heraus kommen sechs Knotenkräfte.
Addiere die sechs Kräfte an den Freiheitsgraden der drei Ecken auf die rechte Seite.
Das ist die einzige Stelle, an der die Wärme in die Mechanik übergeht — die Einweg-Kopplung aus Kapitel 13: Die Temperatur treibt die Verformung, aber die Verformung wirkt nicht auf die Temperatur zurück. Erst das Temperaturproblem lösen (Kapitel 6–10), dann sein Ergebnis als feste Last hier einsetzen.
Diese thermischen Kräfte assembliert man genau wie in Kapitel 13 die Stab-Kräfte: An einem inneren Knoten stoßen mehrere Dreiecke zusammen, ihre Kräfte zeigen gegeneinander, und nur ihre Differenz bleibt stehen. Wo alle Dreiecke gleich warm sind, hebt sich im Inneren alles auf. Steckt aber ein Temperaturgefälle im Netz — oben heißer als unten —, bleibt eine ungleichgewichtige Last übrig, und die ist es, die den Träger gleich krümmt.
14.6 Schritt 6 — Lagerung, und was ohne sie geschieht
Bevor wir lösen, müssen wir den Träger festhalten. Das Rezept ist das Streichen aus Kapitel 8, jetzt für Freiheitsgrade: Ein festgehaltener Knoten gibt seine beiden Zeilen und Spalten ab. Für unseren Kragträger halten wir die ganze linke Kante fest — dort ist er eingespannt, jeder linke Knoten bekommt \(u = 0\)und\(v = 0\). Das rechte Ende bleibt völlig frei.
Was passiert, wenn wir das Festhalten vergessen? Dann erleben wir die 2D-Fassung des schwimmenden Trägers aus Kapitel 8. Dort war der Träger „nur bis auf eine Konstante bestimmt” — man konnte das ganze Temperaturprofil nach oben schieben, ohne die Bilanz zu verletzen. Beim mechanischen Träger gibt es drei solche freien Bewegungen statt einer: Man kann ihn als Ganzes nach rechts schieben, nach oben schieben oder drehen, ohne dass sich seine Form ändert — und ohne dass eine einzige Kraft entsteht. Es sind genau die drei Nullbewegungen aus der Starrkörper-Probe in Schritt 4, jetzt für den ganzen Träger statt für ein Dreieck.
WarnungDer schwimmende Träger, jetzt in der Fläche
Ein Wärmeproblem ohne festen Temperaturwert schwimmt in einer Richtung (die Höhe des Profils ist frei, Kapitel 8). Ein mechanischer Träger ohne Lager schwimmt in drei: zwei Verschiebungen (nach rechts, nach oben) und eine Drehung. Diese drei Starrkörpermoden sind Bewegungen ohne Formänderung, also ohne Kraft — die Systemmatrix hat für sie kein Rückstellvermögen, sie ist nicht lösbar (der Gauß-Löser stolpert über eine Null auf der Diagonale, das Gauß-Seidel-Verfahren driftet Runde um Runde weiter davon). Erst genügend Lager nehmen dem Träger alle drei Nullbewegungen und machen das System eindeutig. Für den Kragträger erledigt das die eingespannte Kante mühelos; wie man mit dem kleinstmöglichen Festhalten auskommt („gerade genug”), üben wir in Übung 14.3.
Die drei Starrkörpermoden sieht man am besten in Bewegung — das Starrkörper-Ballett: Derselbe erwärmte Träger, der ohne Lager nicht rechnen will, treibt in jeder dieser drei Richtungen davon.
Code
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationfrom IPython.display import HTMLecken0 = np.array([[0, 0], [1, 0], [1, 0.1], [0, 0.1]])mitte = np.array([0.5, 0.05])schritte = np.linspace(0, 1, 30)fig, ax = plt.subplots(figsize=(7.5, 2.6))def zeichne(k): ax.clear() s = schritte[k] ax.plot(list(ecken0[:, 0]) + [ecken0[0, 0]],list(ecken0[:, 1]) + [ecken0[0, 1]], "--", color="0.75", lw=1.2)# schieben x (blau), schieben y (gruen), drehen (rot) ex = ecken0 + np.array([0.7* s, 0]) ey = ecken0 + np.array([0, 0.7* s]) w =0.5* s dreh = np.array([[np.cos(w), -np.sin(w)], [np.sin(w), np.cos(w)]]) er = (ecken0 - mitte) @ dreh.T + mittefor e, farbe, name in [(ex, "tab:blue", "schieben →"), (ey, "tab:green", "schieben ↑"), (er, "tab:red", "drehen")]: ax.plot(list(e[:, 0]) + [e[0, 0]], list(e[:, 1]) + [e[0, 1]],"-", color=farbe, lw=2.0, label=name) ax.set_xlim(-0.3, 2.0) ax.set_ylim(-0.5, 1.0) ax.set_aspect("equal") ax.legend(loc="upper right", fontsize=8) ax.set_title("Starrkörper-Ballett: drei kraftfreie Bewegungen") ax.axis("off")return []ani = FuncAnimation(fig, zeichne, frames=len(schritte), interval=120, blit=False)plt.close(fig)HTML(ani.to_jshtml())
Abbildung 14.5: Das Starrkörper-Ballett: die drei Bewegungen, die ein ungelagerter Träger frei ausführen kann, ohne dass eine Kraft entsteht. Nach rechts schieben, nach oben schieben, um die Mitte drehen. Genau weil diese drei Bewegungen kraftfrei sind, ist ein Träger ohne Lager nicht berechenbar — er schwimmt davon wie das Temperaturprofil in Kapitel 8, nur in drei Richtungen statt einer.
Was man sieht: drei Bewegungen des ganzen Trägers, keine ändert seine Form. Der Träger bleibt in jedem Fall ein starres Rechteck — er schiebt sich nur, oder er dreht sich. Genau deshalb erzeugt keine dieser Bewegungen eine Kraft, und genau deshalb kann ein Programm den ungelagerten Träger nicht ausrechnen: Es gibt unendlich viele gleichberechtigte Lagen, keine ist die Lösung. Erst das Festhalten sperrt die drei Nullbewegungen — dann steht der Träger, und das System wird lösbar.
14.7 Schritt 7 — Das Finale: der Träger krümmt sich
Jetzt haben wir alles. Fügen wir die Glieder zur vollständigen Rechenkette zusammen — es ist dieselbe Kette wie in Kapitel 13, nur in der Fläche.
Code
import matplotlib.pyplot as pltkaesten = ["Temperatur-\nfeld T(x,y)", "Element-\nΔT", "thermische\nKräfte F","lösen\nK u = F", "u → ε → σ"]fig, ax = plt.subplots(figsize=(11.0, 2.1))x =0.0for i, text inenumerate(kaesten): farbe ="#fde8d0"if i ==0else ("#dfe8f0"if i <4else"#d9f0d3") ax.add_patch(plt.Rectangle((x, 0.0), 1.6, 1.0, facecolor=farbe, edgecolor="black", lw=1.2)) ax.text(x +0.8, 0.5, text, ha="center", va="center", fontsize=10)if i <len(kaesten) -1: ax.annotate("", xy=(x +2.0, 0.5), xytext=(x +1.6, 0.5), arrowprops=dict(arrowstyle="-|>", color="black", lw=1.8)) x = x +2.0ax.set_xlim(-0.1, x)ax.set_ylim(-0.2, 1.2)ax.axis("off")plt.tight_layout()plt.show()
Abbildung 14.6: Die Rechenkette der 2D-Thermoelastik als Fließband. Das Temperaturfeld (aus Kapitel 6–10) wird je Dreieck gemittelt, daraus werden die thermischen Kräfte; das assemblierte Gleichungssystem K·u = F liefert die Verschiebungen (zwei je Knoten), aus denen man die drei Dehnungen und daraus die drei Spannungen zurückrechnet. Der Pfeil zeigt nur nach rechts: Einweg-Kopplung. Es ist Wort für Wort die Kette aus Kapitel 13, nur mit reicheren Zutaten.
Die Last dieses Kapitels ist ein Temperaturgefälle über die Höhe: unten \(220\,°\mathrm{C}\) (die vom Brand beheizte Unterseite), oben \(20\,°\mathrm{C}\) (die von der Betondecke kühl gehaltene Oberseite, zugleich die spannungsfreie Referenz). Zwischen unten und oben fällt die Temperatur geradlinig ab. Jede waagerechte Faser ist also gleich warm, aber die unteren Fasern sind heißer als die oberen — genau das kontinuierliche Bimetall aus dem Aufhänger. Die untere Faser will um \(\alpha\,\Delta T = 12\cdot 10^{-6}\cdot 200 = 2{,}4\ \mathrm{mm}\) pro Meter länger sein als die obere, und weil sie es nicht darf, wölbt sich der Träger nach oben. Die \(\Delta T = 200\ \mathrm{K}\) über die \(0{,}1\ \mathrm{m}\) Höhe entsprechen einer Wärmestromdichte von rund \(100\ \mathrm{kW/m^2}\) durch die Höhe — eine realistische Größenordnung für die Einwirkung eines Brandes von unten.
Bevor wir das Programm laufen lassen, rechnen wir die Krümmung von Hand — das Verifikations-Ritual aus Kapitel 12. Für ein lineares Temperaturgefälle über die Höhe krümmt sich der Träger zu einem Kreisbogen mit der Krümmung
Ein Bogen mit \(41{,}7\ \mathrm{m}\) Radius ist sehr flach — auf einem Meter Länge weicht er nur wenig von der Geraden ab. Wie weit genau? Das freie Ende eines links eingespannten Trägers der Länge \(L\) hebt sich gegenüber der Geraden um näherungsweise
nach oben. Das ist unsere Vorhersage: rund 12,0 Millimeter Hebung am freien Ende, weg vom Brand. Jetzt lassen wir die FEM rechnen und schauen, ob sie dieselbe Zahl trifft.
Code
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.collections import PolyCollectionimport os, syssys.path.insert(0, os.path.join("..", "programme", "gemeinsam"))from elastik2d import (assembliere_elastik, assembliere_thermokraefte, loese_elastik, elementspannungen)from dreiecke import strukturiertes_dreiecksnetzE, NU, TIEFE, ALPHA =210e9, 0.30, 0.1, 12e-6L, H, REF =1.0, 0.1, 20.0NX, NY =32, 8knoten, dreiecke = strukturiertes_dreiecksnetz(NX, NY, L, H)delta_t = []for d in dreiecke: mittel =sum(220.0-200.0* knoten[d[k]][1] / H for k inrange(3)) /3.0 delta_t.append(mittel - REF)K = assembliere_elastik(knoten, dreiecke, E, NU, TIEFE)F = assembliere_thermokraefte(knoten, dreiecke, E, NU, TIEFE, ALPHA, delta_t)lager = {}for i, (x, y) inenumerate(knoten):ifabs(x) <1e-12: lager[2* i] =0.0 lager[2* i +1] =0.0u = loese_elastik(K, F, lager)sig = elementspannungen(knoten, dreiecke, u, E, NU, ALPHA, delta_t)# freie Endverschiebung (unten rechts), positiv nach oben.for i, (x, y) inenumerate(knoten):ifabs(x - L) <1e-9andabs(y) <1e-9: w_fem = u[2* i +1] *1000.0UEBER =8.0sig_xx = np.array([s[0] /1e6for s in sig])grenze =max(abs(sig_xx.min()), abs(sig_xx.max()))fig, (axo, axu) = plt.subplots(2, 1, figsize=(9.5, 4.2))bx = [p[0] for p in knoten]by = [p[1] for p in knoten]axo.triplot(bx, by, dreiecke, color="0.75", lw=0.6)axo.set_title("unverformtes Netz (32×8)", fontsize=10)axo.set_aspect("equal")axo.set_xlim(-0.05, 1.05)axo.axis("off")polys = []for d in dreiecke: polys.append([(knoten[d[k]][0] + UEBER * u[2* d[k]], knoten[d[k]][1] + UEBER * u[2* d[k] +1]) for k inrange(3)])pc = PolyCollection(polys, array=sig_xx, cmap="RdBu_r", edgecolors="0.5", linewidths=0.3)pc.set_clim(-grenze, grenze)axu.add_collection(pc)axu.autoscale_view()axu.set_aspect("equal")axu.set_title("verformt (× %d überhöht), Farbe = σ_xx | Ende hebt sich %.1f mm"% (UEBER, w_fem), fontsize=10)axu.set_xlabel("Länge x (m)")cb = fig.colorbar(pc, ax=axu, fraction=0.03, pad=0.02)cb.set_label("σ_xx (N/mm²)", fontsize=9)plt.tight_layout()plt.show()
Abbildung 14.7: Das Ergebnisbild des Buches. Oben das unverformte Netz (grau), darunter der gekrümmte Träger (× 8 überhöht), eingefärbt nach der Längsspannung σ_xx: rot Zug, blau Druck. Die heiße untere Faser steht (nahe der Einspannung) unter Druck, die kühle obere unter Zug — der Träger wölbt sich nach oben, heiße Unterseite außen. Netz 32×8; das freie Ende hebt sich um rund 10,5 mm und nähert sich der Handformel-Vorhersage von 12,0 mm von unten (grobe P1-Netze biegen zu steif, siehe Kasten).
Was man hier sieht: oben das ruhende Netz, unten der gekrümmte Träger (überhöht), eingefärbt nach der Längsspannung \(\sigma_{xx}\). Der Träger wölbt sich nach oben — die heiße untere Seite legt sich nach außen, genau wie im Aufhänger. Die Farben zeigen: Nahe der Einspannung, wo die Krümmung erzwungen wird, steht die untere Faser unter Druck (blau) und die obere unter Zug (rot); weiter rechts, wo sich der Träger frei krümmen darf, werden die Spannungen klein. Das freie Ende hebt sich um rund \(10{,}5\ \mathrm{mm}\) — nah an unserer Handformel-Vorhersage von \(12{,}0\ \mathrm{mm}\), aber noch nicht ganz dort. Warum die Lücke? Das ist kein Fehler, sondern eine ehrliche Eigenschaft grober Dreiecksnetze, und sie verdient einen eigenen Kasten.
WichtigGrobe Netze biegen zu steif — ein Fall für Kapitel 12
Ein P1-Dreieck kennt (Schritt 4) nur eine Dehnung über seine ganze Fläche. Biegung aber verlangt, dass die Dehnung sich über die Höhe ändert — auf der Zugseite gestreckt, auf der Druckseite gestaucht. Ein einzelnes Dreieck kann das gar nicht darstellen; viele übereinandergestapelte Dreiecke können es nur als grobe Treppe nachbauen. Die Folge: Grobe P1-Netze sind bei Biegung systematisch zu steif — sie biegen sich zu wenig, die berechnete Durchbiegung ist zu klein. Erst mit feinerem Netz nähert sie sich der wahren Krümmung, und zwar von unten. Das ist genau die Netzkonvergenz aus Kapitel 12, jetzt an der Verformung: noch ein Grund für die Prüfrituale jenes Kapitels.
Wir rechnen dieselbe Aufgabe auf immer feineren Netzen und schauen, ob die Durchbiegung brav gegen die Handformel läuft:
Code
import os, syssys.path.insert(0, os.path.join("..", "programme", "gemeinsam"))from elastik2d import (assembliere_elastik, assembliere_thermokraefte, loese_elastik)from dreiecke import strukturiertes_dreiecksnetzE_MODUL, QUER, TIEFE, ALPHA =210e9, 0.30, 0.1, 12e-6L, H, REF =1.0, 0.1, 20.0W_HAND =12.0# mm, aus der Handformel L^2 / (2R)print("Netz | Hebung Ende (oben)| Anteil der Handformel")print("--------+-------------------+----------------------")for nx, ny in [(4, 1), (8, 2), (16, 4), (32, 8)]: knoten, dreiecke = strukturiertes_dreiecksnetz(nx, ny, L, H) delta_t = []for d in dreiecke: mittel =sum(220.0-200.0* knoten[d[k]][1] / H for k inrange(3)) /3.0 delta_t.append(mittel - REF) matrix = assembliere_elastik(knoten, dreiecke, E_MODUL, QUER, TIEFE) kraefte = assembliere_thermokraefte(knoten, dreiecke, E_MODUL, QUER, TIEFE, ALPHA, delta_t) lager = {}for i, (x, y) inenumerate(knoten):ifabs(x) <1e-12: lager[2* i] =0.0 lager[2* i +1] =0.0 u = loese_elastik(matrix, kraefte, lager)for i, (x, y) inenumerate(knoten):ifabs(x - L) <1e-9andabs(y) <1e-9: w = u[2* i +1] *1000.0print("%3d×%-2d | %11.2f mm | %5.0f %%"% (nx, ny, w, 100.0* w / W_HAND))
Netz | Hebung Ende (oben)| Anteil der Handformel
--------+-------------------+----------------------
4×1 | 0.99 mm | 8 %
8×2 | 3.53 mm | 29 %
16×4 | 7.56 mm | 63 %
32×8 | 10.46 mm | 87 %
Interpretation: Von \(4\times 1\) zu \(32\times 8\) wächst die Hebung von knapp \(1\ \mathrm{mm}\) auf gut \(10\ \mathrm{mm}\) und marschiert von unten auf die \(12{,}0\ \mathrm{mm}\) der Handformel zu. Sie ist bei \(32\times 8\) noch nicht ganz dort (\(\approx 87\,\%\)); ein feineres Netz (\(64\times 16\)) schafft rund \(96\,\%\), aber das dauert in reinem Python schon spürbar. Die Lehre ist die von Kapitel 12: Ein grobes buntes Bild sieht schon richtig aus, ist aber quantitativ noch zu steif. Wer eine Zahl braucht, verfeinert, bis sie sich nicht mehr ändert — oder greift zu Elementen höherer Ordnung, die Biegung von Haus aus besser können (der Ausblick am Kapitelende).
Trotz der noch offenen \(13\,\%\) ist die Hauptsache erreicht und verifiziert: Der Träger krümmt sich in die richtige Richtung, mit der richtigen Größenordnung, und die FEM-Durchbiegung läuft nachweislich auf die unabhängig hergeleitete Handformel zu. Das ist der Moment aus Kapitel 1, jetzt nicht mehr geglaubt, sondern gerechnet und geprüft.
14.8 Zwei Filme: die drei Dehnungen und das Krümmen
Der erste Film macht das Dehnungs-Trio aus Schritt 2 lebendig: Ein Einheitsquadrat durchläuft die drei Moden einzeln — strecken in \(x\), strecken in \(y\), kippen (Schub) — und zum Schluss alle drei gemischt.
Abbildung 14.8: Verzerrungs-Morph: Das graue Einheitsquadrat durchläuft nacheinander die drei Dehnungsmoden (Streckung in x, Streckung in y, Schub) und am Ende eine Mischung aus allen dreien. So sieht man, dass jede ebene Verformung eine Kombination dieser drei Grundzutaten ist.
Was man sieht: Streckung in \(x\) macht breiter, Streckung in \(y\) höher, Schub kippt den Winkel, und die Mischung tut alles zugleich. Diese drei Zahlen — mehr braucht es nicht, um jede ebene Verformung zu beschreiben.
Der zweite Film ist das Herzstück: Das Temperaturgefälle über die Höhe baut sich auf, und der Träger krümmt sich synchron mit. Es ist der Trailer aus Kapitel 1 — jetzt verstanden, Glied für Glied.
Code
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationfrom IPython.display import HTMLimport os, syssys.path.insert(0, os.path.join("..", "programme", "gemeinsam"))from elastik2d import (assembliere_elastik, assembliere_thermokraefte, loese_elastik)from dreiecke import strukturiertes_dreiecksnetzE, NU, TIEFE, ALPHA =210e9, 0.30, 0.1, 12e-6L, H, REF =1.0, 0.1, 20.0knoten, dreiecke = strukturiertes_dreiecksnetz(16, 4, L, H)matrix = assembliere_elastik(knoten, dreiecke, E, NU, TIEFE)lager = {}for i, (x, y) inenumerate(knoten):ifabs(x) <1e-12: lager[2* i] =0.0 lager[2* i +1] =0.0# Loesung skaliert linear mit dem Gefaelle -> einmal bei vollem dT loesen.delta_t_voll = []for d in dreiecke: mittel =sum(220.0-200.0* knoten[d[k]][1] / H for k inrange(3)) /3.0 delta_t_voll.append(mittel - REF)F_voll = assembliere_thermokraefte(knoten, dreiecke, E, NU, TIEFE, ALPHA, delta_t_voll)u_voll = loese_elastik(matrix, F_voll, lager)UEBER =8.0stufen = np.linspace(0.0, 1.0, 28)bx = [p[0] for p in knoten]by = [p[1] for p in knoten]fig, (axl, axr) = plt.subplots(1, 2, figsize=(10.5, 3.0), gridspec_kw={"width_ratios": [1, 2.3]})def zeichne(k): s = stufen[k] axl.clear() axr.clear() unten =20.0+200.0* s ys = np.linspace(0, H, 20) temps = unten + (20.0- unten) * ys / H axl.plot(temps, ys *100, color="tab:orange", lw=2.2) axl.set_xlim(15, 240) axl.set_ylim(0, 10) axl.set_xlabel("T (°C)") axl.set_ylabel("Höhe (cm)") axl.set_title("Gefälle: unten %3.0f °C"% unten, fontsize=9) verf_x = [bx[i] + UEBER * s * u_voll[2* i] for i inrange(len(knoten))] verf_y = [by[i] + UEBER * s * u_voll[2* i +1] for i inrange(len(knoten))] axr.triplot(verf_x, verf_y, dreiecke, color="tab:blue", lw=0.9) axr.plot([0, L], [0, 0], "--", color="0.7", lw=0.8) axr.set_xlim(-0.05, 1.1) axr.set_ylim(-0.04, 0.19) axr.set_aspect("equal") axr.set_title("Träger wölbt sich (× %d überhöht)"% UEBER, fontsize=9) axr.axis("off")return []ani = FuncAnimation(fig, zeichne, frames=len(stufen), interval=110, blit=False)plt.close(fig)HTML(ani.to_jshtml())
Abbildung 14.9: Aufheiz-und-Krümm-Film: Links baut sich das Temperaturgefälle über die Höhe auf (oben kalt unter der Betondecke, unten immer heißer vom Brand). Rechts wölbt sich der Träger synchron nach oben — je größer der Temperaturunterschied, desto stärker der Bogen. Die Verformung ist überhöht gezeichnet (der Faktor steht im Titel); in Wahrheit sind es Millimeter auf einen Meter. Der Kapitel-1-Trailer, jetzt Glied für Glied verstanden.
Was man sieht: Mit jedem Grad, das die untere Faser heißer wird, wölbt sich der Träger ein Stück weiter — die Krümmung wächst genau proportional zum Temperaturunterschied (das ist der Kern von Übung 14.2). Am Ende steht der gekrümmte Träger aus dem Ergebnisbild. Der Überhöhungsfaktor ist ehrlich eingeblendet; in Wahrheit sind es Millimeter.
14.9 Die interaktive Einheit: die Biegebank
Jetzt bist du dran. Die Biegebank spannt den Träger ein, legt ein Temperaturgefälle über die Höhe an und zeigt den gekrümmten Träger, die Spannung \(\sigma_{xx}\) als Farbe und den Vergleich mit der Handformel. Du kannst das Netz verfeinern (NX, NY), das Gefälle ändern (TEMPERATUR_OBEN, TEMPERATUR_UNTEN), das Lager lösen (LAGERUNG) und — der spannendste Regler — die Querkontraktion NU von \(0\) bis \(0{,}45\) verstellen. Bevor du ihn anfasst, eine Vorhersage:
WichtigVorhersage-Punkt
Bevor du das Programm startest: Du stellst NU von \(0{,}30\) auf \(0\) — du schaltest die Querkontraktion also ab. Krümmt sich der Träger dann stärker, schwächer oder gleich stark? Die Querkontraktion war die neue Zutat des Kapitels — also müsste sie doch etwas ausmachen? Leg dich fest, bevor du weiterliest.
Abbildung 14.10: Vorgerenderte Fassung der Biegebank (Kragträger, Gefälle unten 220 → oben 20 °C, ν = 0,30, Netz 12×3, × 8 überhöht): grau das ruhende Netz, blau der nach oben gewölbte Träger. Im Browser wird dieses Bild durch dein Ergebnis ersetzt — verstelle die Regler und beobachte, wie sich Krümmung, Hebung und der Handformel-Vergleich ändern.
Auflösung des Vorhersage-Punkts. Überraschung: Für die Krümmung selbst macht die Querkontraktion so gut wie nichts aus. Schau auf die Handformel — \(\kappa = \alpha\,\Delta T / H\) enthält kein \(\nu\). Ein frei gebogener Träger krümmt sich bei \(\nu = 0\) genauso stark wie bei \(\nu = 0{,}30\); das kannst du prüfen, indem du in Übung 14.3 die „gerade genug”-Lagerung benutzt — dort ändert sich die Krümmung beim Verstellen von NU praktisch nicht.
In der eingespannten Biegebank oben siehst du trotzdem eine kleine Änderung: Bei NU = 0 hebt sich das Ende etwas weniger (gut ein Zehntel weniger). Das liegt aber nicht an der Krümmung, sondern an der festen Einspannung: Die feste linke Kante verwandelt einen Teil der seitlichen Querkontraktions-Zerrung in zusätzlichen Biegeantrieb, und dieser Zusatz wächst mit \(\nu\). Nimm die Einspannung weg (freie Biegung), und \(\nu\) verschwindet aus der Antwort. Die Lehre ist fein, aber wichtig: Die neue Zutat des Kapitels macht die 2D-Buchhaltung reicher, aber sie ist nicht der Motor der Krümmung — der Motor ist und bleibt der Längenunterschied \(\alpha\,\Delta T\) zwischen heißer und kalter Faser.
Probiere zum Schluss noch LAGERUNG = "frei": Das Programm weigert sich zu rechnen und erklärt, warum — der Träger schwimmt (das Starrkörper-Ballett aus Schritt 6). Und dreh TEMPERATUR_UNTEN höher: Die Hebung wächst genau proportional mit (Übung 14.2).
14.10 Das Kapitel-Programm
Das vollständige, eigenständige Programm zu diesem Kapitel ist programme/kap14/kap14_biegebank.py. Es bündelt die Bausteine aus programme/gemeinsam/elastik2d.py (Steckbrief, thermische Kräfte, Assemblierung, Lösen mit Lagerung, Spannungen, Starrkörper-Probe), rechnet den gekrümmten Kragträger, führt die Netzkonvergenz gegen die Handformel vor, prüft den 2D-Nulltest (frei, gleichmäßig warm → Spannung null) und speichert das Ergebnisbild. Die interaktive Biegebank oben ist seine im Browser lauffähige Kurzfassung.
TippMerkkasten
In der Fläche trägt jeder Knoten zwei Freiheitsgrade \((u, v)\); Knoten \(i\) besetzt die Zeilen \(2i\) und \(2i+1\). Das System wächst von \(n\) auf \(2n\).
Es gibt drei Dehnungen: strecken in \(x\) (\(\varepsilon_{xx}\)), strecken in \(y\) (\(\varepsilon_{yy}\)), den Winkel kippen (Schub \(\gamma_{xy}\)). Zusammen das vollständige Messprotokoll der Verformung.
Die Querkontraktion\(\nu\) (Radiergummi wird beim Drücken dicker) koppelt \(x\) und \(y\); sie steckt in der \(3\times 3\)-Materialtabelle des ebenen Spannungszustands. Für unseren dünnen Träger ist „eben” die richtige Wahl.
Die 6×6-Elementmatrix entsteht aus den Zeltflächen-Steigungen (Kapitel 10): Eckverschiebungen → Dehnungen (konstant je Dreieck!) → Spannungen → Kräfte. Man gibt sie als Rezept und liest sie, statt sie von Hand herzuleiten.
Ein Träger ohne Lager schwimmt in drei Starrkörpermoden (2× schieben, 1× drehen) — die 2D-Fassung des schwimmenden Trägers aus Kapitel 8.
Ein Temperaturgefälle über die Höhe krümmt den Träger zum Kreisbogen, \(\kappa = \alpha\,\Delta T_{\text{Höhe}} / H\) — ohne\(\nu\). Grobe P1-Netze biegen zu steif; die Durchbiegung konvergiert von unten gegen die Handformel.
Roter Faden
Wo kam das schon vor, wo kommt es wieder? — Zurück: Das Netz und die Zeltflächen-Steigungen sind die aus 1, die Assemblierung die aus Kapitel 3, der Löser der aus Kapitel 4. Die thermische Kraft und die Einweg-Kopplung sind Kapitel 13 in der Fläche; die Analogie-Tafel jenes Kapitels wächst um die Querkontraktion. Der schwimmende Träger aus Kapitel 8 kehrt als Starrkörpermode wieder — jetzt dreifach. Das Verifikations-Ritual (Handformel, Netzkonvergenz, Nulltest) ist die Prüfkultur aus Kapitel 12, angewandt auf die Verformung. Und der Bimetall-Cliffhanger aus Übung 13.3 ist eingelöst: Nebeneinander liegende, verschieden heiße Fasern krümmen den Träger. — Nach vorn:Kapitel 15 verschmilzt die transiente Wärme aus Kapitel 9 mit dieser Mechanik zum vollständigen, interaktiven Finale — dem Programm aus Kapitel 1, jetzt mit offenem Motorraum.
Übungen
Ü 14.1 (Verstehen). Unten sind drei verzogene Gitterquadrate skizziert (grau der Ausgang, blau die Verformung). Ordne jedem zu, welche der drei Dehnungen ungleich null sind — nur \(\varepsilon_{xx}\), nur \(\varepsilon_{yy}\), nur \(\gamma_{xy}\), oder eine Mischung. (a) Ein Quadrat, das zum liegenden Rechteck wird. (b) Ein Quadrat, das zum Parallelogramm kippt, ohne breiter oder höher zu werden. (c) Ein Quadrat, das gleichzeitig höher wird und kippt.
HinweisMusterlösung zu Ü 14.1
Nur \(\varepsilon_{xx} \neq 0\) (breiter, sonst nichts). (b) Nur \(\gamma_{xy} \neq 0\) (reiner Schub: Winkel kippt, Seitenlängen bleiben). (c) Eine Mischung aus \(\varepsilon_{yy}\) (höher) und \(\gamma_{xy}\) (kippt) — zwei der drei zugleich, \(\varepsilon_{xx} = 0\) (nicht breiter). Die Kunst ist zu sehen, dass „höher und schräg” zwei getrennte Zutaten sind, keine einzige neue.
Ü 14.2 (Verändern). Verdopple in der Biegebank die Temperaturdifferenz über die Höhe (z. B. von \(\Delta T = 200\) auf \(400\ \mathrm{K}\), indem du TEMPERATUR_UNTEN von \(220\) auf \(420\ °\mathrm{C}\) stellst). Verdoppelt sich die Hebung des freien Endes? Und warum gilt das hier exakt, obwohl in Kapitel 8 die Mittentemperatur bei doppelter Brandeinwirkung gerade nicht einfach mitzog? Lösungsskript: loesungen/kap14_ue2.py.
HinweisMusterlösung zu Ü 14.2
Ja — die Hebung verdoppelt sich exakt. Die Krümmung ist \(\kappa =
\alpha\,\Delta T_{\text{Höhe}} / H\), also linear im Temperaturunterschied; doppeltes \(\Delta T\) heißt doppeltes \(\kappa\) heißt doppelte Hebung. Das ganze Modell dieses Kapitels ist linear: doppelte Last, doppelte Antwort. In Kapitel 8 war das anders, weil dort die stationäre Temperatur selbst gesucht war und die Randbedingungen (das fest gehaltene \(20\,°\mathrm{C}\)-Auflager) nicht mitskalierten — eine doppelt so heiße Brandeinwirkung ergibt eben kein doppelt so heißes Profil, wenn ein Ende festgenagelt bleibt. Hier dagegen ist das Temperaturfeld fest vorgegeben (die Einweg-Kopplung), und die Mechanik darauf reagiert streng proportional. Merke: Linearität gilt, wo Ursache und Wirkung durch eine Geradengleichung verbunden sind — und die Thermoelastik dieses Buches ist durchweg so gebaut.
Ü 14.3 (Übertragen). Wiederhole den Nulltest aus Kapitel 13 in 2D: Ein frei gelagerter, gleichmäßig (nicht über die Höhe gestaffelt!) um \(100\ \mathrm{K}\) erwärmter Träger muss Spannung null liefern — er darf sich frei in alle Richtungen ausdehnen. Der Haken: „Frei” heißt hier nicht „gar kein Lager” (dann schwimmt er, Schritt 6), sondern gerade genug Lager, um die drei Starrkörpermoden zu sperren, ohne die Dehnung zu behindern: ein Knoten ganz fest (\(u = v = 0\)) und ein zweiter nur in \(y\) gehalten. Führe das Nulltest-Protokoll und lies die größte Spannung ab. Lösungsskript: loesungen/kap14_ue3.py.
HinweisMusterlösung zu Ü 14.3
Mit der „gerade genug”-Lagerung (Knoten unten links fest, Knoten unten rechts nur in \(y\)) ist die größte Spannung im ganzen Träger null — auf Maschinengenauigkeit (Größenordnung \(10^{-12}\ \mathrm{N/mm^2}\)). Der Grund ist derselbe wie in 1D: Die gleichmäßige Wärmedehnung ist eine konstante Dehnung \([\alpha\,\Delta T, \alpha\,\Delta T, 0]\), und eine konstante Dehnung liegt exakt im Ansatzraum der P1-Dreiecke — kein Diskretisierungsfehler, keine Spannung, auf jedem Netz. (Anders als bei der Biegung in Schritt 7: Dort ist die Dehnung über die Höhe veränderlich, das können die konstanten P1-Dreiecke nicht exakt, und darum ist die Biegung kein Nulltest, sondern konvergiert nur.) Zwei Lagerbedingungen zu wenig, und der Träger schwimmt; eine zu viel (etwa beide Knoten ganz fest), und man behindert die Dehnung und erzeugt künstliche Spannung. „Gerade genug festhalten” ist die Kunst — statisch bestimmt lagern.
Ü 14.4 (Übertragen).Die Betonbrücke in der Sonne. Dieselbe Krümmungsformel, ein ganz anderer Schauplatz: eine Betonbrücke, deren Fahrbahnplatte an einem Sommertag von oben von der Sonne beschienen wird, während die Unterseite im Schatten kühl bleibt. Über die \(H = 0{,}3\ \mathrm{m}\) dicke Platte stellt sich dann ein Temperaturgefälle ein — Brückennormen und Messungen setzen dafür größenordnungsmäßig \(\Delta T \approx 12\ \mathrm{K}\) (oben wärmer) an. Beton dehnt sich mit \(\alpha_{\text{Beton}} \approx 10\cdot 10^{-6}\ 1/\mathrm{K}\). (a) Berechne die Krümmung \(\kappa = \alpha\,\Delta T / H\) und den Krümmungsradius. (b) Ein Brückenfeld der Spannweite \(L = 30\ \mathrm{m}\) liegt an beiden Enden auf Lagern. Bei konstanter Krümmung hebt sich seine Mitte gegenüber der Verbindungslinie der Lager um \(w_{\text{Mitte}} = \kappa L^2 / 8\) (die Auflagerformel, wie sie ein durchhängendes Seil spiegelbildlich erfüllt) — schätze diese Hebung ab. Lösungsskript: loesungen/kap14_ue4.py.
HinweisMusterlösung zu Ü 14.4
\(\kappa = \alpha\,\Delta T / H = 10\cdot 10^{-6}\cdot 12 / 0{,}3 =
4{,}0\cdot 10^{-4}\ 1/\mathrm{m}\), also ein Krümmungsradius \(R = 1/\kappa =
2500\ \mathrm{m}\) — ein sehr flacher Bogen. (b) Für das beidseitig gelagerte Feld ist \(w_{\text{Mitte}} = \kappa L^2 / 8 = 4{,}0\cdot 10^{-4}\cdot 30^2 / 8 =
0{,}045\ \mathrm{m} = 45\ \mathrm{mm}\): Die Feldmitte hebt sich um gut vier Zentimeter. Genau darum bekommen Brücken Bewegungslager und Dehnfugen — das Bauwerk muss atmen dürfen.
Bemerkenswert ist, dass die Sonne das bei Beton überhaupt schafft, bei einem Stahlträger derselben Dicke aber nicht: Ein Temperaturgefälle über die Höhe entsteht nur, wenn die Wärme nicht sofort quer durchsickert. Beton ist ein schlechter Wärmeleiter (\(\lambda_{\text{Beton}} \approx 1{,}8\ \mathrm{W/(m\,K)}\), rund dreißigmal weniger als die \(50\ \mathrm{W/(m\,K)}\) von Stahl), die Platte ist mit \(0{,}3\ \mathrm{m}\) dick, und die Sonne kommt im Tagesrhythmus, lädt tagsüber auf und lässt nachts wieder abkühlen. Diese drei Umstände — schlechter Leiter, großer Querschnitt, langsamer Tageszyklus — halten den Gradienten aufrecht. Bei Stahl gliche sich derselbe Wärmeeintrag über die dünne Höhe fast augenblicklich aus; erst die geballte, intensive Einwirkung eines Brandes von unten erzeugt dort das steile Gefälle dieses Kapitels.
Das Kleingedruckte
Drei ehrliche Anmerkungen zum Schluss.
Die Farbbilder zeigen \(\sigma_{xx}\), nicht die „Vergleichsspannung”. Wir haben den Träger nach der Längsspannung \(\sigma_{xx}\) eingefärbt, weil sie anschaulich ist (Zug rot, Druck blau) und direkt die Biegung zeigt. In der Praxis fasst man die drei Spannungen \(\sigma_{xx}, \sigma_{yy}, \tau_{xy}\) oft zu einer Zahl zusammen, der von-Mises-Vergleichsspannung, die angibt, wie nah das Material am Fließen ist. Das ist ein kleiner Rechenschritt mehr und ein eigenes Thema; unsere Farbbilder sagen ehrlich \(\sigma_{xx}\) dazu.
P1-Dreiecke sind schlechte Biege-Elemente. Wir haben es an der Netzkonvergenz gesehen und offen benannt: Weil ein P1-Dreieck nur eine Dehnung über seine Fläche kennt, bildet es Biegung nur grob und zu steif ab. Für ernsthafte Biegerechnungen nimmt man Elemente höherer Ordnung (quadratische Dreiecke mit Zwischenknoten) oder spezielle Biege-Elemente, die die veränderliche Dehnung über die Höhe von Haus aus darstellen. Unser P1-Netz ist ehrlich, aber nicht das schärfste Werkzeug — es zeigt die Physik richtig und die Zahl ungefähr.
Nur eine Richtung der Kopplung. Wie in Kapitel 13 rechnen wir die Einweg-Kopplung: Die Temperatur erzeugt die Verformung, aber die Verformung wirkt nicht auf die Temperatur zurück. Für unseren Träger ist dieser Rückkanal winzig; echte gekoppelte Probleme (die vollen thermo-mechanischen Prozesse) müssen beide Richtungen zugleich lösen. Das ist der Stoff jenseits dieses Buches — aber die Maschine, die du jetzt verstanden hast, ist genau die, auf der auch jene Programme aufbauen.
Usmani, A. S., J. M. Rotter, S. Lamont, A. M. Sanad, und M. Gillie. 2001. „Fundamental principles of structural behaviour under thermal effects“. Fire Safety Journal 36 (8): 721–44.