wm_polyfit.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*Functtion :多项式拟合polyfit
  2. **********************************************/
  3. #include <stdio.h>
  4. //#include <conio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include "wm_mem.h"
  8. void polyfit_verify(double x, double* a)
  9. {
  10. double y1 = a[1]*x + a[0];
  11. printf("x=%d, y1=%d\n", (int)x, (int)(y1+0.5));
  12. }
  13. /*==================polyfit(n,x,y,poly_n,a)===================*/
  14. /*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
  15. /*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
  16. /*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
  17. void polyfit(int n,double x[],double y[],int poly_n,double a[])
  18. {
  19. int i,j;
  20. double *tempx,*tempy,*sumxx,*sumxy,*ata;
  21. void gauss_solve(int n,double A[],double x[],double b[]);
  22. tempx=tls_mem_calloc(n,sizeof(double));
  23. sumxx=tls_mem_calloc(poly_n*2+1,sizeof(double));
  24. tempy=tls_mem_calloc(n,sizeof(double));
  25. sumxy=tls_mem_calloc(poly_n+1,sizeof(double));
  26. ata=tls_mem_calloc((poly_n+1)*(poly_n+1),sizeof(double));
  27. for (i=0;i<n;i++)
  28. {
  29. tempx[i]=1;
  30. tempy[i]=y[i];
  31. }
  32. for (i=0;i<2*poly_n+1;i++)
  33. for (sumxx[i]=0,j=0;j<n;j++)
  34. {
  35. sumxx[i]+=tempx[j];
  36. tempx[j]*=x[j];
  37. }
  38. for (i=0;i<poly_n+1;i++)
  39. for (sumxy[i]=0,j=0;j<n;j++)
  40. {
  41. sumxy[i]+=tempy[j];
  42. tempy[j]*=x[j];
  43. }
  44. for (i=0;i<poly_n+1;i++)
  45. for (j=0;j<poly_n+1;j++)
  46. ata[i*(poly_n+1)+j]=sumxx[i+j];
  47. gauss_solve(poly_n+1,ata,a,sumxy);
  48. tls_mem_free(tempx);
  49. tls_mem_free(sumxx);
  50. tls_mem_free(tempy);
  51. tls_mem_free(sumxy);
  52. tls_mem_free(ata);
  53. }
  54. void gauss_solve(int n,double A[],double x[],double b[])
  55. {
  56. int i,j,k,r;
  57. double max;
  58. for (k=0;k<n-1;k++)
  59. {
  60. max=fabs(A[k*n+k]); /*find maxmum*/
  61. r=k;
  62. for (i=k+1;i<n-1;i++)
  63. if (max<fabs(A[i*n+i]))
  64. {
  65. max=fabs(A[i*n+i]);
  66. r=i;
  67. }
  68. if (r!=k)
  69. for (i=0;i<n;i++) /*change array:A[k]&A[r] */
  70. {
  71. max=A[k*n+i];
  72. A[k*n+i]=A[r*n+i];
  73. A[r*n+i]=max;
  74. }
  75. max=b[k]; /*change array:b[k]&b[r] */
  76. b[k]=b[r];
  77. b[r]=max;
  78. for (i=k+1;i<n;i++)
  79. {
  80. for (j=k+1;j<n;j++)
  81. A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
  82. b[i]-=A[i*n+k]*b[k]/A[k*n+k];
  83. }
  84. }
  85. for (i=n-1;i>=0;x[i]/=A[i*n+i],i--)
  86. for (j=i+1,x[i]=b[i];j<n;j++)
  87. x[i]-=A[i*n+j]*x[j];
  88. }
  89. void polyfit_test(void)
  90. {
  91. int i,n=2,poly_n=1;
  92. double x[2]={15174, 19196},y[2]={5000, 9986};
  93. double a[2];
  94. void polyfit(int n,double *x,double *y,int poly_n,double a[]);
  95. polyfit(n,x,y,poly_n,a);
  96. for (i=0;i<poly_n+1;i++)/*这里是升序排列,Matlab是降序排列*/
  97. printf("a[%d]=%lf \n",i,a[i]);
  98. for(i = 0; i < n; i++)
  99. {
  100. polyfit_verify(x[i], a);
  101. }
  102. }