Een model bouwen en rekenen in Python
Zeven objecten dekken vrijwel elk model: Node, Material, Section, Member, MemberSet, NodalSupport en NodalLoad. U stelt ze samen, roept run_analysis() aan en leest een resultatenbundel uit, geordend per belastinggeval.
De kernobjecten
Alles wordt geïmporteerd uit fers_core. Een model is een FERS-instantie met staafgroepen; belastingen hangen aan belastinggevallen en niet rechtstreeks aan het model, zodat dezelfde geometrie meerdere onafhankelijke gevallen kan dragen.
- Node — een X-, Y-, Z-punt. Y wijst omhoog. Knopen dragen hun oplegvoorwaarde.
- Material — elasticiteitsmodulus, glijdingsmodulus, dichtheid, vloeigrens. Alles in SI: pascal en kg/m³.
- Section — oppervlakte en traagheidsmomenten, verwijzend naar een materiaal.
- Member — een liggerelement met twee knopen en zes vrijheidsgraden per knoop, verwijzend naar een doorsnede.
- MemberSet — de groep die u aan het model toevoegt, en tevens de eenheid waarop toetsingen werken.
- NodalSupport — de randvoorwaarde die aan een knoop is toegekend.
- NodalLoad — een kracht of moment op een knoop binnen een belastinggeval.
from fers_core import (
FERS, Node, Member, Section, Material,
MemberSet, NodalSupport, NodalLoad
)Geometrie, materiaal en doorsnede definiëren
Coördinaten in meters en materiaaleigenschappen in pascal. De doorsnede hieronder is een IPE 180 uit de FERS-profielenbibliotheek.
Let op de assenafspraak, want die is verreweg de meest voorkomende oorzaak van een fout antwoord: i_z is de sterke as en i_y de zwakke. Een ligger die in zijn gebruikelijke vlak buigt wordt bepaald door i_z.
# Nodes (x, y, z coordinates in metres)
node1 = Node(0, 0, 0)
node2 = Node(5, 0, 0)
# Material (Steel S235)
steel = Material(
name="Steel S235",
e_mod=210e9, # Pa
g_mod=80.769e9, # Pa
density=7850, # kg/m³
yield_stress=235e6 # Pa
)
# Cross-section (IPE 180), values from the FERS steel section library.
# Axis convention: i_z is the STRONG axis (bending in the local x-y plane),
# i_y the weak axis — see ferscloud.com/conventions
section = Section(
name="IPE 180",
material=steel,
i_y=1.009e-6, # m⁴ (weak axis)
i_z=13.17e-6, # m⁴ (strong axis)
j=0.0477e-6, # m⁴
area=0.00240 # m²
)Alle assen-, teken- en eenheidsafspraken staan op de conventiepagina. Het JSON-contract verwacht hoeken in graden, niet in radialen.
Staaf maken, oplegging en belasting aanbrengen
Een kale NodalSupport() is volledig ingeklemd. Voor een scharnier of een rol geeft u displacement_conditions en rotation_conditions expliciet mee — de voorbeelden laten beide zien.
Belastingrichtingen zijn globale eenheidsvectoren, dus (0, 1, 0) met een negatieve grootte is een neerwaartse kracht.
# Create beam element
beam = Member(start_node=node1, end_node=node2, section=section)
# Fixed support at node1
node1.nodal_support = NodalSupport()
# Organise members into a set and add to model
model = FERS()
model.add_member_set(MemberSet(members=[beam]))
# Load case with a −1 kN point load at node2
lc = model.create_load_case(name="Gravity")
NodalLoad(node=node2, load_case=lc, magnitude=-1000, direction=(0, 1, 0))De berekening starten en resultaten lezen
run_analysis() rekent elk belastinggeval. De resultaten staan op model.resultsbundle, geordend op naam van het belastinggeval, met vervormingen en reacties geïndexeerd op knoop-id als tekenreeks.
De opmerkingen tonen de werkelijke uitvoer voor precies deze invoer.
model.run_analysis()
results = model.resultsbundle.loadcases["Gravity"]
dy = results.displacement_nodes["2"].dy
Vy = results.reaction_nodes["1"].nodal_forces.fy
Mz = results.reaction_nodes["1"].nodal_forces.mz
print(f"Tip deflection : {dy*1000:.3f} mm") # -15.065 mm
print(f"Reaction Vy : {Vy:.1f} N") # 1000.0 N
print(f"Reaction Mz : {Mz:.1f} Nm") # 5000.0 NmHandberekening: een uitkraging van 5 m die om zijn sterke as buigt geeft δ = PL³ / 3EI_z = 1000·5³ / (3 · 210×10⁹ · 13,17×10⁻⁶) = 15,07 mm, met uit evenwicht een reactie van 1 kN en een inklemmingsmoment van 5 kN·m. De solver geeft 15,065 mm.
Verder dan lineaire statica
Hetzelfde modelobject draagt de instellingen voor de andere berekeningssoorten. Tweede-orde (P-Delta), lineair knikken met kritieke belastingfactor, modale analyse en responsspectrum-aardbevingsberekening worden allemaal vanuit de analyse-instellingen aangestuurd, niet via een andere API.
Toetsingen hangen aan staafgroepen en worden na de berekening geëvalueerd. Ze geven per artikel de unity check met de tussenwaarden die eraan ten grondslag liggen — een toetsing leest dus als een handberekening en niet als één getal.
- Controleer eerst tegen gesloten oplossingen — zie de nauwkeurigheidstoetsen en de NAFEMS-set.
- Voor toetsingen volgens EN 1993-1-1 bouwt, rekent en toetst
check_beaméén overspanning in één aanroep — zie de voorbeelden.
Gerelateerde pagina’s
Het FERS Python-pakket installeren
Met pip installeren, de import controleren en optioneel cloudauthenticatie met een API-sleutel of token instellen.
Uitgewerkte voorbeelden
Vier uitvoerbare scripts — uitkraging, ligger op twee steunpunten, raamwerk en een EN 1993-1-1-toetsing — elk met handberekening.
Zie ook
Veelgestelde vragen
Waarom zijn mijn vervormingen op een tekenreeks geïndexeerd?
displacement_nodes["2"], niet [2].Waar dient een MemberSet voor?
Hoe modelleer ik een scharnier of een rol?
NodalSupport expliciete voorwaarden mee. Een scharnier houdt de drie verplaatsingen vast en laat de buigrotaties vrij; houd ook de torsierotatie vast, anders heeft de staaf een starre-lichaamsdraaiing en wordt de berekening singulier. Het voorbeeld met de ligger op twee steunpunten toont beide.Welk traagheidsmoment hoort bij de sterke as?
i_z. FERS behandelt de lokale z-as overal als sterke buigas — solver, toetsingen en diagrammen zijn het daarover eens. Verwisselde i_y en i_z zijn de meest voorkomende modelleerfout.Heb ik internet nodig om te rekenen?
run_analysis() draait de gecompileerde solver in uw eigen proces. Netwerktoegang komt alleen in beeld als u een cloudeindpunt aanroept.