FEMM 5

Язык · библиотеки · автоматизация расчётов

Справочник по встроенному MicroPython FEMM 5

От основ Python до воспроизводимой серии FEMM: среда исполнения, язык, файлы, численные массивы, графики и проверка инженерных результатов.

17 разделов и 10 программ с пояснениями и ожидаемым результатом. Читайте последовательно или найдите нужный приём по имени команды и русскому термину.

Среда выполнения. Откройте программу через File → Open Python Script в FEMM 5. Код выполняет встроенный MicroPython; браузер показывает текст и помогает его скопировать. Набор библиотек зависит от сборки FEMM.

Найти в справочнике

Раздел 1

Где выполняется программа и что означает MicroPython

Встроенный MicroPython выполняет программы внутри FEMM 5. Сценарий создаёт или открывает документ, задаёт геометрию и свойства, запускает решение и обрабатывает полученные величины. Программы этого курса запускаются через встроенную консоль или команду Open Python Script.

Основные математические операции дают модули math и cmath. Для числовых массивов используются numpy и scipy из поставки FEMM; их точный состав описан в каталоге функций. csv, json, os и time помогают вести таблицы, описания режимов и журналы расчётов.

Имя функции определяет её контракт: порядок аргументов, допустимые формы массивов, единицы и тип возвращаемого значения. Для комплексной величины дополнительно задайте нормировку и фазовое соглашение. Эти сведения входят в карточку функции вместе с примером и ожидаемым результатом.

Команды конкретной физики регистрируются после создания или открытия соответствующего документа. Команды обработки решения становятся доступны после loadsolution. Поэтому перед обращением к mi_, ei_, hi_, ci_ и соответствующим командам результатов проверьте стадию работы.

Полный перечень приведён в каталоге модулей и функций. Рецепты ниже связывают отдельные вызовы с задачей расчёта; подробные сведения о состоянии документа находятся в справочнике команд.

Раздел 2

Запуск сценария, консоль и рабочий каталог

Сохраните исходный текст в файл .py и откройте его в FEMM через File → Open Python Script. Отдельные выражения удобно проверять во встроенной консоли: сначала арифметику и тип ответа, затем один безопасный запрос к документу. Многострочную программу с циклами и обработкой ошибок храните в файле, чтобы повторный запуск не зависел от истории консоли.

Открытие сценария через интерфейс меняет текущий рабочий каталог на каталог сценария. Относительные пути модели, таблицы и импортируемых модулей зависят от этого каталога. При пакетном запуске проверьте os.getcwd() и сформируйте пути явно через os.path.join. Папка исполняемого файла, папка программы и рабочая папка опыта могут быть разными. Не угадывайте путь по тому, где лежит ярлык.

Способы запуска сценария FEMM
Способ запускаДля чего его использовать
GUI и Open Python ScriptРазобрать модель и увидеть промежуточное состояние
femm_gui -run script.pyВыполнить сценарий и завершить GUI
femm_headless -run script.pyВыполнить пакетный расчёт с завершением процесса
femm_headless -i script.pyИсполнить сценарий и продолжить в REPL

У femm_headless script.py без -run другой жизненный цикл: после исполнения остаётся обслуживание TCP. Для одноразового опыта применяйте документированный пакетный режим. Параметры самого FEMM ставятся перед именем сценария; следующие строки попадают в sys.argv. Числовой аргумент приходит строкой и требует float или int с проверкой диапазона.

Перед серией прочитайте femm_headless --version либо Help → About. Успешное завершение пакетного сценария имеет код 0; ошибка — 1. Проверяйте также новый файл результата и статус конкретного режима: старый .ans может сохраниться после неудачного запуска. Учебный маршрут — консоль и модель, затем рабочие копии и ошибки. Детали ключей собраны в справочнике запуска.

Раздел 3

Переменные, типы, выражения и единицы

Присваивание current_a = 2.0 связывает имя с числом. Оно не задаёт ток модели: для этого нужен отдельный вызов FEMM. Имя выбирайте по физическому смыслу и единице: length_mm, energy_j, frequency_hz. Регистр важен; Current и current — разные имена. Не называйте свои переменные list, str, open, math или femm, если затем собираетесь обращаться к этим встроенным именам.

Основные типы учебных данных: целое int для количества витков и номеров; float для измеряемой величины; complex для фазора; str для пути и имени свойства; bool для условия. None обозначает отсутствие значения. Строка "2.0" остаётся текстом, пока её не преобразуют. Десятичный разделитель в исходном коде — точка. Научная запись 1e-3 удобна для малых величин.

Операторы и логические выражения Python
ЗаписьСмысл
a + b, a - b, a * b, a / bАрифметика; / выполняет деление
a ** 2Возведение в степень
a // b, a % bДеление с округлением вниз и остаток
a == b, a != b, a <= bСравнение; один знак = означает присваивание
and, or, notСоединение логических условий

У нуля нет специального права на деление: linkage_wb / current_a при нулевом токе вызывает ошибку. Даже если оба числа близки к нулю, секущая индуктивность может быть неопределённой или плохо обусловленной. Для линейной катушки без постоянных магнитов удобнее отдельно проверить ожидаемые нулевые значения. Для нелинейной задачи различайте секущую и дифференциальную индуктивности.

Числа Python не контролируют размерности. Константа mm означает множитель 0.001 для перевода в метры, тогда как координаты документа подчиняются единицам probdef. При геометрии в миллиметрах узел с координатой 10 расположен в 10 мм; 10*mm передаст 0.01 и даст 0.01 мм. Подробный разбор приведён в таблице единиц. Основа языка отрабатывается в первом занятии Python.

Переменные и единицы: линейная катушка

Аналитические формулы при постоянной индуктивности; полевой решатель не вызывается.

MicroPython FEMM 5 · 01-language.py
"""Линейная катушка: вычислить потокосцепление и запасённую энергию.

Вход: постоянная L [Гн] и ток I [А]. Выход: Ψ [Вб·виток], W [Дж].
Встроенный MicroPython FEMM 5; это аналитическая модель без постоянных
магнитов, насыщения и полевого расчёта. Имя linkage_wb обозначает Ψ.
"""

# 1. Исходные данные заданы в СИ; единицы отражены в именах переменных.
inductance_h = 0.12
current_a = 2.0

# 2. Для постоянной L применяем Ψ = LI и W = LI²/2.
linkage_wb = inductance_h * current_a
energy_j = inductance_h * current_a ** 2 / 2

# 3. Сравниваем результаты с независимыми числами учебного примера.
assert abs(linkage_wb - 0.24) < 1e-12
assert abs(energy_j - 0.24) < 1e-12

