Настоящая глава фиксирует вычислительный алгоритм построения общего внутреннего объёма рядных псевдогиперболоидов. После того как в предыдущих главах были определены исходная гиперболическая образующая, второй порядок, рекурсивные интервалы, общий n-й порядок, рядность, граница и геометрические режимы, здесь геометрия переводится в воспроизводимую процедуру. В этой редакции глава строго согласована с финальным скриптом и поэтому не вводит операций, которых скрипт фактически не выполняет.
Главная правка относительно прежней версии состоит в следующем: текущий скрипт не строит двоичную 2D-маску как обязательный внутренний шаг и не извлекает 3D-поверхность из контуров такой маски. Его реальная основа — массивы радиальных интервалов lo/hi на общей оси global_axis, операция Merge и построение границ этих интервалов в 2D и 3D. Именно этот алгоритм теперь считается эталонным.
13.1. Назначение вычислительного алгоритма
Вычислительный алгоритм не является вспомогательной иллюстрацией к теории. Он выполняет роль строгого конструктора объекта Ωₙ,ₘ. Если формулы предыдущих глав задают математический закон, то скрипт задаёт процедуру получения конкретной дискретной геометрии: от входных параметров до набора PNG-файлов с меридиональными сечениями и поверхностями границы.
Алгоритм должен сохранять три принципа: рекурсивность, объёмность и запрет искусственных соединений. Рекурсивность означает, что каждый порядок строится из предыдущего. Объёмность означает, что строятся не только ветви, а допустимые внутренние интервалы. Запрет искусственных соединений означает, что ряды, компоненты и разрывы не соединяются прямыми отрезками, если такой связи нет в самой геометрии.
13.2. Входные параметры
Финальный скрипт принимает конечный набор параметров, достаточный для построения всех порядков от 2 до n и для формирования рядной системы. Основные параметры приведены в таблице 13.1.
Таблица 13.1. Входные параметры скрипта
| Параметр | Смысл | Роль в алгоритме |
| a, b | Параметры исходной гиперболической образующей | Определяют форму базового открытого профиля |
| R | Базовый радиальный масштаб второго порядка | Задаёт вертикальный профиль ρᵥ и горизонтальный профиль xₕ |
| offsets = [R₁, R₂, …] | Список рекурсивных смещений | Число элементов списка равно n−2; каждый элемент повышает порядок на один шаг |
| geometry_type | vertical, horizontal или both | Выбирает тип построения или оба типа сразу |
| mode | section, surface или all | Выбирает 2D-сечение, 3D-поверхность или оба режима вывода |
| m | Число одинаковых осевых экземпляров | Задаёт рядность системы |
| h | Осевой зазор, касание или перекрытие | Входит в шаг между центрами step = 2H + h |
| npts | Число узлов базовой осевой сетки | Влияет на дискретную точность построения |
| outdir | Папка вывода | Содержит сохранённые PNG-файлы |
| show | Показывать ли рисунки интерактивно | Не влияет на математику построения |
Параметры по умолчанию: a = 0,5; b = 1; R = 15; offsets = [14, 30]; geometry_type = both; mode = all; m = 3; h = −2; npts = 900. Эти значения создают четвёртый порядок и демонстрируют режим, где уже возникает необходимость корректного объединения пересекающихся или вложенных компонент.
13.3. Базовые сетки вертикального и горизонтального типов
Первый вычислительный этап — построение базовой осевой сетки и базового расстояния d(ξ). Для вертикального типа используется открытый профиль
ρᵥ(|s|) = R − b √((|s|/a)² − 1), a ≤ |s| ≤ L,
L = a √(1 + (R/b)²).
В вычислительном виде вертикальный тип имеет две осевые ветви сетки: левую область s ∈ [−L, −a] и правую область s ∈ [a, L]. Центральный промежуток не заполняется и не соединяется искусственной линией.
Для горизонтального типа используется исправленный повернутый профиль
xₕ(u) = a √(1 + ((R − |u|)/b)²), |u| ≤ R.
Горизонтальная сетка непрерывна по u ∈ [−R, R]. Нулевая точка u = 0 принудительно включается в сетку, если она отсутствует после дискретизации. Это повышает устойчивость симметрии и исключает ложные сдвиги центра.
13.4. Рекурсивное построение радиальных интервалов
Второй вычислительный этап — построение радиальных интервалов. Для второго порядка каждый осевой узел получает один интервал
I₂(ξ) = { [0, d(ξ)] }.
Затем каждый интервал [lo, hi] преобразуется очередным смещением Rₖ. В соответствии со скриптом строятся две новые области:
[ max(Rₖ − hi, 0), max(Rₖ − lo, 0) ] и [ Rₖ + lo, Rₖ + hi ].
Эта формула является вычислительной сердцевиной всей теории. Она заменяет прежнюю неточную запись через общий оператор |R − r|. Нижняя граница радиуса обрезается нулём, потому что отрицательный радиус не является допустимой координатой объёма вращения.
После каждого шага массив интервалов удваивается как формальная структура, но физическая структура не обязана иметь удвоенное число компонент. Позднейшая операция Merge может объединить интервалы, если они касаются или перекрываются.
13.5. Осевые экземпляры и формирование набора Piece
Для построения рядной системы каждый экземпляр переносится вдоль общей оси. Если H — половина длины одного экземпляра вдоль оси, то шаг между центрами равен
step = 2H + h.
Осевые сдвиги имеют вид
Δⱼ = −j(2H + h), j = 0, 1, …, m−1.
В скрипте каждый такой перенесённый интервал представляется объектом Piece, содержащим три массива: axis, lo, hi. Для вертикального типа в набор Piece входят левые и правые базовые участки каждого ряда. Для горизонтального типа входит один непрерывный осевой участок каждого ряда. Далее все Piece объединяются на общей оси.
13.6. Общая ось, интерполяция и Merge
Ключевой вычислительный шаг состоит в построении единой оси global_axis. Она образуется из объединения осевых узлов всех Piece, а затем может уплотняться дополнительной линейной сеткой. Каждый Piece интерполируется на global_axis, причём вне собственного осевого диапазона получает значение NaN. Это важно: NaN разрывает график и не позволяет Matplotlib соединять несвязанные компоненты.
На каждом осевом узле собирается список всех активных интервалов [lo, hi]. Затем применяется слияние: пересекающиеся или соприкасающиеся интервалы объединяются в один. Формально это можно записать так:
I^{union}(ξⱼ) = Merge( { [loᵢ(ξⱼ), hiᵢ(ξⱼ)] } ).
Именно здесь реализуется главный принцип общей геометрии: сами порождающие компоненты не удаляются как математические источники построения, но их общая перекрывающаяся часть не дублируется в итоговом объёме.
13.7. Защита от искусственных соединительных линий
Отдельная часть алгоритма посвящена защите от артефактов. Это особенно важно, потому что прежние версии визуализации могли создавать прямые служебные линии там, где между компонентами должен быть разрыв. В финальном скрипте такая ошибка устраняется несколькими способами.
• 2D-заливка по умолчанию отключена, чтобы fill_between и fill_betweenx не создавали замыкающие прямые отрезки.
• В пустые промежутки между осевыми покрытиями добавляются контрольные точки, в которых активных интервалов нет.
• Маски активности разбиваются на непрерывные сегменты; большие скачки по оси принудительно разрывают линию.
• Кривые дополнительно разбиваются при негеометрических скачках радиуса, связанных со сменой индекса объединённого интервала.
• В 3D поверхности строятся только по непрерывным сегментам hi и, если lo > 0, по внутренним сегментам lo.
Поэтому финальный результат не является дорисованной оболочкой. Это визуализация реальных границ объединённого объёма.
13.8. Построение 2D-сечений
Режим section строит меридиональное сечение общего объёма. Для каждой объединённой компоненты рисуются внешняя граница hi и, когда она существует, внутренняя граница lo. Если lo = 0, внутренняя тороидальная поверхность не рисуется как отдельная стенка, потому что компонент доходит до оси.
В вертикальном и горизонтальном типах используется одинаковая логика интервальных границ, но различается пространственная интерпретация оси. В вертикальном типе осевая координата соответствует продольной координате s, а радиус откладывается поперёк неё. В горизонтальном типе осевая координата соответствует u, а радиус является xₕ-подобной величиной после поворота исходного контура.

