在MATLAB中用坐标求曲线的公式

在MATLAB中用坐标求曲线的公式,matlab,formula,physics,Matlab,Formula,Physics,假设给我们一些平面上点的坐标,比如说20个点,它们的坐标为: X = [0.0809627469389454; 0.0812319917473947; 0.0814760690888197; 0.0816493550701358; 0.0817167028412858; 0.0816873091729635; 0.0813456103002472; 0.0805960479373602; 0.0793506286325874; 0.0768532682616457; 0.073056873961

假设给我们一些平面上点的坐标,比如说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]

这些点是运动坐标,位于公式未知的曲线上。 如何使用给定的坐标/数据找到运动的公式?我需要它的公式来计算它的速度和加速度,它们分别是运动的一阶导数和二阶导数。
提前谢谢

通过绘制数据,这看起来像多项式。因此,我建议您使用该函数。它的作用是给定一组坐标
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.
让我们慢慢地浏览上面的代码。在两点之间创建向量的线性间距。默认点数为100,但您可以将其更改为您想要的任何值。因此,第一行将在
X
中的最小点和最大点之间生成100个点。之后,获取从
polyfit
创建的多项式方程的系数,以及一组
X
点,以基于我们找到的预测方程生成一组
Y
点。一旦我这样做了,我们就会生成一个显示原始数据点和预测曲线的曲线图。我还加入了一个网格,以便更好地测量

这是我得到的情节:


显然,您需要根据数据调整多项式的顺序。记住,这次我们很幸运。在实践中,数据并不是这样自然流动的。因此,您需要首先检查数据,并找出数据适合的曲线类型。一旦您决定了这一点,您将继续进行曲线拟合,因为每一类曲线都遵循不同的策略,以找到参数的最佳估计值。

我想您更感兴趣的是速度和加速度值,而不是原始数据的曲线拟合,但是你认为通过微分一个数学函数来估计速度和加速度比使用真实世界的数据更容易

如果我的猜测是正确的,那么让我告诉你,有一种比粗略估计测量数据更好的方法,因为你在估计开始时丢弃了太多有价值的信息。结果将导致最终速度和加速度值的严重偏差

只需简单地估计测量的X和Y位移的离散导数,最后尝试平滑以减少样本误差。我假设X/Y对是以恒定的时间间隔采样的,所以我使用这个时间间隔作为以下六个图的新X。应将其替换为实时值(例如毫秒)。您可以将其用作自己分析的框架:

子批次(4,1,1)
图(X,Y,“.-”)
xlabel(“手部运动的测量位移数据”)
速度X=diff(X)
速度=差异(Y)
速度=sqrt(速度X.^2+速度^2);
子地块(4,2,3)
绘图(speedX)
ylabel('X')
子地块(4,2,5)
情节(快速)
ylabel('Y')
子地块(4,2,7)
绘图(速度)
ylabel('X和Y的组合')
xlabel(“速度”)
加速度x=diff(速度x)
加速度y=diff(快速)
加速度=sqrt(加速度x.^2+加速度y.^2);
子地块(4,2,4)
绘图(加速X)
子地块(4,2,6)
绘图(加速)
子地块(4,2,8)
绘图(加速度)
xlabel(“加速度”)
%去除异常值的简单解决方案
x1=1:长度(速度);
p1=多配合(x1',速度,5)
estSpeed=polyval(p1,x1)
子地块(4,2,7)
等等
绘图(x1,速度,'r')
拖延
x2=1:长度(加速度);
p2=多配合(x2',加速度,4)
estAcceleration=polyval(p2,x2)
子地块(4,2,8)
等等
图(x2,加速度,'r')
拖延
下图显示了结果图:


你会注意到,即使我选择了这些高阶多项式,曲线拟合仍然不是很好。较低的阶数确实干扰了速度和加速度曲线中有趣的趋势。因此,您需要找到更好的近似方法;-)

@rayryeng:我已经用一些精确的数据进行了编辑。我希望这是清楚的@罗耶-好的,这似乎更清楚一点。我会写一个答案。将你的数据导入,看看什么样的函数最适合数据,然后我猜你可以玩@rayryeng:嗯,这是人站起来时手在身体后面的动作。他面前有一张桌子,上面有一堆东西。他会抓住物体并将其移动到另一个位置,然后手会回到第一个位置。“我想它离抛物线很近。”罗耶——我看了看情节。它看起来确实像多项式。我已经发布了答案。我也撤回了我的投票。非常感谢你的完整回答。实际上,我需要速度和加速度以及曲线拟合。因为代码将计算运动。我的代码和数字还提供了速度和加速度的简单曲线拟合(红线)。我指出的问题是,尽管我使用的是多项式阶数5A
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.