# Учебная редакция: назначение, единицы и этапы алгоритма пояснены по-русски.
# Исходная программа остаётся самостоятельным свидетельством прежней проверки.
# Основа — II00-1.py: независимый аналитический эталон линейной катушки.
def coil_state(current_a, inductance_h=0.12):
    """Вернуть потокосцепление, Вб, и энергию, Дж, линейной катушки.
    
    Ток задан в амперах, постоянная индуктивность — в генри.
    Модель не содержит постоянного магнита и магнитного насыщения."""
    if inductance_h < 0:
        raise ValueError("Negative inductance")
    return inductance_h * current_a, 0.5 * inductance_h * current_a**2


def run_checks():
    """Сопоставить пять токовых режимов с независимой таблицей и отказом при L < 0."""
    # Одинаковое определение тока используется в аналитической функции и в таблице.
    rows = [(i,) + coil_state(i) for i in [0, 2, 4, 6, 8]]
    expected = [(0, 0, 0), (2, .24, .24), (4, .48, .96), (6, .72, 2.16), (8, .96, 3.84)]
    for actual, target in zip(rows, expected):
        assert max(abs(a-b) for a, b in zip(actual, target)) < 1e-12
    # Отдельно проверяем физически недопустимую отрицательную индуктивность.
    rejected = False
    try:
        coil_state(1, -.1)
    except ValueError:
        # Отдельно проверяем физически недопустимую отрицательную индуктивность.
        rejected = True
    assert rejected
    return {"columns": ["I_A", "Psi_Wb", "W_J"], "rows": rows, "negative_L_rejected": rejected}
