假设我们在平面上给出了一些点的坐标,比如20个点,坐标为:
X = [0.0809627469389454;
0.0812319917473947;
0.0814760690888197;
0.0816493550701358;
0.0817167028412858;
0.0816873091729635;
0.0813456103002472;
0.0805960479373602;
0.0793506286325874;
0.0768532682616457;
0.0730568739618012;
0.0688299169022524;
0.0629775052745549;
0.0555093488004414;
0.0469410412695979;
0.0385912069617207;
0.0296789727506768;
0.0200899022102430;
0.00973217977333483;
-0.00138286576734164]
和
Y=[-0.737109973623757;
-0.737164532535452;
-0.737292603740519;
-0.737517126138711;
-0.737930464518794;
-0.738537206858314;
-0.740008741381755;
-0.742712757707760;
-0.745966011330839;
-0.751634798125669;
-0.759200611372096;
-0.767277401090950;
-0.777095158716249;
-0.787200839430418;
-0.797371590291212;
-0.806336086919729;
-0.816124045611269;
-0.825660302601719;
-0.835939409428708;
-0.846471284598907]
这些点是一个运动坐标,它位于一条曲线上,该曲线未知。 如何使用给定的坐标/数据找到运动的公式?我需要它的公式来计算它的速度和加速度,它们分别是运动的一阶和二阶导数。 在此先感谢!!
答案 0 :(得分:1)
通过绘制数据,这看起来是多项式的。因此,我建议您使用polyfit
函数。这样做的是一组坐标x
和y
,你指定你认为数据最匹配的多项式的阶数,并找到最适合这个数据的多项式方程的系数。这是通过最小二乘误差最小化来执行的,但我会留给您阅读它。数学实际上非常优雅。
根据您的数据,由于x = 0.04
附近的拐点,我将猜测三阶多项式。因此,您所要做的就是:
coeff = polyfit(X, Y, 3); %// Specify third order polynomial
我们获得的输出是:
coeff =
174.5793 -13.4016 1.2463 -0.8457
方程的系数按降序构成,从第三个幂开始,一直到截距值。因此,这个等式实际上是:
Y = 174.5793*X^3 - 13.4016*X^2 + 1.2463*X - 0.8457
为了检查这个等式是否正确,我们可以进行目视检查。我们在最小和最大X
值之间指定一堆点,然后使用这些点来评估上述函数,并查看它在我们的图表上的位置。因此,我们可以这样做:
xPoints = linspace(min(X), max(X)); %// Specify 100 points between the min and max
yPredict = polyval(coeff, xPoints); %// Find the corresponding y-values
plot(X,Y,'b.',xPoints,yPredict,'r'); %// Plot the original points with the predicted
grid; %// curve in red.
让我们慢慢浏览上面的代码。 linspace
在两点之间创建向量的线性间距。默认的积分数为100,但您可以将其更改为您想要的任何值。因此,第一行将在X
中的最小点和最大点之间生成100个点。之后,polyval
获取您从polyfit
创建的多项式方程的系数,以及一组X
个点,根据预测的方程生成一组Y
个点我们找到。一旦我这样做,我们就会生成一个图表,显示原始数据点和预测曲线的样子。我也投入了一个很好的网格。
这是我得到的情节:
显然,您需要根据数据调整多项式的阶数。请记住,这次我们很幸运。实际上,数据并不像这样自然流动。因此,您需要首先检查数据并找出数据适合的曲线类型。一旦确定了这一点,就可以继续进行曲线拟合,因为每类曲线都遵循不同的策略来找到最佳的参数估计值。
答案 1 :(得分:1)
我猜你对速度和加速度值更感兴趣而不是原始数据的曲线拟合,但你认为通过区分数学函数而不是使用真实世界更容易估计速度和加速度数据?
如果我的猜测是正确的,请告诉您,有一种比粗略估计测量数据更好的方法,因为您在估算开始时丢掉了太多有价值的信息。结果将是最终速度和加速度值的强烈偏差。
只需简单估算测量的X和Y位移的离散导数,最后尝试平滑以减少样本误差。我假设X / Y对以恒定的时间间隔进行采样,因此我将此间隔用作以下六个图中的新X.您应该用实时值(例如毫秒)替换它。您可以将其用作自己分析的骨架:
subplot(4,1,1)
plot(X,Y,'.-')
xlabel('Measured displacement data of the hand movement')
speedX = diff(X)
speedY = diff(Y)
speed = sqrt( speedX.^2 + speedY.^2 );
subplot(4,2,3)
plot(speedX)
ylabel('X')
subplot(4,2,5)
plot(speedY)
ylabel('Y')
subplot(4,2,7)
plot(speed)
ylabel('Combined X and Y')
xlabel('Speed')
accelerationX = diff(speedX)
accelerationY = diff(speedY)
acceleration = sqrt( accelerationX.^2 + accelerationY.^2 );
subplot(4,2,4)
plot(accelerationX)
subplot(4,2,6)
plot(accelerationY)
subplot(4,2,8)
plot(acceleration)
xlabel('Acceleration')
% Simple solution to remove the outliers
x1 = 1:length(speed);
p1=polyfit(x1',speed,5)
estSpeed=polyval(p1,x1)
subplot(4,2,7)
hold on
plot(x1,estSpeed,'r')
hold off
x2 = 1:length(acceleration);
p2=polyfit(x2',acceleration,4)
estAcceleration=polyval(p2,x2)
subplot(4,2,8)
hold on
plot(x2,estAcceleration,'r')
hold off
下图显示了结果图:
你会注意到,即使我选择了这些高多项式阶数,曲线拟合仍然不是很好。较低的订单确实会扰乱速度和加速度曲线中的有趣趋势。因此,您可以找到更好的近似方法; - )