<!-- canonical: https://jmrplens.github.io/phonometry/vibration/structural/building-response/ -->
Source: https://jmrplens.github.io/phonometry/vibration/structural/building-response/

# Predicting a building's own frequency (ISO 4866)

[Vibration damage to structures](https://jmrplens.github.io/phonometry/vibration/structural/structural-damage/)
reads a measured velocity against a guideline value that depends on frequency,
and in the topmost floor plane it stops depending on frequency because the
building is answering at its own. Both readings assume you know roughly where
that own frequency is. This page is what ISO 4866 says to do when you cannot
measure it.

Measure it if you can: that is the main body of the standard and it comes
first. Annex D is the fallback, for when a direct measurement cannot be made,
or high damping, subcomponent resonances or other practical problems limit how
useful it is. It offers four predictors and is candid about every one.

## 1. Four predictors, and what they are made of

The simplest counts storeys. $f = 10/n$ hertz, which is the same rule
DIN 4150-3 prints in its 6.4 and this library already publishes as
`storey_fundamental_frequency`; here it is the ``"storeys"`` model, so the
four predictors can be compared through one entry point.

The other three are the shapes the period $T$ takes in national codes, each
with a coefficient the codes disagree about:

$$
T = k_1 h \qquad
T = \frac{k_2 h}{\sqrt{b}} \qquad
T = \frac{k_3 h}{\sqrt{b}} \sqrt{\frac{h}{h + b}}
$$

with $h$ the height and $b$ the width parallel to the force, both in metres.
The first knows only how tall the building is. The second adds how wide it is,
which is what actually resists the sway. The third adds a slenderness factor,
$\sqrt{h/(h+b)}$, which is always below 1 and so shortens the period relative
to the second form. It shortens it *least* for a tall narrow building, where
the factor approaches 1, and most for a squat wide one.

D.2 prints a **range** for each coefficient rather than a value: 0,014 to 0,03
for $k_1$, 0,087 to 0,109 for $k_2$, 0,06 to 0,08 for $k_3$. The range is the
spread across the codes it collected them from, and the annex offers no way to
choose inside it, so `fundamental_period` takes the midpoint unless you name a
coefficient.

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/diagram_building_frequency_predictors_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/diagram_building_frequency_predictors.svg" alt="Elevation of an eighteen-storey building sixty metres tall and fifteen metres wide, drawn to scale on the ground, with four horizontal force arrows against one facade, the width b dimensioned parallel to them under the building, the height h dimensioned up that same side and clear of the arrows, and the fundamental translation mode drawn as the same outline swayed in the direction of the force; a note gives h over b as 4 and the slenderness factor, the square root of h over h plus b, as 0,89. To the right, four rows show what each predictor reads off that building and what it gives: the storey rule f = 10/n reads n alone and gives 0,56 hertz, a period of 1,8 seconds; Formula D.1, T = k1 h, reads h, with k1 from 0,014 to 0,03, and gives 0,56 to 1,19 hertz; Formula D.2, T = k2 h over the square root of b, reads h and b, with k2 from 0,087 to 0,109, and gives 0,59 to 0,74 hertz; Formula D.3, T = k3 h over the square root of b times the slenderness factor, reads h and b too, with k3 from 0,06 to 0,08, and gives 0,90 to 1,20 hertz, each row with its period beside it. A note says the four span 0,56 to 1,20 hertz on this one building and that D.2 gives no rule for choosing inside a range. Two boxes at the foot carry the fit of Figure D.1, f = 46/h or T = 0,022 h from 163 rectangular-plan buildings, which gives 0,77 hertz here with errors of plus or minus fifty per cent not uncommon, from 0,38 to 1,15 hertz, and the damping of D.4, for which no proven method exists and 0,5 % to 2,1 % of critical can occur, with large differences between orthogonal modes. Two lines under them say the annex is for when a measurement cannot be made or is limited by high damping or subcomponent resonances, and that a computer model correlates with measurement worse than f = 46/h, an unproven one not to be assumed more accurate" width="100%"></picture>

*The building the code below describes twice, and what each predictor takes
from it. The three code forms give a period and a range for its coefficient,
so on one building they give a span, not a frequency; the fit to measurement
gives one value with errors of ± 50 % not uncommon around it, and damping has
no proven method at all.*

The four predictors take different arguments, so comparing them means
describing the same building twice: eighteen storeys at a shade over three
metres each is the sixty metres the other three are given.

```python
from phonometry import vibration

# The same sixty-metre building, fifteen wide, by each of the four predictors.
for model, kwargs in (
    ("storeys", {"storeys": 18}),        # 18 storeys, about 3.3 m each
    ("height", {"height_m": 60.0}),
    ("height_width", {"height_m": 60.0, "width_m": 15.0}),
    ("slenderness", {"height_m": 60.0, "width_m": 15.0}),
):
    f = vibration.fundamental_frequency(model, **kwargs)
    print(model, round(f, 2), "Hz")
# storeys 0.56 Hz / height 0.76 Hz / height_width 0.66 Hz / slenderness 1.03 Hz
```

## 2. The fit to measurement, and the error it admits

D.2 closes by leaving the codes aside and fitting one curve to data: 163
rectangular-plan buildings give $f = 46/h$ hertz, equivalently $T = 0{,}022\,h$
seconds. Two things about that line are worth carrying away.

The first is quiet and this library pins it with a test: **0,022 is also the
middle of the $k_1$ range** the codes span. The oldest and crudest of the code
forms, taken at the centre of its spread, is the measured fit.

The second is the annex being honest about accuracy. Around that line, errors
of **± 50 % are not uncommon**, and D.2 says this is typical of what an
empirical formula can do. D.3 then says something a reader does not expect: the
correlation between *computed* frequencies, from a standard structural model,
and measured ones is **worse** than the correlation with $46/h$, because a
model is only as good as its idea of what the building is made of.

<picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/building_frequency_prediction_dark.svg"><img src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/building_frequency_prediction.svg" alt="Two panels. The left panel plots fundamental frequency against building height on logarithmic axes from six to two hundred and fifty metres: the f = 46/h fit as a solid line inside a shaded plus-or-minus fifty per cent band, with the three code forms drawn over it, the height form lying on the fit, and the height-and-width and slenderness forms each crossing it from below to above as the building grows taller, the slenderness form crossing at about thirty metres and the height-and-width form at about eighty. The right panel gives, for one sixty-metre building fifteen metres wide, the frequency span each coefficient range allows as a horizontal bar: 0,56 to 1,19 hertz for the height form, 0,59 to 0,74 for the height-and-width form and 0,90 to 1,20 for the slenderness form, against a vertical line at the 0,77 hertz the fit gives." width="94%"></picture>

<details>
<summary>Show the code for this figure</summary>

```python
import matplotlib.pyplot as plt
import numpy as np
from phonometry import vibration

heights = np.logspace(np.log10(6.0), np.log10(250.0), 300)
fit = np.asarray(vibration.height_fundamental_frequency(heights))

fig, ax = plt.subplots()
ax.fill_between(
    heights,
    fit * (1.0 - vibration.EMPIRICAL_FREQUENCY_TOLERANCE),
    fit * (1.0 + vibration.EMPIRICAL_FREQUENCY_TOLERANCE),
    alpha=0.2,
    label=r"$\pm$50 %",
)
ax.loglog(heights, fit, label="$f = 46/h$")

# The three code forms over it, for a building four times as tall as it is
# wide, which is what makes them comparable on one axis.
for model in ("height", "height_width", "slenderness"):
    values = [
        vibration.fundamental_frequency(
            model,
            height_m=float(h),
            **({} if model == "height" else {"width_m": float(h) / 4.0}),
        )
        for h in heights
    ]
    ax.loglog(heights, values, "--", label=model)

ax.set(xlabel="Building height $h$ [m]", ylabel="Fundamental frequency $f$ [Hz]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()

# One estimate, drawn on the same line with its band:
res = vibration.estimate_fundamental_frequency(
    "height_width", height_m=60.0, width_m=15.0
)
print(round(res.frequency_hz, 2), tuple(round(b, 2) for b in res.bounds_hz))
# 0.66 (0.33, 0.99)
res.plot()
plt.show()
```

</details>

*The predictors against each other. The height form sits on the measured fit
because the middle of its coefficient range is the fit's own coefficient. The
right panel is the cost of the choice: on one building, picking a code rather
than a formula moves the answer by a factor of two.*

## 3. Damping, which nothing predicts

D.4 is short and the shortness is the message. No proven method of predicting
damping exists. What the annex reports is measurement: between **0,5 % and
2,1 %** of critical on ten buildings where soil-structure interaction was
negligible, with the two orthogonal translation modes of the same building
often far apart. Damping is partly a function of construction procedure and
workmanship, so anticipate large errors.

```python
from phonometry import vibration

low, high = vibration.DAMPING_RATIO_RANGE
print(f"{100 * low:g} % to {100 * high:g} % of critical")   # 0.5 % to 2.1 %
```

The library publishes the range and no estimator, which is the honest shape of
D.4: a number to sanity-check a measured decay against, not one to assume.

## What this guide covers

The four **empirical predictors** of Annex D: the storey rule of D.2, the
three code forms (D.1), (D.2) and (D.3) with the coefficient ranges D.2 prints
for each, and the $f = 46/h$ fit D.2 closes with, as frequencies or as periods.

The **error** those predictions carry: the ± 50 % band of D.2, published as a
constant and as bounds around any prediction.

The **damping range** measured in D.4, as a range and not as an estimator,
because the annex offers none.

**Nothing here measures a frequency.** The main body of ISO 4866, which is the
measurement this annex is the fallback for, is not implemented: no transducer
requirements, no data acquisition, no modal extraction from a measured
response.

**The classifications are not here.** Annex B classifies buildings, foundations
and soils into the groups and classes that decide what tolerance a structure
gets, and Annex A gives ranges of structural response; both are described in
the standard and neither is implemented. Annex E, the vibrational interaction
of a foundation with the soil, is likewise out.

**No computer model.** D.3 names the ESDU methods for core, shear and frame
buildings, and says a method not calibrated against reliable experimental data
should not be assumed more accurate than the empirical predictors. None of
them is implemented here, and this page is not a substitute for one.

## See also

- [Vibration damage to structures (DIN 4150-3)](https://jmrplens.github.io/phonometry/vibration/structural/structural-damage/):
  the damage question a building frequency is estimated for, and where the
  storey rule also appears; its guideline values are read at the dominant
  frequency of the measured vibration, not at the frequency predicted here.
- [Evaluating machine vibration (ISO 20816-1)](https://jmrplens.github.io/phonometry/vibration/machinery/machine-vibration-evaluation/):
  the same idea of a frequency-shaped criterion, applied to a machine.
- [Mechanical mobility and the FRF family (ISO 7626-1)](https://jmrplens.github.io/phonometry/vibration/structural/mechanical-mobility/):
  the vocabulary a measured response is expressed in, when there is one.

## References

- International Organization for Standardization. (2010). *Mechanical
  vibration and shock — Vibration of fixed structures — Guidelines for the
  measurement of vibrations and evaluation of their effects on structures*
  (ISO 4866:2010).
  Annex D: the storey rule and the three code forms of D.2 with their
  coefficient ranges, the f = 46/h fit D.2 closes with and the ± 50 % accuracy
  it admits, and the measured damping values of D.4.

## Standards

ISO 4866:2010, *Mechanical vibration and shock — Vibration of fixed structures
— Guidelines for the measurement of vibrations and evaluation of their effects
on structures*: Annex D only. The four empirical predictors of the fundamental
translation frequency with the coefficient ranges D.2 prints, the measured
`f = 46/h` fit D.2 closes with and the ± 50 % accuracy it admits, and the
damping values of D.4, which the annex reports without offering an estimator.
The measurement the annex is a fallback for, the classifications of Annex B, the
response ranges of Annex A and the soil interaction of Annex E are not
implemented.