# 4. Выводим обе величины с подписями единиц.
print('Потокосцепление, Вб:', linkage_wb, sep=' ')
print('Энергия, Дж:', energy_j, sep=' ')

Ожидаемый результат. При токе 2 А потокосцепление 0,24 Вб и энергия 0,24 Дж.

Скачать 01-language.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 4

Списки, кортежи, словари и обход режимов

Список хранит упорядоченную последовательность: токи [0.0, 1.0, 2.0], координаты контрольных точек или строки результатов. Индекс первого элемента равен 0, последнего — len(values)-1. Индекс -1 обращается к последнему элементу. Выход за диапазон вызывает IndexError; это полезный сигнал несовпадения размеров, который нельзя заменять произвольным нулём.

Срез values[1:3] включает элементы с индексами 1 и 2; верхняя граница не входит. Полный срез values[:] создаёт поверхностную копию списка. Если элементы сами являются изменяемыми списками или словарями, они всё ещё могут быть общими. Присваивание work = base вообще не создаёт копию: оба имени указывают на тот же объект.

Кортеж похож на фиксированную последовательность. Запись current_a, voltage_v, linkage_wb = result распаковывает три результата и сразу обнаруживает неверное их количество. Один член кортежа записывают с запятой: (value,). Это существенно при ответах API: «одна физическая величина» не всегда означает числовой скаляр. Контейнер сначала исследуют через type, repr и len, когда длина применима.

Словарь связывает ключ и значение: параметры удобно хранить под ключами "current_a", "turns", "model_path". Обязательный ключ читайте через квадратные скобки, чтобы пропуск вызвал KeyError. Метод get пригоден для действительно необязательных данных. Не подставляйте значение по умолчанию вместо потерянной единицы или имени цепи.

Цикл for current_a in currents_a перебирает заданные режимы. range(5) даёт целые от 0 до 4; range(1, 6) — от 1 до 5. Для дробного шага используйте целый счётчик и формулу значения: так легче контролировать число опытов. enumerate даёт номер вместе с элементом. До совместного обхода нескольких последовательностей сверяйте их длины: zip прекращает обход на самой короткой.

При чтении узлов FEMM особенно явно разделяйте индекс массива Python и номер узла API. Связность сетки может содержать номера от 1, хотя строки массивов начинаются с 0. Практика списков и словарей — в занятии 12.1.

Список режимов и словарь параметров

Операции с контейнерами и индексами без решения поля.

MicroPython FEMM 5 · 02-collections.py
"""Последовательность режимов линейной катушки и именованные результаты.

Вход: L [Гн], список токов [А]. Выход: три словаря с I [А] и Ψ [Вб·виток].
Перечисление enumerate сохраняет порядок входных режимов. Полевой расчёт
не выполняется; постоянная L исключает насыщение.
"""

# 1. Словарь хранит параметры, список — последовательность токов в СИ.
parameters = {'inductance_h': 0.12}
currents_a = [0.0, 2.0, 4.0]
rows = []

# 2. Один проход формирует строки: номер режима, ток, потокосцепление.
for index, current_a in enumerate(currents_a):
    row = {'current_a': current_a, 'linkage_wb': parameters['inductance_h'] * current_a}
    # Сохраняем весь словарь; append не меняет ранее записанные строки.
    rows.append(row)
    print(index, row['current_a'], row['linkage_wb'], sep='; ')

# 3. Проверяем число режимов, последнюю величину и правую границу range.
assert len(rows) == 3
assert abs(rows[-1]['linkage_wb'] - 0.48) < 1e-12
assert list(range(0, 5, 2)) == [0, 2, 4]

Ожидаемый результат. Три строки: (0; 0), (2; 0,24), (4; 0,48). Диапазон range(0, 5, 2) даёт 0, 2, 4.

Скачать 02-collections.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 5

Функции, возврат результата и область видимости

Функция объединяет законченный шаг расчёта: проверку параметров, аналитическую оценку, чтение результата или выполнение одного режима FEMM. Определение начинается с def, за заголовком следует двоеточие и блок с одинаковым отступом. В учебных файлах используйте четыре пробела; смешение табуляции и пробелов затрудняет чтение и может изменить структуру программы.

Параметры — входные данные функции. return возвращает результат вызывающему коду и завершает текущий вызов. print лишь выводит сообщение; подменить им возвращаемое число нельзя. Функция без return возвращает None, поэтому последующее умножение её результата обнаружит ошибку типов. Несколько возвращаемых значений образуют кортеж; порядок и единицы нужно описать рядом с определением.

Для аналитической катушки функция получает ток и индуктивность, затем возвращает потокосцепление и энергию. Соотношения linkage_wb = inductance_h * current_a и energy_j = 0.5 * inductance_h * current_a**2 справедливы для указанной линейной модели. По имени функции должно быть понятно, вызывает ли она решатель или вычисляет формулу. Быстрая аналитическая оценка не является результатом полевого расчёта.

Значения по умолчанию удобны для неизменяемых параметров, например допуска сравнения. Список или словарь в заголовке функции создаётся один раз и может сохранить изменения между вызовами. Для накапливаемых строк передавайте контейнер явно либо создавайте новый внутри функции при значении параметра None.

Имя, присвоенное внутри функции, обычно локально. Чтение глобального параметра возможно, но делает зависимость менее заметной; предпочтительнее передать его аргументом. Изменение переданного словаря или списка видно вызывающему коду. Простое присваивание локальному имени другого объекта такого изменения не делает.

Отдельно оговорите побочные действия: открытие документа, изменение тока, сохранение файла, создание окна решения. Функция одного режима должна либо вернуть осмысленный результат с проверенным статусом, либо сообщить об ошибке. Упражнение 12.1 помогает отделить чистое вычисление от работы с моделью.

Функция с двумя возвращаемыми величинами

Аналитическая модель линейной катушки без постоянных магнитов.

MicroPython FEMM 5 · 03-functions.py
"""Функция аналитического состояния линейной катушки.

Аргументы: ток [А], неотрицательная постоянная индуктивность [Гн].
Результат: кортеж (потокосцепление [Вб·виток], энергия [Дж]). Отрицательный
ток меняет знак Ψ, энергия остаётся неотрицательной. Насыщения и магнитов нет.
"""

# 1. Функция отделяет расчёт от вывода; значение L по умолчанию равно 0,12 Гн.
def coil_state(current_a, inductance_h=0.12):
    """Вернуть потокосцепление, Вб, и энергию, Дж, линейной катушки."""
    # Отрицательная L выходит за рамки этой пассивной аналитической модели.
    if inductance_h < 0:
        raise ValueError('Индуктивность должна быть неотрицательной')
    # Обе величины вычисляются из одних исходных данных и возвращаются вместе.
    return (inductance_h * current_a, inductance_h * current_a ** 2 / 2)

