数据拟合

来源:互联网 发布:左淘宝店铺头像 编辑:程序博客网 时间:2024/04/30 12:45

      来源于单片机编程的一些想法。主要适用于:(1)将比较复杂的公式简化为多项式的形式(泰勒展开思想),在CPU运算能力比较低时节省运算时间。(2)在已知某些数据点,求解这些点满足的函数,从而计算其他点。

1.从已知点得到函数关系

       通俗的来讲,数据拟合就是将收集的数据整合,发现他们的规律,然后用函数来表示。这样的函数可以作下一个数据出现位置的预判。比如采集到一组数据:

      

输入x

-9.7

-8.5

-6.1

-7.3

6.5

3.5

2.3

-2.8

8.3

5.9

输出y

94.09

72.25

37.21

53.29

42.25

12.25

5.29

7.84

68.89

34.81

   

       通过这些采集的数据规律,假设再给定一个输入,能否推测输出是多少?在未知输入和输出函数关系的情况下是很难预测出来的(这组数据比较简单,可能比较容易看出来之间的关系,但是复杂的就难得看出了)。

将上述数据在平面坐标系中画出来:


Matlab命令:

>>x=[-9.7,-8.5,-6.1,-7.3,6.5,3.5,2.3,-2.8,8.3,5.9];

>> y=[94.09 72.2537.21 53.29 42.25 12.25 5.29 7.84 68.89 34.81];

>>plot(x,y,'.');

使用matlab自带的数据拟合工具。




 

试着选择线性拟合,采用二阶的试试。得到结果:

y =  p1 * x^2  +  p2*x  +  p3 (p1 p2 p3为系数)

Coefficients:

  p1 = 1

  p2 = 3.3706e-016

  p3 = 8.496e-015

Norm of residuals=

     3.7472e-014

拟合图像为:

数据点基本上都在函数上,说明这个拟合还是很适合的。

 

2. 将复杂函数简单化

       11年全国大学电子设计竞赛B题自由摆的有个倾角传感器测的角度和执行部件该转动的角度,他们的关系通过三角函数计算得到:

       然而,电脑算这个公式当然是没有问题的,但是在单片机里面就存在问题了。也不是说是问题,因为计算式子比较麻烦,所以占用时间比较长。但是这个系统实时性要求特别高。所以将这个式子弄成比较简单的式子(比如二阶的,或者3阶的)是很有意义的。

先把函数图像画出来:

 >> th=-pi/4:0.001:pi/4;
>> beta = atan((1-cos(th))./(1.5-sin(th)));
>> plot(th,beta);
>> grid on

打开拟合工具,二阶拟合的结果:

偏差还是有些大的,那就试试三阶:


这个结果已经非常接近了,得到的式子就是:

y = p1*x^3 + p2*x^2 +p3*x + p4

Coefficients:

  p1= 0.23114

  p2= 0.38838

  p3= -0.00010563

  p4= -0.003147

Norm of residuals =

    0.1019




0 0
原创粉丝点击