"""Учебный бюджет стандартной неопределённости поисковой катушки.

Среда: встроенный MicroPython FEMM 5.
Вход: действующее напряжение E [В], f [Гц], N [витки], A [м²];
rE, rA, rf — стандартные относительные неопределённости в долях единицы.
Выход: JSON с B, стандартной и расширенной неопределённостями в Т.
Линеаризованная модель GUM применима к малым неопределённостям синусоиды;
число витков известно точно. Бюджет не заменяет сертификат калибровки.
"""

import json
import math

E = 0.044428829381583664
f = 50.0
N = 100
A = 2e-4
rE = 0.005
rA = 0.010
rf = 0.001
correlation = 0.7  # Коэффициент корреляции только между E и A.

# Для синусоиды E_rms = sqrt(2)*pi*f*N*A*Bpeak: находим амплитуду B.
B = E / (math.sqrt(2) * math.pi * f * N * A)

# При независимых входах складываются квадраты стандартных вкладов.
# Расширенная неопределённость U = k*uc здесь вычисляется при k=2.
ur = math.sqrt(rE * rE + rA * rA + rf * rf)
uc = B * ur

# Производные по E и A имеют разные знаки: положительная корреляция
# уменьшает дисперсию их отношения. Частоту считаем независимой.
assert -1 <= correlation <= 1, "Коэффициент корреляции вне допустимых границ"
correlated_variance = rE * rE + rA * rA + rf * rf - 2 * correlation * rE * rA
correlated_ur = math.sqrt(correlated_variance)

result = {
    "origin": "author_analytical_budget_not_instrument_certificate",
    "B_T": B,
    "relative_standard_uncertainty": ur,
    "standard_uncertainty_T": uc,
    "expanded_k2_T": 2 * uc,
    "correlated_standard_uncertainty_T": B * correlated_ur,
    "scope": "Linearized GUM model, exact turn count, independent inputs unless specified; k=2 does not automatically prove 95 percent coverage.",
}
# Проверка исходного сигнала не доказывает охват 95 % при k=2:
# для такого вывода нужны распределение и достаточные степени свободы.
assert abs(B - 0.01) < 1e-14, "Перепутаны амплитуда и действующее значение"
print(json.dumps(result))
