diff --git a/PLAN.md b/PLAN.md index 03662de..017da29 100644 --- a/PLAN.md +++ b/PLAN.md @@ -102,7 +102,13 @@ L(x, I)-модель с coenergy-выводом силы — в разделе " CPU-эталоном — расхождение exit_v **0.084%** (tests/test_batch_sweep.py, test_batch_integrator.py). Стиффные конфиги, переполняющие фикс-шаг, честно бракуются (blew_up), а не записываются мусором. - - [ ] (опция) дослить cut-логику в ядро (>3.8x); GPU-батч внутрь эволюции. + - [x] cut-логика дослита: весь шаг = 2 fused-ядра (одно не влезает в лимит + параметров CUDA 4096Б). Оценка 1000 геномов: 98.5с → 6.6с (15x), ~150 + геномов/с на 1070, сверка с numpy-эталоном 0.001%. + - [x] GPU-батч в эволюции: `run_evolution(use_gpu=True)` оценивает всё + поколение одним батчем (`evaluate_genomes_gpu`), та же формула фитнеса; + полировка (Nelder-Mead) остаётся точной на CPU. Сервис `gausse-evolve` + переведён на venv+GPU: 120 поколений × 1000 особей, ~115/с стабильно. ## Физика: найденные завышения КПД и их исправления (хронология честности) @@ -134,6 +140,22 @@ L(x, I)-модель с coenergy-выводом силы — в разделе " слегка отрицательным (трение съело больше слабой катушки) — это честно. Для сравнения на одной и той же эволюции: v1 давал «38%» там, где v2 даёт ~8% — столько стоили неучтённые скин и трение. +6. **gausse-physics-v3**: эволюция нашла «КПД 82%» → вскрытие генома: тонкий + снаряд (⌀4мм) в толстой катушке (⌀29мм) — модель умножала ВСЮ L на + (μ_eff−1), как будто железо заполняет всё сечение. Фикс: коэффициент + заполнения A_снаряда/A_катушки (iron_fill_factor). Плюс лечение зависаний + решателя: tanh-сглаживание сухого трения (разрывный sign(v) дробил шаг + бесконечно), событие тока удержания ключа (передемпфированный хвост), + полная формула отражения вихрей (ωM)²R₂/(R₂²+(ωL₂)²), гард вырожденных + катушек (L/R<100нс). Бенч: 200 геномов 608с → 22с. +7. **gausse-physics-v4**: эволюция нашла «30%» через МЕДЛЕННУЮ катушку + (600+ витков, ~1мс, 36А — там слабы и Доуэлл, и вихревые, и трение). + Неучтённая физика: за импульс поле проникает в сталь на глубину скин-слоя + (~доли мм) — внутренность снаряда не намагничивается. Фикс: + iron_penetration_fraction = 1−(1−δ/a)² множит fill factor. После v4 + лучший КПД эволюции — единицы процентов, что соответствует реальным + reluctance-пушкам. Урок зафиксирован: подозрительно красивый КПД = + вскрывать лучший геном и искать обойдённый канал потерь. ## Требования пользователя, закрытые после Этапа 8 diff --git a/README.md b/README.md index 532e3b3..196d033 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ - **Физика** (`src/gausse/physics/`): RLC-разряд конденсаторной банки через катушку с ферромагнитным снарядом; насыщение железа через единое потокосцепление λ(x,I) (энергия сохраняется); вихревые потери в снаряде; + коэффициент заполнения (тонкий снаряд не усиливает весь поток) и + диффузия поля (за импульс намагничивается только скин-кольцо); скин-эффект + эффект близости обмотки (метод Доуэлла); трение о трубку и сопротивление воздуха; одиночный импульс (тиристор не перезапускается); паспортные импульсные токи ключей (ITSM/IDM/ICM из даташитов). @@ -27,7 +29,8 @@ полировкой; всё в одну SQLite-базу (WAL, писатель поверх очереди). - **GPU** (`src/gausse/gpu/`): батч-интегратор RK4 (numpy/cupy), весь шаг слит в одно cupy.fuse-ядро — на GTX 1070 ~3.8x к CPU; многоступенчатый - GPU-sweep раунд-за-раундом; сверен с CPU-эталоном (<0.1%). + GPU-sweep раунд-за-раундом И GPU-эволюция (use_gpu=True: всё поколение — + один батч, ~150 геномов/с на 1070); сверено с CPU-эталоном (<0.1%). - **Отчёты** (`src/gausse/report/`, `src/gausse/web/`): веб-дашборд с drill-down до каждой детали и энергобаланса ступени, графики ток/поле/ скорость, GIF-анимация выстрела (равномерное физическое время, результат @@ -65,9 +68,9 @@ pytest ## Автономная работа на сервере -Эволюция оформлена как systemd-сервис `gausse-evolve` (вечный цикл: 80 -поколений × 300 особей, по окончании — новый цикл со свежей случайной -популяцией; `Restart=always`, автозапуск при загрузке). Дашборд — Docker- +Эволюция оформлена как systemd-сервис `gausse-evolve` (вечный цикл: 120 +поколений × 1000 особей на GPU, по окончании — новый цикл со свежей +случайной популяцией; `Restart=always`, автозапуск при загрузке). Дашборд — Docker- сервис `web` на :8000, читает ту же базу. Счётчик «запланировано» на дашборде — план **текущего цикла**, а не всего поиска: поиск бесконечен. @@ -75,13 +78,12 @@ pytest - Индуктивность — инженерная модель (Уилер + размагничивание сфероида + tanh-перекрытие), не МКЭ; точная картина поля требует FEA. -- Вихревые потери снаряда — сосредоточенный виток на характерной частоте - импульса; диффузия поля (скин-эффект в самом снаряде) не решается. +- Вихревые потери снаряда — сосредоточенный виток; диффузия поля в снаряд — + одночастотная оценка скин-кольца, а не решение уравнения диффузии. - Доуэлл берёт одну характерную частоту ω=1/√(LC), без спектра импульса. - Воздух — лобовое сопротивление; поршневой эффект столба воздуха в трубе не учтён. Трение — константа 0.35 (сталь-пластик), не измерено. - Гистерезис снаряда посчитан и сознательно не включён в динамику (<0.1%). - Нагрев провода за импульс и от серии выстрелов не моделируется. -Версия физики пишется в каждую запись (`model_version`, сейчас -`gausse-physics-v2`) — прогоны разных моделей не смешиваются. +Версия физики пишется в каждую запись (`model_version`, сейчас `gausse-physics-v4`) — прогоны разных моделей не смешиваются.