GD32F303之最小二乘法

[复制链接]
1147|6
 楼主| zeshoufx 发表于 2019-9-10 20:14 | 显示全部楼层 |阅读模式
一、最小二乘法程序
  1. static void leastSquareLinearFit(float32_t x[], float32_t y[], const int num, float32_t *a, float32_t *b)
  2. {
  3.         float32_t sum_x2 = 0.0;
  4.         float32_t sum_y  = 0.0;
  5.         float32_t sum_x  = 0.0;
  6.         float32_t sum_xy = 0.0;
  7.        
  8.         {
  9.                 for (int i = 0; i < num; ++i)
  10.                 {
  11.                          sum_x2 += x[i]*x[i];
  12.                          sum_y += y[i];
  13.                          sum_x += x[i];
  14.                          sum_xy += x[i]*y[i];
  15.                  }
  16.         }
  17.         *a = (num*sum_xy - sum_x*sum_y)/(num*sum_x2 - sum_x*sum_x);
  18.         *b = (sum_x2*sum_y - sum_x*sum_xy)/(num*sum_x2-sum_x*sum_x);
  19. }
二、结果
801675d7792a3137b1.png
三、测试函数
  1. void lsm_test(void)
  2. {
  3.         float32_t a,b;
  4.         static float32_t tempx[96] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  5.                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.46667, 11.4667,
  6.                 31.6, 52.7333, 80.3333, 116.333, 156.6, 199.4, 242.2, 283.4,
  7.                 329.2, 379.333, 431.333, 482.6, 541, 594.4, 643.533, 692.133,
  8.                 736.267, 772.667, 810.133, 841.867, 868.2, 892.4, 917.667,
  9.                 939.8, 954.667, 969, 976.8, 983.4, 987.467, 994.933, 1023.67,
  10.                 875.2, 873.933, 758.8, 678.2, 515.867, 782.533, 908.8, 779.2,
  11.                 831.4, 645.533, 734.067, 679.533, 610.267, 565.067, 512.467,
  12.                 462, 405.2, 354.133, 302, 247.8, 191.533, 140, 94.2667, 57.5333,
  13.                 25.9333, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // x
  14.        
  15.         static float32_t tempy[96] = {0.595, 0.595, 0.595, 0.595, 0.595, 0.595,
  16.                 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595,
  17.                 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595,
  18.                 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 0.595, 1.785, 2.57833, 3.927,
  19.                 5.79233, 7.379, 9.48133, 11.1473, 12.4167, 13.6627, 16.193701, 18.248699,
  20.                 19.042, 19.042, 19.105301, 16.6383, 17.240999, 14.631, 11.8217, 11.663,
  21.                 12.155, 15.488, 21.859301, 19.32, 19.042, 19.6133, 21.105, 22.9937,
  22.                 20.827299, 23.858299, 23.0333, 19.2883, 15.6937, 21.5893, 23.802999,
  23.                 20.518299, 21.5893, 17.907301, 17.971001, 17.574301, 16.781, 15.5513,
  24.                 12.3773, 10.2747, 8.60867, 6.86333, 5.39567, 3.88767, 2.856, 2.142,
  25.                 2.142, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952, 0.952,
  26.                 0.952, 0.952, 0.952, 0.952 }; // y
  27.         leastSquareLinearFit(tempx,tempy,96,&a,&b);
  28.                 printf("a=%f        b=%f",a,b);
  29. }
四、主函数

  1. /*
  2.     昆明电器科学研究所 张恩寿 2019年5月3日
  3.        
  4.        
  5. */
  6. #include "bitband.h"
  7. #include "led_config.h"
  8. #include "systick.h"
  9. #include "usart.h"
  10. #include "spi_flash.h"
  11. #include "tft.h"
  12. #include "key_lookup.h"
  13. #include "lsm.h"




  14. int main(void)
  15. {                       
  16.         systick_config(120);
  17.         nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  18.         usart0_init(115200);
  19.     led_init();
  20.         lsm_test();
  21.         
  22.         while(1)
  23.         {
  24.                 led_on();
  25.                 delay_nms(600);
  26.                 led_off();
  27.                 delay_nms(600);
  28.         }
  29.                
  30. }


五、结论
通过matlab 的polyfit函数拟合得到的a=0.0215,b=0.6085;
利用GD32F303最小二乘法拟合得到的a=0.021514,b=0.608488;二者结果一样,MATLAB只保留了小数点后四位。
435065d77938fcdf1f.png

wahahaheihei 发表于 2019-9-16 23:51 | 显示全部楼层
非常棒。
drer 发表于 2019-10-13 08:49 | 显示全部楼层
非常感谢楼主分享
kxsi 发表于 2019-10-13 10:22 | 显示全部楼层
非常好的资料
nawu 发表于 2019-10-13 10:45 | 显示全部楼层
非常感谢楼主分享
tfqi 发表于 2019-10-13 11:17 | 显示全部楼层
非常不错的分享
wiba 发表于 2019-10-13 11:22 | 显示全部楼层
感谢楼主的资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

1991

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部