cout << '\n'
<< "Число делений шага=" << ihlf; 
  } 
getch(); 
 
m_y.close(); 
m_f.close(); 
m_s.close(); 
m_l.close(); 
m_par.close(); 
u_f.close(); 
u_par.close(); 
k_par.close(); 
} 
 
void out_p(real
x,real *y,real*,int,int,real*) 
{ 
if (x >=
(dTp*Curp)) 
  { 
  Curp++; 
  gotoxy(1,20); 
  cout <<
"Процесс выполнения:" << float(Curp)*100./Np << " %
" << '\n'; 
 
  cout.precision(7); 
 
  m_y << x
<< '\t' << y[0] << '\t' << y[1] << '\t' <<
y[2] << '\t' 
      << y[3]
<< '\t' << y[4] << '\t' << y[5] << '\n'; 
  m_f << x
<< '\t' << Fz << '\t' << Fs << '\t' << Fl
<< '\t' << Fa 
      << '\t'
<< U20 << '\n'; 
  m_s << x
<< '\t' << xs << '\t' << ys << '\t' << zs
<< '\n'; 
  m_l << x
<< '\t' << xl << '\t' << yl << '\t' << zl
<< '\n'; 
  m_par << x
<< '\t' << par[0] << '\t' << par[1] << '\t'
<< par[2] 
          <<
'\t' << par[3] << '\t' << par[4] << '\t' <<
par[5] 
          <<
'\t' << par[6] << '\t' << par[7] << '\n'; 
  } 
if (Fl_u &&
(par[7] > parn[7])) 
  { 
  Fl_u = 0; 
  dl =
-(w_z-w_s)*(par[6]-parn[6]); 
 
  u_par << x
<< '\t' << par[0] << '\t' << par[1] << '\t'
<< par[2] 
          <<
'\t' << par[3] << '\t' << par[4] << '\t' <<
par[5] 
          <<
'\t' << par[6] << '\t' << par[7] << '\n'; 
  u_f << x
<< '\t' << Fz << '\t' << Fs << '\t' << Fl 
      << '\t'
<< Fa << '\t' << U20 << '\n'; 
  } 
if ((x > 79000)
&& (x < 81000)) 
  { 
  k_par << x
<< '\t' << par[5] << '\t' << par[7] << '\n'; 
  } 
} 
 
6.2. ПОДПРОГРАММА РАСЧЕТА ВОЗМУЩАЮЩИХ УСКОРЕНИЙ, ПАРАМЕТРОВ ОРБИТЫ И
КОРРЕКЦИИ SFUN.CPP 
 
#include
"sfun.h" 
 
const real p =
4.64e-6; 
const real sm_s = 8.; 
const real A =
1.496e11; 
const real Cx = 2.; 
const real sm_a =
2.5; 
const real ro =
5.098e-13; 
 
void korr (real&
t, real *f, real *dery); 
 
