matlab和C語言實現最小二乘法
阿新 • • 發佈:2018-12-23
參考: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[],doubley[],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; }