Среда выполнения. Откройте программу через File → Open Python Script в FEMM 5. Код выполняет встроенный MicroPython; браузер показывает текст и помогает его скопировать. Набор библиотек зависит от сборки FEMM.
Встроенный MicroPython выполняет программы внутри FEMM 5. Сценарий создаёт или открывает документ, задаёт геометрию и свойства, запускает решение и обрабатывает полученные величины. Программы этого курса запускаются через встроенную консоль или команду Open Python Script.
Основные математические операции дают модули math и cmath. Для числовых массивов используются numpy и scipy из поставки FEMM; их точный состав описан в каталоге функций. csv, json, os и time помогают вести таблицы, описания режимов и журналы расчётов.
Имя функции определяет её контракт: порядок аргументов, допустимые формы массивов, единицы и тип возвращаемого значения. Для комплексной величины дополнительно задайте нормировку и фазовое соглашение. Эти сведения входят в карточку функции вместе с примером и ожидаемым результатом.
Команды конкретной физики регистрируются после создания или открытия соответствующего документа. Команды обработки решения становятся доступны после loadsolution. Поэтому перед обращением к mi_, ei_, hi_, ci_ и соответствующим командам результатов проверьте стадию работы.
Полный перечень приведён в каталоге модулей и функций. Рецепты ниже связывают отдельные вызовы с задачей расчёта; подробные сведения о состоянии документа находятся в справочнике команд.
Сохраните исходный текст в файл .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 может сохраниться после неудачного запуска. Учебный маршрут — консоль и модель, затем рабочие копии и ошибки. Детали ключей собраны в справочнике запуска.
Присваивание 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.12current_a=2.0# 2. Для постоянной L применяем Ψ = LI и W = LI²/2.linkage_wb=inductance_h*current_aenergy_j=inductance_h*current_a**2/2# 3. Сравниваем результаты с независимыми числами учебного примера.assertabs(linkage_wb-0.24)<1e-12assertabs(energy_j-0.24)<1e-12# 4. Выводим обе величины с подписями единиц.print('Потокосцепление, Вб:',linkage_wb,sep=' ')print('Энергия, Дж:',energy_j,sep=' ')
Ожидаемый результат. При токе 2 А потокосцепление 0,24 Вб и энергия 0,24 Дж.
Список хранит упорядоченную последовательность: токи [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. Один проход формирует строки: номер режима, ток, потокосцепление.forindex,current_ainenumerate(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.assertlen(rows)==3assertabs(rows[-1]['linkage_wb']-0.48)<1e-12assertlist(range(0,5,2))==[0,2,4]
Ожидаемый результат. Три строки: (0; 0), (2; 0,24), (4; 0,48). Диапазон range(0, 5, 2) даёт 0, 2, 4.
Функция объединяет законченный шаг расчёта: проверку параметров, аналитическую оценку, чтение результата или выполнение одного режима 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 Гн.defcoil_state(current_a,inductance_h=0.12):"""Вернуть потокосцепление, Вб, и энергию, Дж, линейной катушки."""# Отрицательная L выходит за рамки этой пассивной аналитической модели.ifinductance_h<0:raiseValueError('Индуктивность должна быть неотрицательной')# Обе величины вычисляются из одних исходных данных и возвращаются вместе.return(inductance_h*current_a,inductance_h*current_a**2/2)# 2. Распаковываем кортеж и проверяем режим 4 А и нулевое возбуждение.linkage_wb,energy_j=coil_state(4.0)assertabs(linkage_wb-0.48)<1e-12assertabs(energy_j-0.96)<1e-12assertcoil_state(0.0)==(0.0,0.0)print('Потокосцепление, Вб:',linkage_wb,'энергия, Дж:',energy_j,sep=' ')
Ожидаемый результат. При 4 А получаются 0,48 Вб и 0,96 Дж. При нулевом токе обе величины равны нулю.
Модуль 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 не вызывается."""importmathimportcmath# 1. Все параметры в СИ; напряжение задано действующим значением.frequency_hz=50.0resistance_ohm=10.0inductance_h=0.02voltage_rms_v=100.0# 2. Вычисляем Z = R + jωL, затем I = U/Z по комплексному закону Ома.impedance_ohm=resistance_ohm+1j*2*math.pi*frequency_hz*inductance_hcurrent_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 и отставание тока.assertabs(current_rms_a*impedance_ohm-voltage_rms_v)<1e-10assertabs(power_va.real-abs(current_rms_a)**2*resistance_ohm)<1e-10assertphase_deg<0print('Действующий ток, А:',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 вар. Фаза тока отрицательна.
Ошибка программы должна сохранять смысл неудачи. 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. Функция сообщает об ошибочном режиме исключением вместо ложного нуля.defsecant_inductance(linkage_wb,current_a):# Около нуля отношение плохо определено; порог имеет размерность ампер.ifabs(current_a)<1e-12:raiseValueError('При нулевом токе отношение потокосцепления к току не определено')returnlinkage_wb/current_a# 2. Счётчик ошибок отделён от численных результатов успешных режимов.errors=0# Проверяем нулевое возбуждение и нормальный режим линейной катушки.forcurrent_ain[0.0,2.0]:try:inductance_h=secant_inductance(0.12*current_a,current_a)assertabs(inductance_h-0.12)<1e-12print('Индуктивность, Гн:',inductance_h,sep=' ')# Обрабатываем только ожидаемый отказ; другие ошибки не скрываем.exceptValueErroraserror:errors+=1print('Режим пропущен:',error,sep=' ')# 3. Должен быть ровно один обработанный отказ при нулевом токе.asserterrors==1
Ожидаемый результат. Нулевой ток даёт одно обработанное ValueError; при 2 А индуктивность равна 0,12 Гн.
Путь — часть входных данных опыта. Стройте его через 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 предоставляет используемые файловые модули."""importosimportjsonimportcsv# 1. Создаём новый каталог, чтобы отделить этот набор результатов.folder='micro-reference-files'os.mkdir(folder)# Три строки аналитической линейной катушки; единицы задаются заголовком.rows=[[0.0,0.0],[2.0,0.24],[4.0,0.48]]# 2. Контекстный менеджер закрывает CSV после записи заголовка и данных.withopen(os.path.join(folder,'coil.csv'),'w',newline='')asstream:writer=csv.writer(stream)writer.writerow(['current_a','linkage_wb'])writer.writerows(rows)# 3. Читаем CSV обратно: csv.reader возвращает текст, число переводим float.withopen(os.path.join(folder,'coil.csv'),'r',newline='')asstream:loaded=list(csv.reader(stream))assertlen(loaded)==4assertabs(float(loaded[3][1])-0.48)<1e-12# 4. JSON дополнительно хранит происхождение данных и параметр L.record={'model':'analytical-linear-coil','inductance_h':0.12,'rows':rows}withopen(os.path.join(folder,'coil.json'),'w')asstream:json.dump(record,stream)# 5. Сверяем восстановленные строки с исходными без нового расчёта.withopen(os.path.join(folder,'coil.json'),'r')asstream:restored=json.load(stream)assertrestored['rows']==rowsprint('Каталог результатов:',os.path.abspath(folder),sep=' ')
Ожидаемый результат. Создаётся папка micro-reference-files с coil.csv и coil.json; проверяются четыре CSV-строки с заголовком и все исходные JSON-данные.
Список 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.importnumpyasnp# Строка матрицы соответствует уравнению, столбец — неизвестной.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) и обе компоненты невязки.assertabs(answer[0]-0.2)<1e-12assertabs(answer[1]-0.6)<1e-12assertmax(abs(residual[0]),abs(residual[1]))<1e-12print('Решение:',answer,sep=' ')print('Невязка:',residual,sep=' ')
Ожидаемый результат. Решение [0,2; 0,6]; невязка каждого уравнения меньше 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-запуск проверяет выполнениевызова, но не внешний вид окна. Новое полевое решение не создаётся."""importfemm# 1. Ось абсцисс — токи в заданном порядке, включая нулевое возбуждение.currents_a=[0.0,1.0,2.0,3.0,4.0]# 2. Формируем ординаты Ψ = LI одним проходом по тем же токам.linkage_wb=[0.12*current_aforcurrent_aincurrents_a]# Проверяем правую конечную точку до передачи данных построителю.assertabs(linkage_wb[-1]-0.48)<1e-12# 3. Передаём два списка одинаковой длины: сначала x, затем y.femm.plot(currents_a,linkage_wb)print('Пять точек: по горизонтали ток, А; по вертикали потокосцепление, Вб.')
Ожидаемый результат. Пять точек прямой от (0 А; 0 Вб) до (4 А; 0,48 Вб). В FEMM GUI открывается график.
Имя команды сообщает физическую задачу и стадию работы. Буква 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; объяснение состояния и свойств — с раздела команд модели.
FEMM хранит состояние: активный документ, выбранные объекты, текущий контур, открытое решение, режим редактора. Поэтому одинаковая строка сценария может действовать по-разному после разных действий пользователя. Для повторяемого опыта сценарий должен сам устанавливать необходимые предпосылки и проверять их до изменения модели.
Если открыто несколько документов, контролируйте заголовок и фокус через семейства gettitle/setfocus, описанные для нужного модуля. Имя рабочей копии должно отличаться от исходного эталона. Сначала сохраните копию, затем меняйте свойства. Относительное перемещение при повторном запуске может накопиться; восстановление исходного документа часто проще, чем обратное преобразование.
Выбор геометрии также является входом команды. Перед назначением свойства очищайте прежнее выделение и выбирайте нужный объект явно. selectgroup очищает старый выбор и переводит редактор в групповой режим. У выбора по окружности или прямоугольнику значение режима 4 означает все классы; смысл параметра 4 в преобразовании относится к групповому редактированию. Совпадение числа не означает совпадение контракта.
В обработке результатов отдельно существуют выбранные области и контур. Перед интегралом создавайте именно требуемый выбор. Старый контур после предыдущего опыта способен дать правдоподобное число для другой линии. Удобно строить запрос как завершённую последовательность: очистить, выбрать, вычислить, сохранить результат, завершить выбор.
Различайте построение узлов и соединение существующих узлов: addsegment и addarc связывают ближайшие имеющиеся точки, тогда как drawline и родственные команды создают необходимые узлы. Ошибка состояния не исправляется более мелкой сеткой. Подробные примеры действий и режимов приведены в разборе состояния документа, вводный расчёт — в 12.2.
Сначала определите физический вопрос. Значение индукции в контрольной точке, потокосцепление цепи, энергия области и поток через контур требуют разных запросов. Числа нельзя сравнивать лишь потому, что все они возвращаются одной строкой 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 само по себене доказывает их согласованности или физической точности."""importosimportsysimportfemm# 1. Формируем абсолютные пути к входу и результату с одинаковым основанием.model_path=os.path.abspath(sys.argv[1]iflen(sys.argv)>1else'solenoid.fem')solution_path=os.path.splitext(model_path)[0]+'.ans'# Проверка наличия результата даёт понятный отказ до команд постпроцессора.ifnotos.path.isfile(solution_path):raiseOSError('Нужно сохранённое решение: '+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=' ')assertfemm.mo_numelements()>0assertabs(current_a)>0# 4. Закрываем результат и вход также при ошибке чтения или проверки.finally:femm.mo_close()femm.mi_close()
Ожидаемый результат. Выводятся ток, напряжение, потокосцепление цепи Coil и положительное число элементов сохранённого решения.
Начинайте серию с одного параметра: например, тока при неизменных геометрии, материале, сеточных правилах и граничных условиях. Список режимов задайте явно. Для каждого шага сохраняйте не только номер, но и фактически установленное значение с единицей. Позднее это позволяет отличить неверную формулу шага от необычного физического результата.
Перед циклом проверьте исходную модель вручную на одном режиме и сохраните её эталоном. Для запуска создайте отдельный каталог и рабочую копию. Внутри шага определите документ, установите параметр, сохраните модель, решите задачу, загрузите новое решение и только затем читайте величины. Старый файл решения никогда не должен быть запасным результатом после ошибки решателя.
Если меняется только ток цепи, установка конкретного значения безопаснее накопительного прибавления. При изменении геометрии решите, восстанавливается ли исходная модель на каждом шаге либо параметры задают абсолютное состояние. Отдельно отмечайте перестроение сетки. Меняющаяся сетка допустима, но требует контроля сходимости, особенно для силы и локальных максимумов.
Одна строка таблицы соответствует одному запрошенному режиму. Минимальные столбцы: номер, параметр, статус, значения, имя модели/решения и причина отказа. Записывайте строку даже при исключении. После окончания проверьте равенство числа строк количеству режимов и отдельно подсчитайте успешные расчёты. Отсутствующий результат нельзя выдавать за физический ноль.
Для линейной воздушной катушки без магнитов полезны масштабные проверки: потокосцепление пропорционально току, энергия — квадрату тока, поле меняет знак при смене знака возбуждения. Эти ожидания не переносятся автоматически на насыщение, гистерезис или гармонические потери. Добавьте независимый контроль единиц, одну ручную точку и проверку сетки.
Параллельные расчёты требуют отдельных процессов, портов и выходных файлов; совместное изменение одного открытого документа не является параллельной серией. Сначала завершите последовательную воспроизводимую версию. Учебный маршрут — 12.4 и повтор четырёх модулей.
Минимальная программа 10 ниже останавливается при первой ошибке и сохраняет уже завершённые успешные режимы. Она не продолжает серию после сбоя и не создаёт отдельные строки со статусом ошибки; такой журнал понадобится при расширении программы для длинной серии.
Три расчёта по току с рабочими копиями
Нужна solenoid.fem. Выполняются три магнитостатических полевых расчёта учебной осесимметричной катушки. Проверка выполнения не заменяет исследование сходимости и применимости модели.
MicroPython FEMM 5 · 10-current-sweep.py
"""Серия трёх независимых магнитостатических решений катушки.Вход: solenoid.fem с цепью Coil, токи 0, 1, 2 А; единицы геометрии иосесимметричная постановка наследуются из учебной модели. Выход: новыемодели, решения и results.json с токами [А], потокосцеплениями [Вб·виток]и числом элементов. Создаётся новый каталог: для повтора измените folder.Каждый режим начинается с исходной модели; она не перезаписывается.Проверка фактического тока подтверждает возбуждение, но не сходимость сетки."""importosimportsysimportjsonimportfemm# 1. Приводим пути к абсолютному виду и создаём отдельный каталог серии.model_path=os.path.abspath(sys.argv[1]iflen(sys.argv)>1else'solenoid.fem')folder=os.path.abspath('micro-reference-sweep')os.mkdir(folder)rows=[]# 2. Перебираем три тока; номер режима формирует уникальное имя копии.forindex,requested_ainenumerate([0.0,1.0,2.0]):# Снова читаем исходную модель, сохраняя одинаковые исходные параметры.femm.opendocument(model_path)work_path=os.path.join(folder,'coil-'+str(index)+'.fem')solution_open=Falsetry:# Сохраняем рабочую копию до изменения тока; свойство цепи 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')assertabs(measured_a-requested_a)<1e-09rows.append({'current_a':measured_a,'linkage_wb':linkage_wb,'elements':femm.mo_numelements(),'model':work_path,})# Закрываем только открытый результат; вход закрывается в любом случае.finally:ifsolution_open:femm.mo_close()femm.mi_close()# 3. Промежуточная запись сохраняет уже завершённые режимы серии.withopen(os.path.join(folder,'results.json'),'w')asstream:json.dump(rows,stream)# 4. Проверяем, что серия дошла до всех трёх режимов.assertlen(rows)==3print('Результаты трёх статических расчётов:',rows,sep=' ')
Ожидаемый результат. В новой папке micro-reference-sweep сохраняются три модели и решения для 0, 1, 2 А и results.json. Для каждого режима проверяется фактический ток цепи.
Воспроизводимость означает возможность восстановить вход, среду, процедуру и критерий проверки. Одного файла .py недостаточно: он может ссылаться на другой материал, неявный рабочий каталог или открытый пользователем документ. Храните сценарий рядом с протоколом опыта и перечислением используемых моделей.
В протокол включите версию и дату сборки FEMM, способ запуска, единицы геометрии, тип задачи, частоту, глубину либо осесимметрию, исходные свойства и список параметров. Для сетки запишите правила её задания и число узлов/элементов результата.
Идентичность файла удобно фиксировать хешем, например SHA-256. Размер и время изменения помогают расследованию, но не заменяют контроль содержимого. Для каждой таблицы укажите версию схемы, заголовки и единицы. При комплексных данных запишите форму хранения и соглашение о фазорах. Численная таблица и рисунок должны ссылаться на одну серию.
Если используются случайные числа, задавайте random.seed и сохраняйте seed. Результаты поиска файлов сортируйте явно. Избегайте зависимости от текущего выделения и остаточных переменных консоли. Повтор в свежем процессе помогает обнаружить скрытые предпосылки, которые незаметны после длительной интерактивной работы.
Проверка имеет уровни: сценарий выполнился, данные согласованы, численный эталон воспроизведён, сеточная сходимость исследована, физическая применимость обоснована. Не объединяйте их одной надписью «проверено». Исполнение примера языка подтверждает синтаксис данного примера; оно не валидирует машинную модель. Образец воспроизводимого запуска дан в библиотеке проверок курса, границы доказательств — в замечаниях к руководству.
Уменьшайте отказавшую программу до минимального воспроизводимого случая. Сначала проверьте среду и текущий каталог, затем импорт и тип данных, после этого документ и конкретный вызов FEMM. Изменяйте одну причину за раз; случайная одновременная перестройка модели, переустановка Python и правка формул уничтожает полезные признаки ошибки.
Первичная диагностика ошибок сценария
Симптом
Что проверить первым
ImportError или AttributeError
Имя модуля или функции и её наличие в установленной сборке
Модель или таблица «пропала»
os.getcwd(), абсолютный путь и наличие файла
NameError
Регистр, порядок определения, область видимости и открытие нужного документа
Ошибка распаковки
Фактический контейнер и число полей ответа
Все строки серии одинаковы
Установку параметра, повторный analyze и новое loadsolution
Величина отличается в 1000 раз
Единицы геометрии и свойств, перевод результата
Мощность отличается вдвое
Амплитудные либо действующие фазоры
Процесс остаётся после сценария
Наличие -run и выбранный режим обслуживания TCP
Если график построился, но выглядит неверно, проверьте порядок точек, подпись осей, комплексную компоненту и одинаковые шкалы. Если сеточный рисунок разрушен, проверьте диапазон связности и переход от номеров узлов 1…N к индексам 0…N−1. Не исправляйте данные обрезкой массива до случайно подходящей длины.
Для сообщения об ошибке сохраните короткий сценарий, версию FEMM, входной файл, команду запуска, полный текст исключения и ожидаемый результат. Уберите персональные пути, если пример передаётся другим людям. Известные редакционные несогласованности PDF перечислены в errata курса; это помогает отличить собственную ошибку от устаревшего описания.
Если вопрос касается точного аргумента или числового кода FEMM, начинайте с полного указателя API и переходите к странице официального PDF. Если важны контейнеры ответа, состояние документа, единицы или известное противоречие текста, сверяйте также комментарии к API. Для алгоритма модели используйте урок с физической постановкой и критериями проверки.
Официальная страница FEMM MicroPython описывает состав поставки. Подробные контракты функций в этом справочнике сопоставлены с установленными модулями, исходниками сборки и результатами нативных примеров. Ссылки на источники приведены ниже.
Документация MicroPython полезна для языка и базовых типов, но раздел latest относится к развиваемой ветке и может описывать ещё не выпущенные возможности. Сопоставляйте её с версией интерпретатора в вашей сборке и дополнениями FEMM. Аппаратные разделы о GPIO, прошивке платы или загрузке микроконтроллера не являются инструкцией по встроенной консоли FEMM.
При добавлении собственного рецепта укажите назначение, среду запуска, вход, выход, единицы, побочные действия и малую контрольную проверку. Такой рецепт легче повторить и обсуждать, чем набор отдельных команд без документа и физической задачи.
Для примеров 09 и 10 скачайте модели по ссылкам в соответствующем разделе. Создайте отдельную рабочую папку и сохраните в неё необходимые файлы с исходными именами.
Подтверждено выполнение 10 из 10 программ. Проверенная сборка: FEMM headless engine v5.0 06Oct2026. Аналитические примеры проверяют арифметику и функции библиотек; чтение готового решения и новые полевые расчёты отмечены отдельно. Исполнение plot в пакетном режиме не подтверждает внешний вид окна графика.
Три расчёта катушки проверяют последовательность команд и соответствие тока заданию. Они не заменяют проверку сеточной сходимости, материалов и применимости двумерной модели.
Источники и область действия
Сведения сверены 2026-10-16. При другой сборке сначала выполните малый пример нужной функции. Общая документация MicroPython описывает язык и стандартные модули; дополнительные команды и изменения FEMM проверяйте по документации FEMM.