1. B样条基函数递推公式
根据Cox–de Boor递推公式,B样条基函数定义如下.
当基函数的次数k为零时(k=0):
当基函数的次数k不为零时:
其中u为参数,i为节点序号,k为次数,节点向量,n为基函数个数。
2. Matlab计算B样条基函数代码
clear,clc,close all;
set(0,'defaultfigurecolor','w')
% 计算节点区间内非零基函数的值
k = 2; %k次多项式,根据需求改变
U = [0 0 0 1 2 3 4 4 5 5 5]; %节点向量
n = length(U) - k -1;
i = 1; %Ni,k,根据需求改变
B = [];
for j = 0:0.001:5
Bj = getBaseFun(i,k,j,U);
B = [B;Bj];
end
plot(0:0.001:5,B,'linewidth',3);
% text(1,0.5,'N1,1');
xticks(0:1:5);yticks(0:1);
hold on
function Nik_u = getBaseFun(i,k,u,U)
% 计算基函数Ni_k(u),
%u参数,i节点序号,k基函数次数,U节点矢量
if (k == 0) %0次B样条
if u>=U(i) && u<U(i+1)
Nik_u = 1;
else
Nik_u = 0;
end
else
L1 = U(i+k)-U(i);%支撑区间的长度
L2 = U(i+k+1)-U(i+1);
if L1 == 0.0 %规定0/0=0
alpha = 0;
else
alpha = (u-U(i))/L1;
end
if L2 == 0.0
beta = 0;
else
beta = (U(i+k+1)-u)/L2;
end
Nik_u = alpha*getBaseFun(i,k-1,u,U)+beta*getBaseFun(i+1,k-1,u,U);
end
end
3.计算结果举例