The arm is a cantilever.
Here is the homework.
Every STRUCTURE verdict in the studio, and the field painted along each arm, comes out of one beam solver. This page is what it is checked against, how far wrong it is, and what it cannot see. Nothing below is typed in: it is computed from the shipping solvers when the site is built, so it cannot disagree with the code that produced it.
The model
A quad arm carrying a motor at its tip is a cantilever with a lumped tip mass. For the span between the hub and the pad that is not an analogy, it is the load path — so the first bending frequency comes from Rayleigh’s method with the static tip-load deflection curve as the trial shape, integrated numerically over the arm’s real taper:
k* = ∫ E·I(x)·ψ″(x)² dx m* = ∫ ρ·A(x)·ψ(x)² dx + m_tip ψ(ξ) = (3ξ² − ξ³)/2 f₁ = √(k*/m*) / 2π
Thickness enters those two integrals at different powers — I ∝ t³ but A ∝ t — and that asymmetry is the whole reason the studio can say where to remove material rather than only how much margin is left. Near the root, curvature is large and modal displacement is nearly zero, so section is almost pure stiffness and it buys frequency; out at the pad the reverse holds. The station where the two cancel is the crossing the field marks.
The derivations in full — the choice of trial shape, the signed payoff density and its 3 − m_beam*/m* invariant, and the exact eigenvalue below — are in docs/arm-beam.md.
What it is checked against
8 comparisons, computed fresh on every build. 6 are against closed forms with a provenance older than this repo; 2 are the solver agreeing with itself through a different code path. Those are different strengths of claim and each row says which, because a table that renders them identically is quietly promoting the weaker one.
The solver integrates virtual work over the same stations it uses for everything else, so this also checks the quadrature the tapered case depends on.
Stations are sampled mid-cell, so the peak lands half a cell inboard of the true root — a known 0.8% under-read that is corrected for here rather than hidden behind a loose tolerance.
Checks the QUADRATURE only: 33/140 is ∫ψ²dξ for the same shape function, so this closed form is Rayleigh’s own approximation with the integral done by hand. The next row is the one that checks the method.
Rayleigh’s quotient is an upper bound, so the solver is always high — the question is by how much. At a bare cantilever (μ = 0) it would be 1.47%; this arm’s motor-and-prop tip mass puts it at μ = 2.55, where the static tip-load shape is very close to the true mode shape. Measured on a prismatic beam at that μ, since the tapered case has no exact solution to compare against.
The tip rotates through ψ′(L) as well as translating, and 1.5/L is ψ′ at the tip for the same shape function 33/140 came from — so this row is the quadrature check again, extended to the term that makes the tip a body instead of a point. It pins that the solver added J·ψ′(L)² and not J·something-else.
The mass ratio flatters this method and the inertia ratio does not, so the good number above is only half the story. A mode whose tip barely rotates is badly described by a shape that insists on ψ′(L) = 1.5/L, and the bias climbs with ν: at the short fixity station’s own ν = 0.6650 it is 1.65%, against 1.47% for the same arm with its tip taken as a point. That is the seeded build and not a hypothetical: a bare 1404 and a 3.5″ prop are enough to put ν past 0.6. Quoted at the short station because ν goes as 1/L² and that is the worse end once the tip has a size — the OPPOSITE end from the μ-only row above, which is worst at the long station. The bound is a fifth of the fixity band rather than a round number, because "small" here only ever meant "small against the uncertainty we already publish": the method error is 17× under it. Still an upper bound, still under the band, but one order below it rather than three.
The field the studio paints must be the same function as the frequency the verdict quotes, or it is decoration. Both sides come from the solver, so this is self-consistency — but through two different code paths, one of which never touches the field.
64 stations is the shipping default; the integral is stated rather than a spot value because two meshes do not sample the same places.
The exact eigenvalue is validated, not cited
Rayleigh’s quotient is an upperbound for any admissible shape, so the solver’s frequency is always high. Knowing by how much needs the truth, and for a prismatic cantilever with a tip mass the truth is a transcendental frequency equation in μ = m_tip / m_beam:
1 + cos z · cosh z + μ·z·(cos z · sinh z − sin z · cosh z) = 0 ω₁ = z² · √(EI / ρAL⁴)
That equation is checked here against both of its analytically known limits rather than quoted from a page — which is the stronger move, because you can verify it in seconds instead of trusting a citation. At μ = 0 it must return the published bare-cantilever eigenvalue; as μ → ∞ it must collapse to the massless-beam-with-tip-mass result z² → √(3/μ).
The method is at its best exactly where this arm uses it: a heavy tip is a static tip load, so the trial shape converges on the true mode shape as μ grows. A motor and prop put this arm 142× better than a bare beam.
That is a claim about μ, and only about μ. The tip does not merely translate as the arm bends, it rotates through ψ′(L) — so a tip body with real diameter carries a rotary inertia, and the same equation has two more terms in ν = J / (m_beam·L²):
(1 + cos z cosh z) + μ·z·(cos z sinh z − sin z cosh z) − ν·z³·(cos z sinh z + sin z cosh z) + μ·ν·z⁴·(1 − cos z cosh z) = 0
ν runs the other way. The true mode of a beam with a heavy tip inertia has a tip that barely rotates, while the static tip-load shape insists on ψ′(L) = 1.5/L — so the trial function gets worse as ν grows. Still an upper bound; no longer a tiny one.
The solver takes a tip inertia and never estimates one — J needs a radius, and a radius is a fact about a part the engine is not allowed to know. So the sum is assembled caller-side, body by body, from published envelopes: the motor contributes 2917 g·mm² and the prop 741g·mm², and almost all of both is m·d² rather than I_cg, because the whole stack sits on one side of the plate’s neutral axis. That is also why J is not a constant here: it moves with plate thickness, so what the studio hands the solver is a stack, not a number.
Two refusals survive, and one of them narrowed. The prop disc still overshoots a three-blade spread by about 247 g·mm², which makes this an over-estimate of J and therefore an under-estimate of f₁ — the conservative direction against an excitation band the mode is already sitting below. And no datasheet says whether a quoted motor height includes its mount base, so J is computed under both readings and the worse one shipped: ±597 g·mm², about 16.3% of the total, published rather than averaged away. Both readings land on the same modal posture, which is the finding. What the registry still cannot dimension is left out entirely and named in the blind spots below — a prop with no published hub diameter gets no tip body at all, not a smaller one.
Note which end of the fixity band pays more: J·ψ′(L)² goes as 1/L², so the short station loses 17.2% where the long one loses 12.7%. The band falls and narrows at once — and since the verdict reads whichever end is nearer the excitation, neither station is the one to watch in general.
The maths is not the uncertainty
Which is the point of measuring it rather than asserting it — and the reason the headline moved. At μ alone the method’s error is +0.0103%, three orders of magnitude under everything else on this page. Carrying the tip’s rotary inertia puts it at +1.65%, which is about one order under instead. The two things that actually move the answer are still a modelling choice and a placeholder, and both are still larger — but by a margin worth stating rather than one worth rounding to zero.
Where a plate arm becomes “built in” has no single right answer. The arm leaves a square hub on the diagonal, so it crosses at the corner; the junction fillet then adds material outboard of that and pushes effective fixity further out. Over that band f₁ moves by 28.8%, which is wide enough to change the verdict — so the solver reports both stations rather than picking one and presenting a soft number as a sharp one. Each check reads whichever end is conservative for it.
Anyone who wants a better structural answer should print coupons and run FEA on the junction. Nobody should go looking for a better mode shape.
The load case
One thrust number, used everywhere: the top bench row, halved. The bench figure is a manufacturer’s static-mount measurement; the derate is a recorded decision applied through a single constant, so the ledger, the verdicts and this model cannot disagree about what load they are talking about. The excitation band is the 1P shaft order from measured rpm, not KV × volts.
The material, and where each number came from
Quoted from apps/poltergeist/registries/filaments.json, which carries provenance beside every figure because where a number came from matters as much as the number. One of these is a self-declared placeholder — and it is the one the structural answer is most sensitive to. That is not an oversight; it is the point of recording provenance at all.
| Field | Value | Source |
|---|---|---|
| Material | Bambu Lab PAHT-CF (PA12-CF) | manufacturer |
| tensileModulusMPa | 3860 | manufacturer TDS |
| yieldStrengthMPa | 92 | manufacturer TDS |
| densityGCm3 | 1.06 | manufacturer TDS |
| beadDirectionFactor | 0.85 | AUTHORED placeholder, pending coupons |
| conditioning | dry | every row above is this state — takes up 0.88% water at equilibrium @25 °C / 55 %RH |
| Captured | 2026-07-28 | datasheet ↗ |
TDS V3.0, printed specimens annealed+dried 80 °C/12 h. XY block authored; Z block: modulus 2180, strength 47, elongation 4.1 → zAdhesionFactor = 47/92. yield=ultimate (TDS reports single tensile strength). beadDirectionFactor 0.85 is a placeholder pending PH5 coupons.
Every row above is a dry specimen, which is a state a flying airframe is never in — nylon takes up water and softens. Rather than guess a wet modulus this filament has no published one for, the model asks how far it could be wrong before it changed its mind: the safety factor holds until yield falls 96.5%, tip deflection until modulus falls 91.8%, and the first-bending verdict rewords at 6.3%. The worst wet knockdown any manufacturer in the registry publishes is 71.0%. Only the mode result is anywhere near it — and it moves the wrong way to worry about, because a softer arm drops f₁ out of the 1P band rather than into it. Moisture is still an open question for this design — a ducted prop gap is a dimensional tolerance, and swell eats tolerances — but it is not a question about the arm.
What this model cannot see
Not a disclaimer. Each line is a thing FEA or a destructive coupon has to answer, and a later phase is where it gets answered.
- The arm–hub junction. Beam theory has no stress concentration, and the fillet radius that governs it is exactly where this model stops. That is what PH4’s FEA is for.
- Interlayer splitting. Thrust bending puts fibre stress in-plane, which is the good direction; the crash and prop-strike case loads the layer bonds instead, and nothing here says anything about it.
- Torsion. The refusal here has changed footing but not outcome: the motor’s polar inertia is computable now that the registry dimensions it, so what is missing is no longer a fact. It is the other half of the model — a torsional mode needs a torsional STIFFNESS, GJ over the tapered section with the warping a printed rectangle actually has, and that is a second solver rather than a second term in this one. Gyroscopic whirl is deferred on the same grounds.
- Props the registry cannot dimension. J needs a hub diameter and a hub thickness, and only one of the three seeded props publishes both. A build on either of the others gets no tip body at all — not a smaller J, none — so its f₁ is the point-mass answer, high by the 17% the row above measures. The fallback is silent by design: inventing a hub diameter to avoid it would put a made-up number where a missing one is at least honest.
- Where the motor’s height is measured from. No datasheet in the registry says whether a quoted height includes the 2 mm mount base, so J is computed under both readings and the WORSE one shipped, with the difference published as ±597 g·mm² — about 16% of J. Both readings give the same modal verdict, which is the finding; a caliper on the actual motor would close it.
- The real planform. The section is an idealised rectangle at each station; the printed arm has a fillet, a chamfer and a pad that the beam integral does not see.
- Fatigue. Every number here is a single static application of the derated peak thrust.