void fct(real& t,
real *f, real *dery) 
{ 
real x = f[0]; 
real y = f[1]; 
real z = f[2]; 
real Vx = f[3]; 
real Vy = f[4]; 
real Vz = f[5]; 
 
real Tet_s =
(28.1+60*g_r)+w_s*t; 
real e_0 = 23.45*g_r; 
 
xs = A*cos(Tet_s); 
ys =
A*sin(Tet_s)*cos(e_0); 
zs =
A*sin(Tet_s)*sin(e_0); 
 
real Tet_l = 0+w_l*t; 
real Om_l = 0-ww_l*t; 
real i_l =
acos(cos(e_0)*cos(5.15*g_r)-sin(e_0)*sin(5.15*g_r)*cos(Om_l)); 
real rsr_l =
3.8448e8; 
 
xl =
rsr_l*(cos(Tet_l)*cos(Om_l)-cos(i_l)*sin(Tet_l)*sin(Om_l)); 
yl =
rsr_l*(cos(Tet_l)*sin(Om_l)+cos(i_l)*sin(Tet_l)*cos(Om_l)); 
zl =
rsr_l*sin(i_l)*sin(Tet_l); 
 
real R_ka =
sqrt(x*x+y*y+z*z); 
 
real Fz_x =
-mu_z*x/pow(R_ka,3.); 
real Fz_y =
-mu_z*y/pow(R_ka,3.); 
real Fz_z =
-mu_z*z/pow(R_ka,3.); 
 
real mu_sd =
p*sm_s*A*A/m; 
 
real R_s =
sqrt((x-xs)*(x-xs)+(y-ys)*(y-ys)+(z-zs)*(z-zs)); 
 
real Fs_x =
-(mu_s-mu_sd)*x/pow(R_s,3.); 
real Fs_y =
-(mu_s-mu_sd)*y/pow(R_s,3.); 
real Fs_z =
-(mu_s-mu_sd)*z/pow(R_s,3.); 
 
real R_l =
sqrt((x-xl)*(x-xl)+(y-yl)*(y-yl)+(z-zl)*(z-zl)); 
 
real Fl_x =
-mu_l*x/pow(R_l,3.); 
real Fl_y =
-mu_l*y/pow(R_l,3.); 
real Fl_z =
-mu_l*z/pow(R_l,3.); 
 
real V_ka =
sqrt(Vx*Vx+Vy*Vy+Vz*Vz); 
 
real Fa_x =
(-Cx*sm_a/(2*m))*ro*V_ka*Vx; 
real Fa_y =
(-Cx*sm_a/(2*m))*ro*V_ka*Vy; 
real Fa_z =
(-Cx*sm_a/(2*m))*ro*V_ka*Vz; 
 
const real c20 =
-1.09808e-3; 
const real c22 =
5.74e-6; 
const real d22 =
-1.58e-6; 
const real r_e =
6378137.; 
 
real cr =
mu_z*r_e*r_e/pow(R_ka,5); 
real lr =
2*atan(y/x); 
real mr =
3*(c22*cos(lr)+d22*sin(lr)); 
 
real U20_x =
cr*x*(c20*(1.5-7.5*z*z/pow(R_ka,2))+mr*(5*z*z/pow(R_ka,2)-3)); 
real U20_y =
cr*y*(c20*(1.5-7.5*z*z/pow(R_ka,2))+mr*(5*z*z/pow(R_ka,2)-3)); 
real U20_z =
cr*z*(c20*(4.5-7.5*z*z/pow(R_ka,2))+5*mr*(z*z/pow(R_ka,2)-1)); 
 
dery[0] = Vx; 
dery[1] = Vy; 
dery[2] = Vz; 
dery[3] =
(Fz_x+U20_x+Fs_x+Fl_x+Fa_x+akor[0]); 
dery[4] =
(Fz_y+U20_y+Fs_y+Fl_y+Fa_y+akor[1]); 
dery[5] =
(Fz_z+U20_z+Fs_z+Fl_z+Fa_z+akor[2]); 
 
Fz =
sqrt(Fz_x*Fz_x+Fz_y*Fz_y+Fz_z*Fz_z); 
Fs =
sqrt(Fs_x*Fs_x+Fs_y*Fs_y+Fs_z*Fs_z); 
Fl =
sqrt(Fl_x*Fl_x+Fl_y*Fl_y+Fl_z*Fl_z); 
Fa =
sqrt(Fa_x*Fa_x+Fa_y*Fa_y+Fa_z*Fa_z); 
U20 =
sqrt(U20_x*U20_x+U20_y*U20_y+U20_z*U20_z); 
 
parn[3] =
parn[3]+w_s*t; 
 
par_or(f,par); 
 
korr(t,f,dery); 
 
if ((u_last-par[7])
> 300*g_r) 
  Fl_u = 1; 
 
u_last = par[7]; 
} 
 
