您当前的位置: 首页 > 

松下J27

暂无认证

  • 0浏览

    0关注

    114博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

数值计算 --- B样条函数(B-spline)

松下J27 发布时间:2021-09-27 19:38:35 ,浏览量:0

 B样条函数(B-spline)

B-spline就是Basis Spline的简称:

        术语B-spline一词,是由罗马尼亚裔美国数学家Isaac Jacob Schoenberg创造的(就是下图的这个老爷爷,我在wiki百科上找到了他的照片)。一个n阶的B-spline函数,是一个变量为x的n-1次分段多项式函数f(x)。分段函数之间,段与段之间的断点被称为knots。

B-spline的定义:(虽然我也很不想一上来就给个定义)

        B-spline函数(上图中的f(t)),可以看成是一系列控制点P_{i}(Control points)和权重函数N_{i,D}(Weight function)的线性组合。简而言之,B-spline曲线就是每个控制点乘以与之对应的权重函数的加权和。控制点是我们后期指定的,而权重函数是我们预先定义好的,只跟阶数D有关,不会因为控制点的变化而改变。

权重函数\large N_{i,D}(t)

(注意:以下只讨论权重函数N(t),暂时还不涉及控制点P)

权重函数N_{i,D}(t)的定义: 

当阶数D=1时:

        函数N_{i,D}(t)的定义,可以参考Cox–de Boor的递归公式。对于给定的knots,当D=1时,一阶权重函数N_{i,1}(t)可以定义为:

(公式1)

当阶数D>1时:

           有了一阶权重函数N_{i,1}(t)以后,其他所有阶数(D)大于1的高阶权重函数都可以按照如下递归表达式来定义的:

(公式2)

公式1和公式2合称为Cox-de Boor recursion formula。

且有如下性质:

        1,阶数为D的权重函数N_{i,D}(t)的,是关于t的D-1次多项式。

        2,Positivity: 当t在此区间t_{i} t t_{i+D}内时,函数值一定不为0,即N_{i,D}(t)0

        3,Local support: 前面的Positivity定义了高阶权重函数在哪里有值,而这里的local support则是定义了高阶权重函数在哪里没有值。和一阶权重函数一样,对于区间[t_{i} ~ t_{i+D}]之外的t,N_{i,D}(t)=0。         4,Partition of Unity: 在区间[t_{i} ~ t_{i+1}]内,所有非0阶权重函数的和为1。(这个性质我自己也没看懂)     

        5,Recursion: 递归性,这一性质由公式2决定。

        例如,当D=2时:

\LARGE \mathbf N_{i,2}(t)=\frac{(t-t_{i})N_{i,1}(t)}{t_{i+1}-t_{i}}+\frac{(t_{i+2}-t)N_{i+1,1}(t)}{t_{i+2}-t_{i+1}},t_{i}\leqslant t  t_{i+2}

其中\LARGE N_{i,1}(t)\LARGE N_{i+1,1}(t)都是已知的一阶权重函数。

        6,一个D阶B-spline函数是由一些D-1阶多项式曲线连起来的(参考性质1)。每段函数之间的断点/连接点(breakpoints),被称为knot,用非递减序列t_{0}\leqslant t_{1}\leqslant t_{2}...\leqslant t_{m}表示,这些knot的合集被称为knot vector list,共m+1个knot。

T=(t_{0},t_{1},...,t_{m})

        knot与knot之间的半开半闭区间[t_{i},t_{i+1})被称为knot span或i-th knot span,意思就是两个knot之间的跨度。如果knot vector list中,所有的knot都是等间隔的,即t_{1}-t_{0}=t_{2}-t_{1}=t_{3}-t_{2}=....=t_{m}-t_{m-1},则我们说T是uniform的,否则,称之为non-uniform。(本文中讨论的都是uniform B-spline)

        7,一但knot vector list确定了以后,对于阶数为D的B-spline函数,每段函数与函数之间在断点knot处保证C^{D-2}阶连续。(注:函数的连续性和knot的选择方式有关)

      

        举个例子,简要的说明一下上述性质。对于一阶权重函数N_{i,1}(t)而言,阶数D=1,每段函数都是一个D-1=0阶多项式。当i=0时,有一阶权重函数N_{0,1}(t),对应knot span[0,1)。在[0,1)之间的函数值不为0,在这之外函数值都等于0。