# 2. Распаковываем кортеж и проверяем режим 4 А и нулевое возбуждение.
linkage_wb, energy_j = coil_state(4.0)
assert abs(linkage_wb - 0.48) < 1e-12
assert abs(energy_j - 0.96) < 1e-12
assert coil_state(0.0) == (0.0, 0.0)
print('Потокосцепление, Вб:', linkage_wb, 'энергия, Дж:', energy_j, sep=' ')

Ожидаемый результат. При 4 А получаются 0,48 Вб и 0,96 Дж. При нулевом токе обе величины равны нулю.

Скачать 03-functions.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 6

Действительная и комплексная математика

Модуль math предназначен для действительных функций, cmath — для комплексных. Тригонометрические функции принимают угол в радианах. Для 30° используйте 30 * math.pi / 180; результат math.sin должен быть близок к 0.5. Углы геометрического API FEMM могут задаваться в градусах: единица угла принадлежит конкретной функции, а не всему сценарию сразу.

Мнимая единица записывается суффиксом j: число 3+4j имеет действительную часть 3 и мнимую 4. Свойства .real, .imag выделяют компоненты; abs(z) даёт модуль; .conjugate() — сопряжение. cmath.phase(z) возвращает фазу в радианах. Модуль комплексного числа всегда неотрицателен и теряет информацию о знаке действительной компоненты.

Для контрольной цепи с voltage = 10+0j В и impedance = 3+4j Ом ток равен 1.2-1.6j А, его модуль — 2 А. Если эти фазоры заданы амплитудными значениями, комплексная мощность вычисляется как 0.5 * voltage * current.conjugate() и равна 6+8j В·А. При действующих значениях множитель 0.5 отсутствует. Для синусоиды амплитуда равна действующему значению, умноженному на √2.

Перед работой с гармонической задачей запишите принятую временную зависимость, амплитудную либо действующую нормировку и направление положительного тока. Согласуйте их с соглашениями конкретного решателя и его API. Нельзя механически переносить формулу мощности между разными соглашениями. Знак реактивной мощности также оценивают в принятом соглашении, а не только по внешнему виду фазового графика.

Числа с плавающей точкой приближённы. Для контроля используйте абсолютный и относительный допуски: разность должна быть не больше atol + rtol * abs(reference). Рядом с нулём важен абсолютный допуск, выраженный в единице величины. Число цифр на экране не равно точности полевого решения; сеточная и модельная погрешности оцениваются отдельно.

Комплексные операции и малую систему уравнений разбирает занятие 12.3; применение к данным FEMM требует также контракта интегралов.

Комплексный ток и мощность RL-ветви

Однофазная последовательная RL-цепь с действующими фазорами; этот пример не устанавливает амплитудное соглашение магнитного API.

MicroPython FEMM 5 · 04-complex.py
"""Гармоническая последовательная RL-ветвь с действующими фазорами.

Вход: f [Гц], R [Ом], L [Гн], U_RMS [В]. Выход: I_RMS [А], P [Вт],
Q [вар] и фаза тока [градусы]. Принято exp(jωt): индуктивное сопротивление
положительно мнимое. Линейная сосредоточенная цепь; полевой API не вызывается.
"""

import math
import cmath

# 1. Все параметры в СИ; напряжение задано действующим значением.
frequency_hz = 50.0
resistance_ohm = 10.0
inductance_h = 0.02
voltage_rms_v = 100.0

# 2. Вычисляем Z = R + jωL, затем I = U/Z по комплексному закону Ома.
impedance_ohm = resistance_ohm + 1j * 2 * math.pi * frequency_hz * inductance_h
current_rms_a = voltage_rms_v / impedance_ohm

# Комплексная мощность S = U·conj(I): для RMS множитель 1/2 не нужен.
power_va = voltage_rms_v * current_rms_a.conjugate()

# cmath.phase возвращает радианы; переводим угол в градусы.
phase_deg = cmath.phase(current_rms_a) * 180 / math.pi

# 3. Проверяем закон Ома, тепловую мощность I²R и отставание тока.
assert abs(current_rms_a * impedance_ohm - voltage_rms_v) < 1e-10
assert abs(power_va.real - abs(current_rms_a) ** 2 * resistance_ohm) < 1e-10
assert phase_deg < 0
print('Действующий ток, А:', current_rms_a, sep=' ')
print('Активная мощность, Вт:', power_va.real, sep=' ')
print('Реактивная мощность, вар:', power_va.imag, sep=' ')
print('Фаза тока, градусы:', phase_deg, sep=' ')

Ожидаемый результат. Действующий ток примерно 7,1696 − 4,5048j А; активная мощность 716,96 Вт; реактивная 450,48 вар. Фаза тока отрицательна.

Скачать 04-complex.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 7

Исключения, проверки и достоверность результата

Ошибка программы должна сохранять смысл неудачи. SyntaxError означает неверный синтаксис; NameError — неизвестное имя; TypeError — неподходящий тип; ValueError — недопустимое значение; OSError — проблему файловой операции. Сообщение и строка traceback помогают установить место отказа. Начинайте чтение с последнего сообщения, затем прослеживайте вызывавшие функции.

Блок try заключает операцию, которая может завершиться исключением. except OSError as error обрабатывает ожидаемую файловую ошибку; except ValueError — неверный ввод. Общий except Exception уместен на границе отдельного опыта, где нужно записать отказ и перейти к следующему режиму. Внутри математической функции он часто скрывает ошибку разработки.

Не используйте except: pass в расчётной серии. Если решение не получено, строка должна содержать status=error, описание причины и пустые поля численного результата. Ноль уже является физически допустимым значением и не может одновременно обозначать отсутствие данных. Для остановки после записи диагностики применяют повторный raise; для продолжения серии явно определяют допустимые типы отказа.

Проверяйте вход до изменения модели: существование файла, ненулевое сопротивление, допустимость размера, число точек, имя цепи. assert удобен для внутренних учебных инвариантов и контрольных сравнений. Ошибку пользовательского параметра лучше обозначить явным raise ValueError с единицей и допустимым диапазоном: такая проверка не зависит от возможного отключения assertions.

Блок finally выполняет необходимое завершение: например, освобождает ресурс независимо от успеха. Для файлов проще использовать with. При работе с FEMM закрытие окна решения в обработчике должно учитывать, было ли оно действительно открыто; вторичная ошибка завершения не должна уничтожать исходную диагностику.

