形式陈述
给定次数 p ≥ 1 、B样条的夹持节点向量 理路 B样条基与局部支撑 B-spline basis · Cox–de Boor recursion · B样条 从零次区间指示函数递推局部基,证明非负、单位分解、基性质及重复节点下的连续性。 t 和系数 c 0 , … , c N − 1 。要把一个内部点 u ∈ ( a , b ) 插入一次,记其原重数为 r ,要求 0 ≤ r ≤ p ;取 k 为满足 t k ≤ u < t k + 1 的非零跨度下标。新向量 t ′ 在 t k 后插入 u ,新系数为
c i ′ = { c i , 0 ≤ i ≤ k − p , ( 1 − α i ) c i − 1 + α i c i , k − p + 1 ≤ i ≤ k − r , c i − 1 , k − r + 1 ≤ i ≤ N , α i = u − t i t i + p − t i . 中间范围可能为空。其实际分母严格为正,且 0 ≤ α i ≤ 1 。输出满足逐点恒等式
∑ i = 0 N − 1 c i B i , p ( x ; t ) = ∑ i = 0 N c i ′ B i , p ( x ; t ′ ) ( a ≤ x ≤ b ) , 使用同一内部右连续、右端左极限约定。这一步增加一个系数,不增加次数,也不重新拟合数据。
直觉
新节点把允许的样条空间放大,原曲线仍然在其中。插结只回答“原曲线在细一点的局部基下如何存储”。离新节点很远的基没有变化,附近的系数才需要混合。
把 α i 补成 i ≤ k − p 时为一、i ≥ k − r + 1 时为零,单节点的基细化恒等式为
B i , p ( x ; t ) = α i B i , p ( x ; t ′ ) + ( 1 − α i + 1 ) B i + 1 , p ( x ; t ′ ) . 下面用差商证明细化恒等式。对固定且不等于任何节点的 x ,令 g q ( z ) = ( z − x ) + q ,g 0 ( z ) = 1 ( x , ∞ ) ( z ) 。有
B i , p ( x ; t ) = ( t i + p + 1 − t i ) [ t i , … , t i + p + 1 ] g p . 先对互异节点验证。p = 0 时右侧为 g 0 ( t i + 1 ) − g 0 ( t i ) ,正是区间指标。对更高次数,用 g p = ( z − x ) g p − 1 ;差商乘积法则给
( b − a ) [ a , … , b ] g p = ( x − a ) [ a , … , a p ] g p − 1 + ( b − x ) [ a 1 , … , b ] g p − 1 , 其中 a = t i , a 1 = t i + 1 , a p = t i + p , b = t i + p + 1 。除以低阶基的各自支撑长度,就得到 Cox–de Boor 递推,归纳成立。这里的乘积法则也可直接从差商递推 理路 差商与 Newton 插值形式 Divided differences · Newton interpolation 用递归差商构造可增量扩展的 Newton 插值表示,并以嵌套乘法在线性时间求值。 推得:乘以一次式只留下该式的零阶和一阶差商。
设 a < u < b ,记 D = [ a , a 1 , … , a p , b ] g p 、D L = [ a , a 1 , … , a p , u ] g p 、D R = [ u , a 1 , … , a p , b ] g p 。差商的对称性与递推给
D − D L = ( b − u ) D a l l , D R − D L = ( b − a ) D a l l , 其中 D a l l 使用加入 u 的全部节点。消去它得
( b − a ) D = ( u − a ) D L + ( b − u ) D R . 把各节点排序后,左新基的支撑长度为 max ( a p , u ) − a ,右新基为 b − min ( a 1 , u ) 。因此两个系数分别为
u − a max ( a p , u ) − a , b − u b − min ( a 1 , u ) , 即 α i 与 1 − α i + 1 ,分母一般不同。u 在支撑之外时对应不变或移位的基。重复节点由节点合并极限得到:查询点远离节点,g p 在每个节点附近光滑,合流差商使用相应导数除以阶乘;零支撑基省略。再由单侧极限恢复所有节点值及右端值。
最后把恒等式乘 c i 求和。固定一个新基 B i , p ( t ′ ) ,它从旧第 i 项收到 α i c i ,从旧第 i − 1 项收到 ( 1 − α i ) c i − 1 。这里才出现同一 α i ,得到系数更新及整条曲线的不变性。
计算只有至多 p − r 次混合;构造整个新数组还需 O ( N ) 次复制。把“算几个新系数”的代价与“输出完整新数组”的代价分开,才不会遗漏数据移动。
例子与边界
对
p = 2 , t = ( 0 , 0 , 0 , 1 , 1 , 2 , 3 , 3 , 3 ) , c = ( 0 , 1 , 2 , 0 , 1 , 3 ) , 插入 u = 3 / 2 。这里 k = 4 , r = 0 ,只混合 i = 3 , 4 :α 3 = 1 / 2 、α 4 = 1 / 4 。结果是
t ′ = ( 0 , 0 , 0 , 1 , 1 , 3 / 2 , 2 , 3 , 3 , 3 ) , c ′ = ( 0 , 1 , 2 , 1 , 1 / 4 , 1 , 3 ) . 新表示在 u 的两个活跃基值为 1 / 2 , 1 / 2 ,读出 1 / 2 + 1 / 8 = 5 / 8 ,等于旧表示。更强的验证是分段恒等:旧曲线在 1 ≤ x ≤ 2 上为 2 − 4 ( x − 1 ) + 5 ( x − 1 ) 2 / 2 ;新表示在 [ 1 , 3 / 2 ] 和 [ 3 / 2 , 2 ] 各展开一次,均得到这一多项式。两侧其他跨度完全不变,所以相同并非只由几个样本推断。
再在原来的二重节点 1 插入一次,有 r = p = 2 ,中间范围为空,结果仅把系数二重复:c ′ = ( 0 , 1 , 2 , 2 , 0 , 1 , 3 ) 。新空间允许跳变,这条旧曲线却仍连续,因为断点左右端系数一致。若随后把右侧的二改为三,才会真正引入跳变。
已经满重数的点不能再按本接口插入;端点也不接受额外插入。它们不是数学上绝无其他表示,而是当前夹持、无冗余约定下的输入边界。节点删除则要检查相邻多项式是否满足更强拼接条件,不能简单删掉一个系数。
图片加载失败
推论与应用
将每个内部节点补到重数 p ,连续分段曲线可逐段读作 Bernstein 表示;若本来有满重数跳点,则该点两侧分别提取。因每段 Bernstein 基非负且和为一,局部系数的最小值、最大值给整段值域包围。进一步细分有时能把这个界收紧,连接到误差证书 理路 一致误差的全区间证书 Uniform error certification · Continuous supremum error bounds 把临界点、连续模或非负基包围变成全区间误差上界,并说明有限采样本身不能证明上确界。 。
在同一查询点反复插入,局部混合表与de Boor 求值 理路 de Boor 样条求值 de Boor algorithm · de Boor spline evaluation 定位一个非零节点跨度,以局部凸组合计算样条值,并完整处理重节点、右端点与失败输入。 相连。求值最后只要一个数,插结保留完整细化表示;二者共享运算机制,但输出接口不同。
参考资料