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

2 篇文章 11 订阅
订阅专栏

 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<=u<1')
legend('N01(u)')
axis([ 0 6 0 2])
%第二段函数
u1=ti_D1(step+1:2*step);
N11=ones(1,step);
subplot(3,1,2);
plot(u1,N11)
xlabel('1<=u<2')
legend('N11(u)')
axis([ 0 6 0 2])
%第六段函数
u5=ti_D1(5*step+1:6*step);
N51=ones(1,step);
subplot(3,1,3);
plot(u5,N51)
xlabel('5<=u<6')
legend('N51(u)')
axis([ 0 6 0 2])


 二阶权重函数N_{i,2}(t)

        二阶权重函数,D=2,t=[i,i+2),第i段函数的有效区间为i+2。

        同样是7个knots,knot vector list T={0,1,2,3,4,5,6},每段函数的knot span=D=2。

        根据Cox–de Boor的递归公式,一阶权重函数的值是分区间给定的,而对于二阶权重函数的计算,需要根据递归函数来调用一阶权重函数(下图中简化后的公式2)。

        首先,我们把目光移到公式中的阶数D,当我们要计算N_{i,D}(t),我们预先要知道N_{i,D-1}(u)N_{i+1,D-1}(u)。也就是说,要想得到第i段2阶权重函数,需要预先知道第i段1阶权重函数和阶数同为1的第i+1段权重函数 。

        同样,现在我们分别把i=0,1,5和D=2代入简化后的公式2,分别考察这些函数

         当i=0时:有第0段函数N_{0,2}(t),定义域t=[0,2)。而用于合成他的两个一阶函数N_{0,1}(t)N_{1,1}(t)的定义域分别是[0,1)和[1,2)。

为了更好的理解该函数,可以借助之前的Cox–de Boor递归流程图:

        这幅图指出,当t=[0,1)时,仅仅只有函数N_{0,1}(t)对函数N_{0,2}(t)起作用,也就是式中的前半部分tN_{0,1}(t)

此时,N_{0,1}(t)=1推出N_{0,2}(t)=t

同理, 当t=[1,2)时,仅仅只有函数N_{1,1}(t)对函数N_{0,2}(t)起作用,也就是式中的后半部分(2-t)N_{1,1}(t)。 

此时,N_{1,1}(t)=1推出N_{0,2}(t)=2-t

        当i=1时:有第1段函数N_{1,2}(t),定义域t=[1,3):

        当i=4时:有第4段函数N_{4,2}(t),定义域t=[4,6):

(注意:当D=2时,由于只有0~6个knots,i的最大取值范围不会超过4,i的最大取值范围等于knot list中的最大值6-D=4)


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

                 注意:和一阶权重函数的图像类似,二阶权重函数的图像也可以通过把前一段函数整体向右移动一位得到。这一点也可以由于,函数自身的变化看出来。N_{0,2}(t)中前半段曲线t向右移动一位,得到t-1,正好等于N_{1,2}(t)的前半段。同理,N_{0,2}(t)的后半段曲线2-t向右移动一位,得到2-(t-1)=3-t,也正好等于N_{1,2}(t)的后半段。

 Matlab code:

%% 二阶B-spline中的权重函数Ni,2(u)
%n=6, i=0~6,共7个点, each knot span=order=2,总共可以生成7-2=5段曲线。
freq=0.01;
ti_D2=0:freq:6;
step=1/freq;
%第一段函数
%N0,2(u),u=[t0~t2)=[0~2)
u0=ti_D2(1:2*step);
N02=zeros(1,2*step);
%前半部分[0,1)
N02(1:step)=u0(1:step);
%后半部分[1,2)
N02(step+1:2*step)=2-u0(step+1:2*step);
figure;
subplot(3,1,1);
plot(u0,N02);
xlabel('0<=u<2')
legend('N02(u)')
axis([ 0 6 0 2])
%第二段函数
%N1,2(u),u=[t1~t3)=[1~3)
u1=ti_D2(step+1:3*step);
N12=zeros(1,2*step);
%前半部分[1,2)
N12(1:step)=u1(1:step)-1;
%后半部分[2,3)
N12(step+1:2*step)=3-u1(step+1:2*step);
subplot(3,1,2);
plot(u1,N12);
xlabel('1<=u<3')
legend('N12(u)')
axis([ 0 6 0 2])
%第五段函数
%N4,2(u),u=[t4~t6)=[4~6)
u4=ti_D2(4*step+1:6*step);
N42=zeros(1,2*step);
%前半部分[1,2)
N42(1:step)=u4(1:step)-4;
%后半部分[2,3)
N42(step+1:2*step)=6-u4(step+1:2*step);
subplot(3,1,3);
plot(u4,N42);
xlabel('4<=u<6')
legend('N42(u)')
axis([ 0 6 0 2])