Проверяйте обработчик искусственной неудачей: несуществующим путём или запрещённым параметром. Убедитесь, что таблица содержит отказ, а итоговый счётчик успешных опытов не вырос. Эта дисциплина вводится в занятии 12.4.

Обработка нулевого тока

Отношение потокосцепления к току используется только для выбранной линейной катушки.

MicroPython FEMM 5 · 05-errors.py
"""Явный отказ при делении потокосцепления на близкий к нулю ток.

Аргументы функции: Ψ [Вб·виток], I [А]; результат Ψ/I [Гн]. Порог
10⁻¹² А выбран для масштаба этого учебного примера. Отношение является
секущей индуктивностью и в общем нелинейном случае не равно dΨ/dI.
"""

# 1. Функция сообщает об ошибочном режиме исключением вместо ложного нуля.
def secant_inductance(linkage_wb, current_a):
    # Около нуля отношение плохо определено; порог имеет размерность ампер.
    if abs(current_a) < 1e-12:
        raise ValueError('При нулевом токе отношение потокосцепления к току не определено')
    return linkage_wb / current_a

# 2. Счётчик ошибок отделён от численных результатов успешных режимов.
errors = 0

# Проверяем нулевое возбуждение и нормальный режим линейной катушки.
for current_a in [0.0, 2.0]:
    try:
        inductance_h = secant_inductance(0.12 * current_a, current_a)
        assert abs(inductance_h - 0.12) < 1e-12
        print('Индуктивность, Гн:', inductance_h, sep=' ')
    # Обрабатываем только ожидаемый отказ; другие ошибки не скрываем.
    except ValueError as error:
        errors += 1
        print('Режим пропущен:', error, sep=' ')

# 3. Должен быть ровно один обработанный отказ при нулевом токе.
assert errors == 1

Ожидаемый результат. Нулевой ток даёт одно обработанное ValueError; при 2 А индуктивность равна 0,12 Гн.

Скачать 05-errors.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 8

Пути, текстовые файлы, JSON и CSV

Путь — часть входных данных опыта. Стройте его через os.path.join, проверяйте os.path.isfile для модели и создавайте отдельную папку результатов. Прямые разделители удобны и на Windows. В строковом литерале обратная косая черта может начать escape-последовательность; особенно легко случайно получить табуляцию или перевод строки. Кириллические имена файлов и UTF-8 проверены в установленной сборке FEMM.

Встроенное имя open имеет особенность FEMM: единственный аргумент с расширением .fem, .fee, .feh или .fec может открыть документ. Для явного открытия модели используйте opendocument. Для обычного файла всегда задавайте режим вторым аргументом: open(path, "r") или open(path, "w"). Режим w перезаписывает существующий файл, поэтому имя и каталог назначайте до запуска серии.

Контекстный менеджер with закрывает поток при выходе из блока. Сначала полностью запишите строку, затем переходите к следующему режиму. При больших сериях храните журнал постепенно, чтобы уже завершённые опыты пережили поздний отказ. Для точных байтов предназначены rb/wb; текстовый режим обрабатывает окончания строк платформы.

JSON подходит для протокола расчёта: параметры, единицы, версия, имена файлов, список режимов. Обычный комплексный объект не представляется стандартным JSON-числом. Записывайте его явно как пару действительной и мнимой частей с описанием нормировки. Не пытайтесь восстановить словарь через eval прочитанного текста; используйте json.load/json.loads и проверяйте обязательные ключи.

CSV подходит для прямоугольной таблицы. Указывайте единицы в заголовках, например current_a,linkage_wb,status. Учебный пример использует csv.reader/csv.writer; для потока CSV задавайте newline="". Не разделяйте произвольный CSV через split(","): поле может содержать кавычки, запятую или перевод строки. Для собственного строго числового формата ограничения должны быть написаны явно.

В старых абзацах PDF есть противоречия о наличии csv; минимальный вызов подтверждён в проверенной сборке курса, но это не проверка всех диалектов. Форматирование print задавайте через sep и end: стандартный вывод FEMM разделяет аргументы табуляцией. Детали и ограничения np.savetxt приведены в справочнике файлов, упражнение — в 12.4.

В проверенной сборке Windows для CSV используйте open(path, mode, newline=""): этот аргумент поддерживается встроенной средой и предотвращает повторное преобразование конца строки в CR CR LF. Кириллица, символ Ψ и поля с запятыми проверены обратным чтением. Дополнительный параметр encoding="utf-8" также поддерживается в этой сборке. При переносе на другую поставку повторите малый файловый пример.

Запись и обратное чтение CSV и JSON

Записывает только новую папку в текущем каталоге. Для повтора измените её имя; существующая папка вызывает OSError.

MicroPython FEMM 5 · 06-files.py
"""Запись и обратное чтение результатов в CSV и JSON.

Столбцы: ток [А] и потокосцепление [Вб·виток]; L [Гн] входит в JSON.
Код создаёт новый подкаталог текущей рабочей папки. Для повторного запуска
измените folder: mkdir откажет, если каталог существует. Поле не рассчитывается.
Встроенный MicroPython FEMM 5 предоставляет используемые файловые модули.
"""

import os
import json
import csv

# 1. Создаём новый каталог, чтобы отделить этот набор результатов.
folder = 'micro-reference-files'
os.mkdir(folder)

# Три строки аналитической линейной катушки; единицы задаются заголовком.
rows = [[0.0, 0.0], [2.0, 0.24], [4.0, 0.48]]

# 2. Контекстный менеджер закрывает CSV после записи заголовка и данных.
with open(os.path.join(folder, 'coil.csv'), 'w', newline='') as stream:
    writer = csv.writer(stream)
    writer.writerow(['current_a', 'linkage_wb'])
    writer.writerows(rows)

# 3. Читаем CSV обратно: csv.reader возвращает текст, число переводим float.
with open(os.path.join(folder, 'coil.csv'), 'r', newline='') as stream:
    loaded = list(csv.reader(stream))
assert len(loaded) == 4
assert abs(float(loaded[3][1]) - 0.48) < 1e-12

# 4. JSON дополнительно хранит происхождение данных и параметр L.
record = {'model': 'analytical-linear-coil', 'inductance_h': 0.12, 'rows': rows}
with open(os.path.join(folder, 'coil.json'), 'w') as stream:
    json.dump(record, stream)

# 5. Сверяем восстановленные строки с исходными без нового расчёта.
with open(os.path.join(folder, 'coil.json'), 'r') as stream:
    restored = json.load(stream)
