几何内核中的算法,大部分是可以转化为非线性方程组求解问题的。目前,最适合几何内核的非线性方程组求解算法是区间迭代类算法。
多项式是几何内核中比较常见的表达式(Bezier、Nurbs等),多项式值域精准高效的估计,严重影响区间类迭代算法的收敛速度。
本文将采用伯恩斯坦多项式来估算多项式值域。因为伯恩斯坦多项式具有凸包性,并且所有多项式都能转化成伯恩斯坦多项式形式。
伯恩斯坦多项式的定义如下:
相关伯恩斯坦多项式的详细知识,讲解的文章比较多,这里就不占用篇幅了。
在本算法中,我们做的工作是求出该式中的pi,并根据pi计算闭包作为多项式的值域估计。
我们可以通过对u采样并解一个线性方程组的方式来计算pi。
需要注意的是,u属于[0, 1],所以首先需要将多项式的变量x变换到[0, 1]。
当然,如果每次计算都解这样一个线性方程组,效率还是比较低的。
我们采用固定好采样节点的方式来避免这个问题。
固定好采样节点,等式右边方程的系数矩阵也就固定了,我们可以提前计算出该逆矩阵并定义成常量。
计算pi的时候只需要和左侧基于该采样节点计算出的向量相乘即可。
下面以如下一个多项式为例子演示一下该算法的效果。
设置定义域为[-4, -2]。
根据该多项式,通过计算极值点,很容易计算其值域区间为[21, 28],我们不推荐直接这样做的原因是因为计算极值点的效率有点低。
如果采用传统的区间代数公式,计算出的值域区间为[-33, 77]。
采用本文算法,u的采样点选为0,1/3,2/3,1。生成的系数逆矩阵如下:
最终计算出的值域区间为[21, 31]。
从结果来看,它和实际值域非常接近,比传统区间代数法要好很多。
因为矩阵是提前生成好的,所以本算法的计算效率也非常高。
将该算法用在曲线求交上的效率数据如下:
未使用该算法时的效率数据如下:
可见该算法的使用将运算效率提高了1倍左右。
更多几何算法,欢迎关注公众号“几何算法”。