Advertisement
Guest User

Untitled

a guest
Jul 20th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.50 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. //---------------------------------------------------------------------------
  5. double A0=6378.1363; //средний радиус Земли
  6. double Wgeo=360.9856235/86400./57.2957795; // радиан/сек
  7. double Grav=398600.4415; //гравитационная постоянная
  8. double th0;
  9. double RAD = M_PI / 180.;
  10. //---------------------------------------------------------------------------
  11. void smpy ( double *a, double r, double *b, int n ) // Умножение на скаляp
  12. { for ( int i=0; i<n; i++, *b++ = *a++ * r ); }
  13. //------------------------------------------------------------------------
  14. void madd ( double *a, double *b, double *c, int n ) // Сложение вектоpов
  15. { for ( int i=0; i<n; i++, *c++ = *a++ + *b++ ); }
  16. //------------------------------------------------------------------------
  17. double scal ( double *a, double *b, int n ) // Скаляpное пpоизведение
  18. {
  19. double c=0.;
  20. for ( int i=0; i<n; c+=a[i]*b[i], i++ );
  21. return c;
  22.  
  23. }
  24. //------------------------------------------------------------------------
  25. void mprd ( double *a, double *b, double *c, int ma, int na, int nb )
  26. { // Умножение матpиц
  27. int i,j,k;
  28. double s, *api, *bpj, *cpi;
  29. for(i=0; i<ma; i++) {
  30. api = a+i*na; cpi = c+i*nb;
  31. for(j=0; j<nb; j++) {
  32. bpj = b+j;
  33. for ( k=0,s=0.; k<na; k++) s += *(api+k) * *(bpj+k*nb);
  34. *(cpi+j) = s;
  35. }
  36. }
  37. }
  38. //------------------------------------------------------------------------
  39. void ort ( double *r, double & fi, double & psi)
  40. {
  41. double a,cf;
  42. a = sqrt ( scal ( r , r, 3 ) );
  43. fi = ( a == 0. )? 0. : asin(r[2]/a);
  44. psi= ( r[0] == 0. && r[1] == 0. ) ? 0. : atan2(r[1],r[0]);
  45. }
  46. //------------------------------------------------------------------------
  47. void GreenFash(double jd)
  48. {
  49. double Tu = (jd - 2451545.)/36525.;
  50. th0 = 24110.54841 + 8640184.812866*Tu + 0.093104*Tu*Tu - 6.2e-6*Tu*Tu*Tu;
  51. th0 = (th0/60/60)*15/57.29;
  52. }
  53. //---------------------------------------------------------------------------
  54. void GreenSimple(double t, double *m)
  55. {
  56. double Th = th0 + Wgeo*t;
  57. m[0] = cos(Th); m[1] = -sin(Th); m[2] = 0;
  58. m[3] = -m[1]; m[4] = m[0]; m[5]=0;
  59. m[6] = 0; m[7] = 0; m[8] = 1;
  60. }
  61. //---------------------------------------------------------------------------
  62. void getAccelJ6(double *r, double *acc)
  63. {
  64. double J_zonal[5] = {1.08262668355e-3, -2.53265648533e-6,
  65. -1.61962159137e-6, -2.27296082869e-7, 5.40681239107e-7}; // коэффициенты зональных гармоник
  66. double rm[3]; smpy(r,1000.,rm,3);
  67. double rmod = sqrt(scal(rm,rm,3)), mu = 3.986004418e+14, R = 6.378137e+6;
  68. double Rd = R/rmod, Rd2=pow(Rd,2), Rd3=pow(Rd,3), Rd4=pow(Rd,4), Rd5=pow(Rd,5), Rd6=pow(Rd,6);
  69. double mur2 = mu/(rmod*rmod);
  70. double zR = rm[2]/rmod, zR2 = pow(zR,2), zR3 = pow(zR,3), zR4 = pow(zR,4), zR5 = pow(zR,2), zR6 = pow(zR,6);
  71. double rx = rm[0]/rmod, ry = rm[1]/rmod, rz = rm[2]/rmod; //ввести исходные данные
  72. double aJ2[3],aJ3[3],aJ4[3], aJ5[3], aJ6[3], tmp;
  73.  
  74. double scal = -1.5*J_zonal[0]*mur2*Rd2; tmp = (1.-5.*zR2);
  75. double vj2[3] = {tmp*rx, tmp*ry, (3.-5.*zR2)*rz}; //считаем определитель
  76. smpy(vj2,scal,aJ2,3);
  77.  
  78. scal = -0.5*J_zonal[1]*mur2*Rd3; tmp = 5.*(7.*zR3 - 3.*zR);
  79. double vj3[3] = {tmp*rx, tmp*ry, 3.*(10.*zR2 - (35./3.)*zR4 - 1.)};
  80. smpy(vj3,scal,aJ3,3);
  81.  
  82. scal = -0.625*J_zonal[2]*mur2*Rd4; tmp = (3. - 42.*zR2 + 63.*zR4);
  83. double vj4[3] = {tmp*rx, tmp*ry, -(15. - 70.*zR2 + 63.*zR4)*rz};
  84. smpy(vj4,scal,aJ4,3);
  85.  
  86. scal = -0.125*J_zonal[3]*mur2*Rd5; tmp = 3.*(35.*zR - 210.*zR3 + 231.*zR5);
  87. double vj5[3] = {tmp*rx, tmp*ry, (15. - 315.*zR2 + 945.*zR4 - 693.*zR6)};
  88. smpy(vj5,scal,aJ5,3);
  89.  
  90. scal = 0.0625*J_zonal[4]*mur2*Rd6; tmp = (35. - 945.*zR2 + 3465.*zR4 - 3003.*zR6);
  91. double vj6[3] = {tmp*rx, tmp*ry, (2205.*zR2 - 4851.*zR4 + 3003.*zR6 - 315.)*rz};
  92. smpy(vj6,scal,aJ6,3);
  93.  
  94. madd(aJ2,aJ3,acc,3); madd(acc,aJ4,acc,3); madd(acc,aJ5,acc,3); madd(acc,aJ6,acc,3);
  95. smpy(acc,1e-3,acc,3); // км/с2
  96. }
  97. //---------------------------------------------------------------------------
  98. void RightPart(double t, double *x, double *dx)
  99. {
  100. double r2=scal(x,x,3), r=sqrt(r2), r3=r*r2, Acc[3];
  101. for ( int i=0; i<3; i++)
  102. {
  103. dx[i] = x[i+3];
  104. dx[3+i]=-Grav*x[i]/r3;
  105. }
  106. double rg[3],mgg[9], mg[9],a[3];
  107. GreenSimple(t, mgg);
  108. mprd(x,mgg,rg,1,3,3); // переводим радиус-вектор в текущий Гринвич
  109. getAccelJ6(rg,a); // получаем ускорение в текущем Гринвиче
  110. mprd(mgg,a,Acc,3,3,1); // переводим ускорение в J2000
  111. madd(&dx[3],Acc,&dx[3],3);
  112. }
  113. //---------------------------------------------------------------------------
  114. double djul(int day, int mon, int year, int hour, int min, int sec)
  115. {
  116. long int i1=(mon-14)/12,
  117. i2=year+4800+i1,
  118. i3=day-32075+1461*i2/4,
  119. i4=i3+367*(mon-2-i1*12)/12-3*((i2+100)/100)/4;
  120. return (i4-.5+hour/24.+min/1440.+sec/86400.);
  121. }
  122. //---------------------------------------------------------------------------
  123. void RK (void (*f)(double, double*, double*), double t, double *y, double h )
  124. {
  125. int i;
  126. double y1[6], y2[6], y3[6], y4[6], yy[6], h2;
  127. h2=h/2;
  128. f(t,y,y1);
  129. for (i=0; i<6; i++) yy[i]=y[i]+h2*y1[i];
  130. f(t+h2,yy,y2);
  131. for (i=0; i<6; i++) yy[i]=y[i]+h2*y2[i];
  132. f(t+h2,yy,y3);
  133. for (i=0; i<6; i++) yy[i]=y[i]+h *y3[i];
  134. f(t+h,yy,y4);
  135. for ( i=0; i<6; i++) y[i] = y[i]+h*(y1[i]+y4[i]+2*(y2[i]+y3[i]))/6.;
  136. }
  137. //---------------------------------------------------------------------------
  138. int main()
  139. {
  140. FILE *f;
  141. double jd = djul(4, 6, 2017, 13, 26, 13); //ввести дату
  142. double y[6] = {-14849.674121, -6184.115762, 5525.320326, 2.914687, -0.917413, -4.746170}; // ССО
  143. GreenFash(jd);
  144. double t = 3600; // + 3 часа потому что ДМВ
  145. double tk = t+86400, h = 1;
  146.  
  147. f = fopen("res_with.txt", "w");
  148. int sh = 0;
  149. while(t<tk)
  150. {
  151. RK(RightPart,t,y,h);
  152. double mg[9], rg[3];
  153. GreenSimple(t,mg);
  154. mprd(y,mg,rg,1,3,3);
  155. double dec, ra, H;
  156. ort(rg, dec, ra);
  157. if(sh % 60 == 0)
  158. { fprintf(f,"%lf %lf %lf\n",t,ra*RAD, dec*RAD); sh = 0;}
  159. t+=h;
  160. sh+=1;
  161. }
  162. fclose(f);
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement