Исходя из вашего вопроса, похоже, у вас есть следующая проблема. Поправьте меня, если я ошибаюсь:
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
также могут быть массивами, чтобы ускорить процесс.
Я не уверен, правильно ли я понял, или это имеет какой-то смысл. Дайте мне знать.