smooth.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:4k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <math.h>
  5. Smooth(double *,double *,double *,int,int,
  6.    double *,double *,double *);
  7. void main()
  8. {
  9. int i,n,m;
  10. double *x,*y,*a,dt1,dt2,dt3,b;
  11. n = 20;
  12. m = 6;
  13. b = 0;
  14. /*分别为x,y,a分配存贮空间*/
  15. x = (double *)calloc(n,sizeof(double));
  16. if(x == NULL)
  17. {
  18. printf("内存分配失败n");
  19. exit (0);
  20. }
  21. y = (double *)calloc(n,sizeof(double));
  22. if(y == NULL)
  23. {
  24. printf("内存分配失败n");
  25. exit (0);
  26. }
  27. a = (double *)calloc(n,sizeof(double));
  28. if(a == NULL)
  29. {
  30. printf("内存分配失败n");
  31. exit (0);
  32. }
  33. for(i=1;i<=n;i++)
  34. {
  35. x[i-1]=b+(i-1)*0.1;
  36. /*每隔0.1取一个点,这样连续取n个点*/
  37. y[i-1]=x[i-1]-exp(-x[i-1]);
  38. /*计算x[i-1]点对应的y值作为拟合已知值*/
  39. }
  40. Smooth(x,y,a,n,m,&dt1,&dt2,&dt3); /*调用拟合函数*/
  41. for(i=1;i<=m;i++)
  42. printf("a[%d] = %.10fn",(i-1),a[i-1]);
  43. printf("拟合多项式与数据点偏差的平方和为:n");
  44. printf("%.10en",dt1);
  45. printf("拟合多项式与数据点偏差的绝对值之和为:n");
  46. printf("%.10en",dt2);
  47. printf("拟合多项式与数据点偏差的绝对值最大值为:n");
  48. printf("%.10en",dt3);
  49. free(x); /*释放存储空间*/
  50. free(y); /*释放存储空间*/
  51. free(a); /*释放存储空间*/
  52. }
  53. Smooth(x,y,a,n,m,dt1,dt2,dt3 )
  54. double *x; /*实型一维数组,输入参数,存放节点的xi值*/
  55. double *y; /*实型一维数组,输入参数,存放节点的yi值*/
  56. double *a; /*双精度实型一维数组,长度为m。返回m一1次拟合多项式的m个系数*/
  57. int n; /*整型变量,输入参数,给定数据点的个数*/
  58. int m; /*整型变量,输入参数,拟合多项式的项数*/
  59. double *dt1; /*实型变量,输出参数,拟合多项式与数据点偏差的平方和*/
  60. double *dt2; /*实型变量,输出参数,拟合多项式与数据点偏差的绝对值之和*/
  61. double *dt3; /*实型变量,输出参数,拟合多项式与数据点偏差的绝对值最大值*/
  62. {
  63. int i,j,k;
  64. double *s,*t,*b,z,d1,p,c,d2,g,q,dt;
  65. /*分别为s,t,b分配存贮空间*/
  66. s = (double *)calloc(n,sizeof(double));
  67. if(s == NULL)
  68. {
  69. printf("内存分配失败n");
  70. exit (0);
  71. }
  72. t = (double *)calloc(n,sizeof(double));
  73. if(t == NULL)
  74. {
  75. printf("内存分配失败n");
  76. exit (0);
  77. }
  78. b = (double *)calloc(n,sizeof(double));
  79. if(b == NULL)
  80. {
  81. printf("内存分配失败n");
  82. exit (0);
  83. }
  84. z = 0;
  85. for(i=1;i<=n;i++)
  86. z=z+x[i-1]/n; /*z为各个x的平均值*/
  87. b[0]=1;
  88. d1=n;
  89. p=0;
  90. c=0;
  91. for(i=1;i<=n;i++)
  92. {
  93. p=p+x[i-1]-z;
  94. c=c+y[i-1];
  95. }
  96. c=c/d1;
  97. p=p/d1;
  98. a[0]=c*b[0];
  99. if(m>1)
  100. {
  101. t[1]=1;
  102. t[0]=-p;
  103. d2=0;
  104. c=0;
  105. g=0;
  106. for(i=1;i<=n;i++)
  107. {
  108. q=x[i-1]-z-p;
  109. d2=d2+q*q;
  110. c=y[i-1]*q+c;
  111. g=(x[i-1]-z)*q*q+g;
  112. }
  113. c=c/d2;
  114. p=g/d2;
  115. q=d2/d1;
  116. d1=d2;
  117. a[1]=c*t[1];
  118. a[0]=c*t[0]+a[0];
  119. }
  120. for(j=3;j<=m;j++)
  121. {
  122. s[j-1]=t[j-2];
  123. s[j-2]=-p*t[j-2]+t[j-3];
  124. if(j>=4)
  125. for(k=j-2;k>=2;k--)
  126. s[k-1]=-p*t[k-1]+t[k-2]-q*b[k-1];
  127. s[0]=-p*t[0]-q*b[0];
  128. d2=0;
  129. c=0;
  130. g=0;
  131. for(i=1;i<=n;i++)
  132. {
  133. q=s[j-1];
  134. for(k=j-1;k>=1;k--)
  135. q=q*(x[i-1]-z)+s[k-1];
  136. d2=d2+q*q;
  137. c=y[i-1]*q+c;
  138. g=(x[i-1]-z)*q*q+g;
  139. }
  140. c=c/d2;
  141. p=g/d2;
  142. q=d2/d1;
  143. d1=d2;
  144. a[j-1]=c*s[j-1];
  145. t[j-1]=s[j-1];
  146. for(k=j-1;k>=1;k--)
  147. {
  148. a[k-1]=c*s[k-1]+a[k-1];
  149. b[k-1]=t[k-1];
  150. t[k-1]=s[k-1];
  151. }
  152. }
  153. *dt1=0;
  154. *dt2=0;
  155. *dt3=0;
  156. for(i=1;i<=n;i++)
  157. {
  158. q=a[m-1];
  159. for(k=m-1;k>=1;k--)
  160. q=q*(x[i-1]-z)+a[k-1];
  161. dt=q-y[i-1];
  162. if(fabs(dt)>*dt3)
  163. *dt3=fabs(dt);
  164. *dt1=*dt1+dt*dt;
  165. *dt2=*dt2+fabs(dt);
  166. }
  167. /*释放存储空间*/
  168. free(s);
  169. free(t);
  170. free(b);
  171. return(1);
  172. }