ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

matalb实现计算节点区间内所有不为零的B样条基函数

2021-06-15 17:03:47  阅读:190  来源: 互联网

标签:end 函数 样条 mid high 区间 matalb 节点


B样条基函数的递推定义:
在这里插入图片描述
根据B样条的递推定义有,在任意给定的节点区间内[ui,ui+1)内,最多由p+1个基函数不为零,它们分别为Ni-p,p …Ni,p

计算节点区间内所有不为零的基函数分为两步:
1、计算节点区间下标
2、计算不为零基函数

%% 计算节点区间下标
function index=FindSpan(n,p,u,U)
%n 为节点区间i的最大值,n=基函数个数=控制点个数
%p 为曲线的次数
%U 为节点矢量
if u==U(n+1)
index=n;
return;
end
low=p;
high=n+1;
mid=fix((low+high)/2);
while u<U(mid)||u>=U(mid+1)
if u<U(mid)
high=mid;
else
low=mid;
end
mid=fix((low+high)/2);
end
index=mid;
end
%% 计算节点区间内所有不为零的基函数
function N=BasisFuns(i,u,p,U)
%i为节点区间下标,u为节点值,p为曲线次数,U为节点向量
N=zeros(1,p+1);
N(1,1)=1;
for j=1:p
save=0.0;
r=0;
t=0;
while r<j
r=r+1;
temp=N(1,r)/(R(i,t+1,u,U)+L(i,j-t,u,U));
N®=save+R(i,t+1,u,U)*temp;
save=L(i,j-t,u,U)*temp;
t=t+1;
end
N(:,j+1)=save;
end
end
% 定义嵌套函数L R
function Li=L(i,l,u,U)
Li=u-U(i-l+1);
end
function Ri=R(i,l,u,U)
Ri=U(i+l)-u;
end

验证代码:
%计算节点区间
clear;
U=[0 0 0 1 2 3 4 4 5 5 5];
p=2;
n=length(U)-p-1;
u=3.5;
x=FindSpan(n,p,u,U);
disp(BasisFuns(x,u,p,U));

结果:0.1250 0.6250 0.2500

标签:end,函数,样条,mid,high,区间,matalb,节点
来源: https://blog.csdn.net/weixin_45445751/article/details/117928038

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有