Аппроксимация функции нескольких переменных
Для нахождения приближающей функции y = f(x) по методу наименьших квадратов и построения графиков я использовал следующие функции из пакета NumPy:
t = np.polyfit(x, y, 3)
f = np.poly1d(t)
ax.plot(x, f(x))
Теперь появилась необходимость найти коэффициенты и построить график для функции у которой несколько переменных y = f(x,z). Как можно решить данную задачу?
Ответы (1 шт):
Вам нужна интерполяция или аппроксимация?
Интерполяция - это поиск значений между точками с известными значениями. На практике используют линейные приближения (в двумерном случае триангуляционные), либо кубические сплайны.
Аппроксимация - приближение неизвестной функции функцией из известного семейства. Семейство выбирают из каких-либо теоретических соображений.
Судя по вашему комментарию, вам нужна именно аппроксимация - подбор параметра по известной модели. Для аппроксимации в scipy.optimize есть функция curve_fit(f,x,y)
Она принимает на вход функцию вида f(x, p1, p2, ..., pn), где x - переменная (возможно, многомерная), p1, p2, ..., pn - параметры. curve_fit пытается подобрать параметры p_i так, чтобы минимизировать отклонения в заданных точках x от известных значений y.
Пример.
Подбор параметров для двумерной функции вида r*cos(2*pi*r) - три параметра: амплитуда A, сдвиг по оси x dx и сдвиг по оси y dy.
def r_cos(var_2d, A, dx, dy):
x = var_2d[0] - dx
y = var_2d[1] - dy
r = np.sqrt(x*x + y*y)
return A*r*np.cos(2*np.pi*r)
Для двумерности в переменную var_2d передается двумерный массив, где первая строка x а вторая строка y.
Тестовые данные - набор случайных 20 точек с небольшим шумом. Пареметры A=1.5, dx=0.2, dy=0.3.
vx = np.random.rand(20)
vy = np.random.rand(20)
v_2d = np.vstack((vx,vy))
Z = r_cos(v_2d, 1.5, 0.2, 0.3) + 0.05*np.random.rand(len(vx))
Подбор параметров:
p, p_cov = curve_fit(r_cos, v_2d, Z, p0=[1.0,0.0,0.0])
Возвращаемое значение p - оптимальный набор параметров, p_cov ковариционная матрица. Ошибка приближения i-го параметра оценивается как квадратный корень из соответствующего элемента на диагонали p_cov, вектор ошибок можно вычислить как np.sqrt(np.diag(p_cov)). Результат таков:
[1.46694227, 0.19898437, 0.29632489] ± [0.01517198, 0.0016201 , 0.00238286]