FittingPosition.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "stdafx.h"
  2. #include <math.h>
  3. #include "FittingPosition.h"
  4. double Em[REF_POSITION_NUM][REF_POSITION_NUM];
  5. double Fitting::sum(double * dNumarry,int n) //计算方程组的增广矩阵时需要
  6. {
  7. double *dTemp= new double[n];
  8. double dSum=0;
  9. dTemp=dNumarry;
  10. for (int i=0;i<n;i++)
  11. {
  12. dSum+=dTemp[i];
  13. }
  14. return dSum;
  15. }
  16. double Fitting::Sum(std::vector<double> vt_num,int n)
  17. {
  18. double total = 0;
  19. for (int i = 0; i < n; i++)
  20. {
  21. total+=vt_num[i];
  22. }
  23. return total;
  24. }
  25. double Fitting::MutilSum(double* dX,double *dY,int n) //计算方程组的增广矩阵时需要
  26. {
  27. double * dXTemp= new double [n];
  28. double * dYTemp= new double [n];
  29. double dMultiSum=0;
  30. dXTemp=dX;
  31. dYTemp=dY;
  32. for (int i=0;i<n;i++)
  33. {
  34. dMultiSum += dX[i]*dY[i];
  35. }
  36. return dMultiSum;
  37. }
  38. double Fitting::MutilSum(std::vector<double> vx,std::vector<double> vy,int n)
  39. {
  40. double dMultiSum=0;
  41. for (int i = 0; i < n; i++)
  42. {
  43. dMultiSum+=vx[i]*vy[i];
  44. }
  45. return dMultiSum;
  46. }
  47. double Fitting::RelatePow(double *dx,int n,int ex) //计算方程组的增广矩阵时需要
  48. {
  49. double * dTemp =new double[n];
  50. double ReSum=0;
  51. dTemp=dx;
  52. for (int j=0;j<n;j++)
  53. {
  54. ReSum+=pow(dTemp[j],ex);
  55. }
  56. return ReSum;
  57. }
  58. double Fitting::RelatePow(std::vector<double> vx, int n, int ex)
  59. {
  60. double ReSum=0;
  61. for (int i=0; i<n; i++)
  62. {
  63. ReSum+=pow(vx[i],ex);
  64. }
  65. return ReSum;
  66. }
  67. double Fitting::RelateMutiXY(double *dx,double*dy,int n,int ex) //计算方程组的增广矩阵时需要
  68. {
  69. double * dXTemp= new double [n];
  70. double * dYTemp= new double [n];
  71. double dReMultiSum=0;
  72. dXTemp=dx;
  73. dYTemp=dy;
  74. for (int i=0;i<n;i++)
  75. {
  76. dReMultiSum+=pow(dXTemp[i],ex)*dYTemp[i];
  77. }
  78. return dReMultiSum;
  79. }
  80. double Fitting::RelateMutiXY(std::vector<double> vx, std::vector<double> vy, int n, int ex)
  81. {
  82. double dReMultiSum=0;
  83. for (int i = 0; i < n; i++)
  84. {
  85. dReMultiSum+=pow(vx[i],ex)*vy[i];
  86. }
  87. return dReMultiSum;
  88. }
  89. //计算方程组的增广矩阵
  90. void Fitting::EMatrix(double *dx,double*dy,int n,int ex,double coefficient[] )
  91. {
  92. double * dXTemp= new double [n];
  93. double * dYTemp= new double [n];
  94. dXTemp=dx;
  95. dYTemp=dy;
  96. for(int i=1;i<=ex;i++)
  97. {
  98. for(int j=1;j<=ex;j++)
  99. {
  100. Em[i][j]=RelatePow(dXTemp,n,i+j-2);
  101. }
  102. Em[i][ex+1]=RelateMutiXY(dXTemp,dYTemp,n,i-1);
  103. }
  104. Em[1][1]=n;
  105. CalEquation(ex,coefficient);
  106. }
  107. void Fitting::EMatrix(std::vector<double> vx, std::vector<double> vy, int n, int ex, double coefficient[])
  108. {
  109. for (int i=1; i<=ex; i++)
  110. {
  111. for (int j=1; j<=ex; j++)
  112. {
  113. Em[i][j]=RelatePow(vx,n,i+j-2);
  114. }
  115. Em[i][ex+1]=RelateMutiXY(vx,vy,n,i-1);
  116. }
  117. Em[1][1]=n;
  118. CalEquation(ex,coefficient);
  119. }
  120. void Fitting::CalEquation(int exp,double coefficient[] ) //求解方程,计算方程组的增广矩阵时需要
  121. {
  122. for(int k=1;k<exp;k++) //消元过程
  123. {
  124. for(int i=k+1;i<exp+1;i++)
  125. {
  126. double p1=0;
  127. if(Em[k][k]!=0)
  128. p1=Em[i][k]/Em[k][k];
  129. for(int j=k;j<exp+2;j++)
  130. Em[i][j]=Em[i][j]-Em[k][j]*p1;
  131. }
  132. }
  133. coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];
  134. for(int l=exp-1;l>=1;l--) //回代求解
  135. coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l];
  136. }
  137. double Fitting::F(double c[],int l,int m)//供CalEquation函数调用
  138. {
  139. double sum=0;
  140. for(int i=l;i<=m;i++)
  141. sum+=Em[l-1][i]*c[i];
  142. return sum;
  143. }
  144. double Fitting::F(std::vector<double> vc,int l,int m)
  145. {
  146. double sum = 0;
  147. for(int i = l;i <= m;i++)
  148. sum+=Em[l-1][i]*vc[i];
  149. return sum;
  150. }
  151. double Fitting::polyval(double* a,double x){ //根据ct计算位置
  152. int i;
  153. double y = 0.0;
  154. for(i=1;i<4;i++){
  155. y+=a[i]*pow(x,i-1);
  156. }
  157. return y;
  158. }
  159. double Fitting::polyval(std::vector<double> vt,double v)
  160. {
  161. double y = 0.0;
  162. for(int i = 1;i < 4;i++){
  163. y+=vt[i]*pow(v,i-1);
  164. }
  165. return y;
  166. }
  167. double Fitting::VAR(double v[REF_POSITION_NUM]){ //求方差
  168. double sum=0,s=0,e;
  169. int i;
  170. for(i=0;i<REF_POSITION_NUM;i++)
  171. sum+=v[i];
  172. e=sum/REF_POSITION_NUM;
  173. for(i=0;i<REF_POSITION_NUM;i++){
  174. if(i!=REF_POSITION_NUM-1)
  175. s+=(v[i]-e)*(v[i]-e);
  176. }
  177. s=s/REF_POSITION_NUM;
  178. return s;
  179. }
  180. double Fitting::VAR(std::vector<double> vt)
  181. {
  182. double sum = 0,s = 0,e;
  183. int n = REF_POSITION_NUM;
  184. int i;
  185. for(i = 0;i < n;i++)
  186. sum+=vt[i];
  187. e = sum/n;
  188. for(i = 0;i < n;i++){
  189. if(i!=n-1)
  190. s+=(vt[i]-e)*(vt[i]-e);
  191. }
  192. s = s/n;
  193. return s;
  194. }