Durchgerechnete Beispiele

Vier Skripte zum Einfügen und Ausführen. Jedes nennt die erwartete Ausgabe für genau seine Eingaben und die geschlossene Lösung, gegen die es geprüft wurde — Sie können also bestätigen, dass Ihre Installation sie reproduziert, bevor Sie einem eigenen Modell vertrauen.

1. Kragarm mit Einzellast am Ende

Ein 5 m langer Kragarm IPE 180, an einem Ende voll eingespannt, mit einer nach unten gerichteten Einzellast von 1 kN an der Spitze. Das ist das einfachste Modell, das die gesamte Kette durchläuft: Geometrie, Material, Querschnitt, Auflager, Lastfall und Berechnung.

from fers_core import FERS, Node, Member, Section, Material, MemberSet, NodalSupport, NodalLoad

model = FERS()

node1 = Node(0, 0, 0)  # fixed end
node2 = Node(5, 0, 0)  # free end (5 m span)

steel = Material(name="Steel S235", e_mod=210e9, g_mod=80.769e9, density=7850, yield_stress=235e6)
# IPE 180 from the FERS section library: i_z = strong axis (in play here), i_y = weak axis
section = Section(name="IPE 180", material=steel, i_y=1.009e-6, i_z=13.17e-6, j=0.0477e-6, area=0.00240)

beam = Member(start_node=node1, end_node=node2, section=section)
node1.nodal_support = NodalSupport()  # fully fixed
model.add_member_set(MemberSet(members=[beam]))

lc = model.create_load_case(name="End Load")
NodalLoad(node=node2, load_case=lc, magnitude=-1000, direction=(0, 1, 0))

model.run_analysis()

dy = model.resultsbundle.loadcases["End Load"].displacement_nodes["2"].dy
print(f"Tip deflection: {dy*1000:.3f} mm")
# Expected output: Tip deflection: -15.065 mm
# Hand check: δ = PL³/3EI_z = 1000·5³ / (3 · 210e9 · 13.17e-6) = 15.07 mm ✓

Handrechnung: δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm. Der Solver gibt 15,065 mm zurück.

2. Einfeldträger mit Einzellast in Feldmitte

Ein 10 m langer IPE 300 aus zwei Stäben à 5 m, damit in Feldmitte ein Knoten zum Belasten und Ablesen liegt. Gelenklager an einem Ende, Rollenlager am anderen.

Beachten Sie die expliziten Auflagerbedingungen. Das Gelenklager hält die drei Verschiebungen und die Torsionsverdrehung, lässt aber die Biegeverdrehungen frei — halten Sie die Torsion nicht, hat der Träger eine Starrkörper-Drehung und die Steifigkeitsmatrix wird singulär. Das Rollenlager gibt zusätzlich die Längsverschiebung frei, damit sich der Träger frei dehnen kann.

from fers_core import FERS, Node, Member, Section, Material, MemberSet, NodalSupport, NodalLoad

model = FERS()

node1 = Node(0, 0, 0)
node2 = Node(5, 0, 0)   # mid-span
node3 = Node(10, 0, 0)  # right support

steel = Material(name="Steel S235", e_mod=210e9, g_mod=80.769e9, density=7850, yield_stress=235e6)
section = Section(name="IPE 300", material=steel, i_y=6.038e-6, i_z=83.58e-6, j=0.199e-6, area=0.00538)

beam1 = Member(start_node=node1, end_node=node2, section=section)
beam2 = Member(start_node=node2, end_node=node3, section=section)

# Pin at node1 — bending rotations free, torsion (RX) held so the beam
# has no rigid-body twist mode. Roller at node3 — X translation free too.
pin = NodalSupport(
    displacement_conditions={"X": "Fixed", "Y": "Fixed", "Z": "Fixed"},
    rotation_conditions={"X": "Fixed", "Y": "Free", "Z": "Free"},
)
roller = NodalSupport(
    displacement_conditions={"X": "Free", "Y": "Fixed", "Z": "Fixed"},
    rotation_conditions={"X": "Free", "Y": "Free", "Z": "Free"},
)
node1.nodal_support = pin
node3.nodal_support = roller

