matlab和C語言實現最小二乘法


參考:https://blog.csdn.net/zengxiantao1994/article/details/70210662

Matlab代碼:

N = 8;
x = [1   2   3    4   5  6   7   8  ];
y = [67 84 102  120 137 155 172 190];
subplot(2,1,1);
plot(x,y,'*');
% 圖形的一些設置
xlabel('時間(秒)');
ylabel('位移(米)');
title('原始數據離散點')  
grid on
subplot(2,1,2);
p = polyfit(x,y,1); %得出P就是線性擬合的系數
% 0:0.01:9    
x1 = 0:1:N;  %起始為0,終點為N,步長1
y1 = polyval(p,x1);
plot(x,y,'*',x1,y1,'r')
xlabel('時間(秒)');
ylabel('位移(米)');
title('紅線為最小二乘法擬合')  
grid on

sumxyji =sum(x.*y); %向量內積
sumx = sum(x);
sumy = sum(y);
sumxx = sum(x.*x);
k = (N*sumxyji - sumx*sumy)/(N*sumxx-sumx*sumx)
b = (sumy-k*sumx)/N

效果:

 

自己C語言實現:

公式:

#include <stdio.h>
#include <stdlib.h>


//函數功能:進行最小二乘曲線擬合(擬合y=a0+a1*x),計算出對應的系數a
//參數說明:
//      n:      給定數據點的個數
//      x[]:    存放給定n個數據點的X坐標
//      y[]:    存放給定n個數據點的Y坐標
//      k,b:    擬合多項式的系數,表示多項式的k,b
void polyfit(int n,double x[],double y[],double &k,double &b)
{
    
    
    int i,j;
    double sumxymultiply = 0.0;
    double sumx   = 0.0;
    double sumy   = 0.0;
    double sumxx   = 0.0;
     for (i=0;i<n;i++)
    {
        sumx += x[i];
        sumy += y[i];
        sumxymultiply += (x[i]*y[i]);
        sumxx += (x[i]*x[i]);
    }
    
    k = (n*sumxymultiply - sumx*sumy)/(n*sumxx - sumx*sumx);
    b = (sumy-k*sumx)/n;
}

void printArr(double *arr,int n)
{
    for(int i=0;i<n;++i)
        printf("%lf ",arr[i]);
    
    printf("\n");
}
int main()
{
    const int N = 8;
      

    double x[N] = {1,2,3, 4,5,6,7,8};
    double y[N] = {67,84,102,120,137,155,172,190};
    double k,b;
    
    polyfit(N,x,y,k,b);
    printf("%lf %lf\n",k,b);
    
 
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM