gxqcn 发表于 2011-11-16 15:13:49

由于单位间隔时间内的脉冲值存在圆整误差,
导致之后计算的速度、加速度、加加速度误差逐级被放大(甚至超过一个数量级),
现在的处理方法结果似乎仍不理想,不知谁有类似处理经验,请赐教。。。

wayne 发表于 2011-11-17 09:46:53

21# gxqcn
先将离散数据连续化,如拟合,插值。

mathe 发表于 2011-11-17 12:54:08

我也感觉用拟合比较好。

mathe 发表于 2011-11-17 13:08:46

由于每个点数据需要计算1阶,2阶,3阶导数,所以至少要求结果的3阶导数是连续的,为此,可以使用分段四次曲线来拟合。
为此,开始可以一次性读取k个数据(k>=5),利用最小二乘法对这k个数据拟合出一条最佳的四次曲线。
比如开始k个数据为
x1,y1
x2,y2
...
xk,yk
设多项式为$y=a_0+a_1x+a_2x^2+a_3x^3+a_4x^4$
将各个数据$x_i,y_i$代入,得到矩阵
$Xa=y$
求解5*5方程组$X'Xa=X'y$就可以得出系数$a_0,a_1,a_2,a_3,a_4$的比较好的逼近值了。
此后每次,假设已经得到过前面比较好的拟合$f_h(x)$
由此我们可以计算出最后一个点$x_h$的拟合取值以及一阶,二阶,三阶导数的取值。
由于我们需要添加新点后后面部分拟合的曲线至少保持三阶导数的连续性,为此可以假设后面一段曲线在这个点的取值和前三阶导数都已经给定,由此可以得出这个点在$x_h$处展开式为
$y=b_0+b_1(x-x_h)+b_2(x-x_h)^2+b_3(x-x_h)^3+b_4(x-x_h)^4$
其中,$b_0,b_1,b_2,b_3$已知,$b_4$待定,由此我们只需要根据下一个点$x_{h+1}$出的取值就可以确定区间$(x_h,x_{h+1})$之间应该选择什么函数。或者,我们可以同时根据$x_{h+1},x_{h+2}$出的取值,给出$b_4$的一个拟合,这样可以得到更加好的结果。

同样,如果为了让结果中三阶导数函数看起来不仅仅连续,还要光滑,我们还可以使用分段5次函数拟合

gxqcn 发表于 2011-11-17 14:32:26

这个问题是为了检验CNC的S形速度规划曲线的,它是一个分段函数。
由于问题根源出在圆整上,为了降低其误差影响,我将它放大1024倍后再取整,
得到的曲线就没有那么多跳动的毛刺了。

mathematica 发表于 2012-2-14 18:15:44

从本贴可以看出郭对matlab应用的并不多,当然还有一点泄露机密的嫌疑

mathematica 发表于 2012-2-14 18:16:28

我觉得样条插值就很好!spline
matlab有一个样条插值工具箱!

szy85 发表于 2012-4-15 14:19:31

学习了!!!

mathematica 发表于 2017-5-16 18:46:47

真没想到你MATLAB的水平这么不高
页: 1 2 [3]
查看完整版本: 如何删除MatLab矩阵中偶数行数据?