# Учебная редакция: назначение, единицы и этапы алгоритма пояснены по-русски.
# Исходная программа остаётся самостоятельным свидетельством прежней проверки.
# Основа — II07-2.py: аналитическая проверка нормировки преобразования Фурье.
import math
import numpy as np


def amplitudes(samples):
    """Вернуть односторонние амплитуды гармоник учебного потокосцепления, Вб.
    
    samples — положительное целое число; допустимы чётное и нечётное N.
    Основные контрольные расчёты выполнены при N = 128 и N = 256. Отсчёты равномерны по полному периоду,
    конечная точка не повторяется. Гармоника Найквиста введена только
    для проверки нормировки и не используется в расчёте физической ЭДС."""
    if type(samples) is not int or samples <= 0:
        raise ValueError("Нужно положительное целое число отсчётов")
    # Постоянная составляющая и гармоника Найквиста проверяют особую нормировку.
    values = np.array([.01+.08*math.cos(2*math.pi*k/samples)+.004*math.cos(10*math.pi*k/samples)+.002*((-1)**k) for k in range(samples)])
    # БПФ возвращает ненормированные комплексные коэффициенты.
    spectrum = np.fft.fft(values)
    # Для DC и Найквиста множитель 1/N; для остальных положительных гармоник 2/N.
    # При нечётном N частоты Найквиста нет: последняя положительная гармоника удваивается.
    return [abs(spectrum[k])/samples*(1 if k == 0 or (samples % 2 == 0 and k == samples//2) else 2) for k in range(samples//2+1)]


def run_checks():
    """Проверить постоянную составляющую, основную, пятую и гармонику Найквиста."""
    results = []
    for n in [128, 256]:
        a = amplitudes(n)
        assert max(abs(a[k]-v) for k, v in [(0, .01), (1, .08), (5, .004), (n//2, .002)]) < 1e-10
        omega = 2*math.pi*100
        # Производная потокосцепления умножает амплитуду на h·ω; √2 переводит ЭДС в RMS.
        e1, e5 = omega*a[1]/math.sqrt(2), omega*5*a[5]/math.sqrt(2)
        assert abs(e5/e1-.25) < 1e-10
        results.append({"N": n, "DC_Wb": a[0], "A1_Wb": a[1], "A5_Wb": a[5], "Nyquist_Wb": a[n//2], "E1_RMS_V": e1, "E5_RMS_V": e5})
    # Частота контрольной гармоники Найквиста меняется с N; физическая сходимость не заявляется.
    return {"runs": results, "scope": "Uniform full period, endpoint excluded; only harmonics 1/5 used for EMF comparison"}
