MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Series.cpp
Go to the documentation of this file.
1#include "Series.hpp"
2
4
5namespace {
6
7 [[nodiscard]] double free_bar_root(size_t order) noexcept
8 {
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;
15 x -= step;
16 if (std::abs(step) < 1e-15 * std::abs(x))
17 break;
18 }
19 return x;
20 }
21
22}
23
24std::vector<double> harmonic_series(size_t count, double base)
25{
26 std::vector<double> terms(count);
27 for (size_t i = 0; i < count; ++i)
28 terms[i] = base * static_cast<double>(i + 1);
29 return terms;
30}
31
32std::vector<double> stretched_series(size_t count, double stretch, double base)
33{
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);
38 }
39 return terms;
40}
41
42std::vector<double> free_bar_series(size_t count, double base)
43{
44 std::vector<double> terms(count);
45 if (count == 0)
46 return terms;
47
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;
52 }
53 return terms;
54}
55
56std::vector<double> power_series(size_t count, double ratio, double step, double base)
57{
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);
61 return terms;
62}
63
64std::vector<double> split_pairs(std::span<const double> values, double spread)
65{
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));
71 }
72 return pairs;
73}
74
75} // namespace MayaFlux::Kinesis::Discrete
Ordered sequences of positive numbers.
glm::vec3 value
std::vector< std::byte > values
Definition VDBWriter.cpp:26
size_t count
std::vector< double > power_series(size_t count, double ratio, double step, double base)
Geometric steps: base * ratio^(k * step) for k = 1 .
Definition Series.cpp:56
std::vector< double > harmonic_series(size_t count, double base)
base * 1, base * 2, ... base * count.
Definition Series.cpp:24
std::vector< double > stretched_series(size_t count, double stretch, double base)
Integers pulled outward with order: base * n * sqrt(1 + stretch * n^2).
Definition Series.cpp:32
std::vector< double > free_bar_series(size_t count, double base)
Ratios of the transverse modes of a uniform free-free beam.
Definition Series.cpp:42
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).
Definition Series.cpp:64