2012-10-09 107 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那么,这是最好的想法,你可以使用然后:) –