2009-12-29 1 views
0

У меня есть данные по осям х и у, а выход на г2 мерной интерполяции проблема

, например

y = 10 
x = [1,2,3,4,5,6] 
z = [2.3,3.4,5.6,7.8,9.6,11.2] 

y = 20 
x = [1,2,3,4,5,6] 
z = [4.3,5.4,7.6,9.8,11.6,13.2] 

y = 30 
x = [1,2,3,4,5,6] 
z = [6.3,7.4,8.6,10.8,13.6,15.2] 

как я могу найти значение г при у = 15 х = 3.5

Я пытался использовать SciPy, но я очень новичок в этом

Спасибо большое за помощь

vibhor

ответ

4

scipy.interpolate.bisplrep

Ссылка: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.bisplrep.html

import scipy 
import math 
import numpy 
from scipy import interpolate 


x= [1,2,3,4,5,6] 
y= [10,20,30] 

Y = numpy.array([[i]*len(x) for i in y]) 
X = numpy.array([x for i in y]) 
Z = numpy.array([[2.3,3.4,5.6,7.8,9.6,11.2], 
       [4.3,5.4,7.6,9.8,11.6,13.2], 
       [6.3,7.4,8.6,10.8,13.6,15.2]]) 

tck = interpolate.bisplrep(X,Y,Z) 
print interpolate.bisplev(3.5,15,tck) 


7.84921875 

EDIT:

Верхний раствор не дает вам идеально подходит. проверка

print interpolate.bisplev(x,y,tck) 

[[ 2.2531746 4.2531746 6.39603175] 
[ 3.54126984 5.54126984 7.11269841] 
[ 5.5031746 7.5031746 8.78888889] 
[ 7.71111111 9.71111111 10.9968254 ] 
[ 9.73730159 11.73730159 13.30873016] 
[ 11.15396825 13.15396825 15.2968254 ]] 

, чтобы преодолеть это интерполировать ничуть polyinomials из 5-я степени по й и 2-й степени в направлении у

tck = interpolate.bisplrep(X,Y,Z,kx=5,ky=2) 
print interpolate.bisplev(x,y,tck) 

[[ 2.3 4.3 6.3] 
[ 3.4 5.4 7.4] 
[ 5.6 7.6 8.6] 
[ 7.8 9.8 10.8] 
[ 9.6 11.6 13.6] 
[ 11.2 13.2 15.2]] 

Этого выход

print interpolate.bisplev(3.5,15,tck) 

7.88671875 

Черчение:
ссылка http://matplotlib.sourceforge.net/examples/mplot3d/surface3d_demo.html

fig = plt.figure() 
ax = Axes3D(fig) 
ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap=cm.jet) 
plt.show() 
+0

Эй, спасибо. Я думаю, что это отлично работает Еще один вопрос: как я могу построить их в осях XY z – VASUDEVAN

+0

Обратите внимание, что сплайны scipy.interpolate. * (FITPACK) могут не интерполировать, то есть не могут проходить входные данные; см. параметр гладкости s. Imho FITPACK имеет больше мощности, чем doc, поэтому начните просто (Martelli): kx = ky = 1, s = 0. – denis

0

Я бы сказал, просто возьмем среднее значение значений вокруг него. Поэтому, если вам нужны X = 3.5 и Y = 15 (3.5,15), вы в среднем (3,10), (3,20), (4,10) и (4,20). Поскольку я понятия не имею, с какими данными вы сталкиваетесь, я не уверен, будет ли важна точная близость - в этом случае вы можете просто придерживаться w/average - или если вам нужно сделать какой-то инверсионный вес.

1

Учитывая (не как код Python, поскольку второе задание будет стерта первым в каждом конкретном случае, конечно ;-):

y = 10 
x = [1,2,3,4,5,6] 
z = [2.3,3.4,5.6,7.8,9.6,11.2] 

y = 20 
x = [1,2,3,4,5,6] 
z = [4.3,5.4,7.6,9.8,11.6,13.2] 

вы спрашиваете: «Как я могу найти значение г когда у = 15 х = 3,5 "?

Поскольку вы просматриваете точку, точно эквидистантную как в x, так и y из заданной «сетки», вы просто берете среднюю точку между значениями сетки (если у вас есть значения, не эквидистантные, вы должны взять пропорциональную середину , увидим позже). Таким образом, для y = 10 значения z для x 3 и 4 равны 5.6 и 7.8, поэтому для x 3.5 вы оцениваете их среднюю точку, 6.7; и аналогично для y = 20 вы оцениваете середину между 7.6 и 9.8, т. е. 8.7. Наконец, поскольку у вас есть y = 15, средняя точка между 6.7 и 8.7 является вашим окончательным интерполированным значением для z: 7.7.

Скажем, у вас были y = 13 и x = 3.8. Тогда для х вы бы принимать значения 80% пути, то есть:

  • при у = 10, 0,2 * 5,6 + 0,8 * 7,8 -> 7,36

  • при у = 20, 0,2 * 7,6 + 0,8 * 9,8 -> 9,46

Теперь вы хотите г 30% пути между ними, 0,3 * 7,36 + 0,7 * 9,46 -> 8,83, это г.

Это линейная интерполяция, и это действительно очень просто. Вы хотите вычислить его вручную или найти подпрограммы, которые делают это за вас (например, numpy массивы как «сетки»)? Даже в последнем случае я надеюсь, что это «ручное» объяснение (показывающее, что вы делаете в самых элементарных арифметических терминах) может помочь вам понять, что вы делаете ... ;-).

Есть более продвинутые формы интерполяции, конечно, вам нужны эти или линейная интерполяция достаточна для вашего случая использования?

+0

уа спасибо я получил то, что вы говорите ... я буду нуждаться в подпрограммах, потому что я просто привел пример в моем вопросе в моих собранных данных мои у значения идет от 10 .... 300 шагов из 10 мои значения x идут 1 ... 20 и аналогичным образом 20 различных значений z для каждого значения y , поэтому я думал, есть ли способы интерполировать или экстраполировать значения x и y. – VASUDEVAN