Приложения (исходные коды на Python для моделирования)

Приложение A: Исходные коды на Python построения 2D модели псевдогиперболоида 2-го порядка

Рис. № 11. 2D- псевдогиперболоид 2-го порядка

Python

import numpy as np

import matplotlib.pyplot as plt

# параметры резонатора

a0 = 2      # Полуось (горизонтальная)

b0 = 3      # Полуось (вертикальная)

R = 13.7    # Радиус фокальной зоны

# вычисляем фокусы

c = np.sqrt(a0**2 + b0**2)      # Фокусное расстояние

e = c / a0                       # Эксцентриситет

print(f»Параметры:»)

print(f»  a₀ = {a0}»)

print(f»  b₀ = {b0}»)

print(f»  R = {R}»)

print(f»\nФокусы гиперболы:»)

print(f»  F₁ = {-c:.4f} (левый)»)

print(f»  F₂ = {+c:.4f} (правый)»)

# функция образующей гиперболы

def hyperbolic_horns_lower(x, a0, b0, R_line):

    «»»Нижние рога, ограниченные сверху Y=R_line»»»

    if np.abs(x) < a0:

        return 0.0

    y = b0 * np.sqrt((x / a0)**2 — 1)

    return min(y, R_line)

# генерация точек 

X_LIMIT = 10.0  # УВЕЛИЧЕНО: было 4.0 → теперь 10.0 для полного отображения

x_values = np.linspace(-X_LIMIT, X_LIMIT, 1000)  # Больше точек для гладкости

# Нижние рога

y_lower = np.array([hyperbolic_horns_lower(x, a0, b0, R) for x in x_values])

# Верхние рога (зеркальная часть)

y_upper = 2 * R — y_lower

# визуализация

fig = plt.figure(figsize=(16, 10))

ax = plt.gca()

# основные рога

ax.plot(x_values, y_lower, color=’darkorange’, linewidth=4,

        label=’Нижние рога (гипербола)’, zorder=3)

ax.plot(x_values, y_upper, color=’blue’, linewidth=4,

        label=’Верхние рога (зеркальная часть)’, zorder=3)

# ось вращения

ax.axhline(R, color=’red’, linestyle=’-‘, linewidth=2.5,

           label=f’Ось вращения Y={R}’, alpha=0.8, zorder=1)

# фокусы гиперболы — на обеих ветвях!

# нижние фокусы (на нижних рогах, y=0)

ax.scatter([c, -c], [0, 0], color=’red’, s=500, marker=’*’, zorder=10,

           edgecolors=’darkred’, linewidths=2.5)

# верхние фокусы (на верхних рогах, y=2r)

ax.scatter([c, -c], [2*R, 2*R], color=’red’, s=500, marker=’*’, zorder=10,

           edgecolors=’darkred’, linewidths=2.5,

           label=f’Фокусы гиперболы: F₁={-c:.2f}, F₂={c:.2f}’)

# Вертикальные линии через НИЖНИЕ фокусы

ax.plot([c, c], [-2, 2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)

ax.plot([-c, -c], [-2, 2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)

# Вертикальные линии через ВЕРХНИЕ фокусы ← ДОБАВЛЕНО!

ax.plot([c, c], [2*R-2, 2*R+2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)

ax.plot([-c, -c], [2*R-2, 2*R+2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)

# Текстовые метки нижних фокусов

ax.text(c+0.3, -2.5, f’F₂ = {c:.2f}’, fontsize=12, weight=’bold’,

        color=’darkred’, ha=’left’,

        bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))

ax.text(-c-0.3, -2.5, f’F₁ = {-c:.2f}’, fontsize=12, weight=’bold’,

        color=’darkred’, ha=’right’,

        bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))

# Текстовые метки верхних фокусов

ax.text(c+0.3, 2*R+2.5, f’F₂ = {c:.2f}’, fontsize=12, weight=’bold’,

        color=’darkred’, ha=’left’,

        bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))

ax.text(-c-0.3, 2*R+2.5, f’F₁ = {-c:.2f}’, fontsize=12, weight=’bold’,

        color=’darkred’, ha=’right’,

        bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))

# вершины рогов

ax.scatter([a0, -a0], [0, 0], color=’black’, s=180, zorder=6, marker=’o’,

           edgecolors=’darkgray’, linewidths=2.5, label=f’Вершины нижних рогов: ±{a0}’)

