Uitgewerkte voorbeelden

Vier scripts om te plakken en uit te voeren. Elk noemt de verwachte uitvoer voor precies zijn invoer en de gesloten oplossing waartegen het is gecontroleerd, zodat u kunt vaststellen dat uw installatie ze reproduceert voordat u een eigen model vertrouwt.

1. Uitkraging met eindbelasting

Een uitkraging IPE 180 van 5 m, aan één zijde volledig ingeklemd, met een neerwaartse puntlast van 1 kN aan het uiteinde. Dit is het eenvoudigste model dat de hele keten doorloopt: geometrie, materiaal, doorsnede, oplegging, belastinggeval en berekening.

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 ✓

Handberekening: δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm. De solver geeft 15,065 mm.

2. Ligger op twee steunpunten met last in het midden

Een IPE 300 van 10 m, opgedeeld in twee staven van 5 m zodat er in het midden een knoop is om te belasten en af te lezen. Scharnier aan de ene zijde, rol aan de andere.

Let op de expliciete oplegvoorwaarden. Het scharnier houdt de drie verplaatsingen en de torsierotatie vast maar laat de buigrotaties vrij — houdt u de torsie niet vast, dan heeft de ligger een starre-lichaamsdraaiing en is de stijfheidsmatrix singulier. De rol geeft daarnaast de langsverplaatsing vrij zodat de ligger vrij kan uitzetten.

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 ✓

Handberekening: δ = PL³ / 48EI_z = 10000·10³ / (48 · 210×10⁹ · 83,58×10⁻⁶) = 11,87 mm. De solver geeft 11,870 mm.

3. Raamwerk onder horizontale belasting

Twee kolommen HEA 200 van 4 m met ingeklemde voeten en een ligger IPE 300 van 6 m, belast door een horizontale kracht van 5 kN op de kop van de linkerkolom. Dit is het kleinste model waarbij de raamwerking — en niet één staaf — het antwoord bepaalt.

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 ✓

Handberekening met de hoekveranderingsmethode, waarbij de normaalkrachtvervorming is verwaarloosd: 5,30 mm. De solver geeft 5,310 mm. Een uitgebreidere behandeling met diagrammen staat in het raamwerkvoorbeeld.

4. Staaltoetsing volgens Eurocode 3

check_beam bouwt een ligger van één overspanning, rekent hem en voert de toetsingen volgens EN 1993-1-1 uit in één aanroep. Hier: een IPE 400 op twee steunpunten van 7,5 m in S355 onder een karakteristieke gelijkmatig verdeelde belasting van 13 kN/m, vermenigvuldigd met 1,35, met de drukflens over de volle lengte niet gesteund.

Het resultaat bevat een uitwerking per artikel in plaats van één getal, zodat elke unity check als handberekening te lezen is — alle tussenwaarden die eraan ten grondslag liggen zijn aanwezig.

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

Dit reproduceert het gepubliceerde Eurocode 3-voorbeeld, waar hetzelfde geval artikel voor artikel is uitgewerkt. Kip is maatgevend met een unity check van 0,82.

Controleren voordat u vertrouwt

Elk voorbeeld hierboven drukt een getal af naast de gesloten oplossing die het zou moeten reproduceren. Dat is met opzet, en het is de gewoonte om over te nemen: reken een geval waarvan u het antwoord al kent voordat u opschaalt naar een geval waarvan u het niet kent.

De nauwkeurigheidstoetsen doen dit over een bredere reeks gesloten oplossingen, en de NAFEMS-pagina draait de standaard eindige-elementenbenchmarks live in uw browser, met per geval de afwijking tussen streefwaarde en FERS.

Gerelateerde pagina’s

Zie ook

Veelgestelde vragen

Waarom heeft het voorbeeld op twee steunpunten twee staven nodig?

Alleen om in het midden een knoop te hebben waar de last aangrijpt en de vervorming wordt afgelezen. De elementformulering is exact voor een prismatische staaf, dus het opdelen van de overspanning verandert het antwoord niet — het geeft slechts een aangrijpingspunt.

Waarom houdt het scharnier de torsierotatie vast?

Alle drie de rotaties aan beide uiteinden van een rechte ligger vrijgeven laat hem vrij om zijn eigen as draaien. Die starre-lichaamsbeweging maakt de stijfheidsmatrix singulier en de berekening faalt. RX bij één oplegging vasthouden neemt de beweging weg zonder enige buiging te belemmeren.

Mijn getallen verschillen in het laatste cijfer — is er iets mis?

Nee. De afgedrukte waarden zijn afgerond op drie decimalen van een millimeter; de vergelijking met de gesloten oplossing is gegeven met de nauwkeurigheid die de formule rechtvaardigt. Een groter verschil wijst meestal op verwisselde i_y / i_z of een eenhedenfout.

Waar komen de doorsnede-eigenschappen vandaan?

Uit de FERS-staalprofielenbibliotheek, die met het pakket wordt meegeleverd. U kunt de eigenschappen ook rechtstreeks meegeven, zoals deze voorbeelden doen, of ze voor een willekeurige vorm bepalen met de doorsnede-eigenschappencalculator.

Kan ik deze voorbeelden zonder account uitvoeren?

Ja. Alle vier rekenen lokaal zonder inloggegevens. Alleen cloudopslag en de getelde API-/agentkanalen vragen een sleutel.

Hoe doe ik hetzelfde vanuit JavaScript?

Dezelfde rekenkern is als WebAssembly-npm-pakket gepubliceerd met een identiek modelformaat — zie FERS vanuit JavaScript.