Рис. 13.1. Вертикальный тип: последовательность 2D-сечений для порядков 2, 3 и 4 при a = 0,5; b = 1; R = 15; R₁ = 14; R₂ = 30; m = 3; h = −2. Рисунки построены финальным скриптом.

Рис. 13.2. Горизонтальный тип: последовательность 2D-сечений для порядков 2, 3 и 4 при тех же параметрах. Видно, что алгоритм не дорисовывает искусственные соединения между компонентами.
13.9. Построение 3D-поверхностей границы
Режим surface строит не твердотельную CAD-модель и не объёмную конечную сетку, а поверхности границы общего объёма. Для вертикального типа кривая вращается вокруг оси X. Для горизонтального типа кривая вращается вокруг оси Y. В обоих случаях используются функции вращения, создающие координаты поверхности по углу φ.
Вертикальный тип: X = ξ, Y = ρ cos φ, Z = ρ sin φ.
Горизонтальный тип: X = ρ cos φ, Y = ξ, Z = ρ sin φ.
Чтобы сохранять реальный масштаб фигуры, после построения поверхностей применяется выравнивание масштаба по всем трём осям. Это принципиально: геометрия должна быть показана без растяжения, сжатия и ложного впечатления о форме.

Рис. 13.3. 3D-поверхности границы общего объёма четвёртого порядка для вертикального и горизонтального типов. Параметры: a = 0,5; b = 1; R = 15; R₁ = 14; R₂ = 30; m = 3; h = −2.
13.10. Цикл по порядкам от 2 до n
Финальный скрипт строит не только конечный порядок n. Он проходит по всем порядкам
p = 2, 3, …, n,
и для каждого p использует только первые p−2 смещений из списка offsets. Поэтому при offsets = [R₁, R₂] автоматически строятся второй, третий и четвёртый порядки. Это свойство важно для теории: оно позволяет видеть не только итоговую форму, но и всю историю геометрического роста.
Схематически главный цикл можно записать так:
for p = 2 … len(offsets)+2:
used_offsets = offsets[0 : p−2]
построить интервалы порядка p
построить объединённые компоненты на global_axis
сохранить section и/или surface

