# Эталоны программных заданий

Восемь коротких эталонов связаны с заданиями курса и исходными программами `downloads/python/IIxx-x.py`. Они добавляют требуемые проверки к тем же формулам, центральным разностям, демпфированному Ньютону, FFT и шагу Хойна. Исходные программы, модели и результаты курса не изменяются.

Скачайте все файлы этой папки в один рабочий каталог и запустите `selfcheck.py` через **File → Open Python Script** в FEMM 5. Нужна встроенная реализация `numpy` с `linalg.solve` и `fft.fft`, используемая исходными занятиями. При запуске контроллером задайте `CODE_REFERENCE_DIR` — полный путь к папке эталонов. Итоговая строка `CODE_REFERENCE_RESULT=` содержит JSON и восемь результатов; ошибка проверки останавливает программу.

`selfcheck.py` проверяет аналитические алгоритмы. Это не новый расчёт электромагнитного поля. Для II00.2 он использует только макет API, чтобы проверить порядок команд и отсутствие чтения старого результата после отказа. Реальная последовательность FEMM дополнительно проверяется отдельным нативным запуском `run_case` на рабочей копии воздушной катушки. Квитанция нативного запуска отдельно фиксирует файлы, контрольные суммы, среду и область проверки.

При вызове `run_case` из контроллера команды нужно разрешать в момент их вызова: в FEMM часть `mi_*` появляется после открытия модели, а `mo_*` — после загрузки решения. Поэтому передайте ленивые обёртки, например `"mi_saveas": lambda *a: mi_saveas(*a)` и аналогично для остальных команд, а не преждевременно собранные ссылки на ещё не зарегистрированные функции. Словарь должен содержать `opendocument`, `mi_saveas`, `mi_modifycircprop`, `mi_analyze`, `mi_loadsolution`, `mo_getcircuitproperties`, `mo_close`. Пути исходной и рабочей модели должны различаться.

| Занятие / файл | Проверяемый результат |
|---|---|
| II00.1 / `II00-1-reference.py` | При I=0,2,4,6,8 А и L=0,12 Гн: Ψ=0;0,24;0,48;0,72;0,96 Вб и W=0;0,24;0,96;2,16;3,84 Дж. Отрицательная L отклоняется. |
| II00.2 / `II00-2-reference.py` | Открыть исходную модель → сохранить отдельную рабочую копию → изменить ток → решить → загрузить новое решение → прочитать свойства цепи → закрыть решение. Отказ не вызывает чтение прежнего результата. Нативный образец при 2 А: Ψ около 0,00019170283046 Вб; сравнивать с проверенным статическим образцом при 1 А. |
| II00.4 / `II00-4-reference.py` | Пять запланированных ID дают пять строк: четыре `ok`, одну `error` с `value=None` и причиной. Повтор даёт те же ID без дубликатов. `write_csv` открывает новую серию с режимом `w`; для сохранения прежней серии сначала выбирают новый каталог. |
| II01.2 / `II01-2-reference.py` | 96 разных механических углов: шаг 0,9375°, последний 89,0625°; 90° не включается вторично. Период реальной геометрии проверяется отдельно. |
| II02.2 / `II02-2-reference.py` | Для явно аналитического двухобмоточного примера точный Якобиан при (2;1) А: [[0,124;0,02],[0,02;0,083]] Гн. Ошибка центральной разности уменьшается примерно вчетверо при уменьшении ΔI вдвое; взаимность и положительный определитель проверяются. |
| II03.3 / `II03-3-reference.py` | Четыре неизвестных Re I₁, Im I₁, Re I₂, Im I₂ для аналитической цепи. Ориентир: [0,29110497; −1,19390842; −0,64529289; 0,33191140] А RMS; максимальная невязка двух комплексных портов <10⁻⁷ В. Демпфирование должно уменьшать фактическую невязку; бюджеты итераций/вызовов ограничены. |
| II07.2 / `II07-2-reference.py` | При N=128 и 256: DC=0,01 Вб, A₁=0,08 Вб, A₅=0,004 Вб, проверочная Nyquist=0,002 Вб. При f₁=100 Гц: E₁≈35,5430635 В RMS, E₅≈8,88576588 В RMS. DC/Nyquist не удваиваются. |
| II08.2 / `II08-2-reference.py` | Линейная карта L=0,01 Гн, R=2 Ом, U=24 В, заданная ω=100 рад/с. Выключение при θ=0,3 рад происходит в 0,003 с; далее идеальная свободная циркуляция U=0. В 0,01 с точный ток 1,33514016846 А; шаги 0,1/0,05 мс сходятся к нему. Выход из диапазона карты останавливает расчёт. |

## Границы проверки

- Аналитические callbacks не содержат насыщения, сетки, геометрии и дискретизации поля. Заменяя callback на FEMM, нужно получать новое решение для каждого возмущения и отдельно проверять сходимость поля.
- Дополнительная вторая обмотка в примере Якобиана — явно заданный взаимный аналитический контроль. Это не утверждение о свойствах конкретного трансформатора.
- Ньютон использует положительное нелинейное сопротивление первой цепи как проверочную нелинейность. Он не превращает линейный FEMM-эталон в модель насыщенной стали.
- В FFT контрольная составляющая Найквиста меняет физический порядок при изменении N. Она проверяет нормировку, а не сходимость физической гармоники; для ЭДС сравниваются гармоники 1 и 5.
- В интеграторе скорость задана извне, карта линейна, событие известно по θ/ω. Это проверка разбиения шага и отказа при выходе из диапазона, а не полный механический расчёт SRM. Переключение U=0 задаёт объявленную идеальную топологию; другой преобразователь требует другого закона напряжения.
- Нативное прохождение этих контрольных тестов удостоверяет исполнение именно этих файлов и условий. Оно не доказывает пригодность произвольного пользовательского кода, неизвестной карты или реальной машины.
