形式陈述
输入为次数 、夹持非降节点向量 、系数 ,输出
先检查两端各重 次、内部重数不超过 、、系数数量正确以及数值有限。本文只接受 ;区间外不自动外推。
若 ,找唯一非零跨度 ,即相等节点块之后的那一段;若 ,令 ,按左极限处理。复制 ,。对 ,计算
返回 。若在同一数组覆盖,每轮必须按 从右向左更新,避免读到本轮的新值。
有效跨度保证每个实际使用的分母为正: 而 ,因此它至少跨越 。这里不需要把有效步骤的 人为改成零;若出现零分母,应检查跨度或下标是否有误。基函数递推里省略零支撑项的约定,不能不加区分地套到系数三角表。
直觉
Cox–de Boor 递推理路B样条基与局部支撑B-spline basis · Cox–de Boor recursion · B样条从零次区间指示函数递推局部基,证明非负、单位分解、基性质及重复节点下的连续性。从低阶基构造高阶基。将 展开后反向收集同一低阶基的系数,就得到上面的 ;再收集一次得 。最后只剩跨度 的零次基,其值为一,旁边的系数就是所求值。这给出逐层不变式
其中每层只在当前查询点使用该等式。第一层到下一层的系数合并恰是递推式,末层为单项。
在合法跨度上 。每一步只混合两个邻系数,解释了凸包性质与局部计算。一次完整合法性预检需 时间,可在固定节点和系数后缓存。预检通过的单次查询定位需 ,之后 次混合,合计 时间、 额外空间;它不必先生成全部 个基值。
例子与边界
取 、、。在 ,,初行是
第一轮 、,得到 ;第二轮 ,得到 。这与逐基求值的 相同。
在二重节点 ,仍取 。第一轮两个权重都为零,得到 ;第二轮权重为零,返回二。这是合法的零权重,不是零分母。若误把 当作有效跨度,才会制造无意义的除零。
在 ,选末跨度 ,相关权重都为一,返回 。次数零时没有混合步骤,直接返回当前跨度的系数。内部满重数允许左右值不同:例如 ,左极限为一,而算法在 返回右侧值四。
推论与应用
向量系数可逐分量执行同一表,得到参数曲线上的点。只有一个跨度时,这个三角表就是 Bernstein 表示下的 de Casteljau 求值;局部线性混合是两者共有的计算结构。
浮点凸组合避免展开大幂系数,但结果接近零时,相对误差仍可能很大;节点差极小时,减法与除法也需要尺度检查。验收可比较同一输入的基递推、分段多项式和三角求值,并检查端点、节点左右两侧以及非法输入。通过这些样例说明实现符合所定接口,不等于已经证明任意浮点输入都没有误差。
参考资料