3. 数学基础(二):B样条与NURBS曲面、径向基函数(RBF)、离散点云拟合与插值

好,咱们接着聊数学。上一章我们把自由曲面的参数化基础过了一遍,这一章要动真格的了。

说实话,我刚入行那会儿,觉得搞光学设计嘛,会Zemax、Code V就行了,数学差不多就得了。结果第一次做自由曲面照明系统,被那个曲面形状折腾得够呛——用多项式硬拟合,边缘翘得跟飞碟似的。后来才明白,选对数学工具,比闷头调参数重要一百倍

这一章,我带你吃透三个核心工具:B样条与NURBS径向基函数(RBF)、以及离散点云拟合与插值。它们就像你工具箱里的三把不同型号的扳手,各有各的脾气。

3.1 B样条与NURBS曲面:工业界的“标准语言”

先说说B样条。你想想看,为什么不用简单的多项式?因为多项式是全局的——你改一个点,整个曲面都跟着抖。这在光学设计里是灾难。你只想微调局部面形来消除像差,结果整个系统像被踹了一脚。

B样条就不一样。它把曲面分成一小段一小段,每段由几个控制点决定。你动一个控制点,影响的只是它附近那一小块区域。这就是局部支撑性,太实用了。

我个人的习惯是,在做自由曲面初始设计时,先用低阶B样条(3阶或4阶)。为什么?因为控制点少,优化速度快,能快速找到大致的形状。等结构定型了,再升级到高阶或者NURBS去精修细节。

3.1.1 B样条的核心公式

别怕公式,咱们挑重点说。B样条曲面可以写成:

S(u, v) = Σᵢ Σⱼ Nᵢₚ(u) Nⱼ_q(v) Pᵢⱼ

这里Nᵢₚ(u)是B样条基函数,Pᵢⱼ是控制点网格。关键就在这个基函数上——它是通过递推定义的,也就是著名的Cox-de Boor公式。

嗯,这里要注意:阶数p越高,曲面越光滑,但计算量也越大。我在项目中遇到过,用5阶B样条拟合一个复杂面形,结果优化一次要等半小时。后来降到3阶,速度提了5倍,精度也够用。

3.1.2 NURBS:带权重的B样条

NURBS全称是非均匀有理B样条。说白了,就是在B样条的基础上给每个控制点加了一个权重。这个权重有什么用?它可以让你精确表示圆锥曲面(球面、抛物面等)。

举个例子。你设计一个自由曲面透镜,中间部分接近球面,边缘需要自由扭曲。用NURBS,你可以把中间控制点的权重设高,让它更“粘”在球面上;边缘权重设低,让设计师自由发挥。

核心区别:
  • B样条:控制点权重相同,适合自由形态设计
  • NURBS:控制点有权重,可以精确表示二次曲面
我的小技巧: 在光学设计软件里,如果遇到“曲面在边缘处震荡”的问题,试试把边缘控制点的权重调低0.1~0.2。很多时候能立竿见影。

3.2 径向基函数(RBF):散点数据的“柔性插值器”

B样条和NURBS有个共同点:它们都需要一个规整的控制点网格。但现实世界的数据往往是散乱的——比如你从干涉仪测出来的面形数据,就是一堆乱七八糟的坐标点。

这时候,RBF就派上用场了。

RBF的思路很巧妙:在每个数据点位置放一个“基函数”,然后把这些基函数叠加起来,拟合出整个曲面。常用的基函数有:

  • 高斯函数:φ(r) = exp(-ε²r²),适合平滑数据
  • 多二次函数:φ(r) = √(r² + c²),适合有尖峰的数据
  • 薄板样条:φ(r) = r² log(r),适合自然弯曲的曲面

我记得有一次做车载镜头设计,镜片面形测量数据有5000多个点,用多项式拟合怎么都过拟合。后来换成RBF,选了多二次基函数,形状参数c调了三次就搞定了。拟合残差从λ/4降到了λ/20。

3.2.1 RBF拟合的数学形式

f(x) = Σᵢ wᵢ φ(||x - xᵢ||) + p(x)

其中wᵢ是权重系数,φ是基函数,p(x)是一个低阶多项式(通常线性或常数),用来保证远距离处的行为合理。

避坑指南: 我曾经吃过一次亏——RBF的形状参数ε(或c)选得太大,结果曲面在数据点之间出现了剧烈的“鼓包”。后来我总结了一个经验:ε ≈ 1.5 / d_avg,其中d_avg是数据点之间的平均距离。这个经验公式在大多数情况下都管用。

3.3 离散点云拟合与插值:从测量到模型

好,现在你手里有一堆测量数据点,可能是干涉仪测的,也可能是光线追迹算出来的。怎么把它变成一个光滑的、可用的曲面?

这里有两个方向:插值拟合

  • 插值:曲面必须精确通过每一个数据点。适合测量精度极高、噪声很小的情况。
  • 拟合:曲面在数据点附近通过,不要求精确穿过。适合有测量噪声的情况。

我个人更推荐拟合。为什么?因为测量数据总有噪声。你强行插值,等于把噪声也“学”进去了。拟合相当于加了一个平滑滤波器,得到的曲面更干净。

3.3.1 最小二乘拟合的实战流程

假设你有N个数据点(xᵢ, yᵢ, zᵢ),想用B样条曲面拟合。步骤是这样的:

  1. 确定节点向量:根据数据点的分布,均匀或非均匀地设置节点
  2. 构建基函数矩阵:每个数据点对应一组基函数值
  3. 求解线性方程组:用最小二乘法解出控制点坐标
  4. 检查残差:看拟合误差是否在允许范围内
# 伪代码示例
A = build_basis_matrix(data_points, knots, order)
b = data_points.z
control_points = (A^T * A)^{-1} * A^T * b
residual = norm(A * control_points - b)
关键参数:
参数作用典型值
B样条阶数控制曲面光滑度3~5
节点数量控制局部自由度数据点数的1/10~1/5
正则化系数抑制过拟合0.001~0.1

3.4 知识体系总览

说了这么多,咱们用一张图把这一章的核心逻辑串起来。你一看就明白了:

自由曲面数学基础(二):知识体系 B样条与NURBS 径向基函数(RBF) 离散点云拟合与插值 局部支撑 · 控制点网格 NURBS:带权重的B样条 散点数据 · 基函数叠加 高斯 · 多二次 · 薄板样条 插值 vs 拟合 最小二乘 · 正则化 应用场景:自由曲面透镜设计 · 照明系统 · 成像系统 核心原则 规整网格 → B样条/NURBS | 散乱数据 → RBF | 有噪声 → 拟合而非插值

3.5 实战中的选择策略

最后,我跟你分享一个实战中的选择策略。你拿到一个自由曲面设计任务,第一步不是写代码,而是问自己三个问题:

  1. 数据是规整网格还是散点? 网格用B样条,散点用RBF。
  2. 需要精确通过数据点吗? 需要就插值,不需要就拟合。
  3. 曲面包含圆锥曲面吗? 包含就用NURBS,纯自由形态用B样条。

这三个问题问完,工具基本就定了。剩下的就是调参数——节点向量怎么设、形状参数怎么选、正则化系数取多少。这些经验,咱们在后面的章节里慢慢聊。

一句话总结: B样条是“规整网格的雕刻刀”,RBF是“散点数据的橡皮泥”,拟合是“去噪声的过滤器”。三样都备齐了,自由曲面设计才算真正入门。

专注资料整理