2010-01-07 83 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