二维插值问题

VAS*_*VAN 1 python scipy

我在 x 和 y 轴上有数据,输出在 z 上

例如

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]
Run Code Online (Sandbox Code Playgroud)

当 y = 15 x = 3.5 时如何找到 z 的值

我试图使用 scipy 但我对它很陌生

非常感谢您的帮助

维布尔

Luk*_*hne 5

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
Run Code Online (Sandbox Code Playgroud)

编辑:

鞋面解决方案并不能让您完美贴合。查看

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 ]]
Run Code Online (Sandbox Code Playgroud)

为了克服这个问题,在 x 方向上插入 5 次多项式,在 y 方向上插入 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]]
Run Code Online (Sandbox Code Playgroud)

这个产量

print interpolate.bisplev(3.5,15,tck)

7.88671875
Run Code Online (Sandbox Code Playgroud)

绘图:
参考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()
Run Code Online (Sandbox Code Playgroud)