0

我打算将钳位 b 样条拟合到 R 中的一组控制点,但在理解knotsbs 中参数的使用时遇到了困难。给定一组控制点:

path <- data.frame(
    x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
    y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
)

我根据路径的距离独立地拟合 x 和 y:

path$distance <- c(0, cumsum(sqrt(diff(path[,1])^2 + diff(path[,2])^2)))
path$distance
##  [1]  0.000000  1.118034  4.344511  9.382259 13.566026 27.766169 41.860284 48.799899 52.877545 56.535931 57.950145
## [12] 59.068179

但我想提供一个开放的统一节点向量,以便将拟合锚定到第一个和最后一个点 - 使用df不支持这一点。

据我了解,对于我给定的一组点,以及样条曲线的 3 度,必须有(12-1)+3+2 = 16结(每 m=n+p+1,对于#knots=m+1,#control=n+1, degree=p),所以对于一个钳位样条,这应该是一个很好的节点向量:

knots <- seq(path$distance[1], path$distance[12], length.out = 10)
knots <- c(rep(knots[1], 3), knots, rep(knots[10], 3))
knots
##  [1]  0.000000  0.000000  0.000000  0.000000  6.563131 13.126262 19.689393 26.252524 32.815655
## [10] 39.378786 45.941917 52.505048 59.068179 59.068179 59.068179 59.068179

使用它会给出一些疯狂的数字,以及关于排名不足的警告,所以很明显我一定是在某种程度上弄错了:

pred_df  <-  data.frame(x=0,y=0,distance=seq(min(path$distance), max(path$distance), length.out=100))
xPath <- predict(lm(x~bs(distance, knots=knots, degree = 3), path), pred_df)
## Warning message:
## In predict.lm(lm(x ~ bs(distance, knots = knots, degree = degree),  :
##   prediction from a rank-deficient fit may be misleading
summary(xPath)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -2133.000     3.468    16.700  -161.900    64.590   857.800 

给定一组控制点和度数,指定节点向量的正确方法是什么?

4

1 回答 1

1

从您的“参数”和“节点”数据来看,它们确实违反了 Schoenberg-Whitney 条件。我不熟悉 R 中的语法,但您似乎在 path$distance[1] 和 path$distance[12] 之间统一生成节点值。这个不对。您应该通过以下方式生成结值:

0) 将参数表示为 p[i],其中 i = 0 到 (n-1),p[0]=0.0,n 为点数。对于您的情况,n=12
1)将结值创建为

节[0] = (p[1]+p[2]+p[3])/3
节[1] = (p[2]+p[3]+p[4])/3
节[2] = (p[3]+p[4]+p[5])/3
......
这些是内部节点值。您应该注意到 p[0] 和 p[n-1] 不会在此步骤中使用。您应该为您的案例获得 8 个内部结值。
2) 现在,将 p[0] 添加到结值的前面 4 次(对于度数 = 3),然后将 p[n-1] 添加到结值的末尾 4 次,您就完成了。对于您的情况,您应该总共获得 16 个节值。

请注意,这不是生成有效节点向量的唯一方法。但是以这种方式生成的节点向量将始终满足 Shoenberg-Whitney 条件。

于 2015-11-11T01:37:16.367 回答