N-мерная полиномиальная интерполяция высокого порядка
Я ищу некоторые подсказки о сложной проблеме, с которой я сталкиваюсь, касающейся интерполяции в четырехмерном пространстве.
У меня есть набор данных, состоящий из 340 точек в трехмерном пространстве (у меня есть три переменные - A, B, C - каждая из которых определяется 340 элементами). Каждая точка идентифицируется определенным значением выходной переменной. Итак, как правило, у меня есть
f(A,B,C) = D
Мне нужно интерполировать набор данных, чтобы предсказать значение D для каждой точки в области проектирования. Я написал небольшой скрипт для получения коэффициентов полинома m с помощью метода numpy linalg.lstsq.
def polyfit4d(x,y,z, metric, order):
ncols = (order + 1)**3
G = np.zeros((x.size, ncols))
ij = itertools.product(range(order+1), repeat=3)
for w, (i,j,k) in enumerate(ij):
G[:,w] = x**i * y**j * z**k
m, residuals, rank, s = np.linalg.lstsq(G, metric)
return m, residuals
Затем я использовал оценочную функцию для получения значений функции во всех точках пространства проектирования.
def polyval4d(x, y, z, m):
string = ''
order = int(math.ceil(((len(m))**(1/3.0))-1))
ij = itertools.product(range(order+1), repeat=3)
f = np.zeros_like(x)
for a, (i,j,k) in zip(m, ij):
f += a * x**i * y**j * z**k
return f
Поскольку мое пространство проектирования является трехмерным, я передал поливальной функции три трехмерных матрицы со всеми точками X,Y,Z пространства проектирования. F является трехмерной матрицей выходных данных D. Каждая точка в этой матрице представляет собой значение D, вычисленное с использованием полинома, найденного с помощью polyfit, в каждой точке проектного пространства (извините за хитрое предложение).
То, что я делаю, - это построение контурного графика фрагмента этого пространства трехмерного дизайна. Я выбираю одно значение Z и строю 2D-плоскость, образованную X, Y, с уровнями контуров на основе значений D. Проблема в том, что результат не тот, который я ожидаю. Контурная диаграмма почти одного цвета с некоторыми вариациями в одном углу.
Я искал повсюду в Интернете, а также вики Python предлагает функции, которые работают только для 2D-случая. Кто-нибудь когда-нибудь сталкивался с такой проблемой? Я что-то упускаю в оценке / определении этого N-мерного полинома?
Большое спасибо за ваше внимание.
Federico