Рис. 13.4. Регулярный пример роста порядка от n = 2 до n = 5 для вертикального типа. Параметры: a = 0,8; b = 1; R = 10; R₁ = 18; R₂ = 40; R₃ = 90; m = 1; h = 0.
13.11. Рядность как вычислительный уровень поверх порядка
Алгоритм принципиально разделяет внутренний порядок n и внешнюю рядность m. Порядок определяет глубину рекурсивного построения одного экземпляра. Рядность создаёт m одинаковых экземпляров на общей оси. Поэтому увеличение m не меняет n и не увеличивает число рекурсивных смещений.
Параметр h управляет только осевой компоновкой. Если h > 0, между экземплярами возникает зазор. Если h = 0, они касаются. Если h < 0, их осевые диапазоны перекрываются, и операция Merge должна корректно объединить общую часть.

Рис. 13.5. Сравнение рядной сборки: слева режим перекрытия h = −2, справа режим зазора h = 6. Оба изображения построены для вертикального типа четвёртого порядка.
13.12. Выходные данные и диагностические сообщения
Главная функция возвращает словарь result. Его назначение — не заменить геометрические массивы, а зафиксировать параметры построения, список сохранённых файлов и предупреждения диагностики. Основные поля приведены в таблице 13.2.
Таблица № 13.2. Выходные данные
| Поле result | Смысл |
| a, b, R | Параметры базовой геометрии |
| offsets | Список рекурсивных смещений |
| n_order | Итоговый порядок, равный len(offsets)+2 |
| focus_c | Фокусное расстояние исходной гиперболической образующей |
| morphology | Грубая диагностическая метка, не заменяющая полную классификацию режимов |
| m, h | Параметры рядной компоновки |
| volume_mode | Текстовая фиксация режима объединения объёмных компонент |
| saved_files | Список PNG-файлов, созданных скриптом |
| warnings | Предупреждения о касании, пересечении или вложении компонент |
Предупреждения не запрещают построение. Они сообщают, что выбранный режим требует объединения объёмов. Это особенно важно для революционной части идеи: пересечения и вложения не являются аварией, а могут быть источником богатой внутренней геометрии для последующего волнового исследования.
13.13. Что алгоритм уже делает и что является следующим этапом
Для научной честности необходимо отделить текущую функциональность скрипта от дальнейшей исследовательской программы.
Таблица 13.3. Что алгоритм уже делает и что является следующим этапом
| Уже реализовано в финальном скрипте | Не является штатным результатом текущей версии |
| Построение вертикального и горизонтального типов | Автоматический расчёт всех физических волновых полей |
| Построение всех порядков от 2 до n | Монте-Карло трассировка лучей |
| Рекурсивные интервалы lo/hi | Автоматическая топологическая классификация связности |
| Merge пересекающихся и касающихся интервалов | Расчёт собственных мод и резонансных частот |
| 2D-сечения общего объёма | Полная CAD/mesh-модель объёма |
| 3D-поверхности границы общего объёма | Готовый электромагнитный/акустический решатель |
Такое разделение не ослабляет теорию, а делает её сильнее. Скрипт задаёт воспроизводимую геометрическую область. Следующие главы должны строить на этой области лучевую, Монте-Карло и волновую физику, не смешивая геометрический этап с физическим решателем.

