Statically Indeterminate Analysis (structures/fem/statically-indeterminate)
Use when you must find the elastic end moments and support reactions of statically indeterminate beams and continuous beams. This leaf computes the elastic force distribution of redundant flexural members by the classical hand methods, pure stdlib and deterministic: the fixed-end moments of the standard load cases for a both-ends-fixed member, the propped-cantilever fixed-end results that follow when one end is released, the interior support moments of continuous beams from the three-moment (Clapeyron) equation, the member end moments by the moment distribution (Hardy-Cross) method and the slope-deflection equations, the redundant reactions by the consistent deformation (force) method with flexibility coefficients, and the end moments and joint rotations of one symmetric no-sway fixed-base frame under a central beam load. The limit-load end moments and reactions produced here are exactly the elastic moment peaks that the limit-state complement consumes, and the distribution is what downstream strength and margin checks, including the 1.5 ultimate-factor check of FAR 25.303 / CS 25.303, are applied to. It pairs with plastic-collapse-analysis (the limit-state complement), with beam-frame-analysis (the numeric 6x6 stiffness complement, which distributes no moments) and with truss-analysis (the pin-jointed axial complement).
Domain quick reference
- Sign conventions: beam internal moment M(x) is SAGGING POSITIVE across each span, so hogging support moments are negative floats. Member end moments in moment distribution and slope-deflection are CLOCKWISE POSITIVE on the member end: for a downward transverse load on a both-ends-fixed member FEM_left = -|M_FE| and FEM_right = +|M_FE|. Joint rotations theta are CLOCKWISE POSITIVE. The sagging-positive interior support moment M_j equals -end_moments[j-1][1] of the span to its left and end_moments[j][0] of the span to its right; joint equilibrium makes the two member-end moments at a joint sum to zero.
- Fixed-end moment magnitudes (both ends fixed, hogging at each end): uniform w over the span: |M_FE| = wL**2/12; central load P: |M_FE| = PL/8. These are the Roark fixed-end table values for the two standard cases of this leaf.
- Propped cantilever (one end released): the fixed-end moment magnitude grows to wL**2/8 (uniform) or 3PL/16 (central), equal to the both-ends-fixed FEM plus the 1/2 carry-over of the released end (wL2/12 + w*L2/24, PL/8 + PL/16), the classic moment-distribution identity of the prop release.
- Clapeyron load terms t = Axbar/L of the simple-span free bending moment diagram: uniform w: A = wL3/12, xbar = L/2, t = w*L3/24; central P: A = PL**2/8, xbar = L/2, t = PL**2/16.
- Three-moment (Clapeyron) equation over the adjacent spans j and j + 1 between supports j - 1, j and j + 1, M_j the sagging-positive interior support moment and M_0 = M_n = 0 at the simple ends: M_{j-1}L_j + 2M_j*(L_j + L_{j+1}) + M_{j+1}L_{j+1} = -6(t_j + t_{j+1}). Table values reproduced: two equal spans under uniform w give M_interior = -wL**2/8; three equal spans give -wL**2/10 at each interior support.
- Span reactions from the support moments with R0 the simple-span reaction (wL/2 uniform, P/2 central): R_left = R0 + (M_right_end - M_left_end)/L and R_right = R0 + (M_left_end - M_right_end)/L, with 0.0 at the simple ends. Example: the two-span end reaction wL/2 - |M_B|/L.
- Slope-deflection member end moments (no settlement, no sway term in this catalog): M_ab = (2EI/L)(2theta_a + theta_b) + FEM_ab and M_ba = (2EI/L)(2theta_b + theta_a) + FEM_ba. Propped cantilever: the roller condition M_ba = 0 fixes theta_B = -FEM_baL/(4E*I).
- Consistent deformation (force method) on the propped cantilever: release the prop B; the redundant R_B closes the released-cantilever tip deflection delta_B against the unit-load flexibility f_BB = L3/(3EI), R_Bf_BB = delta_B, with the Shigley A-9 cantilever cases: uniform delta_B = wL4/(8EI) giving R_B = 3wL/8; central delta_B = 5PL*3/(48EI) giving R_B = 5P/16.
- Moment distribution (Hardy-Cross): member ends start at their fixed-end moments; each joint in turn is released by adding the negative of its unbalanced sum, split by the distribution factors DF_e = k_e/sum(k) with k = 4EI/L (common E*I, so DFs are proportional to 1/L), carrying one half of each balancing moment to the far end of the same member; simple end supports have DF = 1. The release cycle converges to the exact joint solution, so the support moments agree with the three-moment equation to the tolerance.
- Symmetric fixed-base frame (the one frame case): beam span Lb between the top joints B and C, columns of height h fixed at the bases, common EI, central load W on the beam, no sidesway by symmetry. FEM = WLb/8 hogging at each beam end; top-joint distribution factors 0.6 (column) and 0.4 (beam) at h = 4 m, Lb = 6 m from the 4EI/h and 4EI/Lb stiffnesses; the bases never release, so the base moment equals one half of the column top moment (carry-over). Closed form: theta_B = (WLb/8)/(4EI/h + 2EI/Lb) = -theta_C, column top moment magnitude (4EI/h)theta_B, beam end moment magnitude WLb/8 - (2E*I/Lb)theta_B, beam midspan sagging moment WLb/4 minus the beam end moment magnitude, base vertical reactions W/2 each and zero horizontal reactions.
- Units are SI throughout: m, N, N/m, N m, rad, Pa. The relations above are the classical elastic methods of Roark's fixed-end and continuous-beam tables, the Shigley A-9 deflection cases and the Bruhn redundant-structure presentation, named and paraphrased, never reproduced.
Workflow
- Set up the catalog: span lengths, one (kind, magnitude) load pair per span ('uniform' w in N/m or 'central' P in N at midspan) and the common bending stiffness E*I of all members.
- Compute the fixed-end moments of the standard load cases with fixed_end_moment_uniform and fixed_end_moment_central: |M_FE| = wL**2/12 or PL/8 hogging at each end of a both-ends-fixed member.
- Compute the Clapeyron load terms t = Axbar/L with clapeyron_term_uniform and clapeyron_term_central (wL3/24, P*L2/16).
- For a propped cantilever, run the consistent deformation (force method) traverse with propped_cantilever(config, q, length, ei): the released cantilever deflection delta_B closed against the flexibility coefficient f_BB = L*3/(3E*I) gives the redundant prop reaction, and the dict reports the fixed reaction, the hogging fixed-end moment, the prop rotation, the peak sagging moment and its location. Confirm the carry over identity: fixed_end_moment equals the both-ends-fixed FEM plus FEM/2, and the Hardy-Cross and slope-deflection fixed-end moments agree.
- For a continuous beam on simple end supports, solve the interior support moments with three_moment_support_moments(lengths, terms), which solves the Clapeyron set for the n - 1 sagging-positive interior moments.
- Recover the n + 1 support reactions with support_reactions_continuous(lengths, loads, moments) and verify that the reaction sum equals the applied load sum.
- Cross-check the continuous beam with the moment distribution (Hardy-Cross) method, hardycross_beam(lengths, loads): the distribution factors from the 1/L-proportional stiffnesses and the 1/2 carry-over factor reproduce the three-moment support moments, the member end moments at each interior joint balance to zero and the simple-end member end moments vanish.
- Compute member end moments and joint rotations with slope_deflection_member(ei, length, theta_left, theta_right, fem_left, fem_right) in the clockwise-positive convention, e.g. the propped cantilever roller condition M_ba = 0.
- For the symmetric no-sway fixed-base frame under a central beam load, run portal_frame_fixed_base(total_load, span, height, ei): moment distribution over the two top joints with the fixed bases and the 4EI/h, 4EI/Lb stiffnesses gives the beam end, column top and column base (carry-over) moment magnitudes, the beam midspan sagging moment, the joint rotations and the base reactions. Cross-check with slope_deflection_frame_solve, the direct solve of the two joint-equilibrium slope-deflection equations, and with the closed form theta_B = (WLb/8)/(4EI/h + 2E*I/Lb).
- Confirm the deterministic checks: every non-physical input raises ValueError, repeated runs return identical bits, and the contract test scripts/test_statically_indeterminate.py passes offline.
Worked example
E = 200 GPa, I = 2.0e-4 m4, so E*I = 4.0e7 N m2 throughout. All values below are the real outputs of scripts/statically_indeterminate_logic.py (pure stdlib math, deterministic), which sit within float noise of the closed forms (worst observed agreement 4e-15 relative; e.g. the two-span interior support moment prints -30833.333333333332 N m).
- Fixed-end moments and Clapeyron terms: fixed_end_moment_uniform(12000, 5) = 25000.0 N m hogging at each end (wL**2/12), (10000, 6) = 30000.0; fixed_end_moment_central(30000, 4) = 15000.0 (PL/8). clapeyron_term_uniform(12000, 5) = 62500.0 N m2 and clapeyron_term_central(30000, 4) = 30000.0 N m2.
- Propped cantilever, central load P = 20000 N, L = 4 m: consistent deformation gives delta_B = 5PL3/(48EI) = 0.00333333333333 m, f_BB = L3/(3EI) = 5.33333333333e-07 m/N and R_B = delta_B/f_BB = 6250.0 N (5P/16) with consistency residual 0.0; statics give R_A = 13750.0 N (11P/16) and the hogging fixed-end moment 15000.0 N m (3PL/16). prop_rotation = -2.5e-4 rad, peak sagging 5PL/32 = 12500.0 N m under the load at x = 2.0 m. The Hardy-Cross release of the prop end (balance -10000.0, carry -5000.0 to A on top of the FEM -10000.0) and the slope-deflection roller condition give the same 15000.0 N m, sd_prop_end_moment = 0.0, and the carry-over identity 3PL/16 = PL/8 + PL/16 holds with residual 0.0.
- Propped cantilever, uniform w = 12000 N/m, L = 4 m: R_B = 3wL/8 = 18000.0 N, R_A = 5wL/8 = 30000.0 N, fixed-end moment wL**2/8 = 24000.0 N m, prop_rotation -4.0e-4 rad, delta_B = 9.6e-03 m (consistency residual 1.73472347598e-18), peak sagging 9wL**2/128 = 13500.0 N m at x = 5L/8 = 2.5 m; carry-over identity 24000.0 = 16000.0 + 8000.0.
- Two-span continuous beam, L1 = 5 m uniform 12000 N/m, L2 = 4 m central 30000 N, simple ends: three_moment_support_moments returns M_B = -30833.3333333333 N m, the closed form -3*(t1 + t2)/(L1 + L2) of the single Clapeyron equation; support_reactions_continuous returns 23833.3333333333, 58875.0 and 7291.6666666667 N (sum 90000.0 N, the applied load). Moment distribution agrees with the three-moment support moment in 23 iterations with the simple-end member end moments below 5e-10 N m.
- Three-span continuous beam, three equal spans L = 6 m, uniform 10000 N/m: M_1 = M_2 = -36000.0 N m, the Roark/Shigley table value -wL**2/10; reactions 24000.0, 66000.0, 66000.0, 24000.0 N (sum 180000.0 = 3w*L, residual 0.0); moment distribution agrees within 3.2e-10 N m in 25 iterations.
- Symmetric fixed-base frame, W = 60000 N central on the beam, Lb = 6 m, h = 4 m: FEM = 45000.0 N m hogging at each beam end, distribution factors 0.6 (column) and 0.4 (beam); moment distribution converges in 12 iterations to beam end moment magnitude 33750.0 N m at each end, column top moment 33750.0 N m, column base moment 16875.0 N m (the carry-over half) and beam midspan sagging moment 56250.0 N m (= W*Lb/4 - 33750). theta_B = 8.4375e-4 rad = -theta_C from the closed form 45000.0 / 53333333.3333333; the direct 2x2 slope_deflection_frame_solve reproduces every member end moment (maximum difference over the six end moments 7.3e-12 N m). Base vertical reactions 30000.0 N each, horizontal reactions 0.0.
Verification
- Confirm fixed_end_moment_uniform(12000, 5) = 25000.0 and fixed_end_moment_central(30000, 4) = 15000.0, each equal to the closed form wL**2/12 or PL/8 by construction.
- Confirm three_moment_support_moments on the two-span case returns -30833.3333333333 (within 1e-6 relative of -3*(t1 + t2)/(L1 + L2)) and on the three equal spans returns -36000.0 at both interior supports (within 1e-9 relative of -w*L**2/10).
- Confirm hardycross_beam support moments equal the three-moment results, the member end moments at each interior joint sum to zero, the simple-end member end moments vanish, and the sagging-positive support moment equals -end_moments[j-1][1] and end_moments[j][0] within 1e-9 relative.
- Confirm slope_deflection_member(EI, 4.0, 0.0, -2.5e-4, -10000.0, 10000.0) returns (-15000.0, 0.0): the zero prop end moment is the roller condition.
- Confirm propped_cantilever reports the anchor reactions, moments, rotations and deflections with the consistency residual R_B*f_BB - delta_B below 1e-12 N (central) and 1e-15 N (uniform), and that the carry-over identity |M_A| - (FEM + FEM/2) holds.
- Confirm portal_frame_fixed_base(60000.0, 6.0, 4.0, EI) reports beam end moment magnitude 33750.0, column top 33750.0, column base 16875.0 (= top/2 carry-over), midspan sagging 56250.0, theta_B = 8.4375e-4 = -theta_C, base vertical reactions 30000.0 each and horizontal reactions 0.0, and that slope_deflection_frame_solve reproduces every member end moment within 1e-6 relative.
- Confirm every non-physical input raises ValueError: nonpositive w, L, P, load, term or ei; a one-span three-moment call; arity mismatches on the terms, loads or moments; unknown load kinds; an unknown propped-cantilever config; and nonpositive frame inputs.
- Run the deterministic contract test offline: python3 scripts/test_statically_indeterminate.py (34 tests, exit 0).
Related leaves
- skills/structures/fem/plastic-collapse-analysis: the limit-state complement; its plastic mechanisms consume exactly the elastic end moments and reactions this leaf distributes.
- skills/structures/fem/beam-frame-analysis: the numeric 6x6 Euler-Bernoulli stiffness-method complement for the same rigid-jointed frames; it assembles no compatibility equation and distributes no moments.
- skills/structures/fem/truss-analysis: the pin-jointed axial-only stiffness complement for trusses, no redundancy distribution.
- skills/structures/fem/beam-vibration: natural frequencies of a continuous (distributed-mass) member, not a multi-span redundant beam.
- skills/structures/fem/buckling-analysis: elastic stability of compression members with effective length and secant-formula checks.
Pitfalls
- Mixing the sign conventions: the sagging-positive interior support moment of a gravity-loaded continuous beam is negative (M_B = -30833.3333333333 N m in the two-span example), while the clockwise-positive member end moment at that support from the span to the right is positive; reading one convention as the other flips the hogging moment into a sagging one.
- Reading the both-ends-fixed FEM as the propped fixed-end moment: releasing one end raises the fixed end from wL**2/12 to wL*2/8 (uniform) or PL/8 to 3PL/16 (central) by the carry-over of the released end; the moment-distribution identity |M_A| = FEM + FEM/2 checks the propped result.
- Treating three-moment support moments as magnitudes: the Clapeyron equation works in the sagging-positive convention with the simple-end condition M_0 = M_n = 0, and the load terms t = A*xbar/L are moments of the free moment diagram area, not the areas themselves.
- Forgetting the 1/2 carry-over in moment distribution: a balancing moment at a joint carries one half to the far end of the same member, and the simple end supports (DF = 1) release fully every cycle; a hand table that stops after one balance cycle is not converged.
- Using the frame closed form outside its scope: the single catalog frame is symmetric, fixed-base, no-sway, with a central beam load and common E*I; a swaying, pinned-base or unsymmetric frame needs the numeric stiffness-method leaf (beam-frame-analysis).
- Confusing elastic and plastic: the moments here are the elastic limit distribution; the collapse load and plastic hinge checks of the limit-state sibling start from these elastic peaks but belong to plastic-collapse-analysis.
- Applying the catalog outside its prismatic scope: the continuous-beam spans and all frame members share one E*I, loads are only full-span uniform or midspan point loads, and there is no support settlement, temperature, material nonlinearity or dynamics in this leaf.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_statically_indeterminate.py
The test covers the worked-example contract: fixed-end moments and Clapeyron terms, the two-span and three-span three-moment interior support moments with their closed forms, support reactions with the equilibrium sums, the moment distribution cross-checks (agreement with the three-moment results, joint equilibrium, vanishing simple-end moments, the support-moment sign convention), the slope-deflection roller-condition identities of the propped cantilever, the consistent-deformation solution with flexibility coefficients and the carry-over identity for both load configs, the peak sagging moments, the fixed-base frame end moments, rotations and reactions with the carry-over base moments, the direct 2x2 joint-equation solve cross-check, and the ValueError rejection of every non-physical input class. 34 tests, all deterministic, exit 0 under both /usr/bin/python3 and the pre-push hook interpreter.
Compliance
- Standards referenced, not reproduced: FAR 25.303 and CS 25.303 require the structure to withstand 1.5 times the limit loads without failure; the elastic end moments and reactions computed here are the limit-load force distribution that the downstream strength and margin checks, including the 1.5 ultimate-factor check, consume. The classical methods above (Roark fixed-end and continuous-beam tables, Shigley A-9 deflection cases, Bruhn redundant-structure presentation) are standard engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.