теория 1к 2с / Приближение функций. Методы интерполяции зависимостей с одной независимой переменной. Интерполяционный многочлен Лагранжа. Аппроксимация методом наименьших квадратов
.pdfАппроксимация
Аппроксимация - научный метод, состоящий в замене одних объектов другими, в каком-то смысле близкими к исходным, но более простыми.
В вычислительной математике - нахождение уравнения описывающего какие-либо дискретные данные, представляющие собой сложную зависимость.
Суть аппроксимации
Основу методов аппроксимации составляет процесс минимизации отклонения между расчетными и экспериментальными значениями - называемом критерием рассогласования.
Суть аппроксимации
Наиболее часто в качестве критерия рассогласования выступает следующее уравнение:
где - экспериментальные значения; - расчетные значения.
Метод наименьших квадратов
Целевая функция: Критерий:
Метод наименьших квадратов
Необходимое условие - равенство нулю частных
производных по параметрам
Метод наименьших квадратов
Приводя ситему к матричной форме получаем:
Метод наименьших квадратов
Решение СЛАУ в матричном виде:
где
МНК для линейного уравнения
|
|
Исходный код |
Результат |
|
|
|
|
||
|
1 |
# Задание целевой функции |
|
|
|
2 |
f = lambda x: -2 + 3 * x |
|
|
|
3 |
# Создание псевдо-экспериментальных данных |
|
|
|
4 |
xs = np.linspace(0, 2, 1000) |
|
|
|
5 |
ys = f(xs) + np.random.randn(xs.size) / 2 |
|
|
|
6 |
# Формирование матрицы Ф |
|
|
|
7 |
P = np.stack((np.ones(xs.size), xs), axis=-1) |
|
|
|
8 |
# Расчет коэффициентов уравнения по МНК |
|
|
|
9 |
a = np.linalg.inv(P.T @ P) @ (P.T @ ys) |
|
|
|
10 |
# Получение расчетных значений |
|
|
|
11 |
yc = a[0] + a[1] * xs |
|
|
|
12 |
|
|
|
|
13 |
plt.scatter(xs, ys, alpha=0.3) |
|
|
|
14 |
plt.plot(xs, yc, c="r") |
|
|
|
15 |
|
|
|
|
16 |
plt.show() |
|
|
|
|
|
|
|
|
|
|
|
|
МНК для линейного уравнения
|
|
Исходный код |
Результат |
|
|
|
|
||
|
1 |
# Задание целевой функции |
|
|
|
2 |
f = lambda x: -1 + 3*x - 2*x**2 |
|
|
|
3 |
# Создание псевдо-экспериментальных данных |
|
|
|
4 |
xs = np.linspace(0, 2, 1000) |
|
|
|
5 |
ys = f(xs) + np.random.randn(xs.size) / 4 |
|
|
|
6 |
# Формирование матрицы Ф |
|
|
|
7 |
arrs = (np.ones(xs.size), xs, xs**2) |
|
|
|
8 |
P = np.stack(arrs, axis=-1) |
|
|
|
9 |
# Расчет коэффициентов уравнения по МНК |
|
|
|
10 |
a = np.linalg.inv(P.T @ P) @ (P.T @ ys) |
|
|
|
11 |
# Получение расчетных значений |
|
|
|
12 |
yc = a[0] + a[1] * xs + a[2] * xs**2 |
|
|
|
13 |
|
|
|
|
14 |
plt.scatter(xs, ys, alpha=0.3) |
|
|
|
15 |
plt.plot(xs, yc, c="r") |
|
|
|
16 |
|
|
|
|
17 |
plt.show() |
|
|
|
|
|
|
|
|
|
|
|
|
МНК с NumPy
|
|
Исходный код |
Результат |
|
|
|
|
||
|
1 |
# Задание целевой функции |
|
|
|
2 |
f = lambda x: -1 + 3*x - 2*x**2 |
|
|
|
3 |
# Создание псевдо-экспериментальных данных |
|
|
|
4 |
xs = np.linspace(0, 2, 1000) |
|
|
|
5 |
ys = f(xs) + np.random.randn(xs.size) / 4 |
|
|
|
6 |
# Расчет коэффициентов |
|
|
|
7 |
p = np.polyfit(x, y, deg=3) |
|
|
|
8 |
# Получение расчетных значений |
|
|
|
9 |
yc = np.polyval(p, xs) |
|
|
|
10 |
|
|
|
|
11 |
plt.scatter(xs, ys, alpha=0.3) |
|
|
|
12 |
plt.plot(xs, yc, c="r") |
|
|
|
13 |
|
|
|
|
14 |
plt.show() |
|
|
|
|
|
|
|
|
|
|
|
|