assert restored['rows'] == rows
print('Каталог результатов:', os.path.abspath(folder), sep=' ')

Ожидаемый результат. Создаётся папка micro-reference-files с coil.csv и coil.json; проверяются четыре CSV-строки с заголовком и все исходные JSON-данные.

Скачать 06-files.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 9

Числовые массивы и решение малой системы

Список Python удобен для параметров и разнородных записей. Числовой массив удобен для однородных данных: координат, значений поля, таблицы отсчётов. Во встроенном FEMM import numpy as np обращается к локальной библиотеке ulab с расширениями FEMM. Размерность и поддерживаемые аргументы функции проверяйте на малом примере, прежде чем переносить привычный код настольного NumPy.

Массив np.array([[2.0, 1.0], [1.0, 3.0]]) представляет матрицу двух уравнений. Для правой части [1.0, 2.0] вызов np.linalg.solve должен дать [0.2, 0.6]. Проверка обязательна обратной подстановкой: 2*0.2+0.6=1 и 0.2+3*0.6=2. Это самостоятельный численный эталон; он не доказывает правильность геометрии FEMM.

Различайте умножение элементов и матричную операцию. Для каждой операции проверьте допустимую форму массива и правила согласования осей. При неизвестной форме сначала выведите shape, тип и короткий фрагмент данных. Ошибка размерности обычно означает смешение осей либо узловых и элементных величин, а не необходимость удалить одну случайную строку.

Для системы уравнений предпочтительнее решать A x = b, чем вычислять обратную матрицу ради одного решения. Почти вырожденная матрица может давать большой разброс результата при малом изменении входа. Невязка проверяет согласованность найденного вектора с данной системой; она сама по себе не оценивает физическую достоверность исходных коэффициентов.

Локально документированы линейная алгебра, интерполяция, FFT и ряд методов интегрирования/оптимизации. Подробный перечень — численные функции FEMM, учебный эталон — 12.3.

Линейная система во встроенном NumPy

Проверены np.array, np.linalg.solve и np.dot для данной действительной матрицы 2×2. Это не проверка всего NumPy.

MicroPython FEMM 5 · 07-arrays.py
"""Решение небольшой действительной системы линейных уравнений.

Вход: матрица A размера 2×2 и столбец b из двух чисел; выход: x и невязка
r = Ax − b. Числа безразмерные. Для физической системы согласуйте единицы
каждого уравнения и масштаб строк. Используется import numpy — совместимый
слой FEMM 5 поверх ulab; его np.linalg.solve доступен в этой среде.
Непосредственный import ulab.numpy предоставляет другой набор возможностей.
Проверка этой малой матрицы не устанавливает устойчивость любых систем.
"""

# 1. Импортируем совместимый NumPy FEMM 5.
import numpy as np

# Строка матрицы соответствует уравнению, столбец — неизвестной.
matrix = np.array([[2.0, 1.0], [1.0, 3.0]])
right = np.array([1.0, 2.0])

# 2. Решаем Ax = b напрямую через solve; обратную матрицу не формируем.
answer = np.linalg.solve(matrix, right)

# 3. Отдельно подставляем решение в исходные уравнения: r = Ax − b.
residual = np.dot(matrix, answer) - right

# Контролируем точное решение (1/5, 3/5) и обе компоненты невязки.
assert abs(answer[0] - 0.2) < 1e-12
assert abs(answer[1] - 0.6) < 1e-12
assert max(abs(residual[0]), abs(residual[1])) < 1e-12
print('Решение:', answer, sep=' ')
print('Невязка:', residual, sep=' ')

Ожидаемый результат. Решение [0,2; 0,6]; невязка каждого уравнения меньше 10⁻¹².

Скачать 07-arrays.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 10

Графики: сначала численные данные и единицы

Для зависимости силы от зазора или потокосцепления от тока сначала получите две согласованные последовательности: x и y. Их длины должны совпасть, точки — соответствовать одному порядку режимов. Неуспешные расчёты нельзя незаметно соединять сплошной линией с успешными. В подписи укажите величину, единицу, вариант модели и нормировку комплексного результата.

FEMM содержит собственный plot: по руководству он принимает абсциссы и до семи последовательностей ординат с необязательными подписями. В проверенной установленной сборке femm.plot принимает обычные списки либо кортежи, но непосредственная передача ulab ndarray вызвала ошибку типа. Для одномерного числового массива сначала создайте список через list(array); совместимость параметров проверяйте на коротком примере. Порядок аргументов и подписей указан в карточке plot.

makeplot решает другую задачу: получает выбранную физическую величину вдоль текущего контура решения. Количество точек задаёт дискретизацию графика и не меняет конечную сетку. При передаче имени файла FEMM 5 записывает CSV; расширение .png не превращает эту таблицу в рисунок. Сохранение вида поля выполняет savebitmap.

При сравнении карт поля задавайте одинаковые пределы шкалы. Для гармонических данных отдельно выберите действительную часть, мнимую часть, модуль или фазу. Фаза около нулевого модуля неустойчива; резкий скачок на ±π может быть особенностью представления угла. Прежде чем объявить локальный максимум физическим, проверьте сетку и положение точки относительно границы материалов.

Контракты экспорта, карт и различающегося порядка аргументов четырёх модулей собраны в справочнике графиков. Сеточные массивы рассматриваются в разделе пакетного чтения.

Встроенный график

Встроенный plot с двумя массивами. Нативная автоматическая проверка подтверждает выполнение вызова; вид окна графика требует GUI.

MicroPython FEMM 5 · 08-plots.py
"""Встроенный график аналитической зависимости потокосцепления от тока.

Вход: пять токов [А], L = 0,12 Гн; выход: график Ψ [Вб·виток] от I [А].
В FEMM GUI открывается окно графика; headless-запуск проверяет выполнение
вызова, но не внешний вид окна. Новое полевое решение не создаётся.
"""

import femm

# 1. Ось абсцисс — токи в заданном порядке, включая нулевое возбуждение.
currents_a = [0.0, 1.0, 2.0, 3.0, 4.0]

# 2. Формируем ординаты Ψ = LI одним проходом по тем же токам.
linkage_wb = [0.12 * current_a for current_a in currents_a]

# Проверяем правую конечную точку до передачи данных построителю.
assert abs(linkage_wb[-1] - 0.48) < 1e-12

# 3. Передаём два списка одинаковой длины: сначала x, затем y.
femm.plot(currents_a, linkage_wb)
print('Пять точек: по горизонтали ток, А; по вертикали потокосцепление, Вб.')

Ожидаемый результат. Пять точек прямой от (0 А; 0 Вб) до (4 А; 0,48 Вб). В FEMM GUI открывается график.

