德布尔算法

来自testwiki
跳转到导航 跳转到搜索

Template:Unreferenced

数学的子领域数值分析中,De Boor算法是快速而且数值上稳定算法,用于计算B样条形式的样条曲线。这是用于貝茲曲線de Casteljau算法的一个推广。

概述

一般的情况如下。若要构造一个穿过一系列p个点d0,d1,,dp1的曲线。曲线可以描述为一个参数x的函数。要穿过点的序列,曲线必须满足s(u0)=d0,,s(up1)=dp1。可假设u0, ..., up-1d0,d1,,dp1一起给定。这个问题称为插值

解决这个问题的一个方法是用样条。样条是一个分段nth阶多项式的曲线。这表示在任意区间[ui, ui+1)上,曲线必须等于次数最多n的多项式。它在不同的区间上可以是不同的多项式。多项式必须同步:当区间[ui-1, ui)[ui, ui+1)上的多项式在点ui上相遇,它们必须有同样的值,而且他们的导数必须相等(以保证曲线是光滑的)。

De Boor算法是一个算法,当给定u0, ..., up-1d0,d1,,dp1时,它能找到样条曲线s(x)在点x的值。它采用O(n2)次操作。注意算法的运行时间依赖于多项式的次数n,而不是点的个数p

算法概要

假设要计算参数值为x[u,u+1)的样条曲线的值。可以将曲线表示为

s(x)=i=0p1diNin(x),Ni0(x)={1,if x[u,u+1)0,... 

其中Nin(x)是x的多项式其参数依赖于u0, ..., un但和di无关。

因为样条的局域性,

s(x)=i=ndiNin(x)

所以值s(x)由控制点dn,dn+1,,d决定;其他控制点di没有影响。下一节所述的De Boor算法是一个有效计算s(x)表达式的程序。

算法

假设x[u,u+1)di[0]=di对于i = l-n, ..., l. 现在计算

di[k]=(1αk,i)di1[k1]+αk,idi[k1];k=1,,n;i=n+k,,

其中

αk,i=xuiui+n+1kui

s(x)=d[n].