# Учебный турбогенератор: от геометрии до характеристик

Пакет рассчитан на **встроенный MicroPython FEMM 5**, а не на внешний `pyfemm`. Команды `newdocument`, `mi_*`, `mo_*` доступны в среде FEMM глобально. Для выполнения нужны FEMM 5 и эта папка. NumPy, SciPy, Lua и внешние библиотеки для самого расчёта не требуются.

Редакция `open-slot-wedges-v2`: самостоятельный двухполюсный учебный образец с 24 **открытыми пазами статора** и 12 **открытыми пазами ротора**, шлицами и подклиновыми расширениями. В клиновых областях явно назначены русские материалы с μr=1 и σ=0. Зазор между поверхностями зубцов 2 мм, активная длина 250 мм. Профиль стенки статора адаптирован по [опубликованному фрагменту Lua Милыха и Поляковой](https://eie.khpi.edu.ua/article/download/2074-272X.2015.4.02/44944/97805) (2015, с.11; [DOI](https://doi.org/10.20998/2074-272X.2015.4.02)); численные размеры, зеркальное построение ротора и отдельная граница воздух/клин — наши учебные допущения. Это не копия промышленного ТГ 340 МВт. Три B(H), сопротивление, инерция и демпфирование условные.

Предыдущая редакция с замкнутыми пазами и железными перемычками отозвана из действующего учебного маршрута и сохранена отдельно вместе со своими точными файлами и квитанциями. Её числа не относятся к этой открытой геометрии. Новый идентификатор геометрии присутствует в программе, `result.json`, геометрическом контракте и нативной квитанции.

Центральная область радиуса15мм имеет материал «Воздух и немагнитный вал» с μr=1: это условная немагнитная центральная область учебного сечения, а не утверждение о материале или конструкции реального вала турбогенератора. Для реального изделия центральную область и B(H) задают по его конструкции.

## Запуск и воспроизведение отдельного шага

Откройте `reproduce.py` через Run Script в FEMM 5. По умолчанию выполняются все 16 этапов. Для отдельного этапа используйте готовые `run-01.py`…`run-16.py`. Каждый такой файл запускает нужный этап с необходимыми предшествующими построениями с нуля. Ранее полученные `.fem`, `.ans`, результаты и квитанции сохраняются.

Для запуска из редактора FEMM:

```python
TG_ROOT = r'C:/учебные-модели/turbogenerator'
STAGE = '08'
CASE = 'standard'
exec(open(TG_ROOT + '/reproduce.py').read(), globals())
```

Каждый запуск создаёт `calculated-01`, `calculated-02` и далее. При необходимости задайте существующий каталог `TG_OUTPUT_ROOT`, чтобы хранить расчёты отдельно. `CASE='smoke'` уменьшает только угловую сетку некоторых серий; опубликованные результаты относятся к `standard`.

`TG_CONFIG` позволяет изменять исходные параметры, не редактируя алгоритм. Например:

```python
TG_CONFIG = {'depth_mm': 300, 'eccentricity_mm': 0.2,
             'slot_turns_stator': 14}
```

Геометрические радиусы, число и ширина пазов, витки, частота, активная длина, отдельные B(H), заданный режим и списки токов находятся в словаре `CFG`. Параметры `target_phase_voltage_rms_V`, `target_current_rms_A`, `target_power_factor` управляют заданным режимом, полевыми U-кривыми и проверкой полного периода; списки `occ_excitation_A`, `scc_excitation_A`, `load_currents_A`, `regulation_currents_A` задают выборку характеристик. Текущая топология поддерживает одну пару полюсов и число пазов статора, кратное шести. Список `rotor_slot_angles_deg` задаёт центры пазов ротора; `rotor_slots` должен равняться длине списка, что проверяет программа. Параметры `*_slot_width_deg` теперь задают только прежнюю площадь меди для контролируемого сравнения, а не угол стенки нового паза. Действительные ширины тела `bs_mm`, подклиновой зоны `bks_mm` и устья выводятся в `geometry_contract`. Имена `stator_slot_radii_mm` и `rotor_slot_radii_mm` сохранены для преемственности; теперь это продольные координаты концов прямоугольной Cu-области в локальной системе, а радиус её угла равен √(x²+y²). Высота шлица, расширение на сторону и углы фасок изменяются через `*_neck_height_mm`, `*_groove_expansion_each_side_mm`, `*_chamfer_angles_deg`. Произвольная смена топологии и переход к двухслойной укороченной обмотке требуют собственной проверки и новой таблицы сторон катушек.

## Открытый паз: профиль, клин и контроль геометрии

Локальная ось x направлена радиально наружу, y — по касательной. Для статора R=72 мм, для ротора R=70 мм. Полуширины тела и подклиновой зоны обозначим ya=bs/2 и yb=ya+b1. Устье лежит на окружности: xa=√(R²−ya²). Статорная стенка следует точкам a(xa,ya) → b(xb,ya) → c(xc,yb) → d(xd,yb) → e(xe,ya) → f(xf,ya) → g(xg,ya), вторая стенка получается отражением y→−y. Здесь xb=xa+hss, xc=xb+b1·tan(as1), xd=xe−b1·tan(as2), xf=(xe+xg)/2. В роторной учебной адаптации радиальные приращения зеркально направлены внутрь: xb=xa−hsr, xc=xb−b1·tan(ar1), xd=xe+b1·tan(ar2). Все фаски в исходном примере равны45°.

| Параметр, мм | Статор | Ротор |
|---|---:|---:|
| bs | 12.3864059854 | 7.19029126090 |
| bks=bs+2b1 | 14.3864059854 | 9.19029126090 |
| b1 | 1 | 1 |
| xa | 71.7331460114 | 69.9076170950 |
| xb | 72.7331460114 | 68.9076170950 |
| xc | 73.7331460114 | 67.9076170950 |
| xd | 77 | 67 |
| xe | 78 | 66 |
| xg | 100 | 52 |
| Высота шлица hss/hsr=abs(xb−xa) | 1 | 1 |
| Глубина до меди hks/hkr=abs(xe−xa) | 6.26685398861 | 3.90761709496 |
| Полная глубина hs/hr=abs(xg−xa) | 28.2668539886 | 17.9076170950 |

Окружность расточки статора и поверхность ротора построены **только дугами между устьями**. Дуги поперёк устьев отсутствуют: шлиц непосредственно связан с зазором, железной перемычки нет. Устье и тело имеют одинаковую ширину bs в локальных декартовых координатах; подклиновая зона шире, bks>bs. Само слово «шлиц» не означает, что он обязательно уже меди.

В опубликованном Lua нет поперечной границы при xb и отдельной метки клина: шлиц и подклиновая зона наследуют μ0 общего зазора. Здесь мы добавили границу при xb для явной учебной области клина b→c→d→e и присвоили материалы «Клин статора — немагнитный, условный» и «Клин ротора — немагнитный, условный». Выбор μr=1, σ=0 означает только этот магнитостатический пример; реальные клинья могут быть магнитными и электропроводными. Электромагнитные и механические свойства конкретного изделия надо задавать по его паспорту. Статорные клинья имеют группу13; роторные — группу2 вместе со всем вращающимся телом. Точка xf остаётся на стенке, но не разделяет Cu на две обмотки: во всём прямоугольнике одно N, поэтому ампер-витки не удваиваются.

Медь прямоугольная: Sмеди=bs·|xg−xe|. Для сравнения с отозванной редакцией взято bs=Sстарой/|xg−xe|, где Sстарой=(r2²−r1²)sin(w)/2. Таким образом, формы различаются, но S и плотность заданного тока Jz=NI/S совпадают. Получаем 272.500931680 мм² на сторону статора и100.664077653 мм² на сторону ротора. Это условие сравнения, а не аттестация промышленного паза.

Площадь прямолинейного клина определяется формулой Гаусса S=|Σ(xk·y{k+1}−x{k+1}·yk)|/2. Для полной удалённой полости учитывается кривизна устья. При α=2·arcsin(ya/R) круговой сегмент имеет площадь Sсег=R²(α−sinα)/2. Из площади полигона, замкнутого хордой aa′, для статора вычитают Sсег, а для ротора прибавляют. По той же причине Sшлица=bs·hss−Sсег для статора иbs·hsr+Sсег для ротора. Точный баланс Sполости=Sмеди+Sклина+Sшлица даёт соответственно356.454044839 и133.019115365 мм². Объём каждой области V=S·l; мм² и мм переводятся в м³ множителем10⁻⁹.

`geometry-contract.json` и `result.geometry_contract` содержат исходные координаты, локальные полигоны, точные площади, круговые сегменты, формулу поворота и группы. В этапах02–05 нативные `mo_getpointvalues` проверяют μr и проводимость в устье, шлице, клине и Cu. Интеграл5 FEMM для выбранных клина и Cu независимо сравнивается с аналитической площадью. Проверка относится к точной сохранённой и повторно открытой FEM/ANS. Сходимость напряжения не объявляется сходимостью локальных усилий на клине.

Для отдельного независимого чтения всех36пазов предусмотрен `run-slot-audit.py`. Он строит144точки по опубликованному геометрическому контракту, вызывает точное независимое ядро `audit_open_slots.py` и создаёт новый `audit-calculated-NN`. По умолчанию проверяется опубликованная контрольная пара этапа05; для собственной пары задайте `TG_AUDIT_RESULT_FILE` в результат этапа05/all. Контроль SHA-256 выполняется до и после чтения. Нативные индексы9/10 `mo_getpointvalues` возвращают относительные проницаемости, индекс3 — проводимость в МСм/м: для устья, шлица и клина ожидаются μr=1, σ=0, для Cu — μr=1, σ=58. Это прямое чтение свойств, а не деление B/H при слабом поле. Все144точки подтверждают классификацию в этих местах; отсутствие любой возможной перемычки дополнительно требует структурной проверки FEM-контуров. Исходная независимая квитанция, нативные значения и их SHA-256 опубликованы в `verified/open-slot-material-audit*.json`.

## Этапы, данные и проверяемые результаты

| Этап | Вход и действие | Файл или проверка |
|---|---|---|
| 01 | Шесть концентрических границ, вал, ротор, зазор, зубцовая зона, спинка и внешний воздух | Нулевое поле и контрольная FEM/ANS-пара |
| 02 | 24 открытых паза статора, шлицы, расширения и немагнитные клинья | Нативные μr/σ-пробы и площади Cu/клина |
| 03 | 12 открытых пазов ротора с клиньями и большие зубцы | Нативные пробы обоих открытых профилей |
| 04 | Раздельные русские материалы спинки, зубцов и ротора, три условные B(H) | Сохранение, повторное открытие и решение |
| 05 | Шесть фазных зон A+, C−, B+, A−, C+, B−; возбуждение 30 А | FEM/ANS, карта индукции `05-field-triangles.json` |
| 06 | Три ограничения сетки и удаление внешней границы | `06-mesh.csv`, изменение напряжения ХХ <2%, влияния границы <1% |
| 07 | Полный период ХХ, ΨA(θ), ЭДС и спектр; Br/Bt по окружности зазора | `07-no-load.csv`, `07-no-load-harmonics.csv`, `07-gap.csv` |
| 08 | Полевой подбор If и положения ротора для 80 В, 10 А, cosφ=0.8 | Основная гармоника напряжения и её комплексная невязка <0.5% |
| 09 | Приращения амплитудных id, iq при фиксированных If и угле | `09-dq.csv`, секущие/дифференциальные L, взаимность матрицы |
| 10 | If=0, 10, 20, 30, 45, 60 А; I=0 | `10-occ.csv`, полевые точки ХХ |
| 11 | Подбор симметричного тока до компенсации основной гармоники Ψ | `11-scc.csv`, магнитостатическое КЗ с R=0 в условии |
| 12 | Постоянные If и угол тока относительно ЭДС ХХ | `12-load.csv`, напряжение и фактический cosφ |
| 13 | I=0, 5, 10, 15 А при U=80 В и cosφ=0.8 | `13-regulation.csv`, полевой подбор в каждом узле |
| 14 | P=1200/2400 Вт, Q=−1200/0/1200/2400 вар при U=80 В | `14-u-curves.csv`, разреженное семейство U-кривых |
| 15 | 72 положения за 360° для исправного и смещённого на 0.4 мм ротора | Ψ, ЭДС, момент, индукция, силы; уточнение 36→72, полный DFT-контроль U/P |
| 16 | Полевая P(δ), скалярное качание и связанная модель dq+механика | `16-swing.csv`, `16-dq-dynamics.csv`, RK4 dt→dt/2 |

Каждое полевое решение проходит одинаковый маршрут: построение → `mi_saveas` → `mi_close` → `opendocument` → `mi_analyze` → `mi_loadsolution`. Проверка кириллицы относится к точной сохранённой копии. Исходные библиотечные модели для этого не изменяются и не требуются.

## Как получаются электрические величины

Для плоскопараллельной задачи неизвестна продольная компонента векторного потенциала A. Из неё FEMM получает Bx=∂A/∂y и By=−∂A/∂x, а свойства цепей дают потокосцепления фаз ΨA, ΨB, ΨC в веберах. Активная длина входит в постановку и в интегральное потокосцепление; дополнительно умножать результат FEMM на длину не нужно.

При пространственных осях фаз 0°, 120°, 240° введём a=exp(j·120°). Тогда Ψs=2(ΨA+aΨB+a²ΨC)/3. Коэффициент 2/3 получается из равенства cos²θ+cos²(θ−120°)+cos²(θ+120°)=3/2: для идеальной симметричной синусоиды реальная часть Ψs равна ΨA. Мгновенный Ψs содержит высшие гармоники и не является автоматически основной гармоникой.

Чтобы выделить основную гармонику, поворачиваем ротор на θk и синхронно сдвигаем фазные токи. Среднее Ψ1=(1/N)ΣΨs(θk)exp(−jθk) оставляет прямую основную гармонику: для слагаемого exp(jhθ) сумма exp(j(h−1)θk) обнуляется, кроме частот, совпавших по дискретной сетке. Для здоровой симметричной машины шесть положений через 10° на интервале 60° эквивалентны 36 положениям за период с перестановкой фаз. Для дефекта используется полный период. Этап 15 проверяет результат по 72 независимым положениям; высокочастотный алиасинг полностью не исключён.

Задаём выходящий ток Iout=I·exp(jβ). FEMM использует физический ток в положительном направлении обмотки: ik=−√2·I·cos(β−120°k). Множитель √2 переводит действующее значение в амплитуду. В пассивном направлении фазного напряжения v=Ri+dΨ/dt. При Ψ=Re(Ψ1exp(jωt)) производная равна Re(jωΨ1exp(jωt)); поэтому действующий комплекс напряжения генератора U=jωΨ1/√2−RIout. Знак ЭДС источника по закону Фарадея e=−dΨ/dt противоположен пассивной производной напряжения; CSV временной ЭДС подписан именно в направлении источника.

Активная мощность трёх фаз P=3Re(U·Iout*), реактивная Q=3Im(U·Iout*), cosφ=P/(3|U|I). Момент FEMM считается положительным в двигательном направлении. Для генератора средняя механическая входная мощность равна −Tср·Ω; без потерь стали и механики она должна совпасть с P+3RI². Сравнение выполняется по среднему за полный период, поскольку отдельное положение содержит пульсации.

`mo_blockintegral(22)` возвращает момент относительно начала координат. Поэтому исходные `rotor_torque_Nm` и столбец `torque_Nm` временных CSV относятся к центру статора (0,0). В дефектном опыте ось ротора смещена на e по x; из определения момента сил r×F следует Tоси=Tначала−e·Fy, где e переводится из миллиметров в метры. Отдельные опубликованные `shaft-torque-correction.json` и `shaft-torque-correction.csv` содержат этот явно выделенный перенос и SHA-256 исходного нативного результата. Исходный нативный момент сохраняется. Проверка мощности исправной машины использует e=0.

## Подбор режима и характеристики

Для заданных Uзад и cosφ сначала задаём β=−arccos(cosφ), затем ищем x=(If,α). Вектор невязки F=(Re(U)−Uзад,Im(U)) имеет размерность вольт. Столбцы численного якобиана получают повторными полевыми расчётами при If+ΔIf и α+Δα. Решение системы JΔx=−F даёт поправки возбуждения и угла. Длина шага ограничена; при недостаточном снижении невязки якобиан вычисляется заново. Физические критерии принимаются до запуска серии, а не подгоняются по ответу.

ХХ строится изменением If при нулевых токах статора. Для установившегося симметричного КЗ в принятом пределе R=0 основная гармоника напряжения равна jωΨ1/√2; условие КЗ становится Ψ1≈0. Скрипт подбирает ток якоря секущими. Общая запись напряжения с R=0.15 Ом сохраняется для прозрачности, но не используется как невязка этого отдельного предела КЗ. Это не ударный ток и не переходный процесс замыкания.

Для U-кривой задаются U и P, перебирается Q. Из S=3UI* следует Iout=(P−jQ)/(3U). Поэтому I=sqrt(P²+Q²)/(3U), β=−atan2(Q,P). Каждая точка заново подтверждается полевым подбором If и α; аналитическая формула задаёт ток, а не подменяет полевое решение. Четыре значения Q показывают форму семейства; положение точного минимума без сгущения сетки не заявляется.

Сходимость статического подбора U и I не доказывает электромеханическую устойчивость рабочей точки. В частности, крайние недовозбуждённые точки не объявляются допустимыми режимами реального генератора: модель не содержит ограничителей возбуждения, сети и анализа устойчивости этих ветвей.

## Эквивалентные параметры и динамика

В rotor dq-системе Ψd+jΨq=Ψs·exp(−jα). Дифференциальная матрица Lkj=∂Ψk/∂ij вычисляется центральной разностью [Ψk(+Δij)−Ψk(−Δij)]/(2Δij) с амплитудным приращением 1 А. Секущая Lk=[Ψk(10 А)−Ψk(0)]/10 А отвечает другому вопросу и в насыщении отличается от производной. Умножение L на ω даёт локальную реактивность X. Матрица относится к указанным If=30 А, неподвижному ротору и 2D активной части; лобовое рассеяние не включено.

В записях `09-dq-*` и `16-dq-validation-*` токи заданы напрямую через `id_axis`; фактические фазные токи находятся в `physical_phase_currents_A`. Общие поля `current_rms_A`, `voltage_V` и `terminal_power_W` предназначены для маршрута заданного выходящего тока и не интерпретируются как рабочая характеристика этих неподвижных токовых возмущений. Для матрицы L и статического сравнения используются только действительные заданные фазные токи и нативные потокосцепления.

Многопозиционные расчёты дают квазистатические временные функции при t=θ/Ω. Это последовательность магнитостатических задач, без токов, индуцированных движением в массивной стали. Для равномерных Ψk коэффициенты DFT ah=(2/N)ΣΨkcos(hθk), bh=(2/N)ΣΨksin(hθk), амплитуда Ψh=sqrt(ah²+bh²). Из дифференцирования следует Eh,rms=hωΨh/√2. Гармоники выше Найквиста не определяются; гармоники пазового порядка могут потребовать отдельного сгущения угловой сетки.

После этапа 15 выполните `postprocess_saved_forces.py`, чтобы получить силы на выбранной стороне катушки и агрегированную силу железа ротора:

```python
TG_RESULT_FILE = r'C:/расчёты/calculated-01/result.json'
TG_FORCE_SCRIPT_FILE = r'C:/учебные-модели/turbogenerator/postprocess_saved_forces.py'
TG_FORCE_OUTPUT_ROOT = r'C:/расчёты'
FORCE_SLOT = 6
FORCE_KIND = 'both'
exec(open(TG_FORCE_SCRIPT_FILE).read(), globals())
```

Скрипт создаёт новый `forces-calculated-NN` с `conductor-forces.json` и CSV. Он читает полные 72+72 исходные FEM/ANS, не запускает анализ и не сохраняет модели. В публичном наборе выбраны контрольные положения; для воспроизведения полной силовой кривой сначала самостоятельно выполните этап 15 или all.

Для предварительной проверки только по публичным контрольным FEM/ANS задайте `TG_RESULT_FILE` в `verified/result.json` и `FORCE_POSITIONS=[0, 18, 36, 54]`. Получатся четыре положения исправного и четыре положения дефектного ротора; метаданные явно укажут неполную выборку. Для полного периода удалите это ограничение или задайте `FORCE_POSITIONS=None` и используйте собственный полный сырой результат этапа 15.

У выбранного паза сторона катушки имеет знаковое число витков N и пассивный ток FEMM Iф. Для однородного DC-тока Jz=NIф/S. Площадь прямоугольной меди нового открытого паза S=bs·|xg−xe|; размеры перед подстановкой переводят в метры. Условие сохранения прежней площади подробно выведено в геометрическом разделе. Объём V=S·l. Из векторного произведения J×B получаются Fx=−Jz∫By dV и Fy=Jz∫Bx dV. Интегралы 8/9 FEMM имеют размерность Тл·м³, поэтому повторное умножение на активную длину ошибочно. Результаты сравниваются с нативными интегралами Лоренца 11/12; дополнительно проверяются S, V и ампер-витки ∫Jz dS=NIф.

Для всего ротора взвешенные интегралы 18/19 дают силу на железе и токонесущих областях совместно. В принятой модели в железе, немагнитном валу и клиньях J=0; у вала и клиньев μr=1, а все токи ротора находятся в меди с μr=1. Поэтому агрегированная сила железа определяется разностью Fжелеза=Fвсего−FЛоренца,ротора. Аналогично вычисляется разность моментов 22−15 относительно начала координат. Это разложение общего баланса, а не локальная оценка напряжений каждого зубца. Тождество J×B проверяет внутреннюю согласованность численного интегрирования; оно не заменяет сеточную или физическую проверку сил. SHA-256 каждой входной FEM/ANS контролируется до и после чтения.

Дополнительная модель этапа 16 использует замороженные полевые Ld, Lq и Ψf: Ψd=Ψf+Ld·id, Ψq=Lq·iq. Из преобразования производной вращающегося вектора получаются vd=Rid+Ld·did/dt−ΩΨq и vq=Riq+Lq·diq/dt+ΩΨd. Для автономной симметричной резистивной нагрузки v=−Rнi. Отсюда did/dt=[−(R+Rн)id+ΩLqiq]/Ld и diq/dt=[−(R+Rн)iq−Ω(Ldid+Ψf)]/Lq. Момент Te=1.5(Ψdiq−Ψqid), уравнение механики J·dΩ/dt=Tm+Te−DΩ. Начальный ток решает эти уравнения в равновесии, Tm компенсирует тормозной момент и потери. При t=0.1 с нагрузка меняется с 8 до 6 Ом. RK4 с шагами 0.2 и 0.1 мс проверяется по токам и скорости. Это ограниченная электрическая и механическая модель; в ней нет демпфера, АРВ, динамики цепи возбуждения или сети.

Область линеаризации принципиальна: Ld и Lq получены при id=iq=0 и приращениях ±1 А, а иллюстративная траектория имеет id=-17.277…-12.940 А и iq=-15.085…-13.451 А. Для состояний при t=0, 0.25, 0.5 с отдельные нелинейные магнитостатические расчёты дали относительные отклонения потокосцепления ||Ψзамороженная−ΨМКЭ||/||ΨМКЭ|| соответственно 0.05917628, 0.09413964, 0.09425997 (5.92%, 9.41%, 9.43%). Точные значения приведены в `16-dq-static-comparison.csv`. Три статические проверки ограничивают точность замороженного отображения Ψ(i), но не подтверждают количественную точность всей нелинейной переходной траектории. Сходимость RK4 подтверждает решение выбранных ОДУ; её нельзя считать подтверждением описания насыщенной машины. Квазистатические многопозиционные расчёты и рабочие характеристики сохраняют собственные численные проверки. Для количественного нелинейного переходного процесса нужна табличная Ψd(id,iq,If), Ψq(id,iq,If) с производными и соответствующая замкнутая электрическая схема.

## Дефект и границы доверия

Статический эксцентриситет задаёт постоянное смещение центра ротора по x. Геометрия ротора вращается вокруг этого смещённого центра, а направление смещения в статоре сохраняется. Минимальный зазор остаётся положительным. Сравниваются полный период ΨA, индукция в зазоре и результирующие силы. Канал `even_flux_ratio` — отношение чётных **временных** гармоник фазного потокосцепления к основной. Для этой конкретной симметричной модели увеличение такого отношения не ожидается как физический признак статического эксцентриситета. Через полпериода геометрия двухполюсного ротора повторяется, токи статора и пространственная плотность тока возбуждения меняют знак. При нечётной безгистерезисной B(H) из единственности магнитостатического решения следует B(t+T/2)=−B(t), затем Ψ(t+T/2)=−Ψ(t). В интеграле Фурье вклад второй половины для чётного h имеет обратный знак и сокращается: чётные временные гармоники должны оставаться численным фоном. Статическое смещение оси постоянно и само по себе эту временную симметрию не нарушает. Ненулевой результат проверяют уточнением сетки и симметрией отсчётов; его не объявляют диагнозом.

Пространственный спектр B(φ) по окружности зазора в одном положении — другой канал: геометрическая симметрия по φ при эксцентриситете нарушена, поэтому могут меняться пространственные гармоники, включая h=2. Силы квадратичны по полю, и неуравновешенное магнитное притяжение также может изменяться. Временной спектр Ψ, пространственный спектр B(φ), поле во внешней точке и силы нельзя подменять друг другом. Внешнее поле и реальная диагностическая система этим опытом не аттестуются.

`postprocess_saved_gap.py` читает две сохранённые ANS этапа15 в положении0: исправную и с эксцентриситетом. Задайте `TG_GAP_RESULT_FILE`, `TG_GAP_SCRIPT_FILE` и существующий `TG_GAP_OUTPUT_ROOT`, затем выполните скрипт во встроенном Python FEMM5. Он создаёт новый `gap-calculated-NN` с `spatial-gap.json`, `spatial-gap-samples.csv` и `spatial-gap-harmonics.csv`; опубликованные копии находятся в `verified/`. Окружность радиуса71мм имеет центр в статоре и целиком находится в зазоре; при собственных параметрах это условие проверяется. В180точках φk=2πk/180 читаются Bx, By и μr. Затем Br=Bx·cosφ+By·sinφ, Bt=−Bx·sinφ+By·cosφ. По ортогональности ah=(2/N)ΣBkcos(hφk), bh=(2/N)ΣBksin(hφk), амплитуда Bh=√(ah²+bh²); экспортируются h=1…15 отдельно для Br и Bt. Это амплитуды индукции в теслах; множитель hω из временной ЭДС сюда не переносится. Среднее по окружности хранится отдельно. Обе FEM/ANS и исходный result контролируются SHA-256 до и после чтения; нового решения поля нет. Величина или рост h=2 служит наблюдением этого опыта и не является условиемPASS. Сетка180точек также не аттестует высокочастотный спектр или реальную диагностику.

Публичный `verified/` содержит численные таблицы, квитанции и выбранные точные FEM/ANS-контрольные точки. Полный сырой расчёт всех итераций хранится отдельно в рабочем каталоге и связан SHA-256-журналом; повторный запуск воспроизводит его в новом каталоге. Пропуск промежуточных Newton-итераций в опубликованных файлах не меняет численных результатов и не препятствует воспроизведению этапа. Карты поля здесь являются визуализациями численных данных. Снимки нативного интерфейса выполняются отдельным согласованным проходом.
