有两种方法可以画平滑曲线,第一罩备种是拟合的方法,第二种是用spcrv。
其实原理应该都一样就是插值。下面是源程序,大家可以根据需要自行选择,更改拟合的参数。
clc,clear
a = 1:1:6 %横坐标
b = [8.0 9.0 10.0 15.0 35.0 40.0]%纵坐标
plot(a, b, 'b') %自然状态的画图效果
hold on
%第一种,画平滑曲线的方法
c = polyfit(a, b, 2) %进行拟合,c为2次拟物前毁合后的系数
d = polyval(c, a, 1) %拟合后,每一个横坐悔颂标对应的值即为d
plot(a, d, 'r') %拟合后的曲线
plot(a, b, '*') %将每个点 用*画出来
hold on
%第二种,画平滑曲线的方法
values = spcrv([[a(1) a a(end)][b(1) b b(end)]],3)
plot(values(1,:),values(2,:), 'g')
线平顷模腔滑的算法实现都有二次指数平滑法求预测值,最小二乘法曲线拟合,5点3次平滑曲线,线平滑的算法属于数字几何处理领域的问题雀衫,计算机图形学和计算机辅助设计中,用多边形网格可以表示复杂的三维实体。
线平滑的算法中为了方便于在O(1)的时间内获取点P的相邻点与相邻面,故需要提供辅助结构来存储这些邻接点面的信息。故用上面那个简单的Mesh定义就不行了,应该将Mesh数据结构按如下方式定义,增加点邻接信息的存储,为实现这些,定义了PointAttachmentInfo结构和新的Mesh类。
还有一种实现的是拉普拉斯平滑,在前面的博客中,介绍了最为基础的拉普拉斯平滑算法的实现,简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置,即采用所谓伞状算子。
其具体的实现逻辑表述如下:初始化Mesh的邻接点结构集,新建临时点集,码握用来存储点平滑后的位置,对所有Mesh中的顶点P,初始化临时向量为零向量。
获取P的邻域点集Adj(P),对所有领域点T,将其位置加到临时向量里,临时向量/=领域点集数,将临时向量的位置存入临时点集,对所有Mesh中的顶点P,将P的位置修改为临时点集中对应点的位置。
1、首先准备两列数据,作为xy坐标值,使用plot命令作图如下。
2、然后进行数据拟合,这里使用matlab的polyfit命令。如果数据的规律性很差手姿的话,polyfit后面设哗手置的参数要足够大才能保证拟合精度,在这个数据中选择15。
3、拟合后与原来数据对比后的std约为0.1287.y的平均值为113.精度值根据不同的需要设计不同的拟合值。
4、matlab下的命令为polyder。求导后得到毕芦绝的数据作图如下。可以看到在比区间上,导数有两处为0,这与原来曲线相符。
5、最后就完成了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)