gemini Код (Text): import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from IPython.display import HTML # ============================================================ # 1. ОБЩИЕ ПАРАМЕТРЫ СИСТЕМЫ # ============================================================ G = 1.0 M = 1.0 c_rel = 6.0 # Скорость света для ОТО (1PN) c_delay = 8.0 # Скорость поля для задержки dt = 0.0008 steps = 35000 frames_count = 250 steps_per_frame = steps // frames_count # Начальные условия (небольшой эксцентриситет для наглядности) r0 = 1.0 e = 0.15 v0 = np.sqrt(G * M * (1 + e) / (r0 * (1 - e))) init_pos = np.array([r0 * (1 - e), 0.0]) init_vel = np.array([0.0, v0]) # ============================================================ # 2. ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ УСКОРЕНИЙ # ============================================================ # Модель 1: ОТО (1PN) def accel_oto(pos, vel): r = np.linalg.norm(pos) v2 = np.dot(vel, vel) rv = np.dot(pos, vel) a_N = -G * M * pos / r**3 factor = (4 * G * M / r - v2) / c_rel**2 v_factor = 4 * rv / c_rel**2 return a_N * (1 + factor) + (G * M / r**3) * v_factor * vel # Модель 2: Классический Ньютон def accel_newton(pos): r = np.linalg.norm(pos) return -G * M * pos / r**3 # Модель 3: Наивная Задержка def accel_delay(pos, vel): r = np.linalg.norm(pos) delay = r / c_delay retarded_center = -vel * delay dr = retarded_center - pos r_ret = np.linalg.norm(dr) return G * M * dr / r_ret**3 # ============================================================ # 3. РАСЧЕТ ТРАЕКТОРИЙ # ============================================================ # --- 1. ОТО (1PN) --- traj_oto = [init_pos.copy()] p, v = init_pos.copy(), init_vel.copy() for _ in range(1, steps): # RK4 k1_v = accel_oto(p, v); k1_p = v k2_v = accel_oto(p + 0.5*dt*k1_p, v + 0.5*dt*k1_v); k2_p = v + 0.5*dt*k1_v k3_v = accel_oto(p + 0.5*dt*k2_p, v + 0.5*dt*k2_v); k3_p = v + 0.5*dt*k2_v k4_v = accel_oto(p + dt*k3_p, v + dt*k3_v); k4_p = v + dt*k3_v p += (dt/6) * (k1_p + 2*k2_p + 2*k3_p + k4_p) v += (dt/6) * (k1_v + 2*k2_v + 2*k3_v + k4_v) traj_oto.append(p.copy()) # --- 2. Ньютон --- traj_newton = [init_pos.copy()] p, v = init_pos.copy(), init_vel.copy() for _ in range(1, steps): a = accel_newton(p) v += a * dt p += v * dt traj_newton.append(p.copy()) # --- 3. Задержка --- traj_delay = [init_pos.copy()] p, v = init_pos.copy(), init_vel.copy() for _ in range(1, steps): a = accel_delay(p, v) v += a * dt p += v * dt traj_delay.append(p.copy()) # --- 4. Квантованная гравитация --- traj_quant = [init_pos.copy()] p, v = init_pos.copy(), init_vel.copy() # Параметры квантования p_quantum = 0.0003 # Квант приращения импульса (дискретность) t_quantum_steps = 15 # Шагов между квантовыми актами взаимодействия acc_buffer = np.zeros(2) for step in range(1, steps): a = accel_newton(p) acc_buffer += a * dt # Взаимодействие происходит порциями if step % t_quantum_steps == 0: # Дискретизация приращения импульса/скорости v_inc = np.round(acc_buffer / p_quantum) * p_quantum v += v_inc acc_buffer = np.zeros(2) p += v * dt traj_quant.append(p.copy()) traj_oto = np.array(traj_oto) traj_newton = np.array(traj_newton) traj_delay = np.array(traj_delay) traj_quant = np.array(traj_quant) # ============================================================ # 4. ОТРИСОВКА И АНИМАЦИЯ # ============================================================ fig, axs = plt.subplots(2, 2, figsize=(10, 10), dpi=100) fig.patch.set_facecolor('#0d1117') titles = ['1. ОТО (1PN: Розетка)', '2. Ньютон (Идеальный эллипс)', '3. Задержка (Разгон / Срыв)', '4. Квант (Дискретный хаос)'] colors = ['#58a6ff', '#3fb950', '#ff7b72', '#d2a8ff'] trajs = [traj_oto, traj_newton, traj_delay, traj_quant] lines, planets = [], [] for ax, title, color in zip(axs.flat, titles, colors): ax.set_facecolor('#0d1117') ax.set_xlim(-1.8, 1.8) ax.set_ylim(-1.8, 1.8) ax.set_aspect('equal') ax.grid(True, color='#21262d', linestyle='--') ax.set_title(title, color=color, fontsize=11, fontweight='bold') line, = ax.plot([], [], color=color, lw=1.0, alpha=0.8) ax.scatter([0], [0], color='#f2cc60', s=120, zorder=5) # Звезда planet = ax.scatter([], [], color='white', s=40, zorder=6) lines.append(line) planets.append(planet) def update(frame): idx = (frame + 1) * steps_per_frame for line, planet, traj in zip(lines, planets, trajs): line.set_data(traj[:idx, 0], traj[:idx, 1]) planet.set_offsets([traj[idx-1, 0], traj[idx-1, 1]]) return lines + planets anim = animation.FuncAnimation( fig, update, frames=frames_count, blit=True, interval=40 ) plt.tight_layout() plt.close() # Вывод видео в Jupyter/Colab HTML(anim.to_html5_video()) Матан что он генерит я не понимаю --- Сообщение объединено, 6 сен 2026 --- Как это работает: - это эльфийское, матем попроще. Это разложеник в Тейлор дающее силовые поправки, которые накапливаются:
Искал по ТО, нашел этот материал Метафизика, МГУ Ю. С. Владимиров Там много упоминается Пуанкаре. Автор мыслит матем понятиями прошлого века, такая подача совершенно не понятна. Алгебра это зло.. После выжимки получается это реляционная физика, как ттр. Только он не видет связей(граф), а тащит алгебру для описания сову на глобус. Может кому то интересно, на разбор нужно много времени.
Эффект Джанибекова Код (Text): import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from IPython.display import HTML from scipy.spatial.transform import Rotation as R # ========================================== # 1. ГЕОМЕТРИЯ И МАССЫ (Абсолютно твердое тело) # ========================================== # Начальные положения 4 точек Т-образной гайки init_positions = np.array([ [0.0, 0.0, 0.0], # 0: Центр [0.0, -0.25, 0.0], # 1: Левое крыло [0.0, 0.25, 0.0], # 2: Правое крыло [0.35, 0.0, 0.0] # 3: Хвост (штырь) ]) masses = np.array([4.0, 1.0, 1.0, 1.5]) total_mass = np.sum(masses) # Сдвигаем начальные координаты, чтобы центр масс был строго в (0,0,0) cm_init = np.sum(init_positions * masses[:, None], axis=0) / total_mass init_positions -= cm_init # Функция для вычисления тензора инерции def get_inertia_tensor(pos): I = np.zeros((3, 3)) for i in range(len(masses)): r = pos[i] I += masses[i] * (np.dot(r, r) * np.eye(3) - np.outer(r, r)) return I # Начальный вектор момента импульса L (он СТРОГО сохраняется в пространстве!) w0 = np.array([0.15, 6.0, 0.0]) # Вращение вокруг Y + малое возмущение по X L = get_inertia_tensor(init_positions) @ w0 # Настройки симуляции dt = 0.001 steps = 16000 skip = 50 positions = init_positions.copy() history = [] # ========================================== # 2. ЧЕСТНЫЙ ИНЕРЦИОННЫЙ ШАГ НЬЮТОНА (БЕЗ ДЕФОРМАЦИИ) # ========================================== for step in range(steps): I = get_inertia_tensor(positions) I_inv = np.linalg.inv(I) # Находим текущую угловую скорость из неизменного L w = I_inv @ L # Строгое вращение без изменения расстояний через матрицу поворота rot_vector = w * dt rot = R.from_rotvec(rot_vector) positions = rot.apply(positions) if step % skip == 0: history.append(positions.copy()) # ========================================== # 3. ВИЗУАЛИЗАЦИЯ ИДЕАЛЬНОГО КУВЫРКА # ========================================== fig = plt.figure(figsize=(6, 6)) ax = fig.add_subplot(111, projection='3d') # Фиксируем куб, чтобы убрать иллюзию смещения ax.set_xlim([-0.4, 0.4]) ax.set_ylim([-0.4, 0.4]) ax.set_zlim([-0.4, 0.4]) ax.set_title("Эффект Джанибекова из элементарных масс") ax.view_init(elev=20, azim=55) # Создаем объекты линий с пустыми массивами нужной формы line_bar, = ax.plot(np.array([]), np.array([]), np.array([]), 'b-o', lw=4, markersize=6) line_tail, = ax.plot(np.array([]), np.array([]), np.array([]), 'r-o', lw=5, markersize=6) center_dot, = ax.plot(np.array([0.0]), np.array([0.0]), np.array([0.0]), 'go', markersize=10) def update(frame): pos = history[frame] # Синяя перекладина: Лево (1) -> Центр (0) -> Право (2) bx = np.array([pos[1, 0], pos[0, 0], pos[2, 0]], dtype=float) by = np.array([pos[1, 1], pos[0, 1], pos[2, 1]], dtype=float) bz = np.array([pos[1, 2], pos[0, 2], pos[2, 2]], dtype=float) line_bar.set_data(bx, by) line_bar.set_3d_properties(bz) # Красный штырь: Центр (0) -> Хвост (3) tx = np.array([pos[0, 0], pos[3, 0]], dtype=float) ty = np.array([pos[0, 1], pos[3, 1]], dtype=float) tz = np.array([pos[0, 2], pos[3, 2]], dtype=float) line_tail.set_data(tx, ty) line_tail.set_3d_properties(tz) # Центр масс строго в нуле center_dot.set_data(np.array([0.0]), np.array([0.0])) center_dot.set_3d_properties(np.array([0.0])) return line_bar, line_tail, center_dot # Запускаем анимацию (blit=False для стабильности в Jupyter/Colab) anim = FuncAnimation(fig, update, frames=len(history), interval=30, blit=False) plt.close() HTML(anim.to_html5_video()) К теме инерциоидов, на симуляции падает вертикально. Но это ничего не доказывает. Боковая сила возникает при наличии веса. Код (Text): import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from IPython.display import HTML from scipy.spatial.transform import Rotation as R # ========================================== # 1. ГЕОМЕТРИЯ, МАССЫ И МЯГКАЯ ГРАВИТАЦИЯ # ========================================== init_positions = np.array([ [0.0, 0.0, 0.0], # 0: Центр [0.0, -0.25, 0.0], # 1: Левое крыло [0.0, 0.25, 0.0], # 2: Правое крыло [0.35, 0.0, 0.0] # 3: Хвост (штырь) ]) masses = np.array([4.0, 1.0, 1.0, 1.5]) total_mass = np.sum(masses) # Центрируем начальное тело строго в локальный ноль cm_init = np.sum(init_positions * masses[:, None], axis=0) / total_mass init_positions -= cm_init def get_inertia_tensor(pos): I = np.zeros((3, 3)) for i in range(len(masses)): r = pos[i] I += masses[i] * (np.dot(r, r) * np.eye(3) - np.outer(r, r)) return I # Начальное вращение вокруг Y + возмущение по X w0 = np.array([0.15, 6.0, 0.0]) L = get_inertia_tensor(init_positions) @ w0 # Ускорение падения (сделали еще меньше, чтобы падало дольше) g_acc = np.array([0.0, 0.0, -0.06]) # Увеличенные настройки времени для долгого полета dt = 0.001 steps = 40000 # Увеличили число шагов в 2.5 раза skip = 80 # Скорректировали шаг кадров positions = init_positions.copy() cm_position = np.array([0.0, 0.0, 0.3]) # Стартуем повыше cm_velocity = np.array([0.0, 0.0, 0.0]) history_pts = [] history_cm = [] # ========================================== # 2. РАСЧЕТ ДЛИТЕЛЬНОГО ПАДЕНИЯ # ========================================== for step in range(steps): I = get_inertia_tensor(positions) w = np.linalg.inv(I) @ L rot = R.from_rotvec(w * dt) positions = rot.apply(positions) # Падение центра масс cm_velocity += g_acc * dt cm_position += cm_velocity * dt if step % skip == 0: world_positions = positions + cm_position history_pts.append(world_positions.copy()) history_cm.append(cm_position.copy()) # ========================================== # 3. ВИЗУАЛИЗАЦИЯ (ВЫТЯНУТЫЙ КУБ ПО ОСИ Z) # ========================================== fig = plt.figure(figsize=(6, 7)) ax = fig.add_subplot(111, projection='3d') # Вытянули ось Z вниз, чтобы гайка не вылетала ax.set_xlim([-0.4, 0.4]) ax.set_ylim([-0.4, 0.4]) ax.set_zlim([-1.2, 0.4]) ax.set_title("Затяжное падение с эффектом Джанибекова") ax.view_init(elev=15, azim=45) line_bar, = ax.plot([], [], [], 'b-o', lw=4, markersize=6) line_tail, = ax.plot([], [], [], 'r-o', lw=5, markersize=6) center_dot, = ax.plot([], [], [], 'go', markersize=10) def update(frame): pos = history_pts[frame] cm = history_cm[frame] # Синяя перекладина: явные плоские списки координат по осям bx = [pos[1,0], pos[0,0], pos[2,0]] by = [pos[1,1], pos[0,1], pos[2,1]] bz = [pos[1,2], pos[0,2], pos[2,2]] line_bar.set_data(bx, by) line_bar.set_3d_properties(bz) # Красный штырь tx = [pos[0,0], pos[3,0]] ty = [pos[0,1], pos[3,1]] tz = [pos[0,2], pos[3,2]] line_tail.set_data(tx, ty) line_tail.set_3d_properties(tz) # Зеленый падающий центр масс center_dot.set_data([cm[0]], [cm[1]]) center_dot.set_3d_properties([cm[2]]) return line_bar, line_tail, center_dot anim = FuncAnimation(fig, update, frames=len(history_pts), interval=25, blit=False) plt.close() HTML(anim.to_html5_video())