权重函数N_{i,D}(t)定义的简化:

        为了方便计算,上面定义的权重函数可以做进一步的简化。一般情况下,会把knot vector list也就是函数之间的断点t_{0},t_{1},t_{2},...,t_{m},简化成一组非递减的正整数。简而言之,就是把原来的t_{0},t_{1},t_{2},...,t_{m}变成非递减的正整数0,1,2,...m。

 (简化后的公式1)

 (简化后的公式2)

        为了更好的说明当D>1时的Cox–de Boor递归公式,我这里借鉴了一张别人网站里的插图,为了后续描述方便,我这里暂且称它为Cox–de Boor递归流程图(见参考文献1)。

        首先,让我们把目光放在图中三角形的最左上角的一个小三角形N_{0,1},N_{1,1}N_{0,2},他所要表达的是,要想求出二阶函数N_{0,2},我们需要先知道一阶函数N_{0,1}N_{1,1}。这就是说,要想知道上图中左起第二列的所有二阶函数N_{0,2}N_{1,2},。。。N_{4,2},必须先知道他们所对应的左起第一列的一阶函数N_{0,1}N_{1,1}。。。N_{5,1}。依此类推,当我们要计算六阶函数N_{0,6}时,首先需要先知道五阶函数N_{0,5}N_{1,5},其次我们需要相应的所有四阶函数,三阶函数。。。直到一阶函数。

        从公式的角度看也一样,根据简化后的公式,我们发现要想得到阶数为D的第i段函数N_{i,D}(t),需要先知道阶数为D-1的第i段函数N_{i,D-1}(t)和阶数为D-1的第i+1段函数N_{i+1,D-1}(t)。以此类推,要想知道D-1阶的第i段函数N_{i,D-1}(t)和第i+1段函数N_{i+1,D-1}(t),我们又分别需要N_{i,D-2}(t),N_{i+1,D-2}(t)N_{i+1,D-2}(t),N_{i+2,D-2}(t),以此类推直到对应的一阶权重函数。

        下面我们由低到高,详细探讨一下几个不同阶数的权重函数N_{i,D}(t)。我这里再次强调,到目前为止都没有讨论过控制点P_{i},而只讨论权重函数,目的是为了避免混淆对权重函数N_{i,D}(t)和控制点P_{i},这两个B-spline中最重要的概念的理解。因为,所谓的B-spline就是这两个概念的线性组合,只有分别理解他们的各自的作用,才能更好的理解B-spline。

一阶权重函数N_{i,1}(t)

         一阶权重函数,D=1,t=[i,i+1),有效区间为i+1。

        首先,我们知道权重函数都有一个有效区间,这里我暂且把他称之为t的定义域,毕竟函数在定义域之外是有值的,且值为0。

         这里我们统一以7个knots为例,knot vector list T={0,1,2,3,4,5,6},每段函数的knot span为1。对于第0段函数,也就是当i=0时,t的定义域为[0,1),函数N_{0,1}(u)的断点knot为0,1。对于最后一段函数,也就是第5段函数,此时,i=5,u=[5,6),函数两端的端点knot为5,6。(注意,此时还没有用到递归函数。)

 一阶权重函数N_{i,1}(t)的图像: 

        注意:相对于第i段权重函数的图像而言,第i+1段权重函数只不过是对第i段函数向右移动一位后的结果,以此类推。

 Matlab code:

%% B-spline demo for CSDN
% Created: early fall, 2022. (2022/09/02)
% Author: Z.Zhu, J27
% Copy Rights Reserved.

close all
clear all


Data=[6,6,6,6,1,1];
%% 一阶B-spline中的权重函数Ni,1(u),ti为正整数的定义域
%n=6, i=0~6,共7个点, each knot span=order=1,总共可以生成7-1=6段曲线。
%N0,1(u),u=[t0~t1)=[0~1)
freq=0.01;
ti_D1=0:freq:6;
step=1/freq;
%第一段函数
u0=ti_D1(1:step);
N01=ones(1,step);
figure;
subplot(3,1,1);
plot(u0,N01);
xlabel('0            
关注
打赏
1660635678
查看更多评论
0.0371s