我有以下代码。它生成以参数形式给出的给定3-D函数的3-D三次样条。我几乎使用splprep和splev的在线文档对我的案例进行了调整。
但我有一些我不明白的事情。这是代码:
%matplotlib inline
from numpy import arange, cos, linspace, pi, sin, random
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt
# make ascending spiral in 3-space
t=linspace(0,1.75*2*pi,100)
x = sin(t)
y = cos(t)
z = t
# spline parameters
s=3.0 # smoothness parameter
k=3 # spline order
nest=-1 # estimate of number of knots needed (-1 = maximal)
# find the knot points
tck,u = splprep([x,y,z],s=s,k=k,nest=-1)
# evaluate spline, including interpolated points
xnew,ynew,znew = splev(linspace(0,1,400),tck)
关于此实施,我有几个问题。
在这种情况下,(t,c,k)
元组究竟返回了什么?我阅读了文档,它说它返回结点,系数和样条的程度。结点是否必须是形式(x,y,z)的坐标?所以我们必须有"number of knots"
个这样的坐标点。但那并不是什么回归。我们只返回一个length 11
数组。
u
返回什么? (文档说它返回参数的值。这是什么意思?参数的值t
?
当我使用nest = -1(这是默认值)时,它使用所需的最大结点数(在这种情况下,它们使用11
结点)。但是如何指定我自己的结点数,比方说50或80等?
我完全误解了这里的文档。有人可以启发我可能会使用示例吗?
答案 0 :(得分:5)
这个想法是你的点[x,y,z]是一些参数化曲线的值,原始参数在你的例子中为t。知道参数t的值有助于弄清楚如何在这些点之间进行插值。因此,您可以选择将参数值作为可选参数u
传递(在此示例中为u=t
)。但是如果您选择不这样做,该方法将根据给定点之间的距离(参数间隔从0到1)猜测参数的值。然后,此猜测将作为变量u
返回给您,因此您知道如何解释数据。如果你确实传递了u = t作为参数,那么你得到的u
就完全相同了。
您真的不需要u
来使用样条曲线。但是,如果需要将原始[x,y,z]点的位置与样条曲线的值进行比较,那么您可能希望将u
作为参数传递给splev
。解释u
含义的一种较短方式是:splev
需要重现您开始使用的[x,y,z]
坐标,并且由于平滑而存在一些偏差。
样条曲线的节点t
是参数区间中的点,而不是3D空间中的点。由于在您的示例中,参数区间为[0,1],默认情况下选择,因此t的值在此范围内。 结是参数区间上的一个位置,其中样条的某些系数会发生变化。端点0和1在技术上是多个节点,因此它们被列出多次。
曲线的3D特性由系数c
表示。您可能会注意到它是一个包含三个数组的列表,每个数组对应一个坐标。
使用此插值例程,您有两个选择:
task=-1
并提供结t
参数。为避免混淆:此t
不一定是您获得点[x,y,z]的t
。一个人不一定希望每个样本点都是一个结点。但是,结的数量取决于平滑度参数s
的值,因此可以间接影响。例如,你的数据有11节,s = 3,但是12节,s = 1和14节,s = 0.1。