3D-интерполяция - PullRequest
       1

3D-интерполяция

1 голос
/ 27 марта 2020

Я пытаюсь переформулировать свою проблему более четко:

Я хочу провести трехмерную интерполяцию своих данных, но я не могу найти хороший scipy для решения моей проблемы и правильный способ ее решения.

Представьте, что вы находитесь в трехмерном декартовом пространстве (x,y,z). Плоскость (x,y) ==> (200x200) обращена к вам, и вы можете увидеть графическое представление c некоторых значений, образующих график рассеяния. Значения оцениваются моделью, которая смотрит на свойства моего объекта с определенной длиной волны c. Модель, которую я использую, может работать только с 20 длинами волн, это наша z-axis. Поэтому, если мы снова возьмем наше графическое c представление моей проблемы, у вас будет 20 слоев графиков, начиная со значения, называемого lambda_min, до 20-й и последней длины волны: lambda_max. Каждый слой сюжета разделен регулярными шагами. Но, как вы можете догадаться, поскольку у нас есть ограниченное количество созданных моделей (20), мы не можем получить оценку значений между пропусками: это цель моего вопроса.

Как мы можем интерполировать данные (y) для одной или нескольких указанных c длин волн (z), не сгенерированных нашей моделью. Я уточняю, что выборка значения x одинакова для всех моделей, единственным изменяющимся параметром в плоскости (x,y) относительно длины волны является оценка физической величины (y).

Мои данные отсортированы в массив с именем V (вызванный из количества, с которым я работаю: Видимости) формы (10,200).

Так что, когда я вызываю V[w][k], это дает мне точка: оценочная видимость (y), оцененная для данной w (= длина волны ==> z) в определенной c точке k на x-axis (= q пространственная частота).

Данные x-axis (пространственная частота) хранятся отдельно в одномерном массиве с именем q длины 200 и одинаковы для всех длин волн.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Исходя из вашего вопроса, похоже, у вас есть следующая проблема. Поправьте меня, если я ошибаюсь:

x = [1, 2, .., 200]
y = [1, 2, .., 200]
z = [z0, .., z20]

V = V(z, k, y) = V(z, k(x), y)

Вы говорите, что знаете V для всех x, y и z, указанных выше. И знаю, что вы хотите знать их для действительных чисел y' и z', где 1 < y' < 200 и z0 < z' < z20.

Итак, нас интересует:

res = V(z', k(x), y')

Разве я получить это правильно?

Если это так, у нас есть проблема двумерной интерполяции. Возьмите scipy.interpolate.interp2d и скорректируйте его с правильными данными.

Для данного val_x in [1, 2, .., 200] вы делаете следующее:

all_y = np.arange(1, 200 + 1)
all_z = [z0, .., z20]
all_V_x = [[V(z, k(val_x), y) for y in all_y] for z in all_z])

estimate_V_x = scipy.interpolate.interp2d(all_y, all_z, all_V_x, kind='cubic')

Теперь у нас есть функция чтобы получить оценки V для z' и y', для наших данных val_x. Нам просто нужно оценить это:

res = estimate_V_x(y_new, z_new)

Это дает нам результат для V(z', k(x), y').

Чтобы объединить все это вместе:

all_x = np.arange(1, 200 + 1)
all_y = np.arange(1, 200 + 1)
all_z = [z0, .., z20]

def get_V(z, k, y):
    assert z in all_z and y in all_y
    return ... # your computed data goes here
def get_k(x):
    assert x in all_x
    return ... # your computed data goes here

def estimate_V(x, new_y, new_z):
    assert x in all_x
    all_V_x = [[get_V(z, get_k(val_x), y) for y in all_y] for z in all_z])
    estimate_V_x = scipy.interpolate.interp2d(all_y, all_z, all_V_x, kind='cubic')
    return estimate_V_x(new_y, new_z)

Обратите внимание, что здесь new_y и new_z также могут быть массивами, чтобы ускорить процесс.

Я не уверен, правильно ли я понял, или это имеет какой-то смысл. Дайте мне знать.

0 голосов
/ 28 марта 2020

Спасибо моему другу и @Chris, я понял, что проблема была не в 3D, а в 2D, и затем я попытался использовать еще раз scipy.interpolate.interp2d.

Затем, чтобы оценить значение V, которое я хочу для данной длины волны на заданной c пространственной частоте.

f = scipy.interpolate.interp2d(x=q,y=wavel,z=V)

, где

np.shape(q) = (200,)
np.shape(w) = (10,)
np.shape(V) = (10,200)

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

...