2010-01-07 69 views
0

我想在y = 12和x = 3.5处找到一个z值,并给出以下示例数据。我怎样才能在C++中做到这一点?二维插值

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] 

我当前的Python代码:

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) 
+5

是功课吗? – 2010-01-07 22:50:41

+3

有许多算法可以使用。 http://en.wikipedia.org/wiki/Multivariate_interpolation#2_dimensions你有偏好吗? – 2010-01-07 22:53:19

+0

没有..我有这个在python中实现我必须在C++中实现它 这是我从我的数据库提供的示例 我的Y从0到300的步长为10 我的X从1到20 和相应的20 Z轴上的数据值 您建议或者如何去做的其中一个 – VASUDEVAN 2010-01-07 22:58:06

回答

1

只是做了两次内插。首先用Y插值来选择两个Z表。然后插入X来选择Z值。

1

我会使用Akima's Spline,这是非常良好的测试,非常快,并产生非常好的结果。不幸的是,它在Fortran-66中(并且很麻烦),所以你需要将它翻译成C语言或者更现代的Fortran变体。我已将gotten some help全部上线,所以我建议通过Usenet上的mythreads进行阅读。

+0

请参阅我的Akima Spline实现列表http://stackoverflow.com/questions/3502769/akima-interpolation-of-an-array-of-doubles/4637884#4637884 – Handcraftsman 2011-01-09 17:19:49