6

我有以下一段代码。它生成以参数形式给出的给定 3-D 函数的 3-D 三次样条。我使用splprepsplev的在线文档非常适合我的情况。

但是我有一些我不明白的地方。这是代码:

%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)

关于这个实现,我有几个问题。

  1. 在这种情况下,元组究竟(t,c,k)返回了什么?我阅读了文档,它说它返回了节点、系数和样条曲线的度数。结点不是必须是 (x, y, z) 形式的坐标吗?所以我们必须有"number of knots"这样的坐标点。但这不是返回的。我们只是返回一个数组length 11

  2. 返回什么u?(文档说它返回参数的值。这是什么意思?参数的值t

  3. 当我使用nest = -1(这是默认值)时,它使用所需的最大结点数(在这种情况下,它们使用11结点)。但是我如何指定我自己的结点数,比如 50 或 80 等?

我完全误解了这里的文档。有人可以启发我使用示例吗?

4

1 回答 1

5

参数值,u

这个想法是你的点 [x,y,z] 是一些参数化曲线的值,在你的例子中原始参数是 t 。知道参数 t 的值有助于弄清楚如何在这些点之间进行插值。出于这个原因,您可以选择将参数的值作为可选参数传递uu=t在本例中)。但是,如果您选择不这样做,该方法将根据给定点之间的距离(参数间隔将从 0 到 1)对参数的值进行猜测。然后这个猜测作为变量返回给你u,所以你知道数据是如何被解释的。如果您确实将 u=t 作为参数传递,那么u您得到的结果是完全相同的。

你真的不需要这个u来使用样条线。但是,如果需要将原始 [x,y,z] 点的位置与样条曲线的值进行比较,那么您可能希望将u其作为参数传递给splev. 解释其含义的更短的方法u是:它splev需要重现[x,y,z]您开始使用的坐标,由于平滑而存在一些偏差。

tck 值

样条曲线的节点 是参数区间t中的点,而不是 3D 空间中的点。由于在您的示例中,参数间隔为 [0,1],默认选择,因此 t 的值在此范围内。节点是参数区间上样条的一些系数发生变化的地方。端点 0 和 1 在技术上是多个节点,因此它们被多次列出。

曲线的 3D 特性由系数表示c。您可能会注意到它是一个包含三个数组的列表,每个坐标一个。

结点数

使用此插值例程,您有两种选择:

  • 准确地告诉它结点是什么(通过给出task=-1和提供t结的参数)。为避免混淆:这t不一定是t您获得点 [x,y,z] 的地方。不一定希望每个样本点都是一个结点。
  • 将结的确定留给常规,包括它们的数量。

但是,结的数量取决于平滑度参数的值s,因此可以间接受到影响。例如,在您的数据中,s=3 有 11 个结,s=1 有 12 个结,s=0.1 有 14 个结。

于 2017-01-15T16:13:04.040 回答