B-spline Basis Functions B样条基函数(转)

2023-10-19 20:10

本文主要是介绍B-spline Basis Functions B样条基函数(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.cnblogs.com/icmzn/p/5100761.html

基函数

这里讨论B-spline Basis Functions

设U 是m + 1个非递减数的集合,u0 <= u2 <= u3 <= ... <= um。ui称为节点(knots), 集合U 称为节点向量(knot vector), 半开区间[ui, ui+1) 是第i个节点区间(knot span)。注意某些ui可能相等,某些节点区间会不存在。如果一个节点 ui 出现 k 次 (即,ui = ui+1 = ... = ui+k-1), 其中 k > 1, ui 是一个重复度(multiplicity)为k 的多重节点,写为 ui(k)。 否则,如果ui只出现一次,它是一个简单节点。如果节点等间距(即, ui+1 - ui 是一个常数,对 0 <= i <= m - 1),节点向量或节点序列称为均匀的;否则它是非均匀的。

为了定义B-样条基函数,我们还需要一个参数,基函数的次数(degree)p,第i个p次B-样条基函数,写为Ni,p(u),递归定义如下:

11173460-68269e312a08009c.jpg
bs-basis[1].jpg

上述公式通常称为Cox-de Boor递归公式。 这个定义看起来很复杂;但是不难理解。如果次数(degree)为零(即, p = 0),这些基函数都是阶梯函数,这也是第一个表达式所表明的。即,如果u是在第i个节点区间[ui, ui+1)上基函数Ni,0(u)是1。 例如,如果我们有四个节点u0 = 0, u1 = 1, u2 = 2和 u3 = 3, 节点区间 0, 1 和2是[0,1), [1,2), [2,3),0次基函数是N0,0(u) = 1 在 [0,1) ,在其它区间是0;N1,0(u) = 1 在 [1,2)上,在其它区间是0;N2,0(u) = 1在[2,3)上,其它区间是0。如下图所示:
11173460-70f2a493478356eb.jpg
bs-basis-0[1].jpg

为了理解p大于0时计算Ni,p(u)的方法,我们使用三角计算格式。所有节点区间列在左边(第一)列,所有零次基函数在第二列。见下图。
11173460-006569177cbce456.jpg
bs-scheme[1].jpg

两个重要的观察

因为 Ni,1(u) 是从 Ni,0(u) 和 Ni+1,0(u)计算的而 因为Ni,0(u)和Ni+1,0(u) 在区间[ui, ui+1)和[ui+1, ui+2)分别是非零的,Ni,1(u) 在这两个区间都是非零的。换句话说,Ni,1(u)在[ui, ui+2)上是非零的。相似地,因为 Ni,2(u) 依赖于Ni,1(u) 和Ni+1,1(u)且因为这两个基函数在[ui, ui+2)和[ui+1, ui+3)分别是非零的,Ni,2(u)在[ui, ui+3)上非零。总之,为确定基函数Ni,p(u), 的非零定义域,可以追溯到三角计算格式直到回到第一列。例如,假设我们想找到 N1,3(u)的非零定义域。基于上述讨论,我们可从西北和西南方向追溯直到第一列为止,如下图中蓝色虚线所示。因此 N1,3(u)在 [u1, u2), [u2, u3), [u3, u4) 和[u4, u5)上是非零的。或,相等地,它在[u1, u5)上非零。

11173460-b1cfe54e7628e7a4.jpg
bs-back[1].jpg

总之,我们有下列观察:

基函数 Ni,p(u)** 在[ui, ui+p+1)****上非零。或,相等地,Ni,p(u)** p+1****个节点区间[ui, ui+1), [ui+1, ui+2), ..., [ui+p, ui+p+1)****上非零。**
   接着,我们看相反的方向。给定一个节点区间[ui, ui+1),我们想知道哪个基函数会在计算中使用这个区间。我们可以以这个节点区间开始并画一个西北界限箭头和一个西南界限的箭头。所有封闭在楔形里的基函数使用 Ni,0(u)(为什么?)因此在该区间是非零的。因此,所有在[ui, ui+1)上非零的p 次基函数是这个楔形和包含所有Ni,p(u) 的列的交集。实际上,这一列和两个箭头形成一个等边三角形,而这一列是垂直边。 从 Ni,0(u) 数到 Ni,p(u) 有p+1列。因此,等边三角形的垂直边至多有p+1 项,即 Ni,p(u), Ni-1,p(u), Ni-2,p(u), ..., Ni-p+2,p(u), Ni-p+1,p(u) 和Ni-p,p(u)。

11173460-f418d6b862c865ed.jpg
bs-non-0[1].jpg

让我们看上图。为了找到所有3次在 [u4, u5) 上非零的基函数,画出两个箭头和所有在垂直边的函数是我们想要的。这个例子,是N1,3(u), N2,3(u), N3,3(u), 和N4,3(u).用黄色三角表示。蓝色 (resp., 红色) 三角显示的是在[u3, u4) (resp., [u2, u3) )上非零的3次基函数。注意在[u2, u3)上只有3个3次基多项式。.
总之,我们观察到下列特性:
  在任何一个节点区间 [ui, ui+1), 最多有 p+1个p 次基函数非零,即:Ni-p,p(u), Ni-p+1,p(u), Ni-p+2,p(u), ..., Ni-1,p(u) 和 Ni,p(u)。

系数的意义是什么?

最后,让我们研究下Ni,p(u)定义中系数的意义。当计算 Ni,p(u) 时,它使用Ni,p-1(u)和Ni+1,p-1(u)。前者在 [ui, ui+p)上非零。如果u 是在这个半开区间,那么u - ui 是u 和这个区间左端之间的距离,区间长度是ui+p - ui, ,而(u - ui) / (ui+p - ui) 是上述距离的比且在0和1之间。见下图。第二项,Ni,p-1(u),在[ui+1, ui+p+1)上非零。如果u 在该区间,那么ui+p+1 - u 是 u 到该区间右端的距离,ui+p+1 - ui+1 是区间长度,而(ui+p+1 - u) / (ui+p+1 - ui+1) 是这两个距离的比且值在0和1之间。因此, Ni,p(u) 是Ni,p-1(u) 和Ni+1,p-1(u)的线性组合,有两个系数,都在 u上是线性的,在0和1之间。

11173460-41d119ac42270413.jpg
division-of-u[1].jpg

这篇关于B-spline Basis Functions B样条基函数(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242091

相关文章

UnityException: Gizmo drawing functions can only be used in OnDrawGizmos and OnDrawGizmosSelected.

You don't have to call OnDrawGizmos() From anywhere, it is a editor function to display gizmos in the scene-view and is called automatically called!! 不能在任何地方调用 OnDrawGizmos(),这个函数是自动调用的。这个函数是编辑器函数,用来

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

神经网络第三篇:输出层及softmax函数

在上一篇专题中,我们以三层神经网络的实现为例,介绍了如何利用Python和Numpy编程实现神经网络的计算。其中,中间(隐藏)层和输出层的激活函数分别选择了 sigmoid函数和恒等函数。此刻,我们心中不难发问:为什么要花一个专题来介绍输出层及其激活函数?它和中间层又有什么区别?softmax函数何来何去?下面我们带着这些疑问进入本专题的知识点: 1 输出层概述 2 回归问题及恒等函数 3

神经网络第一篇:激活函数是连接感知机和神经网络的桥梁

前面发布的文章介绍了感知机,了解了感知机可以通过叠加层表示复杂的函数。遗憾的是,设定合适的、能符合预期的输入与输出的权重,是由人工进行的。从本章开始,将进入神经网络的学习,首先介绍激活函数,因为它是连接感知机和神经网络的桥梁。如果读者认知阅读了本专题知识,相信你必有收获。 感知机数学表达式的简化 前面我们介绍了用感知机接收两个输入信号的数学表示如下:

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

C语言入门系列:初识函数

文章目录 一,C语言函数与数学函数的区别1,回忆杀-初中数学2,C语言中的函数 二, 函数的声明1,函数头1.1,函数名称1.2,返回值类型1.3,参数列表 2,函数体2.1,函数体2.2,return语句 三,main函数四,函数的参数与传递方式1,实参和形参1.1,函数定义(含形参)1.2,函数调用(使用实参) 2,参数传递方式2.1,值传递2.2,引用传递 五,函数原型与预声明1,

Linux C/C++ socket函数

目录 socket函数 函数原型 头文件 功能 返回值 参数 错误码 socket函数 函数原型 int socket(int domain, int type, int protocol); 头文件                 #include <sys/types.h>                 #include <sys/socket.h>