GD32F303之最小二乘法

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

/*
    昆明电器科学研究所 张恩寿 2019年5月3日
       
       
*/
#include "bitband.h"
#include "led_config.h"
#include "systick.h"
#include "usart.h"
#include "spi_flash.h"
#include "tft.h"
#include "key_lookup.h"
#include "lsm.h"




int main(void)
{                       
        systick_config(120);
        nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
        usart0_init(115200);
    led_init();
        lsm_test();
        
        while(1)
        {
                led_on();
                delay_nms(600);
                led_off();
                delay_nms(600);
        }
               
}


五、结论
通过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 | 显示全部楼层
感谢楼主的资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

1945

帖子

14

粉丝