ax.scatter([a0, -a0], [2*R, 2*R], color=’black’, s=180, zorder=6, marker=’s’,

           edgecolors=’darkgray’, linewidths=2.5, label=f’Вершины верхних рогов’)

# фокальная зона

ax.plot([-a0, a0], [0, 0], color=’lime’, linewidth=8, linestyle=’-‘, alpha=0.9,

        label=f’Фокальная зона’, zorder=5, marker=’o’, markersize=6)

ax.plot([-a0, a0], [2*R, 2*R], color=’lime’, linewidth=8, linestyle=’-‘, alpha=0.9,

        zorder=5, marker=’o’, markersize=6)

# Размерные линии

# Размер a₀

ax.annotate(», xy=(0, -0.7), xytext=(a0, -0.7),

            arrowprops=dict(arrowstyle='<->’, color=’black’, lw=2.5))

ax.text(a0/2, -1.3, f’a₀ = {a0}’, fontsize=11, ha=’center’, weight=’bold’,

        bbox=dict(boxstyle=’round’, facecolor=’white’, edgecolor=’black’, linewidth=1.5, alpha=0.95))

# Размер c (фокусное расстояние)

ax.annotate(», xy=(0, 0.7), xytext=(c, 0.7),

            arrowprops=dict(arrowstyle='<->’, color=’red’, lw=2.5))

ax.text(c/2, 1.3, f’c = {c:.2f}’, fontsize=10, ha=’center’, weight=’bold’,

        color=’darkred’,

        bbox=dict(boxstyle=’round’, facecolor=’lightyellow’, edgecolor=’red’, linewidth=2, alpha=0.95))

# Размер R

ax.plot([X_LIMIT+0.5, X_LIMIT+0.5], [0, R], ‘g-‘, linewidth=2.5, alpha=0.8)

ax.plot([X_LIMIT+0.2, X_LIMIT+0.8], [0, 0], ‘g-‘, linewidth=2.5, alpha=0.8)

ax.plot([X_LIMIT+0.2, X_LIMIT+0.8], [R, R], ‘g-‘, linewidth=2.5, alpha=0.8)

ax.text(X_LIMIT+1.2, R/2, f’R = {R}’, fontsize=11, ha=’left’, weight=’bold’,

        color=’darkgreen’,

        bbox=dict(boxstyle=’round’, facecolor=’lightgreen’, edgecolor=’green’, linewidth=1.5, alpha=0.9))

# Аннотация фокусного свойства (снизу)

arrow_y = 1.5

ax.annotate(», xy=(c-0.1, arrow_y), xytext=(-c+0.1, arrow_y),

            arrowprops=dict(arrowstyle='<->’, color=’purple’, lw=3, alpha=0.6))

ax.text(0, arrow_y+0.7, ‘F₁ ← → F₂’,

        fontsize=10, ha=’center’, weight=’bold’, color=’purple’,

        bbox=dict(boxstyle=’round’, facecolor=’lavender’, alpha=0.8))

# Аннотация фокусного свойства (сверху)

arrow_y_top = 2*R + 1.5

ax.annotate(», xy=(c-0.1, arrow_y_top), xytext=(-c+0.1, arrow_y_top),

            arrowprops=dict(arrowstyle='<->’, color=’purple’, lw=3, alpha=0.6))

ax.text(0, arrow_y_top+0.7, ‘F₁ ← → F₂’,

        fontsize=10, ha=’center’, weight=’bold’, color=’purple’,

        bbox=dict(boxstyle=’round’, facecolor=’lavender’, alpha=0.8))

# Информационный текст

info_text = (f’Параметры:\n’

             f’c = √(a₀²+b₀²) = {c:.4f}\n’

             f’e = c/a₀ = {e:.4f}\n’

             f’h/R = {2*a0/R:.4f}\n’

             f’c/R = {c/R:.4f}’)

ax.text(-X_LIMIT+0.5, 2*R+5, info_text, fontsize=9, weight=’bold’, family=’monospace’,

        bbox=dict(boxstyle=’round’, facecolor=’lightyellow’, edgecolor=’black’,

                 linewidth=1.5, alpha=0.95))

#  Оформление

ax.set_title(f’2D сечение псевдогиперболоидного резонатора (a₀={a0}, b₀={b0}, R={R})\nс фокусами НА ОБЕИХ ветвях и ветвями до оси вращения’,

             fontsize=15, weight=’bold’, pad=20, color=’darkgreen’)

ax.set_xlabel(‘X (продольная ось)’, fontsize=13, weight=’bold’)

ax.set_ylabel(‘Y (радиальная ось)’, fontsize=13, weight=’bold’)

ax.grid(True, linestyle=’:’, alpha=0.4, linewidth=1)

ax.set_xlim(-X_LIMIT-1, X_LIMIT+1.5)

ax.set_ylim(-4, 2*R+6)

ax.set_aspect(‘equal’)

ax.legend(loc=’upper center’, fontsize=10, framealpha=0.98, ncol=2,

         bbox_to_anchor=(0.5, -0.04))

plt.tight_layout()

plt.savefig(‘hyperboloid_complete_foci.png’, dpi=150, bbox_inches=’tight’)

plt.show()

# Вывод результатов

print(f»\n» + «=»*70)

print(«ПОЛНАЯ ИНФОРМАЦИЯ О РЕЗОНАТОРЕ»)

print(«=»*70)

print(f»»»

ФОКУСЫ НА НИЖНИХ РОГАХ:

  F₁ = ({-c:.4f}, 0)  — левый фокус

  F₂ = ({c:.4f}, 0)  — правый фокус

ФОКУСЫ НА ВЕРХНИХ РОГАХ:

  F₁ = ({-c:.4f}, {2*R:.1f})  — левый фокус

  F₂ = ({c:.4f}, {2*R:.1f})  — правый фокус

РАССТОЯНИЕ МЕЖДУ ФОКУСАМИ:

  2c = {2*c:.4f}

  c/R = {c/R:.4f}

ВЕТВИ ДОХОДЯТ ДО ОСИ ВРАЩЕНИЯ:

  X_LIMIT = 10.0

  Полное отображение гиперболы

ФОКУСНОЕ СВОЙСТВО:

  На каждой ветви лучи циркулируют между F₁ и F₂

  Верхние и нижние ветви связаны через портали

  → Полная 3D циркуляция энергии в резонаторе!

«»»)

print(«=»*70)

Приложение В: Исходные коды на Python построения 3D модели псевдогиперболоида

Рис. № 12. 3D- псевдогиперболоид 2-го порядка

Модель:

Python

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
# Параметры из документа
a0 = 2
b0 = 2.9
R = 13.7
 
# Функция для y_lower (радиальный профиль нижних рогов)
def get_y_lower(x, a0, b0, R):
    abs_x = np.abs(x)
    if abs_x < a0:
        return 0.0
    y = b0 * np.sqrt((abs_x / a0)**2 - 1)
    return min(y, R)
 
# Расстояние от оси Y=R до профиля (радиус вращения)
def d(x, a0, b0, R):
    y_lower = get_y_lower(x, a0, b0, R)
    return R - y_lower  # Поскольку профиль симметричен, это даёт радиус
 
# Генерация сетки
x = np.linspace(-10, 10, 100)  # Ось X (осевая координата)
theta = np.linspace(0, 2 * np.pi, 50)  # Угол вращения
 
X, Theta = np.meshgrid(x, theta)
 
# Радиус для каждой точки
D = np.array([d(xval, a0, b0, R) for xval in x])
D = np.tile(D, (len(theta), 1))
 
# Координаты поверхности
Y = R + D * np.cos(Theta)  # Смещение по Y от оси
Z = D * np.sin(Theta)      # Z для вращения
 
# Построение графика
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, color='blue', alpha=0.7)  # Полупрозрачная поверхность
 
# Настройка осей
ax.set_xlabel('X (осевая координата)')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D модель резонатора: вращение вокруг оси Y=13.7')
 
# Показать сюжет
plt.show()

Приложение С: Исходные коды на Python построения профиля псевдогиперболоида 7-го порядка

Рис. № 13. Профиль псевдогиперболоида 7-го порядка

python

import numpy as np

import matplotlib.pyplot as plt

# Геометрические параметры

a0 = 2.0       # Горизонтальная полуось

b0 = 2.9        # Вертикальная полуось

R = 13.7        # Ограничение по радиусу

N_COPIES = 5    # Кол-во зеркальных слоёв

X_LIMIT = 10.0  # Отрисовка по X

c = np.sqrt(a0**2 + b0**2)  # Фокусное расстояние

def get_hyperbola_y(x, a0, b0, R_lim):

    if np.abs(x) < a0:

        return 0.0

    y = b0 * np.sqrt((x / a0)**2 — 1)

    return np.minimum(y, R_lim)

x_vals = np.linspace(-X_LIMIT, X_LIMIT, 1000)

y_base_lower = np.array([get_hyperbola_y(x, a0, b0, R) for x in x_vals])

y_base_upper = 2 * R — y_base_lower

# Визуализация

fig, ax = plt.subplots(figsize=(10, 14))

colors = [‘#3477eb’, ‘#34eb86’, ‘#eb3434’, ‘#b134eb’, ‘#ebce34’]

for i in range(N_COPIES):

    offset = i * (2 * R)

    ax.plot(x_vals, y_base_lower + offset, color=colors[i % len(colors)], lw=2.5)

    ax.plot(x_vals, y_base_upper + offset, color=colors[i % len(colors)], lw=2.5)

    ax.axhline(offset, color=’gray’, ls=’—‘, alpha=0.3)

    ax.axhline(offset + 2 * R, color=’gray’, ls=’—‘, alpha=0.3)

    ax.scatter([c, -c], [offset, offset], marker=’*’, color=’black’, s=60)  # фокусы

ax.set_title(«Стек из зеркальных торо-оболочек гиперболического профиля», fontsize=14)

ax.set_xlim(-X_LIMIT, X_LIMIT)

ax.set_ylim(-5, N_COPIES * 2 * R + 5)

ax.set_xlabel(«X (Ось симметрии)»)

ax.set_ylabel(«Y (Вертикальная ось)»)

ax.grid(True)

plt.show()

Приложение D: Исходные коды на Python построения 3-D псевдогиперболоида 6-го порядка

Рис. № 14. 3-D псевдогиперболоид 6-го порядка

Python

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

# ПАРАМЕТРЫ

a0 = 2

b0 = 2.9

R = 13.7

X_LIMIT = 8.0

N_COPIES = 5

N_STEPS = 100  # Детализация вращения

N_POINTS = 200 # Детализация кривой

# Функция образующей

def get_hyperbola_y(x, a0, b0, R_limit):

    if np.abs(x) < a0:

        return 0.0

    y = b0 * np.sqrt((x / a0)**2 — 1)

    return np.minimum(y, R_limit)

x_vals = np.linspace(-X_LIMIT, X_LIMIT, N_POINTS)

theta = np.linspace(0, 2 * np.pi, N_STEPS)

theta_grid, x_grid = np.meshgrid(theta, x_vals)

# ПОСТРОЕНИЕ 3D

fig = plt.figure(figsize=(12, 10))

ax = fig.add_subplot(111, projection=’3d’)

# Цветовая карта для слоев

colors = plt.cm.viridis(np.linspace(0, 1, N_COPIES))

for i in range(N_COPIES):

    offset = i * (2 * R)

    # Расчитываем радиусы для нижней и верхней ветвей этой копии

    # Относительно оси вращения Y=0

    y_base = np.array([get_hyperbola_y(x, a0, b0, R) for x in x_vals])

    # Слой 1: Вращение нижней ветви + offset

    r1 = y_base + offset

    Y1 = r1[:, None] * np.cos(theta_grid)

    Z1 = r1[:, None] * np.sin(theta_grid)

    X1 = x_grid

    # Слой 2: Вращение верхней ветви + offset

    r2 = (2 * R — y_base) + offset

    Y2 = r2[:, None] * np.cos(theta_grid)

    Z2 = r2[:, None] * np.sin(theta_grid)

    X2 = x_grid

    # Отрисовка поверхностей (с прозрачностью для видимости слоев)

    ax.plot_surface(X1, Y1, Z1, color=colors[i], alpha=0.3, antialiased=True)

    ax.plot_surface(X2, Y2, Z2, color=colors[i], alpha=0.3, antialiased=True)

# Оформление

ax.set_title(f’3D Резонатор: вращение 5 зеркальных копий\nвокруг оси фокусов (Y=0)’, fontsize=14)

ax.set_xlabel(‘X (Ось симметрии)’)

ax.set_ylabel(‘Y’)

ax.set_zlabel(‘Z’)

# Выравнивание осей для корректного отображения пропорций

max_range = (2 * R * N_COPIES) / 2

ax.set_ylim(-max_range, max_range)

ax.set_zlim(-max_range, max_range)

plt.tight_layout()

plt.show()