找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8314|回复: 0
收起左侧

最小二乘法拟合一条直线(C语言代码)

[复制链接]
ID:90014 发表于 2015-9-15 14:58 | 显示全部楼层 |阅读模式
  1. #include<stdio.h>


  2. #define N10             //N为要拟合的数据的个数

  3. float X[10] = {1.9,0.8,1.1,0.1,-0.1,4.4,4.6,1.6,5.5,3.4};
  4. float Y[10] = {0.7,-1.0,-0.2,-1.2,-0.1,3.4,0.0,0.8,3.7,2.0};


  5. floatK=0;               //拟合直线的斜率

  6. floatR=0;               //拟合直线的截距

  7. float x_sum_average=0;   //数组 X[N] 个元素求和 并求平均值

  8. float y_sum_average=0;   //数组 Y[N] 个元素求和 并求平均值

  9. float x_square_sum=0;    //数组 X[N] 个个元素的平均值

  10. float x_multiply_y=0;    //数组 X[N]和Y[N]对应元素的乘机

  11. float Squre_sum(float c[N]) ;
  12. float Sum_Average(float d[N]);
  13. float X_Y_By(float m[N],float n[N]);
  14. float Squre_sum(float c[N]);
  15. void Line_Fit(void);


  16. void Line_Fit(void)
  17. {
  18.   x_sum_average= Sum_Average(X);

  19.   y_sum_average= Sum_Average(Y);

  20.   x_square_sum = Squre_sum(X);

  21.   x_multiply_y = X_Y_By(X,Y);

  22.   K = ( x_multiply_y - N * x_sum_average * y_sum_average)/(x_square_sum - N * x_sum_average*x_sum_average );

  23.   R = y_sum_average - K * x_sum_average;

  24.   printf("K = %f\n",K);

  25.   printf("R = %f\n",R);

  26. }



  27. float Sum_Average(float d[N])
  28. {

  29. unsigned int i=0;

  30. float z=0;

  31. for(i=0;i<N;i++)

  32. {
  33. z = z + d[i];
  34. }

  35. z = z/N;

  36. return z;

  37. }

  38. float X_Y_By(float m[N],float n[N])
  39. {

  40. unsigned int i=0;

  41. float z=0;

  42. for(i=0;i<N;i++)

  43. {

  44. z = z + m[i]*n[i];

  45. }

  46. return z;

  47. }



  48. float Squre_sum(float c[N])
  49. {

  50. unsigned int i=0;

  51. float z=0;

  52. for(i=0;i<N;i++)

  53. {

  54. z = z + c[i]*c[i];

  55. }

  56. return z;

  57. }


  58. void main(void)
  59. {

  60.     Line_Fit();

  61. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表