7 [[nodiscard]]
double free_bar_root(
size_t order)
noexcept
9 double x = (2.0 *
static_cast<double>(order) + 1.0) * std::numbers::pi * 0.5;
10 for (
int iteration = 0; iteration < 50; ++iteration) {
11 const double sech = 1.0 / std::cosh(x);
12 const double value = std::cos(x) - sech;
13 const double slope = -std::sin(x) + sech * std::tanh(x);
14 const double step =
value / slope;
16 if (std::abs(step) < 1e-15 * std::abs(x))
26 std::vector<double> terms(
count);
27 for (
size_t i = 0; i <
count; ++i)
28 terms[i] = base *
static_cast<double>(i + 1);
34 std::vector<double> terms(
count);
35 for (
size_t i = 0; i <
count; ++i) {
36 const auto n =
static_cast<double>(i + 1);
37 terms[i] = base * n * std::sqrt(1.0 + stretch * n * n);
44 std::vector<double> terms(
count);
48 const double first = free_bar_root(1);
49 for (
size_t i = 0; i <
count; ++i) {
50 const double ratio = free_bar_root(i + 1) / first;
51 terms[i] = base * ratio * ratio;
58 std::vector<double> terms(
count);
59 for (
size_t i = 0; i <
count; ++i)
60 terms[i] = base * std::pow(ratio,
static_cast<double>(i + 1) * step);
66 std::vector<double> pairs;
67 pairs.reserve(
values.size() * 2);
68 for (
const double v :
values) {
69 pairs.push_back(v * (1.0 - spread));
70 pairs.push_back(v * (1.0 + spread));
Ordered sequences of positive numbers.
std::vector< std::byte > values
std::vector< double > power_series(size_t count, double ratio, double step, double base)
Geometric steps: base * ratio^(k * step) for k = 1 .
std::vector< double > harmonic_series(size_t count, double base)
base * 1, base * 2, ... base * count.
std::vector< double > stretched_series(size_t count, double stretch, double base)
Integers pulled outward with order: base * n * sqrt(1 + stretch * n^2).
std::vector< double > free_bar_series(size_t count, double base)
Ratios of the transverse modes of a uniform free-free beam.
std::vector< double > split_pairs(std::span< const double > values, double spread)
Each value replaced by a close pair, v * (1 - spread) and v * (1 + spread).