model.add_member_set(MemberSet(members=[beam1, beam2]))

lc = model.create_load_case(name="Centre Load")
NodalLoad(node=node2, load_case=lc, magnitude=-10000, direction=(0, 1, 0))

model.run_analysis()

dy_mid = model.resultsbundle.loadcases["Centre Load"].displacement_nodes["2"].dy
print(f"Mid-span deflection: {dy_mid*1000:.3f} mm")
# Expected output: Mid-span deflection: -11.870 mm
# Hand check: δ = PL³/48EI_z = 10000·10³ / (48 · 210e9 · 83.58e-6) = 11.87 mm ✓

Handrechnung: δ = PL³ / 48EI_z = 10000·10³ / (48 · 210×10⁹ · 83,58×10⁻⁶) = 11,87 mm. Der Solver gibt 11,870 mm zurück.

3. Rahmen unter Horizontallast

Zwei 4 m hohe Stützen HEA 200 mit eingespannten Fußpunkten und ein 6 m langer Riegel IPE 300, belastet durch eine horizontale Kraft von 5 kN am Kopf der linken Stütze. Das ist das kleinste Modell, bei dem die Rahmenwirkung — und nicht ein einzelner Stab — das Ergebnis bestimmt.

from fers_core import FERS, Node, Member, Section, Material, MemberSet, NodalSupport, NodalLoad

model = FERS()

# Portal frame: two columns (h=4 m) + one beam (L=6 m)
n1 = Node(0, 0, 0)   # left base
n2 = Node(0, 4, 0)   # left top
n3 = Node(6, 4, 0)   # right top
n4 = Node(6, 0, 0)   # right base

steel = Material(name="Steel S235", e_mod=210e9, g_mod=80.769e9, density=7850, yield_stress=235e6)
col_sec  = Section(name="HEA 200", material=steel, i_y=13.36e-6, i_z=36.93e-6, j=0.206e-6, area=0.00538)
beam_sec = Section(name="IPE 300", material=steel, i_y=6.038e-6, i_z=83.58e-6, j=0.199e-6, area=0.00538)

col_left  = Member(start_node=n1, end_node=n2, section=col_sec)
col_right = Member(start_node=n4, end_node=n3, section=col_sec)
rafter    = Member(start_node=n2, end_node=n3, section=beam_sec)

n1.nodal_support = NodalSupport()  # fixed base
n4.nodal_support = NodalSupport()  # fixed base

model.add_member_set(MemberSet(members=[col_left, col_right, rafter]))

lc = model.create_load_case(name="Wind")
# Horizontal wind load on left column top
NodalLoad(node=n2, load_case=lc, magnitude=5000, direction=(1, 0, 0))

model.run_analysis()

dx = model.resultsbundle.loadcases["Wind"].displacement_nodes["2"].dx
print(f"Sway at left top: {dx*1000:.3f} mm")
# Expected output: Sway at left top: 5.310 mm
# Hand check (slope-deflection, axial deformation neglected): 5.30 mm ✓

Handrechnung nach dem Drehwinkelverfahren unter Vernachlässigung der Längsverformung: 5,30 mm. Der Solver gibt 5,310 mm zurück. Eine ausführlichere Behandlung mit Ergebnislinien steht im Rahmen-Beispiel.

4. Stahlnachweis nach Eurocode 3

check_beam baut ein Einfeld, rechnet es und führt die Bauteilnachweise nach EN 1993-1-1 in einem Aufruf durch. Hier: ein 10 m … genauer, ein 7,5 m langer Einfeldträger IPE 400 aus S355 unter einer charakteristischen Gleichstreckenlast von 13 kN/m, mit 1,35 beaufschlagt, Druckgurt über die volle Länge nicht gehalten.

Das Ergebnis enthält eine klauselweise Nachvollziehung statt einer einzelnen Zahl, jede Ausnutzung liest sich also wie eine Handrechnung — die Zwischenwerte, aus denen sie entstand, sind alle vorhanden.

