Аппроксимация многочленом

Урок про то, как описать изогнутую характеристику многочленом и считать его без сторонних библиотек.

Аппроксимация — подбор гладкой функции (обычно многочлена), наилучшим образом проходящей через калибровочные точки по методу наименьших квадратов.

Когда характеристика датчика изогнута, прямой её не описать. На помощь приходит многочлен: парабола или кубика гибко повторяют изгиб. Коэффициенты подбирают так, чтобы сумма квадратов отклонений была минимальной.

Метод наименьших квадратов для прямой

Для прямой $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 точкам параболой и доверять ей за пределами диапазона (экстраполяция).
  • Забыть, что МНК чувствителен к выбросам — один кривой замер перекосит всю кривую.

Итог

  • Нелинейную характеристику линеаризуют аппроксимацией многочленом.
  • Коэффициенты подбирает метод наименьших квадратов.
  • Высокая степень опасна переобучением; экстраполяция за диапазон ненадёжна.
Проверьте себя
1. Что минимизирует метод наименьших квадратов?
AСумму отклонений
BСумму квадратов отклонений
CМаксимальное отклонение
DЧисло точек
2. Чем опасен многочлен слишком высокой степени при аппроксимации?
AСлишком медленно считается
BОн начинает 'гулять' между точками (переобучение)
CНе проходит через точки
DТребует numpy