三阶权重函数N_{i,3}(t) 

        三阶权重函数,D=3,t=[i,i+3),第i段函数的有效区间为i+3。

        总共7个knots,knot vector list T={0,1,2,3,4,5,6},每段函数的knot span=D=3。

        按照Cox–de Boor递归公式,要求三阶的权重函数N_{i,3}(t),首先我们要先知道二阶权重函数N_{i,2}(t),而这些函数都已经在前面求出来了。和前面一样,我们把i=0,1,3和D=3逐一代入简化后的公式2,看一下三阶权重函数。

1,当i=0时,t=[0,3),第0段函数N_{0,3}(t)

         我们可以看到,和前面一样,为了求出N_{0,3}(t),我们需要先知道N_{0,2}(t)N_{1,2}(t)(前面已经算好了)。

        此时,我们要特别注意函数N_{0,3}(t)的定义域t=[0,3),用于合成他的子函数之一N_{0,2}(t)的定义域是[0,2),继而我们还会发现,对于N_{0,2}(t)而言,用于合成他的子函数之一N_{0,1}(t)的定义域是[0,1),在这以外都是0。也就是说,对于这个递归分段函数,我们要特别注意他的有效区间,或者说是每个子函数的有效定义域。(这在Cox–de Boor递归流程图中会更加直观,我们分三个区间讨论)

 1.1,当i=0时,对t=[0,1)而言:

        这时只有N_{0,2}(t)在此处有定义,其他都为0。因此,只有N_{0,2}(t)对函数N_{0,3}(t)起作用, 此时,N_{0,2}(t)在[0,1)上等于t,N_{1,2}(t)在[0,1)上等于0,得到N_{0,3}(t)=t^{2}/2。而这一点,在我们之前的推导结果中也显而易见。

 (上图中画红线处

 1.2,当i=0时,对t=[1,2)而言:

          此时,N_{0,2}(t)N_{1,2}(t)都有定义,他们同时对函数N_{0,3}(t)起作用, 此时,N_{0,2}(t)在[1,2)上等于2-t,N_{1,2}(t)在[1,2)上等于t-1,得到N_{0,3}(t)=(-2t^{2}+6t-3)/2

上图中画红线处

 1.3,当i=0时,对t=[2,3)而言:

        t=[2,3)时的情形和t=[0,1)时的情形很类似,此时,只有N_{1,2}(t)在此处有定义,其他都为0。因此,这时只有函数N_{1,2}(t)对函数N_{0,3}(t)起作用。此时,N_{1,2}(t)等于3-t,N_{0,2}(t)等于0,得到N_{0,3}(t)=(3-t)^{2}/2

上图中画红线处

2,当i=1时,t=[1,4),第1段函数N_{1,3}(t)

3,当i=3时,t=[3,6),第3段函数N_{3,3}(t)

(注意:当D=3时,由于只有0~6个knots,i的最大取值范围不会超过3,i的最大取值范围等于knot list中的最大值6-D=3)


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

 Matlab code:

%% 三阶B-spline中的权重函数Ni,2(u)
%n=6, i=0~6,共7个点, each knot span=order=3,总共可以生成7-3=4段曲线。
freq=0.01;
ti_D3=0:freq:6;
step=1/freq;
%第一段函数
%N0,3(u),u=[t0~t3)=[0~3)
u0=ti_D3(1:3*step);
N03=zeros(1,6*step+1);
N03(1:step)=u0(1:step).^2./2;%0~1
N03(step+1:2*step)=(-2*u0(step+1:2*step).^2+6*u0(step+1:2*step)-3)/2;%1~2
N03(2*step+1:3*step)=(3-u0(2*step+1:3*step)).^2/2;%2~3
figure;
subplot(4,1,1);
plot(ti_D3,N03);
xlabel('0<=u<3')
legend('N03(u)')
axis([ 0 6 0 2])
%第二段函数
%N1,3(u),u=[t1~t4)=[1~4)
u1=ti_D3(step+1:4*step);
N13=zeros(1,6*step+1);
N13(step+1:2*step)=(u1(1:step)-1).^2./2;%1~2
N13(2*step+1:3*step)=(-2*u1(step+1:2*step).^2+10*u1(step+1:2*step)-11)/2;%2~3
N13(3*step+1:4*step)=(4-u1(2*step+1:3*step)).^2/2;%3~4
subplot(4,1,2);
plot(ti_D3,N13);
xlabel('1<=u<4')
legend('N13(u)')
axis([ 0 6 0 2])
%第三段函数
%N2,3(u),u=[t2~t5)=[2~5)
u2=ti_D3(2*step+1:5*step);
N23=zeros(1,6*step+1);
N23(2*step+1:3*step)=(u2(1:step)-2).^2./2;%2~3
N23(3*step+1:4*step)=(-2*u2(step+1:2*step).^2+14*u2(step+1:2*step)-23)/2;%3~4
N23(4*step+1:5*step)=(5-u2(2*step+1:3*step)).^2/2;%4~5
subplot(4,1,3);
plot(ti_D3,N23);
xlabel('2<=u<5')
legend('N23(u)')
axis([ 0 6 0 2])
%第四段函数
%N3,3(u),u=[t3~t6)=[3~6)
u3=ti_D3(3*step+1:6*step);
N33=zeros(1,6*step+1);
N33(3*step+1:4*step)=(u3(1:step)-3).^2./2;%1~2
N33(4*step+1:5*step)=(-2*u3(step+1:2*step).^2+18*u3(step+1:2*step)-39)/2;%2~3
N33(5*step+1:6*step)=(6-u3(2*step+1:3*step)).^2/2;%3~4
subplot(4,1,4);
plot(ti_D3,N33);
xlabel('3<=u<6')
legend('N33(u)')
axis([ 0 6 0 2])


关于权重函数的两点总结:

 1,在文章的开头处,我提到了权重函数N_{i,D}的几点特征,其中的Positivity非常重要,他指出了权重函数的有效区间,也就是定义域t=[i,i+D)。函数在[i,i+D)以内的值一定不为0,而在这以外都是0。这一点我们依然可以借助Cox–de Boor递归流程图看出来。

        比如说,我们要看一下函数N_{1,4}(t)的定义域, 我们可以沿着N_{1,4}(t)的两条放射线朝着图像左边一直追溯到底。他所夹着的区域,就是他的定义域,或者说是有效区间,也叫非零区间。同时,我们还能在这个夹角区间内,找到N_{1,4}(t)的子函数,以及子函数的子函数所对应的定义域。

2, 对于给定的knot span[i,i+1),如何才能知道,生成哪些权重函数的时候会用到它?或者说,他这个区间所对应的最低阶的一阶函数N_{i,1}(t),可以生成哪些高阶函数?要回答这个问题,我们需要在Cox–de Boor递归流程图中,沿着N_{i,1}(t)的两条放射线向右追溯。比如说N_{1,4}(t),他所能生成的高阶函数,如下图所示:


带有控制点\large P_{i}(Control Point)的B-Spline Curve

注意:现在开始讨论控制点CP的应用

        

         现在让我们再回到之前对B-Spline的定义,之前我们已经详细介绍了权重函数N,现在我们着重讨论控制点P,以及加入控制点P后最终生成的B-Spline曲线。

        假定控制点的数量为n+1,他们分别是控制点P_{0}P_{1},。。。P_{n}。权重函数的阶数为D,那么在生成B-spline时所需的knot断点数m,必须满足:

m=n+D+1

也就是说,变量t所在的knot vector list为T={0,1,。。。m-1}。

        我们以三阶B-spline函数为例,D=3,给定6个控制点[2,6,3,8,1,1],即n=5,共需m=5+3+1=9个knots。首先,按照我们上面的推导,也就是knots={0~6}共7个knots的函数推导,我们已经得到了N03,N13,N23和N33。

根据带有控制点的计算公式:

        首先,我们分别计算函数f(0),f(1),f(2),f(3)。其中,f(0)=P0xN03,f(1)=P1xN13,f(2)=P2xN23,f(3)=P3xN33,f(4)=P4xN43,f(5)=P5xN53。共六个控制点,每个控制点乘以对应的权重函数,就能得到当前点所生成的曲线。他们的函数图像如下所示:

这里我们要注意两点:

        1,其实这里除了控制点的值不同,每个权重函数都相同,只是他们所对应的定义域不同,即,曲线相同而位置不同。

        2,根据我们之前的推导,我们现在只有N03~N33的函数。因此,我们暂时无法使用最后两个控制点P4和P5,因为我们暂时还不知道权重函数N43和N53。

        3,上面我在给出控制点时,只给了具体的值,而没有给出每个控制点所对应的位置。在实际应用中需要特别注意。

        接下来,只需把他们都加到一起,就能得到最终的B-Spline Curve:

f(t)=f(0)+f(1)+f(2)+f(3)=P0xN03+P1xN13+P2xN23+P3xN33

        下图是最终生成的B-Spline Curve,注意他在每个knot断点处都是连续的。根据权重函数的定义,他的连续性为C^{D-2},也就是说最终生成的Curve在每个断点处都连续C^{0},且,在断点处的导数也连续C^{1}

        对于三阶B-Spline而言,正如我们前面说的,每个控制点CP所乘的权重函数其实是一模一样的,只不过是在不同的定义域定义的,这也直接决定了输出函数的位置。也就是说,CP值的改变会极大地影响整个曲线的形状。现在我们把控制点的值由[2,6,3,8,1,1]改成[6,6,6,6,1,1],我们再来看看最终生成的Curve,并和之前的曲线做一个比较(他们使用的是相同的权重函数,只是使用了不同的控制点)。注意:最后两个控制点P4=1,P5=1在这里用不到。

Matlab code:

%% add Control Points 
%P(u)=PN
Px0=Data(1)*N03;%P(0)=CP0*N03,domain=0~3
Px1=Data(2)*N13;%P(1)=CP1*N13,domain=1~4
Px2=Data(3)*N23;%P(2)=CP2*N23,domain=2~5
Px3=Data(4)*N33;%P(3)=CP3*N33,domain=3~6

figure;
subplot(4,1,1);
plot(ti_D3,Px0);
xlabel('0<=u<3')
legend('P(0)=CP0*N03')
axis([ 0 6 0 10])
subplot(4,1,2);
plot(ti_D3,Px1);
xlabel('1<=u<4')
legend('P(1)=CP1*N13')
axis([ 0 6 0 10])
subplot(4,1,3);
plot(ti_D3,Px2);
xlabel('2<=u<5')
legend('P(2)=CP2*N23')
axis([ 0 6 0 10])
subplot(4,1,4);
plot(ti_D3,Px3);
xlabel('3<=u<6')
legend('P(3)=CP3*N33')
axis([ 0 6 0 10])

%Bspline = P(0) + P(1) + P(2) + ...
BsplineY=Px0+Px1+Px2+Px3;

figure;plot(ti_D3,BsplineY)
axis([ 0 6 0 10])
hold on
stem(0:5,Data)
legend('B-spline','Control Points')
title("B-Spline generated with CP0~CP3.Note:the last two CP4 and CP5 are not used!");

(全文完)

2022年8月4日晚,上海

作者 --- 松下J27

1,Matlab code added, 2022/09/02下班后

2,对文章的排版做了部分修改,2022/10/28

3,对文中B-spline函数的定义进行了修改(修改了原有的插图),2023/07/31

4,对文章进行了大改,2023/08/03

参考文献(鸣谢):

1,B-spline Basis Functions: Definition

2, 1.4.1 B-splines

3, https://en.wikipedia.org/wiki/Isaac_Jacob_Schoenberg

诗词赏析:

《 遣悲怀三首·其二》--- 元稹

昔日戏言身后事,今朝都到眼前来。
衣裳已施行看尽,针线犹存未忍开。
尚想旧情怜婢仆,也曾因梦送钱财。
诚知此恨人人有,贫贱夫妻百事哀。

 (配图与本文无关)  

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

B-spline曲线详解
03-09
给资料为B-spline曲线详细解释.B-spline基本特性, B-spline曲線數學模式,B-spline模型特性。
B样条的实现
09-05
自己写了个B样条的实现,其中一个方法参考了网上的代码,已经在博客里标记出来。新人资源,有错误希望多多指正。
一文白话搞懂【KAN】网络,真有那么神奇?
最新发布
全栈O-Jay的博客
05-22 5418
良心总结,白话搞懂【KAN】网络,神奇但没有那么神奇。
B-Spline样条曲线及其性质
NEO's NOTEBOOK
08-11 1万+
目录B-Spline 学习笔记(MOOC)[1] B样条产生的背景1. Bezier曲线的不足2. 克服不足的方法3. 如何进行分段?[2] B样条的递推定义1. B-Spline与Bezier Curve2. B样条函数3. de Boor-Cox递推公式[3] B样条的定义区间与节点向量1. k阶B样条对应的节点向量数2. B样条函数的定义区间3. B样条曲线完整定义[4] B样条函数的主要性质1. 局部支撑性2. 权性3. 连续性4. 分段参数多项式[4] B样条函数的主要性质1. 局部性2. .
样条函数
MTandHJ的博客
10-06 1万+
数值分析》 David Kincaid, Ward Cheney 著, 王国荣 余耀明 徐兆亮 译. 因为看的论文里用到了样条函数,故查阅了一些资料并整理一下. 定义 样条函数是由一些具有某些连续性条件得子空间上得分段多项式构成. 给定n+1个点t0,t1,…,tnt_0, t_1, \ldots, t_nt0​,t1​,…,tn​并且满足t0<t1<…tn.t_0 < ...
样条曲线、样条函数、python绘画样条曲线
leemboy的博客
11-01 1万+
样条曲线 所谓(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。 定义 样条曲线是经过一系列给定点的光滑曲线。最初,样条曲线都是借助于物理样条得到的,放样员把富有弹性的细木条(或有机玻璃条),用压铁固定在曲线应该通过的给定型值点处,样条做...
样条函数spline function)—— 分段多项式函数(piecewise polynomial function)
热门推荐
07-21 2万+
1. 分段多项式函数 样条函数是某种意义上的分段函数Spline (mathematics) - Wikipedia最简单的样条函数是一种分段多项式函数(piecewise polynomial function),样条函数 S:[a,b]→RS:[a, b]\rightarrow \mathbb R。SS 是在定义域 [a,b][a, b] 上分段定义的,我们将 [a,b][a, b] 划
算法笔记:样条插值
qq_40206371的博客
12-05 2553
假设第一段和第二段函数的三阶导在端点处相等;第n-1段和第n段函数的三阶导在端点处也相等。最后一个分段函数的一阶段和二阶导于第一个分段的一阶导和二阶导相等。这种假设特别适合用在周期函数中,尤其是第一点与最后一点相等时。若想求得这4n个未知系数,需要构建4n个方程。强制第一个与最后一个分段函数的第一个系数为0。假设第1个和最后一个端点的二阶导为0。是已知的n+1个数据点,整个函数有。下面以三次样条插值为例,假设。在每两点间画一条直线。
数据清洗_第一篇 缺失值处理(2)_样条函数 Spline function
Blog of Mary Sun
11-18 1847
目录 1. 样条函数定义 2. 样条曲线简介 3. 样条插值法 4. 三次样条曲线 1. 样条函数定义 样条是一种特殊的函数,由多项式分段定义。在插值问题中,样条插值通常比多项式插值好用。用低阶的样条插值能产生和高阶的多项式插值类似的效果,并且可以避免被称为龙格现象(Runge phenonmenon) 的数值不稳定的出现,并且低阶的样条插值还具有“保凸”的重要性质。 备注:在计算方法中,有利用多项式对某一函数的近似逼近,计算相应的函数值。一般情况下,多项式的次数越多,需要的数据就越多,...
贝塞尔曲线,B-样条,非均匀有理B样条梳理
养生少年小余的奋进之路
07-07 1万+
贝塞尔曲线(Bézier curve) B-样条(B-spline) 非均匀有理B样条(Non-Uniform Ratioinal B-splines)
B SplineB样条曲线)
龙征天的博客
07-11 3623
文章目录说明B样条曲线代码 说明 在阅读此博客前,请访问2018级山东大学计算机学院图形学实验汇总。 原笔记通过latex编写,csdn只支持latex部分功能,所以下面主要是将pdf截屏上传。部分内容参考课本。 B样条曲线 代码 #include <glad/glad.h> #include <GLFW/glfw3.h> #include "shader.h" #include <iostream> #include <cstdio> #include &
B样条插值(B-spline interpolation)
04-12
该文档讲述了B样条插值在图像处理中的应用,内容翔实,可供参考。
B样条曲线及对应基函数的绘制
04-07
B样条曲线及对应基函数的绘制,针对B样条曲线的四种类型给出图形,对应教材《计算机辅助几何与非均匀有理B样条》,主编 施法中
B样条曲线原理及De Boor算法详解
06-27
它提供了一种快速且数值稳定的方法,用于在给定域中的u的B样条曲线上找到一个点。增加内部节点的多重性会减少该节点处非零基函数的数量。事实上,如果这个结的重数是k,那么这个结上最多有p-k+1个非零基函数。因此,...
Nonuniform rational B-spline
12-07
它是一系列非递减的数值,控制了B样条函数的分布和重复。 3. **阶数**:阶数决定了曲线的复杂性和光滑度。较高的阶数会产生更平滑的曲线,但计算成本也会增加。 4. **基函数构造**:NURBS的基函数是通过结合控制...
基于B样条的Level-Set GPU演化算法.pdf
09-25
文章中提到的混合GPU求解器,利用B样条的这些特性,结合中心差分(一种数值微分方法,可以提供较高的精度),在GPU平台上实现了高效并行计算,从而提高演化算法的精度和效率。 GPU(图形处理器)因其并行处理能力,...
B样条程序及拓展
05-31
B样条(B-Spline)是一种在计算机图形学、几何建模和数值分析等领域广泛应用的数学工具。它通过控制点来定义平滑曲线和曲面,允许灵活地调整形状而无需重新计算整个模型。在给定的源码中,实现了B样条曲线和NURBS...
人工智能-机器学习-B样条基组方法在强外场中原子谱计算中的应用.pdf
04-14
在这个研究中,B样条基组(B-Spline basis sets)被用作解决强外场下原子行为的工具,这是数值计算中一种有效的方法。机器学习在此可能被用来优化计算过程,预测复杂系统的谱性质,或者学习并理解外场与原子相互作用...
B样条的产生和定义
高处不胜寒
10-09 8396
B样条 什么是样条样条是通过一组指定点集而生成平滑曲线的柔性带。 什么是B样条B样条就相当于一个函数,这个函数在系数不同时就可以变化成各种曲线的形状。 B样条曲线 BezierBezierBezier曲线的不足 nnn次BezierBezierBezier曲线:n+1n+1n+1个控制点 x(t)=∑i=0nBin(t)bix(t)=\sum_{i=0}^nB_i^n(t)b_ix(t)=∑i=0n​Bin​(t)bi​ 全局性:牵一发而动全身,不利于设计 原因:基函数是全局的 样条曲线
matlab b样条
09-05
B样条(B-spline)是一种常用于曲线和曲面插值的数学方法,也是MATLAB中的一个重要工具。B样条曲线是由一系列控制点和节点向量定义的平滑曲线。在MATLAB中,你可以使用`spmak`函数创建B样条曲线的结构体,然后使用`fnplt`函数绘制曲线。 下面是一个示例代码,演示了如何在MATLAB中创建和绘制B样条曲线: ```matlab % 创建控制点 x = [0 1 2 3 4 5]; y = [0 1 2 1 0 1]; % 创建节点向量 t = [0 0 0 1 2 3 4 4 4]; % 创建B样条曲线的结构体 spl = spmak(t, [x;y]); % 绘制B样条曲线 fnplt(spl); ``` 在这个例子中,我们定义了一个包含6个控制点的B样条曲线。节点向量`t`的长度为9,其中重复的0和4表示了开始和结束的控制点的重复次数。 你可以根据自己的需求修改控制点和节点向量来创建不同形状的B样条曲线。同时,MATLAB还提供了其他函数用于处理B样条曲线,例如`spcol`函数用于计算函数值,`splder`函数用于求取曲线的导数等等。希望这可以帮助到你!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
165
原创
2155
点赞
5388
收藏
1293
粉丝
关注
私信
写文章