from fers_core import check_beam

# 7.5 m simply supported IPE 400 in S355, 13 kN/m characteristic UDL,
# ULS factor 1.35, compression flange unrestrained over the full span
model = check_beam(
    span=7.5,
    section="IPE400",
    material="S355",
    udl=13_000,       # N/m characteristic (13 kN/m)
    uls_factor=1.35,
)

model.run_analysis()

check = model.unity_check_results()[0]
print(f"Governing UC: {check['max_utilization']:.2f}")
for step in check["governing"]["trace"]:
    print(f"  {step['label']:22s} {step['value']:.2f}")

# Expected output (solver-computed, matches the published worked example):
# Governing UC: 0.82
#   Bending y (6.2.5)      0.00
#   Bending z (6.2.5)      0.27
#   Shear z (6.2.6)        0.00
#   Shear y (6.2.6)        0.07
#   Combined N+M (6.2.1)   0.27
#   LTB (6.3.2)            0.82
#   Governing              0.82

Das reproduziert das veröffentlichte Eurocode-3-Beispiel, in dem derselbe Fall klauselweise dargestellt ist. Maßgebend wird das Biegedrillknicken mit einer Ausnutzung von 0,82.

Prüfen, bevor Sie vertrauen

Jedes Beispiel oben nennt einen Zahlenwert neben der geschlossenen Lösung, die es reproduzieren soll. Das ist Absicht, und es ist die Gewohnheit, die man übernehmen sollte: Rechnen Sie einen Fall, dessen Antwort Sie kennen, bevor Sie auf einen skalieren, dessen Antwort Sie nicht kennen.

Die Genauigkeits-Benchmarks tun das über eine breitere Menge geschlossener Lösungen, und die NAFEMS-Seite rechnet die üblichen Finite-Elemente-Benchmarks live in Ihrem Browser, jeweils mit der Abweichung zwischen Sollwert und FERS.

Verwandte Seiten

Siehe auch

Häufige Fragen

Warum braucht das Einfeldträger-Beispiel zwei Stäbe?

Nur damit in Feldmitte ein Knoten liegt, an dem die Last angreift und die Verformung abgelesen wird. Die Elementformulierung ist für einen prismatischen Stab exakt, das Teilen des Feldes ändert das Ergebnis also nicht — es schafft lediglich einen Angriffspunkt.

Warum hält das Gelenklager die Torsionsverdrehung?

Gibt man an beiden Enden eines geraden Trägers alle drei Verdrehungen frei, kann er sich frei um die eigene Achse drehen. Diese Starrkörperbewegung macht die Steifigkeitsmatrix singulär und die Berechnung schlägt fehl. RX an einem Auflager zu halten entfernt die Bewegung, ohne eine Biegung zu behindern.

Meine Werte weichen in der letzten Stelle ab — ist etwas falsch?

Nein. Die ausgegebenen Werte sind auf drei Nachkommastellen eines Millimeters gerundet; der Vergleich mit der geschlossenen Lösung ist auf die Genauigkeit angegeben, die die Formel hergibt. Eine größere Abweichung deutet meist auf vertauschte i_y / i_z oder einen Einheitenfehler hin.

Woher stammen die Querschnittswerte?

Aus der FERS-Stahlprofilbibliothek, die mit dem Paket ausgeliefert wird. Sie können Werte auch direkt übergeben, wie in diesen Beispielen, oder sie für eine beliebige Form mit dem Querschnittswerte-Rechner bestimmen.

Kann ich diese Beispiele ohne Konto ausführen?

Ja. Alle vier rechnen lokal ohne Zugangsdaten. Nur die Cloud-Speicherung und die abgerechneten API-/Agentenkanäle benötigen einen Schlüssel.

Wie mache ich dasselbe aus JavaScript?

Dieselbe Rechenmaschine ist als WebAssembly-npm-Paket mit identischem Modellformat veröffentlicht — siehe FERS aus JavaScript.