Рис. 13.6. Регулярные 3D-поверхности пятого порядка для вертикального и горизонтального типов. Эти изображения показывают, что алгоритм уже способен строить сложные границы, готовые для последующей физической постановки.
13.14. Проверки корректности
Для каждой вычислительной серии должны выполняться проверки корректности. Они не являются декоративными: без них можно получить красивую картинку, не соответствующую реальной геометрии.
• Проверка положительности a, b и R.
• Проверка, что m является целым числом не меньше единицы.
• Проверка допустимых значений geometry_type и mode.
• Проверка предупреждений validate_offsets: пересечение и касание должны быть распознаны, но не запрещены.
• Визуальный контроль 2D-сечений перед анализом 3D-поверхностей.
• Проверка равного масштаба по всем трём осям в 3D.
• Проверка отсутствия искусственных прямых между несвязными компонентами.
Именно такая система контроля превращает скрипт из генератора иллюстраций в эталонную вычислительную базу теории.
13.15. Выводы главы
Главный объект алгоритма — общий внутренний объём Ωₙ,ₘ, заданный через объединение интервальных компонент. Построение не сводится к ветвям и не заменяется внешней оболочкой.
Основной вычислительный закон состоит в рекурсивном преобразовании интервалов [lo, hi], их переносе по рядам, объединении на global_axis и последующем построении 2D-сечений и 3D-поверхностей границы. Текущая версия скрипта не использует 2D-маску как обязательный этап, не строит CAD-тело и не решает волновые уравнения. Но она делает главное: задаёт воспроизводимую геометрическую область, внутри которой уже можно формулировать революционную программу Геометрической Волновой Инженерии.