热门文章

  • 线性代数 --- 矩阵求逆的4种方法 154031
  • 数值计算 --- 三次样条函数插值(Cubic spline function interpolation) 87520
  • 数字图像处理 --- 图像的傅里叶变换的频谱特征 一(周期性,能量分布,fftshift,交错性) 57500
  • 数字信号处理 --- 周期信号的三角函数表示 一(三角函数的性质和三角波的合成) 37984
  • 数字图像处理 --- 图像的傅里叶变换的频谱特征 三(平移,旋转,相位的重要性) 37384

分类专栏

  • Python 9篇
  • Deep Learning 8篇
  • Linear Algebra 68篇
  • Calculus 7篇
  • Essay 8篇
  • 生活中的数学 1篇
  • Math is fun 9篇
  • Coding 16篇
  • Numerical Methods 2篇
  • Matlab Cleve Moler 4篇
  • Signal And System 6篇
  • Probability theory 1篇
  • Digital Image Processing 9篇
  • Digital Signal Processing 9篇
  • Medical Image processing 10篇

最新评论

  • 数字信号处理 --- 信号的采样和奇妙的混叠(Aliasing) 壹

    松下J27: 就一厨子。。。

  • 数字信号处理 --- 信号的采样和奇妙的混叠(Aliasing) 壹

    卤水拼盘: 博主是天主教徒吧

  • 线性代数 --- 矩阵求逆的4种方法

    松下J27: “你对于硕士、博士的鄙视和傲慢来自哪里。”你评论里的这些东西我的文章哪里有说。。。?

  • 线性代数 --- 矩阵求逆的4种方法

    m0_64055457: 首先,我不知道你的工作是什么需要用手解方程组,希望你的boss给你发一台电脑。其次,你说求逆会影响精度,那我想说的是matlab里的inv函数本身就是数值解法,本质上和LU分解没有任何的区别,你的文章里也没有任何地方体现出了矩阵求逆和LU分解的精度差异。你想要精度的话应该用迭代法,只要方程有解,你想要多高的精度就有多高。最后,对于非数学专业的人来说,我只想知道这个方程的解是什么,用什么解法对于我并不重要(至少对控制专业来说是这样)。我不理解你对于硕士、博士的鄙视和傲慢来自哪里。伴随矩阵法这种时间复杂度都是N!的东西也能往文章里写,在我看来你连最基础的数值分析都没有学明白。无知并不可怕,可怕的是无知而不自知,当然如果你说你的工作和研究里不用matlab或者python,所有的代数运算都是手算的话,那我承认你是对的。

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

    松下J27: 一般情况下,knots的横坐标都是与其相邻的两control point的横坐标的中间值。比如说两个control point的横坐标位置是1,2,那么knot的坐标就是1.5。如果两个control point的横坐标位置是都是1,那么knot的坐标就是1。(年代久远有些不太确定了)

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分之二,数据的预处理)
  • Python --- 如何修改Jupyter Notebook保存文件的路径?
  • 深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)
2024年29篇
2023年17篇
2022年53篇
2021年34篇
2019年3篇
2018年20篇
2016年10篇

目录

目录

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松下J27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源手机p图软件2022年虎宝宝起名宜用字四个意识四个自信两个维护妖狐x仆ss第二季纽约街头教父论中国共产学历史心得体会宝宝起名秦小型酒厂起名起名根据什么比较好本地磁盘湖北省中医院地址2014男篮亚洲杯起名商标企业孩子起名带木字旁的萨达姆家族刘思彤设计工作室怎么减肥最快名字吧起名网免费取名建筑装修装饰工程专业承包企业资质等级标准开快餐起名字大全百度起名打分姓黄的起名梓起什么名字好1月4日起名笔画数怎么算网红自拍馆起名姓氏翁的男孩子起什么名幸福终点站下载保健产品开店起名起名字测试打分不要钱淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化