void korr(real&
t, real *f, real *) 
{ 
if (t >
(Tkor+172800.)) 
  { 
  if ((fabs(dl) >
0.1*g_r) && (!Fl_ka) && (!Fl_kp) && (!Fl_ki)) 
    { 
    Fl_kp = 1; 
    Fl_ka = 0; 
    Fl_ki = 0; 
    cout <<
"Результат измерений накоплен" << '\n'; 
    cout <<
"Необходима коррекция периода. dl=" << dl*r_g <<
"град." << '\n'; 
    cout <<
"Период ном.=" << parn [6] << "Период тек.="
<< par[6] << '\n'; 
    cout <<
"Параметры орбиты" << '\n'; 
    cout <<
" Rp = " << par[2]*(1-par[1]) << '\n'; 
    cout <<
" Ra = " << par[2]*(1+par[1]) << '\n'; 
    cout <<
" p = " << par[0] << '\n'; 
    cout  <<
" a = " << par[2] << " e = " << par[1]
<< "\n T = " 
           <<
par[6] << " w = " << par[5]*r_g << " u =
" << par[7]*r_g 
           <<
'\n'; 
    clrscr(); 
    } 
  } 
 
Fl_a = 0; 
Fl_p = 0; 
Fl_lu = 0; 
 
real da; 
if (par[5] >
par[7]) 
  da =
fabs(par[5]-par[7]-M_PI); 
else 
  da =
fabs(par[5]-par[7]+M_PI); 
 
if (da < .1*g_r) 
  { 
  Fl_a = 1; 
  } 
 
if (fabs(par[5] -
par[7]) < .1*g_r) 
  { 
  Fl_p = 1; 
  } 
 
if (par[7] <
.1*g_r ) 
  { 
  Fl_lu = 1; 
  } 
 
real Vk; 
 
if (T_vd) 
 
if (t >= (T_vd
+20)) 
  { 
  T_vd = 0; 
  akor[0] = 0; 
  akor[1] = 0; 
  akor[2] = 0; 
  cout <<
"Выкл.дв. \n t = " << t; 
  } 
if (((Fl_kp
&& Fl_a) || (Fl_ka && Fl_p) || (Fl_ki && Fl_lu))
&& (!T_vd)) 
  { 
  cout <<
" \n Коррекция \n"; 
  cout <<
"\n Начало t=" << t << "сек \n"; 
  int sim; 
 
  if ((t-Tkor) <
2500) 
    { 
    cout <<
"Не корректировать!"; 
    return; 
    } 
  Tkor = t; 
 
  real R_t =
sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]); 
  real V_t =
