要通过最小二乘法将一系列数据点拟合成一条 B样条曲线,其核心思想是:在给定一组控制点数量和节点向量的情况下,寻找一组最优的控制点,使得生成的B样条曲线在最小二乘意义下最好地逼近原始数据点。
最小二乘 B样条 曲线拟合方法
1. 数据点
给定一组数据点: P₀, P₁, ..., Pₙ
其中每个点为坐标对:
Pᵢ = (xᵢ, yᵢ),i = 0, 1, …, n
2. B样条曲线表达式
构造一条 k 次B样条曲线:
C(u) = Σ (j=0 到 m) Nⱼ,ₖ(u) · Qⱼ
其中:
- Qⱼ 是待求的控制点(j = 0, 1, …, m),共 m+1 个;
- Nⱼ,ₖ(u) 是第 j 个 k 次B样条基函数;
- u 是参数变量;
- 要求 m ≤ n,通常取 m < n。
3. 参数化
为每个数据点 Pᵢ 分配参数值 uᵢ,常用方法为弦长参数化:
u₀ = 0
uᵢ = uᵢ₋₁ + ||Pᵢ − Pᵢ₋₁||,i = 1, 2, …, n
uₙ
归一化:uᵢ ← uᵢ / uₙ,使 uᵢ ∈ [0, 1]
4. 节点向量生成
构造节点向量 U = {t₀, t₁, ..., tₘ₊ₖ₊₁},常用平均分布+重复端点:
t₀ = t₁ = … = tₖ = 0
tⱼ = (j−k)/(m−k+1),j = k+1, ..., m
tₘ₊₁ = … = tₘ₊ₖ₊₁ = 1
或使用数据参数 {uᵢ} 构造节点向量(如使用 Schoenberg-Whitney 方法)。
5. 建立法方程
令每个数据点满足:
C(uᵢ) ≈ Pᵢ
代入曲线表达式:
Σ (j=0 到 m) Nⱼ,ₖ(uᵢ) · Qⱼ ≈ Pᵢ
写成矩阵形式:
N · Q = P
其中:
- N 是 (n+1) × (m+1) 阶矩阵,元素为:
Nᵢⱼ = Nⱼ,ₖ(uᵢ) - Q 是 (m+1) × d 阶控制点矩阵(d=2 或 3):
Q = [Q₀, Q₁, ..., Qₘ]ᵀ - P 是 (n+1) × d 阶数据点矩阵:
P = [P₀, P₁, ..., Pₙ]ᵀ
6. 最小二乘解
由于方程数多于未知数,采用最小二乘法求解:
Q = (NᵀN)⁻¹NᵀP
此即控制点的最优解。
7. 输出结果
得到控制点 Q₀, Q₁, ..., Qₘ 后,B样条曲线定义为:
C(u) = Σ (j=0 到 m) Nⱼ,ₖ(u) · Qⱼ,u ∈ [0,1]
8.说明
- 基函数 Nⱼ,ₖ(u) 可通过 De Boor-Cox 算法递归计算;
- 实际编程中可使用 SciPy、MATLAB 或 OpenCASCADE 等库实现;
- 曲线光滑性由次数 k 和控制点数量 m 控制。
2417

被折叠的 条评论
为什么被折叠?



