1. CalculateExpandedUncertaintyFast — формула variance некорректна по смыслу
csharp
double mean = sum / n;
double variance = (sumSq - n * mean * mean) / (n - 1);
Математически это верно (Σx² − n·mean² = Σ(x−mean)²), но накапливать sumSq в double на больших n — риск потери точности (catastrophic cancellation), если значения большие, а разброс малый. У вас моменты порядка 1e-3…1e-1, sumSq накапливается до n·x² — для n=10000 и x=0.1 это 1e2, а variance может быть 1e-8. Разница двух близких чисел → потеря значащих цифр.
Рекомендация: либо использовать алгоритм Уэлфорда (Welford) для онлайн-среднего и дисперсии, либо (проще) считать variance через sumSq только при разумных n, а для больших — переключиться на Welford. Но у вас график строится до ChartMaxVisiblePoints = 3000 — это уже критичная зона.
2. Дублирование логики между UpdateChartLive и FinalizeStreamFile
UpdateChartLive считает corrected и u инкрементально с промежуточным kAvg (по накопленному среднему), а FinalizeStreamFile — с финальным kAvg. Это значит:
На графике кривая U и corrected-момента не совпадёт с тем, что попадёт в CSV.
Первые точки на графике будут иметь «неправильный» U, который потом «поплывёт» при финализации.
Для live-отображения это приемлемо, но пользователь может удивиться. Стоит либо:
явно писать в лог/подписи, что график — предварительный;
либо на графике показывать только «сырой» момент без corrected/U (то, что не зависит от kAvg).
....
4. GetStudentTCoefficient — эмпирическая формула для n > 100
csharp
if (n > 100)
return 1.96 + 2.4 / n;
Проверим: для n=101 → 1.96 + 0.0238 = 1.9838. Реальное t(0.975, 100) ≈ 1.984. Совпадает хорошо. Для n=1000 → 1.9624, реальное ≈ 1.9623. Тоже хорошо. Формула адекватна, но обратите внимание: при n→∞ она даёт 1.96, а не точное значение из CDF — это осознанное упрощение. Ок.
Однако граница n > 100 создаёт разрыв: при n=100 (CDF) может дать 1.9842, при n=101 (формула) — 1.9838. Небольшой, но скачок. Можно снизить порог до n > 30 или использовать формулу всегда для n > 30.