23 if (points.size() < 2) {
27 size_t n = points.size();
28 float sum_x = 0.0f, sum_y = 0.0f, sum_xy = 0.0f, sum_x2 = 0.0f, sum_y2 = 0.0f;
31 for (
const auto& point : points) {
32 sum_x += point.measured;
33 sum_y += point.expected;
34 sum_xy += point.measured * point.expected;
35 sum_x2 += point.measured * point.measured;
36 sum_y2 += point.expected * point.expected;
40 float denominator = n * sum_x2 - sum_x * sum_x;
42 if (abs(denominator) < 1e-6f) {
47 coefficients.
slope = (n * sum_xy - sum_x * sum_y) / denominator;
63 float slope,
float intercept) {
70 for (
const auto& point : points) {
71 mean_y += point.expected;
73 mean_y /= points.size();
76 float ss_res = 0.0f, ss_tot = 0.0f;
78 for (
const auto& point : points) {
79 float predicted = slope * point.measured + intercept;
80 ss_res += (point.expected - predicted) * (point.expected - predicted);
81 ss_tot += (point.expected - mean_y) * (point.expected - mean_y);
88 float r_squared = 1.0f - (ss_res / ss_tot);
91 return constrain(r_squared, 0.0f, 1.0f);
105 if (abs(coefficients.
slope) > 10.0f || abs(coefficients.
slope) < 0.1f) {
136 return raw_value + offset.
offset;
144 if (isnan(expected) || isnan(measured) ||
145 isinf(expected) || isinf(measured)) {
150 if (sensor_type ==
"ph") {
151 return (expected >= 0.0f && expected <= 14.0f &&
152 measured >= 0.0f && measured <= 14.0f);
154 else if (sensor_type ==
"ec") {
155 return (expected >= 0.0f && expected <= 20000.0f &&
156 measured >= 0.0f && measured <= 20000.0f);
158 else if (sensor_type ==
"temperature") {
159 return (expected >= -40.0f && expected <= 80.0f &&
160 measured >= -40.0f && measured <= 80.0f);
162 else if (sensor_type ==
"humidity") {
163 return (expected >= 0.0f && expected <= 100.0f &&
164 measured >= 0.0f && measured <= 100.0f);
166 else if (sensor_type ==
"npk") {
167 return (expected >= 0.0f && expected <= 2000.0f &&
168 measured >= 0.0f && measured <= 2000.0f);
179 static void removeOutliers(std::vector<ModernCalibrationPoint>& points,
float threshold = 2.0f) {
180 if (points.size() < 3) {
185 float mean_ratio = 0.0f;
186 std::vector<float> ratios;
188 for (
const auto& point : points) {
189 if (point.measured != 0.0f) {
190 float ratio = point.expected / point.measured;
191 ratios.push_back(ratio);
196 if (ratios.empty()) {
200 mean_ratio /= ratios.size();
203 float variance = 0.0f;
204 for (
float ratio : ratios) {
205 variance += (ratio - mean_ratio) * (ratio - mean_ratio);
207 variance /= ratios.size();
208 float std_dev = sqrt(variance);
211 auto it = points.begin();
212 while (it != points.end()) {
213 if (it->measured != 0.0f) {
214 float ratio = it->expected / it->measured;
215 if (abs(ratio - mean_ratio) > threshold * std_dev) {
216 it = points.erase(it);
241 if (points.empty() || !coefficients.
is_valid) {
245 float total_error = 0.0f;
246 float max_error = 0.0f;
248 for (
const auto& point : points) {
249 float predicted = coefficients.
slope * point.measured + coefficients.
intercept;
250 float error = abs(point.expected - predicted);
252 total_error += error;
253 if (error > max_error) {
258 stats.
mean_error = total_error / points.size();
Структуры данных для системы калибровки датчиков
Definition calibration_math.h:13
static float applyCalibration(float raw_value, const LinearCoefficients &coefficients)
Применение калибровки к значению
Definition calibration_math.h:120
static float calculateRSquared(const std::vector< ModernCalibrationPoint > &points, float slope, float intercept)
Расчет коэффициента детерминации R²
Definition calibration_math.h:62
static void removeOutliers(std::vector< ModernCalibrationPoint > &points, float threshold=2.0f)
Удаление выбросов из калибровочных точек
Definition calibration_math.h:179
static float applyOffsetCalibration(float raw_value, const OffsetCalibration &offset)
Применение offset калибровки
Definition calibration_math.h:131
static bool validateCalibrationPoint(float expected, float measured, const String &sensor_type)
Валидация калибровочной точки
Definition calibration_math.h:142
static bool validateCoefficients(const LinearCoefficients &coefficients)
Валидация коэффициентов калибровки
Definition calibration_math.h:97
static CalibrationStats getCalibrationStats(const std::vector< ModernCalibrationPoint > &points, const LinearCoefficients &coefficients)
Definition calibration_math.h:235
static bool calculateLinearRegression(const std::vector< ModernCalibrationPoint > &points, LinearCoefficients &coefficients)
Расчет коэффициентов линейной регрессии методом наименьших квадратов
Definition calibration_math.h:21
Получение статистики по калибровочным точкам
Definition calibration_math.h:227
float r_squared
Definition calibration_math.h:231
size_t point_count
Definition calibration_math.h:228
bool is_reliable
Definition calibration_math.h:232
float mean_error
Definition calibration_math.h:229
float max_error
Definition calibration_math.h:230
Коэффициенты линейной калибровки y = ax + b.
Definition calibration_data.h:30
bool is_valid
Definition calibration_data.h:34
float intercept
Definition calibration_data.h:32
float slope
Definition calibration_data.h:31
float r_squared
Definition calibration_data.h:33
Простое смещение (offset) для температуры и влажности
Definition calibration_data.h:42
float offset
Definition calibration_data.h:43
bool is_valid
Definition calibration_data.h:44