"""Электромагнитный момент, частота вращения и согласованный нагрузочный режим.

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

import math

# Синхронная частота вращения, об/мин; угловая скорость рассчитывается в рад/с.
sync_speed_rpm = 1500.0
omega_sync = 2 * math.pi * sync_speed_rpm / 60


# Аналитическая схема замещения асинхронного двигателя; результат — момент, Н·м.
# Эталон предназначен только для двигательного режима: 0 < s ≤ 1.
def electromagnetic_torque(slip):
    if not (0 < slip <= 1):
        raise ValueError("Эталон рассчитан для двигательного скольжения")
    rotor_term = 0.5 / slip
    return 3 * 100**2 * rotor_term / (omega_sync * ((0.5 + rotor_term) ** 2 + 3**2))


slip = 0.05
torque = electromagnetic_torque(slip)
# Мощность, передаваемая через зазор, равна моменту, умноженному на синхронную угловую скорость.
gap_w = torque * omega_sync
# Порядок вывода: момент, Н·м; частота вращения, об/мин; мощность зазора, Вт;
# потери в роторе, Вт; мощность электромеханического преобразования, Вт.
print(torque, sync_speed_rpm * (1 - slip), gap_w, slip * gap_w, (1 - slip) * gap_w)
# Ищем скольжение при заданном постоянном моменте нагрузки методом деления интервала пополам.
left, right, load = 0.01, 0.15, 15.0
# Перед поиском проверяем смену знака невязки на концах заданного интервала.
if (electromagnetic_torque(left) - load) * (electromagnetic_torque(right) - load) > 0:
    raise ValueError("Нет подтвержденного интервала корня")
# Сохраняем половину интервала, на концах которой невязка меняет знак.
for iteration in range(40):
    middle = (left + right) / 2
    if (electromagnetic_torque(left) - load) * (
        electromagnetic_torque(middle) - load
    ) <= 0:
        right = middle
    else:
        left = middle
print("Скольжение для 15 Н·м:", (left + right) / 2)
