Аппроксимация многочленом
Урок про то, как описать изогнутую характеристику многочленом и считать его без сторонних библиотек.
Аппроксимация — подбор гладкой функции (обычно многочлена), наилучшим образом проходящей через калибровочные точки по методу наименьших квадратов.
Когда характеристика датчика изогнута, прямой её не описать. На помощь приходит многочлен: парабола или кубика гибко повторяют изгиб. Коэффициенты подбирают так, чтобы сумма квадратов отклонений была минимальной.
Метод наименьших квадратов для прямой
Для прямой $y = a x + b$ коэффициенты находятся явными формулами:
$$ a = \frac{n\sum x y - \sum x \sum y}{n\sum x^2 - (\sum x)^2}, \qquad b = \frac{\sum y - a\sum x}{n} $$
def linfit(xs, ys):
n = len(xs)
sx = sum(xs); sy = sum(ys)
sxx = sum(x*x for x in xs)
sxy = sum(x*y for x, y in zip(xs, ys))
a = (n*sxy - sx*sy) / (n*sxx - sx*sx)
b = (sy - a*sx) / n
return a, b
xs = [0.5, 1.0, 1.5, 2.0, 2.5]
ys = [0.0, 25.0, 50.0, 75.0, 100.0]
a, b = linfit(xs, ys)
print("a =", round(a, 3), "b =", round(b, 3))
print("при 1.75 В:", round(a*1.75 + b, 1), "°C")Вывод:
a = 50.0 b = -25.0 при 1.75 В: 62.5 °C
Квадратичная аппроксимация изгиба
Если характеристика изогнута, добавляют квадратичный член: $y = c_0 + c_1 x + c_2 x^2$. Для трёх точек коэффициенты находятся точно, через решение системы. Покажем на готовой параболе, как её посчитать:
# парабола y = 2 + 3x + 0.5x^2, подобранная по точкам
c0, c1, c2 = 2.0, 3.0, 0.5
def poly(x):
return c0 + c1*x + c2*x*x
for x in (0, 2, 4):
print("x =", x, "-> y =", poly(x))Вывод:
x = 0 -> y = 2.0 x = 2 -> y = 10.0 x = 4 -> y = 22.0
Как работает под капотом
Метод наименьших квадратов минимизирует сумму $\sum (y_i - f(x_i))^2$. Для многочлена это сводится к системе линейных уравнений (нормальные уравнения), которую можно решить вручную для малых степеней. Важно не переусердствовать: многочлен высокой степени идеально пройдёт через точки, но между ними начнёт «гулять» (переобучение). На практике редко идут выше квадратичной или кубической аппроксимации, а лучше добавить точек калибровки.
Частые ошибки
- Брать слишком высокую степень многочлена — он начнёт колебаться между точками.
- Аппроксимировать по 2–3 точкам параболой и доверять ей за пределами диапазона (экстраполяция).
- Забыть, что МНК чувствителен к выбросам — один кривой замер перекосит всю кривую.
Итог
- Нелинейную характеристику линеаризуют аппроксимацией многочленом.
- Коэффициенты подбирает метод наименьших квадратов.
- Высокая степень опасна переобучением; экстраполяция за диапазон ненадёжна.