[Matlab科学计算] 绘制B样条基函数

本文介绍了B样条基函数的递推公式及其在Matlab中的实现方法,并通过实例展示了如何计算特定条件下的B样条基函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. B样条基函数递推公式

根据Cox–de Boor递推公式,B样条基函数定义如下.

当基函数的次数k为零时(k=0):

                                                \large N_{i,k}(u)=\left\{\begin{matrix} 1 ,if u_{i}\leq u< u_{i+1}\\ 0, otherwise \end{matrix}\right.

当基函数的次数k不为零时:

                                     \large N_{i,k}=\frac{u-u_{i}}{u_{i+k}-u_{i}}N_{i,k-1}(u)+\frac{u_{i+k+1}-u}{u_{i+k+1}-u_{i+1}}N_{i+1,k-1}(u)

其中u为参数,i为节点序号,k为次数,节点向量U=\left \{ u_{1},u_{2},...,u_{n+k+1} \right \},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.计算结果举例

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值