Скачать 08-plots.py

Выполнено во встроенном MicroPython FEMM 5.

Раздел 11

Как читать имя команды FEMM

Имя команды сообщает физическую задачу и стадию работы. Буква i относится к исходной модели, o — к обработке решения. Остальные части имени обозначают действие: добавление объекта, изменение свойства, анализ, получение величины. Не ищите одну универсальную команду поля для всех задач: сигнатуры и возвращаемые значения нужно читать по конкретному модулю.

Префиксы команд физических модулей FEMM
ПрефиксыФизикаНомер newdocument/create
mi_, mo_Магнитное поле0
ei_, eo_Электростатика1
hi_, ho_Теплопроводность2
ci_, co_Токопроводимость3

Во встроенном сценарии можно вызывать команды напрямую либо написать import femm и использовать femm.mi_analyze(1). Модуль femm обращается к командам уже работающего приложения; запускать вторую копию FEMM не требуется. Само совпадение имени функции не устанавливает одинаковый контейнер ответа во встроенном Python и внешней обёртке.

Три стадии обычного магнитного режима: изменить параметры препроцессора, выполнить mi_analyze, открыть новое решение через mi_loadsolution. Затем команды mo_ читают результаты. Создание сетки само по себе не означает решения системы, а существование старого окна обработки не доказывает, что оно соответствует изменённому току.

У каждого вызова проверяйте пять вещей: какой документ используется, какие единицы аргументов, что выбирает числовой код, какой тип возвращается и что функция меняет. Особенно внимательно читайте единицы свойств: относительная проницаемость, проводимость и коэффициенты граничных условий имеют разные смыслы. Нельзя угадывать единицу по соседнему аргументу.

В актуальных именах после префикса используется одно подчёркивание; старые расширенные варианты с дополнительными подчёркиваниями не переносите без проверки. Поиск сигнатуры и страницы официального руководства начинается с инвентаря API; объяснение состояния и свойств — с раздела команд модели.

Раздел 12

Документ, выделение и побочные действия

FEMM хранит состояние: активный документ, выбранные объекты, текущий контур, открытое решение, режим редактора. Поэтому одинаковая строка сценария может действовать по-разному после разных действий пользователя. Для повторяемого опыта сценарий должен сам устанавливать необходимые предпосылки и проверять их до изменения модели.

Если открыто несколько документов, контролируйте заголовок и фокус через семейства gettitle/setfocus, описанные для нужного модуля. Имя рабочей копии должно отличаться от исходного эталона. Сначала сохраните копию, затем меняйте свойства. Относительное перемещение при повторном запуске может накопиться; восстановление исходного документа часто проще, чем обратное преобразование.

Выбор геометрии также является входом команды. Перед назначением свойства очищайте прежнее выделение и выбирайте нужный объект явно. selectgroup очищает старый выбор и переводит редактор в групповой режим. У выбора по окружности или прямоугольнику значение режима 4 означает все классы; смысл параметра 4 в преобразовании относится к групповому редактированию. Совпадение числа не означает совпадение контракта.

В обработке результатов отдельно существуют выбранные области и контур. Перед интегралом создавайте именно требуемый выбор. Старый контур после предыдущего опыта способен дать правдоподобное число для другой линии. Удобно строить запрос как завершённую последовательность: очистить, выбрать, вычислить, сохранить результат, завершить выбор.

Различайте построение узлов и соединение существующих узлов: addsegment и addarc связывают ближайшие имеющиеся точки, тогда как drawline и родственные команды создают необходимые узлы. Ошибка состояния не исправляется более мелкой сеткой. Подробные примеры действий и режимов приведены в разборе состояния документа, вводный расчёт — в 12.2.

Раздел 13

Чтение результата: точка, цепь, интеграл и массив

Сначала определите физический вопрос. Значение индукции в контрольной точке, потокосцепление цепи, энергия области и поток через контур требуют разных запросов. Числа нельзя сравнивать лишь потому, что все они возвращаются одной строкой Python. Для каждого результата запишите единицу, положение, выбранную область и режим задачи.

Для магнитной цепи mo_getcircuitproperties возвращает ток, напряжение и потокосцепление в этом порядке. Явная распаковка с именами единиц понятнее индексов 0, 1, 2 в дальнейших формулах. Если ток нулевой, не вычисляйте секущую индуктивность делением на него. Наличие постоянного магнита или остаточного поля также меняет интерпретацию отношения потокосцепления к току.

getpointvalues имеет разные поля для разных физических модулей. Не составляйте универсальную таблицу индексов по памяти. Найдите сигнатуру, исследуйте небольшой ответ и сравните одну величину с интерфейсом или аналитическим эталоном. Точка на границе материалов требует отдельного понимания стороны и сглаживания; локальный запрос не заменяет интегральную проверку баланса.

Числовой type интеграла относится к конкретному модулю. Например, код 2 у mo_blockintegral означает энергию, у eo_blockintegral и ho_blockintegral — объём, у co_blockintegral — полную мощность. Перед вычислением явно задайте выбранные области либо контур. У контурного интеграла направление обхода влияет на знаки нормальной и касательной компонент.

Контейнер ответа тоже часть контракта: одна величина может оказаться одноэлементным кортежем. Проверка курса для eo_blockintegral(0) не распространяется автоматически на другие функции. Аналогично массовое чтение сетки имеет проверенное отличие от старой таблицы PDF: getallelements в проверенной сборке даёт кортеж четырёх массивов, а связность сохраняет нумерацию от 1.

Не объединяйте узловой потенциал с элементным полем по совпадению названий. Магнитный mo_getalla относится к центрам элементов; электростатический потенциал и температура — к узлам. Используйте контракты интегралов, формы массивов и страницы API. Пример чтения сохранённого решения полезно выполнить до первого автоматического пересчёта.

Прочитать сохранённое решение катушки

Нужны solenoid.fem и соответствующий solenoid.ans рядом со сценарием либо путь к модели в первом аргументе. Новое поле не рассчитывается.

MicroPython FEMM 5 · 09-read-solution.py
"""Прочитать уже сохранённое магнитное решение без нового анализа.

Нужны solenoid.fem и соответствующий solenoid.ans: по умолчанию в текущей
папке, либо передайте путь .fem первым аргументом. Координаты, материалы,
частота и глубина наследуются из модели. Выход: ток [А], напряжение [В],
потокосцепление [Вб·виток] цепи Coil и число элементов. Сохранённое решение
должно соответствовать входной модели; существование .ans само по себе
не доказывает их согласованности или физической точности.
"""

import os
import sys
import femm

