Advertisement
Guest User

Untitled

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