2012-10-09 157 views
0

給定一個2D平面中的點序列,[(x0,y0), (x1,y1), ...],我想找到一個spline curve,它通過這些點。曲線樣條(python)

scipy.interpolate一維樣條中的類需要提高x,因爲這些x座標 - 列表是沒有必要的增大(即,曲線不是一個函數,f(x)=y,而是parametrised曲線)。 不幸的是,它不是沿着y的函數(否則通過切換x和y座標就可以輕鬆解決問題)。

我嘗試過使用單變量插值類,但這並沒有達到預期的效果。我怎樣才能用scipy.interpolate來計算這個樣條曲線?

+0

我建議第一次嘗試的工作出了問題的數學。一旦你完成了,然後找出如何在你的程序中實現它。 –

+0

這個問題很簡單,我在2D平面中有一系列點,我想要找到通過這些點的樣條曲線。我的問題是x座標列表不必要增加(即曲線不是一個函數,從數學上講)。不幸的是,它甚至不是一個函數,否則通過切換x和y座標就可以輕鬆解決問題。 scipy.interpolate爲1-d樣條的類需要增加x。我曾嘗試使用單變量插值類,但結果並不理想。有人有一些建議? – SirC

+0

爲什麼結果不理想?顯然,它可行,但你有不同的期望。你的期望是什麼,目前的結果是什麼? (圖片,手繪素描等幫助。)我的觀點是,有時候,人們比純粹的數學例程能夠實現的期望更高。 – Evert

回答

4

你需要重新考慮你如何看待這個問題:其實x是曲線(其中一個通常會表示t時間)和y的參數設置是x,y統籌:

L = [(x0,y0), (x1,y1), ...] 
X = numpy.array(L).T 
# Equivalently (but less generally): 
# X = [[P[0] for P in L], [ P[1] for P in L ]] 

t,X = enumerate(L) # here t[0]==0 and X[0]==(x0,x1,..), X[1]==(y0,y1,..) 
# or to name in a more confusing manner but match the docs: x,y = enumerate(L) 

然後您可以使用各種功能,例如:

f = scipy.interpolate.interp1d(t, X) 

例如直線(0,0)(1,1)之間:

f = interp1d((0,1), numpy.array([[0,0],[1,1]]).T) 
#   (t0,t1) numpy.array([[x0,y0],[[x1,y1]]).T 
#   (t0,t1)    [[x0,x1],[[y0,y1]] 
f(0.5) # array([ 0.5, 0.5]) 
+0

我不想點菜。例如,曲線必須先通過(1,2),然後通過(2,2)然後通過(1.5,3)。如果x被命令,問題將很容易解決。關鍵是x不增加,並且必須保持不增加 – SirC

+0

不,我不知道參數化和x不是定期的間隔。 – SirC

+0

@ user1234383那麼,這是最好的想法,你可以使用然後:) –