用与R的bs()函数相同的方式在Matlab中计算B样条基础

时间:2018-07-23 09:18:37

标签: r matlab math spline bspline

我正在寻找Matlab中的一个(理想的内置)函数,该函数以与R中相同的方式计算B样条基矩阵,例如以样条为基础,在20度的3度等速结中,我会在R

Reliability: 255/255

enter image description here

要想在Matlab中获得相同的效果,我以为我可以使用

require(splines)
B = bs(x = seq(0,1,length.out=100),
        knots = seq(0, 1, length.out=20), # 20 knots
        degree = 3,
        intercept = FALSE)
matplot(B,type="l")

enter image description here

但是可以看到,然后没有边界结。 有什么想法要使Matlab中与R中相同的语法是什么?

PS R用于B = spcol(linspace(0,1,20),3,linspace(0,1,100)); plot(B); 的代码采用某种简化形式:

bs()

1 个答案:

答案 0 :(得分:9)

您的代码中有两处错误

  1. 我认为学位顺序之间有些混淆。您已经在R代码中正确指定了degree=3,但是在MATLAB中,传递给spcol的参数是样条线的 order 。通常,阶数为n的样条函数是阶数为n-1的分段多项式。 [1]

    由于MATLAB的spcol接受 order 作为输入,因此您需要指定order=4而不是degree=3来完成! 您在MATLAB中生成了二次样条,在R中生成了三次样条。

  2. 您的R图中的末端结似乎具有非奇异的多重性,这意味着它们是重复的。使端点具有多个degree+1(在我们的示例中为4)意味着它们的位置与控制多边形重合,这被称为 clamped 结。 [2]

    R documentation for bs中,它指出结节数组包含内部断点。似乎边界结被定义为在较长的代码示例中被夹紧,因为它们在此行重复degree+1次,

    knots <- c(rep(Boundary.knots[1], (degree+1)), interior.knots.sorted, rep(Boundary.knots[2], (degree+1)))
    

    这对于固定的端点有意义,并备份了有关使用 degree 输入的早期点。

    因此,我们在MATLAB中的结矢量(具有固定的端点)应为:

    k = [0, 0, 0, linspace(0,1,20), 1, 1, 1]
    

结论

让我们使用 order 4,并在端点处使用具有固定结点的结点矢量:

B = spcol([0, 0, 0, linspace(0,1,20), 1, 1, 1], 4, linspace(0,1,100)); 
plot(B);

b spline basis MATLAB

我们现在可以看到边界结,就像它们在R图中一样,并且在每个末端有2个附加峰,由于3个钳位结的影响,这些附加峰较小。


进一步阅读

[ 1 ]:维基百科B样条页面

[ 2 ]:麻省理工学院的有用页面,其中更深入地描述了钳位节点和数学。