多元Bspline拟合-基础版本
目录
Bspline拟合能借助局部函数实现复杂曲线、曲面等的拟合;对于复杂曲线、曲面,其拟合能力比我们常用的多项式拟合要强大一些。有关 Bspline 拟合的基本原理讲的比较多,其中一个版本觉得讲的比较详细。见以下地址,有兴趣的可以看看其原理。
https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/INT-APP/CURVE-APP-global.html
我们主要介绍一下在选定knots 的情况下进行曲线、曲面的拟合,当然也可以根据需求扩展到更高维度数据的拟合。Bspline拟合的knots选择很关键,也是许多研究重点讨论的问题,目前代码给出了一种基本选择方案,这块儿感兴趣的可以专门去调研一下,目前这方面的内容不在本篇基础内容中涉及。
测试中所需的2D,3D代码可在https://download.csdn.net/download/u200812705/17895615处下载。
一、曲线拟合
首先看看曲线的拟合:
数据点为
x = [0.846, 0.898, 0.969, 1.037, 1.1 , 1.182, 1.239, 1.318, 1.393,1.469, 1.562, 1.642, 1.727, 1.796, 1.854, 1.91 , 1.961, 2.021,
2.081, 2.157, 2.222, 2.287, 2.33 , 2.391, 2.462, 2.521, 2.579, 2.65 , 2.711, 2.77 , 2.82 , 2.888, 2.945, 2.999]
y = [-51.09557 , -58.15738 , -65.93887 , -67.29464 , -62.62422 , -55.87594 , -54.66174 , -60.42928 , -66.60885 , -65.48577333, -50.29976 , -34.23951 , -30.02204 , -35.13728 , -42.55164 , -46.37235 , -46.12104 , -40.8838 , -33.66896 , -29.73514 , -33.56055 , -40.1181 , -45.05103 , -44.581 , -40.32874 , -32.61178 , -28.15353 , -23.87415 , -31.50011 , -39.45675 , -44.58404 , -50.27785 , -47.55008 , -42.74608 ]
这里对比了Bspline拟合和多项式拟合的结果。其中Bspline拟合的参数为 knots数量为16,degree = 3; 多项式拟合参数为degree = 7。
曲线拟合结果
二、曲面拟合
进行了2组数据的拟合,2组数据均为高斯函数的组合,数据构造如下:
数据1
x1 = (np.random.rand(1000)-0.5)*4
x2 = (np.random.rand(1000)-0.5)*4
y = 2.0*np.exp(-(x1**2+x2**2))+np.random.rand(1000)*0.3
拟合中knots数量为(5,5),degree =3, 选用更多的节点数量可能会使的spline矩阵为奇异矩阵导致报错,这点需要注意以下。
数据1拟合结果
数据2
x1 = (np.random.rand(1000)-0.3)*5
x2 = (np.random.rand(1000)-0.3)*5
y = 2.0*np.exp(-(x1**2+x2**2))-3.0*np.exp(-( (x1-2)**2+(x2-2)**2))+np.random.rand(1000)*0.3
拟合中knots数量为(6,6),degree =3, 选用更多的节点数量可能会使的spline矩阵为奇异矩阵导致报错,这点需要注意以下。
数据2拟合结果