如何在 C++ 中构建递归样条函数

计算科学 C++ b样条
2021-12-20 05:06:18

目前我正在研究一种称为基样条搭配的微分方程求解方法。我遇到的问题是构建一种方法来构建任意顺序样条,具有关系

Bik+1(x)=xxixk+ixiBik+xk+i+1xxk+i+1xi+1Bi+1k(x)
与初始条件
Bi1(x)={1for xix<xi+10otherwise
而且即使从这个问题开始我也遇到了麻烦,因为它是递归的,可以从“顶部”或“底部”开始,而且我遇到了一般作家块类型的东西,我无法得到我的考虑一下我需要做什么。

3个回答

我可以推荐参考 The NURBS book,这似乎是关于这个主题的经典文本。该算法本身在第 72 页给出,可用于在线查看。

我支持 NURBS 书,并且还想强调,虽然这个递归公式通常是表达 B 样条基的方式(如在论文中),但不是实现基函数的方式。由于所有高阶函数都基于低阶,因此您可以计算所有p+1非零函数一次并重用低阶评估。这就是 Piegl 的算法如何做到这一点的。

老实说,我不知道这有多有效,但一种方法是使用 c++ 模板:

顺序为k,t为结结构,x为你想要的值。

template <int k> 
real BSpline(real x, real *t)
{
    if (*t <= x && x < *(t+k))
    {
        real a = (x - *t) / (*(t+k-1) - *t);
        real b = (*(t+k) - x) / (*(t+k) - *(t+1));

        return a * BSpline<k-1>(x, t) + b * BSpline<k-1>(x, (t+1));
    }
    else
        return 0;
};

template <>
real BSpline<1>(real x, real *t)
{
    if (*t <= x && x < *(t+1))
        return 1.;
    else
        return 0.;
};