/*----------------------------------------------------------------
卫星绕地球运动的模拟程序(地心坐标系并且设卫星的质量极小)
<改进29楼程序的时分秒处理>
----------------------------------------------------------------*/
#include <stdio.h>
#include <math.h>
const double dt = 10e-3; //步长10毫秒(可调整)
const double TPI=2*3.1415926535897932;
const double GM=6.672e-11 * 5.976e+24;
const double Re=6371000; //地球平均半径(米);
double g(double r) //距地心r处的重力加速度
{
return GM/(r*r);
}
void hms(double tim,int*hh,int*mm,double*ss)
// 将tim中的秒数化成 hh小时 mm分 ss秒
{
*hh = (int)(tim/3600);
tim = tim - *hh*3600 ;
*mm = (int)(tim / 60);
*ss = tim - *mm * 60 ;
}
int main( )
{
double H; //卫星距地球表面的高度
double V; //卫星相对于地心的速率
double alpha; //卫星运动的仰角
double tim=0; //计时器(秒)
double the=0; //卫星的真近点角
double S=0.0; //卫星的当前里程
double r; //卫星的地心距离
double dth; //真近点角的增量
int second=0; //存放前一秒钟
int hh,mm; //小时、分
double ss; //秒(含有小数)
alpha=0; //仰角的缺省值
{ //这些红色代码可验证本模拟程序,删除掉也可以
double Hmax,Hmin,Hav,aa,bb,cc,ee,Vmax,Vmin,T;
printf("近地点高度(千米)、远地点高度(千米)=");
scanf("%lf%*c%lf",&Hmin,&Hmax);
Hmin*=1e3;Hmax*=1e3;
Hav=(Hmax+Hmin)/2;
aa=Re+Hav;
cc=(Hmax-Hmin)/2;
bb=sqrt(aa*aa-cc*cc);
ee=cc/aa;
printf("\na=%.0f千米,b=%.0f千米,c=%.0f千米,e=%.3f\n\n",
aa/1e3,bb/1e3,cc/1e3,ee);
printf(" %.3f \n",bb*bb/aa/1e3);
printf("极坐标方程为r=────────\n");
printf(" 1+%0.3fcosθ\n\n",ee);
Vmax=sqrt(GM*(2/(aa-cc)-1/aa)); //用活力公式计算近地点速度
Vmin=sqrt(GM*(2/(aa+cc)-1/aa)); //用活力公式计算远地点速度
printf("Vmax=%.3f(米/秒),Vmin=%.3f(米/秒)\n\n",Vmax,Vmin);
T=TPI/sqrt(GM)*pow(aa,1.5); //理论周期(秒)
hms(T,&hh,&mm,&ss);
printf("T=%02d:%02d:%.3f\n\n",hh,mm,ss);
printf("press Enter key to continue....");
getchar();getchar();
}
printf("\n高度(千米) 速度(米/秒) 仰角(度) =");
scanf("%lf%*c%lf%*c%lf",&H,&V,&alpha);
alpha*=TPI/360;
H*=1000;
r=Re+H;
printf("\n高度(千米) 速度(米/秒) 仰角(度) θ角(度) hh:mm:ss.cc 里程(千米)\n");
do
{
double ds=V*dt;
double sa=sin(alpha),ca=cos(alpha),gt=g(r)*dt;
double r0=r;
r=sqrt(r*r+ds*ds+2*r*ds*sa)-0.5*gt*dt;
dth=V*ca*dt/r;//坐标系随卫星旋转dθ角
S+=sqrt(pow(r-r0,2)+r*r0*dth*dth);
V-=gt*sa; //t+dt时刻的速度
alpha+=dth-gt*ca/V; //刷新仰角
the+=dth; //刷新卫星的近点角
tim+=dt; //刷新计时器的秒数
hms(tim,&hh,&mm,&ss);
if(fabs(ss-second)>=1){ second=(int)ss;
printf("%-11.2f%-12.3f%-9.3f%-9.3f%02d:%02d:%5.2f %-9.2f\n",
(r-Re)/1e3,V,alpha/TPI*360,the/TPI*360,hh,mm,ss, S/1e3);}
}
while(the<TPI);
S*=TPI/the;
tim*=TPI/the;
printf("轨道周长=%.3f千米\n",S/1e3);
printf("轨道周期=%.3f秒\n",tim);
printf("平均速度=%.3f米/秒\n",S/tim);
return 0;
}