# 1. Формируем абсолютные пути к входу и результату с одинаковым основанием.
model_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else 'solenoid.fem')
solution_path = os.path.splitext(model_path)[0] + '.ans'

# Проверка наличия результата даёт понятный отказ до команд постпроцессора.
if not os.path.isfile(solution_path):
    raise OSError('Нужно сохранённое решение: ' + solution_path)

# 2. Открываем вход и загружаем его решение; mi_analyze здесь не вызывается.
femm.opendocument(model_path)
femm.mi_loadsolution()

# 3. Команды mo доступны после загрузки магнитного результата.
try:
    # Порядок тройки API: ток, напряжение, потокосцепление.
    current_a, voltage_v, linkage_wb = femm.mo_getcircuitproperties('Coil')
    print('Ток, А:', current_a, sep=' ')
    print('Напряжение, В:', voltage_v, sep=' ')
    print('Потокосцепление, Вб:', linkage_wb, sep=' ')
    print('Число элементов:', femm.mo_numelements(), sep=' ')
    assert femm.mo_numelements() > 0
    assert abs(current_a) > 0

# 4. Закрываем результат и вход также при ошибке чтения или проверки.
finally:
    femm.mo_close()
    femm.mi_close()

Ожидаемый результат. Выводятся ток, напряжение, потокосцепление цепи Coil и положительное число элементов сохранённого решения.

Скачать 09-read-solution.py · Скачать solenoid.fem · Скачать solenoid.ans

Выполнено во встроенном MicroPython FEMM 5.

Раздел 14

Параметрическая серия и сохранение условий опыта

Начинайте серию с одного параметра: например, тока при неизменных геометрии, материале, сеточных правилах и граничных условиях. Список режимов задайте явно. Для каждого шага сохраняйте не только номер, но и фактически установленное значение с единицей. Позднее это позволяет отличить неверную формулу шага от необычного физического результата.

Перед циклом проверьте исходную модель вручную на одном режиме и сохраните её эталоном. Для запуска создайте отдельный каталог и рабочую копию. Внутри шага определите документ, установите параметр, сохраните модель, решите задачу, загрузите новое решение и только затем читайте величины. Старый файл решения никогда не должен быть запасным результатом после ошибки решателя.

Если меняется только ток цепи, установка конкретного значения безопаснее накопительного прибавления. При изменении геометрии решите, восстанавливается ли исходная модель на каждом шаге либо параметры задают абсолютное состояние. Отдельно отмечайте перестроение сетки. Меняющаяся сетка допустима, но требует контроля сходимости, особенно для силы и локальных максимумов.

Одна строка таблицы соответствует одному запрошенному режиму. Минимальные столбцы: номер, параметр, статус, значения, имя модели/решения и причина отказа. Записывайте строку даже при исключении. После окончания проверьте равенство числа строк количеству режимов и отдельно подсчитайте успешные расчёты. Отсутствующий результат нельзя выдавать за физический ноль.

Для линейной воздушной катушки без магнитов полезны масштабные проверки: потокосцепление пропорционально току, энергия — квадрату тока, поле меняет знак при смене знака возбуждения. Эти ожидания не переносятся автоматически на насыщение, гистерезис или гармонические потери. Добавьте независимый контроль единиц, одну ручную точку и проверку сетки.

Параллельные расчёты требуют отдельных процессов, портов и выходных файлов; совместное изменение одного открытого документа не является параллельной серией. Сначала завершите последовательную воспроизводимую версию. Учебный маршрут — 12.4 и повтор четырёх модулей.

Минимальная программа 10 ниже останавливается при первой ошибке и сохраняет уже завершённые успешные режимы. Она не продолжает серию после сбоя и не создаёт отдельные строки со статусом ошибки; такой журнал понадобится при расширении программы для длинной серии.

Три расчёта по току с рабочими копиями

Нужна solenoid.fem. Выполняются три магнитостатических полевых расчёта учебной осесимметричной катушки. Проверка выполнения не заменяет исследование сходимости и применимости модели.

MicroPython FEMM 5 · 10-current-sweep.py
"""Серия трёх независимых магнитостатических решений катушки.

Вход: solenoid.fem с цепью Coil, токи 0, 1, 2 А; единицы геометрии и
осесимметричная постановка наследуются из учебной модели. Выход: новые
модели, решения и results.json с токами [А], потокосцеплениями [Вб·виток]
и числом элементов. Создаётся новый каталог: для повтора измените folder.
Каждый режим начинается с исходной модели; она не перезаписывается.
Проверка фактического тока подтверждает возбуждение, но не сходимость сетки.
"""

import os
import sys
import json
import femm

# 1. Приводим пути к абсолютному виду и создаём отдельный каталог серии.
model_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else 'solenoid.fem')
folder = os.path.abspath('micro-reference-sweep')
os.mkdir(folder)
rows = []

# 2. Перебираем три тока; номер режима формирует уникальное имя копии.
for index, requested_a in enumerate([0.0, 1.0, 2.0]):
    # Снова читаем исходную модель, сохраняя одинаковые исходные параметры.
    femm.opendocument(model_path)
    work_path = os.path.join(folder, 'coil-' + str(index) + '.fem')
    solution_open = False
    try:
        # Сохраняем рабочую копию до изменения тока; свойство цепи 1 — ток, А.
        femm.mi_saveas(work_path)
        femm.mi_modifycircprop('Coil', 1, requested_a)
        femm.mi_saveas(work_path)
        # Решаем копию и загружаем соответствующий результат для команд mo.
        femm.mi_analyze(1)
        femm.mi_loadsolution()
        solution_open = True
        # Читаем фактическое возбуждение вместе с откликом; не подменяем его заданием.
        measured_a, voltage_v, linkage_wb = femm.mo_getcircuitproperties('Coil')
        assert abs(measured_a - requested_a) < 1e-09
        rows.append({
            'current_a': measured_a,
            'linkage_wb': linkage_wb,
            'elements': femm.mo_numelements(),
            'model': work_path,
        })
    # Закрываем только открытый результат; вход закрывается в любом случае.
    finally:
        if solution_open:
            femm.mo_close()
        femm.mi_close()
    # 3. Промежуточная запись сохраняет уже завершённые режимы серии.
    with open(os.path.join(folder, 'results.json'), 'w') as stream:
        json.dump(rows, stream)

# 4. Проверяем, что серия дошла до всех трёх режимов.
assert len(rows) == 3
print('Результаты трёх статических расчётов:', rows, sep=' ')

Ожидаемый результат. В новой папке micro-reference-sweep сохраняются три модели и решения для 0, 1, 2 А и results.json. Для каждого режима проверяется фактический ток цепи.

