2009-12-29 49 views
0

我有x和y軸和所述輸出數據是在z2維插值問題

例如

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] 

如何找到z的值時Y = 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 

編輯:

上層溶液不給你完美契合。 檢查

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 ]] 

克服5RD度的在x和第二程度這個插值絲毫polyinomials在y方向上

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 2009-12-30 16:30:37

+0

請注意,scipy.interpolate。*(FITPACK)樣條曲線可能不會插值, 即可能不經過輸入數據;請參閱平滑度參數s。 Imho FITPACK比doc更強大,所以開始簡單(Martelli):kx = ky = 1,s = 0。 – denis 2010-01-03 11:01:46

0

我會說只是取其周圍的值的平均值。所以如果你需要X = 3.5和Y = 15(3.5,15),你平均(3,10),(3,20),(4,10)和(4,20)。由於我不知道你正在處理的是什麼數據,我不確定是否確切的鄰近度會很重要 - 在這種情況下,你可以堅持使用平均值 - 或者如果你需要做某種反比距離加權。

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] 

你問:「我怎麼能找到z的值y時= 15 x = 3.5「?

由於您正在查看與給定「網格」在x和y兩個方向上完全等距的點,因此您只需取得網格值之間的中點(如果您的值不是等距的,則會採用比例中點,稍後見)。因此,對於y = 10,x 3和4的z值分別爲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代替。然後對於x你會採取的值的方式80%,即:

  • 對於y = 10,0.2 * 5.6 + 0.8 * 7.8 - > 7.36

  • 對於y = 20,0.2 * 7.6 + 0.8 * 9.8 - > 9.46

現在,你想這些的方式在Z 30%,0.3 * 7.36 + 0.7 * 9.46 - > 8.83,這是ž。

這是線性插值,它確實很簡單。你想手動計算它,還是找到可以爲你做的例程(例如numpy數組作爲「網格」)?即使在後一種情況下,我希望這種「手動」的解釋(顯示你正在做的最基本的算術術語)可以幫助你理解你在做什麼...... ;-)。

當然有更高級的插值形式 - 你需要那些,還是線性插值滿足你的用例?

+0

雅謝謝,我得到了你在說什麼......我 將需要的程序,因爲我只是在我收集的數據給了我的問題 爲例 我的y值從10去.... 300步10 我的x值變爲1 ... 20 和類似的20個不同的z值爲每個y值 所以我想如果有一種方法來插值或外推x和y值 – VASUDEVAN 2009-12-29 23:41:58