Глава 13. Вычислительный алгоритм построения общего внутреннего объёма

Настоящая глава фиксирует вычислительный алгоритм построения общего внутреннего объёма рядных псевдогиперболоидов. После того как в предыдущих главах были определены исходная гиперболическая образующая, второй порядок, рекурсивные интервалы, общий 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_typevertical, horizontal или bothВыбирает тип построения или оба типа сразу
modesection, 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-тело и не решает волновые уравнения. Но она делает главное: задаёт воспроизводимую геометрическую область, внутри которой уже можно формулировать революционную программу Геометрической Волновой Инженерии.