1. 程式人生 > >matlab和C語言實現最小二乘法

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; }