#include<iostream.h>
#include "math.h"
#define GM 3.9860047e+14
#define we 7.292115e-5 //地球自转角速度
void main()
{
cout<<"输入瞬时时刻t"<<endl;
float t;
cin>>t;
/*计算卫星运动的平均角速度n*/
cout<<"输入卫星广播星历给出的参数√ A"<<endl;
float gA;
cin>>gA;
float n0;
n0=sqrt(GM)/pow(gA,3); //参考时刻TOE的平均速度n0
cout<<"输入卫星广播星历给定的摄动参数Δn"<<endl;
float deltan;
cin>>deltan;
float n; //观测时刻卫星的平均角速度n
n=n0+deltan;
/*计算观测瞬间卫星的平近点角M*/
cout<<"输入广播星历给出的参考时刻TOE时的平近角点M0"<<endl;
float M0;
cin>>M0;
cout<<"输入参考时刻TOE"<<endl;
float TOE;
cin>>TOE;
float M; //观测瞬间卫星的平近角点
M=M0+n*(t-TOE);
/*计算偏近角点*/
cout<<"输入地球长半轴a和短半轴b"<<endl;
float a,b,e; //分别为长半轴,短半轴,偏心率
cin>>a>>b;
e=sqrt(a*a-b*b)/a; //计算偏心率
float E=0; //给初值
while(fabs(E-(M+e*sin(E)))>1.0e-6)
E=M+e*sin(E); //迭代法计算E
/*计算真近点角f*/
float f;
f=atan(sqrt(1-e*e)*sin(E)/(cos(E)-e));
/*计算升交距角u0*/
float u0;
cout<<"输入卫星广播星历给出的近地点角距w"<<endl;
float w;
cin>>w;
u0=w+f;
/*计算摄动改正项δu,δrδi*/
float deltau,deltar,deltai;
cout<<"输入广播星历中给出的6个摄动参数Cuc,Cus,Crc,Crs,Cic,Cis"<<endl;
float Cuc,Cus,Crc,Crs,Cic,Cis;
cin>>Cuc>>Cus>>Crc>>Crs>>Cic>>Cis;
deltau=Cuc*cos(2*u0)+Cus*sin(2*u0);
deltar=Crc*cos(2*u0)+Crs*sin(2*u0);
deltai=Cic*cos(2*u0)+Cis*sin(2*u0);
/*对u0,r0,i0进行摄动改正*/
float u,r,i,i0;
cout<<"输入广播星历中开普勒六参数给出的TOE时刻的轨道倾角i0"<<endl;
cin>>i0;
cout<<"输入由广播星历中的摄动九参数给出的i的变化率didt"<<endl;
float didt;
cin>>didt;
u=u0+deltau;
r=a*(1-e*cos(E))+deltar;
i=i0+deltai+didt*(t-TOE);
/*计算卫星在轨道面坐标系中的位置*/
float x,y;
x=r*cos(u);
y=r*sin(u);
/*计算观测瞬间升交点的经度L*/
cout<<"输入参考时刻TOE时升交点的赤经OTOE"<<endl;
float OTOE;
cin>>OTOE;
cout<<"输入广播星历的摄动参数中给出的升交点对时间的变化率O1"<<endl;
float O1;
cin>>O1;
float O; //观测瞬间t的升交点赤经O
O=OTOE+O1*(t-TOE);
cout<<"输入观测瞬间对应的本周内的时刻t0"<<endl;
float t0;
cin>>t0;
cout<<"输入本周开始时刻(星期日0时)格林尼治时GASTweek"<<endl;
float GASTweek,GAST; //GAST为观测瞬间的格林尼治恒星时
cin>>GASTweek;
GAST=GASTweek+we*t0;
float L; //观测瞬间升交点的经度L
L=O-GAST;
/*计算卫星在瞬时地球坐标系中的位置*/
float X,Y,Z;
X=x*cos(L)-y*cos(i)*sin(L);
Y=x*sin(L)+y*cos(i)*cos(L);
Z=y*sin(L);
cout<<"卫星在瞬时地球坐标系中的位置为:"<<endl;
cout<<"X:"<<X<<endl<<"Y:"<<Y<<endl<<"Z:"<<Z<<endl;
}
- 1
- 2
- 3
前往页