sqrt(f[3]*f[3]+f[4]*f[4]+f[5]*f[5]); 
  real R_n = parn[0]; 
 
  if (Fl_a) 
    { 
    dRa = R_t-R_n; 
    dRp =
par[2]*(1-par[1])-R_n; 
    cout <<
"Апоцентр dRp:" << dRp << "м \n"; 
    cout <<
"dRa:" << dRa << "м \n"; 
    cout <<
"w=" << par[5]*r_g << "u=" << par[7]*r_g
<< '\n'; 
    real l,ln; 
    l =
-(w_z-w_s)*par[6]; 
    ln =
-(w_z-w_s)*parn[6]; 
    dl =
-(w_z-w_s)*(par[6]-parn[6]); 
    cout <<
"T=" << par[6] << "Тном=" << parn[6]
<< " T-Tном=" 
           <<
par[6]-parn[6] << '\n' << "l=" << l*r_g <<
"lном=" 
           <<
ln*r_g << "l-lном=" << (l-ln)*r_g <<
"dl=" << dl 
           <<
'\n'; 
 
    if (dRp > 0) 
      Sig_a = -1; 
    else 
      Sig_a = 1; 
 
    cout <<
"Знак ускорения:" << Sig_a << '\n'; 
    clrscr(); 
 
    real Rp =
par[2]*(1-par[1]); 
    real Ra_p =
par[2]*(1+par[1]); 
    real Rp_p2 = Rp; 
    real Ra_p2 = R_t; 
    cout <<
"Rp=" << Rp_p2 << "Ra=" << Ra_p2 <<
'\n'; 
    cout <<
"Ra_p=" << Ra_p << "\n Rt=" << R_t
<< '\n'; 
 
    if (fabs(Rp -
R_n) < 500) 
      { 
      Fl_kp = 0; 
      Fl_ka = 1; 
      cout <<
"Закончить коррекцию в апоцентре \n" << "dRp="
<< Rp-R_n 
             <<
"dRa=" << dRa << "t=" << t << '\n'; 
      cout <<
"Параметры орбиты: \n" << "Rp=" <<
par[2]*(1-par[1]) 
             <<
"Ra=" << par[2]*(1+par[1]) << "\n p=" <<
par[0] 
             <<
"a=" << par[2] << "e=" << par[1] <<
"\n T=" 
             <<
par[6] << "w=" << par[5]*r_g << "u="
<< par[7]*r_g 
             <<
'\n'; 
      cout <<
"Суммарный импульс для коррекции перицентра=" << dV_ps <<
'\n'; 
      clrscr(); 
      } 
    else 
      { 
      if (R_t >
R_n) 
          { 
          Rp_p = R_n; 
          Ra_p = R_t; 
          a_p =
(Ra_p+Rp_p)/2.; 
          e_p =
1-Rp_p/a_p; 
          p_p =
a_p*(1-e_p*e_p); 
 
          Vk =
sqrt(mu_z/p_p)*(1-e_p); 
          } 
      else 
          { 
          Rp_p = R_t; 
          Ra_p = R_n; 
          a_p =
(Ra_p+Rp_p)/2.; 
          e_p =
1-Rp_p/a_p; 
          p_p =
a_p*(1-e_p*e_p); 
 
          Vk =
sqrt(mu_z/p_p)*(1+e_p); 
          } 
      real dV =
Vk-V_t; 
      real dVmax =
20*25./m; 
 
      cout <<
"\n dVтреб=" << dV << "dVmax за 20 сек="
<< dVmax; 
 
      if (fabs(dV)
> dVmax) 
          { 
          akor[0] =
Sig_a*(25./m)*f[3]/V_t; 
          akor[1] =
Sig_a*(25./m)*f[4]/V_t; 
          akor[2] =
Sig_a*(25./m)*f[5]/V_t; 
          cout
<< "\n dV=" << dV << "dVmax=" <<
dVmax; 
          cout
<< "\n Корректирующее ускорение:" << akor[0] <<
'\t' << akor[1] 
              
<< '\t' << akor[2] << '\t' << 
              
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << '\n'; 
 
          dV_ps =
dV_ps+dVmax; 
          cout
<< "Суммарный импульс=" << dV_ps << '\n'; 
          } 
      else 
          { 
          akor[0] =
Sig_a*(fabs(dV)/dVmax)*(25./m)*f[3]/V_t; 
          akor[1] =
Sig_a*(fabs(dV)/dVmax)*(25./m)*f[4]/V_t; 
          akor[2] =
Sig_a*(fabs(dV)/dVmax)*(25./m)*f[5]/V_t; 
          cout
<< "\n dV=" << dV << "dVmax=" <<
dVmax; 
          cout
<< "\n Корректирующее ускорение:" << akor[0] <<
'\t' << akor[1] 
              
<< '\t' << akor[2] << '\t' << 
              
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << '\n'; 
 
          dV_ps =
dV_ps+fabs(dV); 
          cout
<< "Суммарный импульс=" << dV_ps << '\n'; 
          } 
 
      if (dVmax >
fabs(dV)) 
          { 
          dVmax =
fabs(dV); 
          real Vk_r =
Sig_a*dVmax+V_t; 
          real Ra_r =
R_t; 
          real e_r =
-(Vk_r*Vk_r*Ra_r/mu_z)+1; 
          real a_r =
Ra_r/(1+e_r); 
          real p_r =
a_r*(1-e_r*e_r); 
          real Rp_r =
a_r*(1-e_r); 
          cout
<< "Параметры орбиты: \n" << " Rp_r = "
<< Rp_r 
              
<< " Ra_r = " << Ra_r << "\n p_r = "
<< p_r << " a_r = " 
              
<< a_r << " e_r = " << e_r << '\n'; 
          } 
      else 
          { 
          real Vk_r =
Sig_a*dVmax+V_t; 
          real Ra_r =
R_t; 
          real e_r =
-(Vk_r*Vk_r*Ra_r/mu_z)+1; 
          real a_r =
Ra_r/(1+e_r); 
          real p_r =
a_r*(1-e_r*e_r); 
          real Rp_r =
a_r*(1-e_r); 
          cout
<< "Параметры орбиты: \n" << " Rp_r = "
<< Rp_r 
              
<< " Ra_r = " << Ra_r << "\n p_r = "
<< p_r << " a_r = " 
              
<< a_r << " e_r = " << e_r << '\n'; 
          } 
      T_vd = t; 
      cout <<
"Вкл.дв. t=" << T_vd << '\n'; 
      } 
    } 
 
  if (Fl_p) 
    { 
    dRp = R_t-R_n; 
    dRa =
par[2]*(1+par[1])-R_n; 
    cout <<
" Перицентра - dRp:" << dRp << "м \n"; 
    cout <<
"dRa:" << dRa << "м. \n"; 
    cout <<
"w=" << par[5]*r_g << "u=" << par[7]*r_g
<< '\n'; 
    real l,ln; 
    l =
-(w_z-w_s)*par[6]; 
    ln =
-(w_z-w_s)*parn[6]; 
    dl =
-(w_z-w_s)*(par[6]-parn[6]); 
    cout <<
"T=" << par[6] << "Tном=" << parn[6]
<< "T-Tном=" 
           <<
par[6]-parn[6] << '\n' << "l=" << l*r_g <<
"lном=" 
           <<
ln*r_g << "l-lном=" << (l-ln)*r_g <<
"dl=" << dl << '\n'; 
 
    if (dRa > 0) 
      Sig_a = -1; 
    else 
      Sig_a = 1; 
 
    cout <<
"Знак ускорения:" << Sig_a << '\n'; 
    clrscr(); 
 
    real Ra =
par[2]*(1+par[1]); 
    real Rp_p1 = R_t; 
    real Ra_p1 = Ra; 
    cout <<
"Rp=" << Rp_p1 << "Ra=" << Ra_p1 <<
'\n'; 
 
    if ((fabs(Ra-R_n)
< 500) || (fabs(dl*r_g) < .0001)) 
      { 
      cout <<
"Закончить коррекцию в перицентре \n" << "dRa=" 
             <<
Ra-R_n << "dRp=" << dRp << "t=" <<
t << '\n'; 
      cout <<
"Параметры орбиты: \n " << "Rp=" 
             <<
par[2]*(1-par[1]) << "Ra=" << par[2]*(1+par[1]) 
             <<
" \n p=" << par[0] << "a=" << par[2]
<< "e=" 
             <<
par[1] << " \n T=" << par[6] << "w="
<< par[5]*r_g 
             <<
"u=" << par[7]*r_g << '\n'; 
 
      cout <<
"Суммарный импульс для коррекции перицентра=" << dV_as <<
'\n'; 
 
      clrscr(); 
 
      Fl_ka = 0; 
      Fl_ki = 1; 
      } 
    else 
      { 
      if (R_t >
R_n) 
          { 
          Rp_p = R_n; 
          Ra_p = R_t; 
          a_p =
(Ra_p+Rp_p)/2.; 
          e_p =
1-Rp_p/a_p; 
          p_p =
a_p*(1-e_p*e_p); 
 
          Vk =
sqrt(mu_z/p_p)*(1-e_p); 
          } 
      else 
          { 
          Rp_p = R_t; 
          Ra_p = R_n; 
          a_p =
(Ra_p+Rp_p)/2.; 
          e_p =
1-Rp_p/a_p; 
          p_p =
a_p*(1-e_p*e_p); 
 
          Vk =
sqrt(mu_z/p_p)*(1+e_p); 
          } 
      real dV =
Vk-V_t; 
      real dVmax =
20*25./m; 
 
      cout <<
"\n dVнадо=" << dV << " dVmax за 20 сек="
<< dVmax; 
 
      if (fabs(dV)
> dVmax) 
          { 
          akor[0] =
Sig_a*(25./m)*f[3]/V_t; 
          akor[1] =
Sig_a*(25./m)*f[4]/V_t; 
          akor[2] =
Sig_a*(25./m)*f[5]/V_t; 
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9 
   
 |