"""Таблицы потокосцеплений, пульсации момента и максимальный момент при заданном токе.

Среда: встроенный MicroPython FEMM 5.
Аналитический учебный пример; полевой решатель не вызывается.
Параметры, единицы величин и порядок вывода пояснены по стадиям.
"""

import math

# Линейная машина с внутренними магнитами: число пар полюсов; магнитное потокосцепление, Вб;
# индуктивности по осям d и q, Гн; допустимая амплитуда тока, А.
pole_pairs, pm_flux_wb, ld, lq, current = 4, 0.08, 0.005, 0.008, 10.0
difference = ld - lq
# Два алгебраических корня условия максимума момента при заданной амплитуде тока.
roots = [
    (-pm_flux_wb + sign * math.sqrt(pm_flux_wb**2 + 8 * difference**2 * current**2))
    / (4 * difference)
    for sign in [1, -1]
]
for id_a in roots:
    # Отбрасываем корень вне окружности допустимого тока до извлечения квадратного корня.
    if abs(id_a) > current:
        print("Недопустимый корень:", id_a)
        continue
    # Выбираем положительную поперечную составляющую тока для рассматриваемой ветви момента.
    iq_a = math.sqrt(current**2 - id_a**2)
    torque = 1.5 * pole_pairs * (pm_flux_wb + difference * id_a) * iq_a
    # Порядок вывода: продольный ток, А; поперечный ток, А; момент, Н·м.
    # Насыщенную машину исследуют по двумерной таблице потокосцеплений, а не по постоянным Ld и Lq.
    print(id_a, iq_a, torque)