Скачать 10-current-sweep.py · Скачать solenoid.fem

Выполнено во встроенном MicroPython FEMM 5.

Раздел 15

Протокол расчёта и воспроизводимость

Воспроизводимость означает возможность восстановить вход, среду, процедуру и критерий проверки. Одного файла .py недостаточно: он может ссылаться на другой материал, неявный рабочий каталог или открытый пользователем документ. Храните сценарий рядом с протоколом опыта и перечислением используемых моделей.

В протокол включите версию и дату сборки FEMM, способ запуска, единицы геометрии, тип задачи, частоту, глубину либо осесимметрию, исходные свойства и список параметров. Для сетки запишите правила её задания и число узлов/элементов результата.

Идентичность файла удобно фиксировать хешем, например SHA-256. Размер и время изменения помогают расследованию, но не заменяют контроль содержимого. Для каждой таблицы укажите версию схемы, заголовки и единицы. При комплексных данных запишите форму хранения и соглашение о фазорах. Численная таблица и рисунок должны ссылаться на одну серию.

Если используются случайные числа, задавайте random.seed и сохраняйте seed. Результаты поиска файлов сортируйте явно. Избегайте зависимости от текущего выделения и остаточных переменных консоли. Повтор в свежем процессе помогает обнаружить скрытые предпосылки, которые незаметны после длительной интерактивной работы.

Проверка имеет уровни: сценарий выполнился, данные согласованы, численный эталон воспроизведён, сеточная сходимость исследована, физическая применимость обоснована. Не объединяйте их одной надписью «проверено». Исполнение примера языка подтверждает синтаксис данного примера; оно не валидирует машинную модель. Образец воспроизводимого запуска дан в библиотеке проверок курса, границы доказательств — в замечаниях к руководству.

Раздел 16

Диагностика типичных затруднений

Уменьшайте отказавшую программу до минимального воспроизводимого случая. Сначала проверьте среду и текущий каталог, затем импорт и тип данных, после этого документ и конкретный вызов FEMM. Изменяйте одну причину за раз; случайная одновременная перестройка модели, переустановка Python и правка формул уничтожает полезные признаки ошибки.

Первичная диагностика ошибок сценария
СимптомЧто проверить первым
ImportError или AttributeErrorИмя модуля или функции и её наличие в установленной сборке
Модель или таблица «пропала»os.getcwd(), абсолютный путь и наличие файла
NameErrorРегистр, порядок определения, область видимости и открытие нужного документа
Ошибка распаковкиФактический контейнер и число полей ответа
Все строки серии одинаковыУстановку параметра, повторный analyze и новое loadsolution
Величина отличается в 1000 разЕдиницы геометрии и свойств, перевод результата
Мощность отличается вдвоеАмплитудные либо действующие фазоры
Процесс остаётся после сценарияНаличие -run и выбранный режим обслуживания TCP

Если график построился, но выглядит неверно, проверьте порядок точек, подпись осей, комплексную компоненту и одинаковые шкалы. Если сеточный рисунок разрушен, проверьте диапазон связности и переход от номеров узлов 1…N к индексам 0…N−1. Не исправляйте данные обрезкой массива до случайно подходящей длины.

Для сообщения об ошибке сохраните короткий сценарий, версию FEMM, входной файл, команду запуска, полный текст исключения и ожидаемый результат. Уберите персональные пути, если пример передаётся другим людям. Известные редакционные несогласованности PDF перечислены в errata курса; это помогает отличить собственную ошибку от устаревшего описания.

Раздел 17

Как пользоваться справочником и первоисточниками

Для первого знакомства пройдите четыре коротких шага: переменные и функции, управление моделью, комплексные числа и массивы, таблицы и ошибки. Затем возвращайтесь к нужному разделу справочника по рабочему вопросу. Исполняемые примеры вынесены отдельно, чтобы их можно было сохранить целым файлом.

Если вопрос касается точного аргумента или числового кода FEMM, начинайте с полного указателя API и переходите к странице официального PDF. Если важны контейнеры ответа, состояние документа, единицы или известное противоречие текста, сверяйте также комментарии к API. Для алгоритма модели используйте урок с физической постановкой и критериями проверки.

Официальная страница FEMM MicroPython описывает состав поставки. Подробные контракты функций в этом справочнике сопоставлены с установленными модулями, исходниками сборки и результатами нативных примеров. Ссылки на источники приведены ниже.

Документация MicroPython полезна для языка и базовых типов, но раздел latest относится к развиваемой ветке и может описывать ещё не выпущенные возможности. Сопоставляйте её с версией интерпретатора в вашей сборке и дополнениями FEMM. Аппаратные разделы о GPIO, прошивке платы или загрузке микроконтроллера не являются инструкцией по встроенной консоли FEMM.

При добавлении собственного рецепта укажите назначение, среду запуска, вход, выход, единицы, побочные действия и малую контрольную проверку. Такой рецепт легче повторить и обсуждать, чем набор отдельных команд без документа и физической задачи.

Все программы

Для примеров 09 и 10 скачайте модели по ссылкам в соответствующем разделе. Создайте отдельную рабочую папку и сохраните в неё необходимые файлы с исходными именами.

  1. Переменные и единицы: линейная катушка · 01-language.py
  2. Список режимов и словарь параметров · 02-collections.py
  3. Функция с двумя возвращаемыми величинами · 03-functions.py
  4. Комплексный ток и мощность RL-ветви · 04-complex.py
  5. Обработка нулевого тока · 05-errors.py
  6. Запись и обратное чтение CSV и JSON · 06-files.py
  7. Линейная система во встроенном NumPy · 07-arrays.py
  8. Встроенный график · 08-plots.py
  9. Прочитать сохранённое решение катушки · 09-read-solution.py
  10. Три расчёта по току с рабочими копиями · 10-current-sweep.py

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

Подтверждено выполнение 10 из 10 программ. Проверенная сборка: FEMM headless engine v5.0 06Oct2026. Аналитические примеры проверяют арифметику и функции библиотек; чтение готового решения и новые полевые расчёты отмечены отдельно. Исполнение plot в пакетном режиме не подтверждает внешний вид окна графика.

Три расчёта катушки проверяют последовательность команд и соответствие тока заданию. Они не заменяют проверку сеточной сходимости, материалов и применимости двумерной модели.

Источники и область действия

Сведения сверены 2026-10-16. При другой сборке сначала выполните малый пример нужной функции. Общая документация MicroPython описывает язык и стандартные модули; дополнительные команды и изменения FEMM проверяйте по документации FEMM.