📄 sp3.cpp
字号:
#include "SP3.h"
#include "StdAfx.h"
#include "GlobleDefine.h"
#include "fstream.h"
#include "Matrixcsl.h"
#include "TimeCorTran.h"
#include "math.h"
/*void VECTORLAGRANGE(long double x, long double *xi, long double **yi,int iTimeOrderN,long double *y,int iDim )
{
int i,j,k,p;
long double dCofficient;//插值求待求点值
long double dDerivaBase;//插值求待求点导数
long double dDerivaIni;
for (k=0;k<2*iDim;k++)
{
y[k]=0;
}
//const int N =17;
for(i=0;i<iTimeOrderN;i++)
{
dCofficient =1.0;
dDerivaBase =1.0;
dDerivaIni =0.0;
for(j=0;j<iTimeOrderN; j++)
{ if(j!=i)
{
dCofficient=dCofficient*(x-xi[j])/(xi[i]-xi[j]);
dDerivaBase=dDerivaBase*10000/(xi[i]-xi[j]);
}
else continue;
}
long double lRem=dDerivaBase/10000;// for(j=0; j<iTimeOrderN; j++)
{
if(j!=i)
{
dDerivaBase=1.0;
for(p=0;p<iTimeOrderN;p++)
{
if((p!=i)&&(p!=j))
{
dDerivaBase=dDerivaBase *(x-xi[p])/10000;
}
else continue ;
}
dDerivaIni+=dDerivaBase;
}
else continue;
}
for (k=0;k<iDim;k++)
{
y[k]=y[k]+yi[i][k]*dCofficient;
}
for (k=iDim;k<2*iDim;k++)
{
y[k]=y[k]+yi[i][k-iDim]*dDerivaIni*lRem;
}
}
}
*/
void NEWTONCOEF(long double *xi, long double **yi,long double **coef,int iPolyOrder,int iDim )
{
int i,j,k,p;
long double *lBase =new long double[iPolyOrder];
for(j=0;j<iDim;j++)
{ coef[0][j]=yi[0][j];
for(i=1;i<iPolyOrder;i++)
{
for(p=0;p<iPolyOrder;p++)
lBase[p]=1;
long double lSum=0;
for(k=0;k<i;k++)
{ lBase[i]*=(xi[i]-xi[k]);
if((k+1)<i)
lSum+=(coef[k+1][j]*lBase[i]);
}
coef[i][j]=(yi[i][j]-yi[0][j]-lSum)/lBase[i];
}
}
}
void CREATSP3POLYCOEF(int iIni, int iPolyOrder,int iSatPrn,long double **coef,NAVSP3EPO *RecordEpo)
{
long double *xi;
long double **yi;
xi=new long double[iPolyOrder];
yi=TwoArrayAlloc(iPolyOrder,3);
GPSTIME time;
UTCCOVGPS(&RecordEpo[iIni].EpoTime,&time);
for (int i=0;i<iPolyOrder;i++)
{
xi[i]=time.dWEEKSECONDS+900*i;
yi[i][0]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lX;
yi[i][1]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lY;
yi[i][2]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lZ;
//yi[i][3]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.lT;
}
NEWTONCOEF(xi,yi,coef,iPolyOrder,3);
delete[]xi;
TwoArrayFree(yi);
}
void CREATCLKPOLYCOEF(int iIni, int iPolyOrder,int iSatPrn,long double **coef,NAVSP3EPO *RecordEpo)
{
long double *xi;
long double **yi;
xi=new long double[iPolyOrder];
yi=TwoArrayAlloc(iPolyOrder,1);
GPSTIME time;
UTCCOVGPS(&RecordEpo[iIni].EpoTime,&time);
for (int i=0;i<iPolyOrder;i++)
{
xi[i]=time.dWEEKSECONDS+900*i;
//yi[i][0]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lX;
//yi[i][1]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lY;
//yi[i][2]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.xyz.lZ;
if(RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.lT>10000.0)
{ if(RecordEpo[i+iIni-1].NavSp3[iSatPrn-1].xyzt.lT>10000.0)
RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.lT=RecordEpo[i+iIni-2].NavSp3[iSatPrn-1].xyzt.lT;
else RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.lT=RecordEpo[i+iIni-1].NavSp3[iSatPrn-1].xyzt.lT;
}
yi[i][0]=RecordEpo[i+iIni].NavSp3[iSatPrn-1].xyzt.lT;
}
NEWTONCOEF(xi,yi,coef,iPolyOrder,1);
delete[]xi;
TwoArrayFree(yi);
}
void READNAVSP3HEAD(ifstream InFile,ofstream OutFile,NAVSP3HEAD &head)
{
char str[81];
CString s;
InFile.getline(str,81,'\n');
s=str;
head.CPorV = str[2];
head.FirstTime.iYEAR = atoi(s.Mid(3,5));
head.FirstTime.iMONTH = atoi(s.Mid(8));
head.FirstTime.iDAY = atoi(s.Mid(11));
head.FirstTime.iHOUR = atoi(s.Mid(14));
head.FirstTime.iMINUTE = atoi(s.Mid(17));
head.FirstTime.dSECOND = atof(s.Mid(20));
head.iEpoNumber = atoi(s.Mid(32));
InFile.getline(str,81,'\n');
s=str;
head.iWeek = atoi(s.Mid(3));
head.dSecond = atof(s.Mid(8));
head.dInterval = atof(s.Mid(24));
head.iMjdDay = atoi(s.Mid(39));
head.dMjdDayFra = atof(s.Mid(45));
InFile.getline(str,81,'\n');
s=str;
head.iRealSatNumber = atoi(s.Mid(4));
if(head.iRealSatNumber>MAXNAVSAT)
head.iRealSatNumber=29; // the others are GLONASS satellites in COD*.EPH FILE
do
{
InFile.getline(str,81,'\n');
}while(!(str[0]=='*')||!(str[1]==' '));
}
int READNAVSP3RECORD(ifstream InFile,ofstream OutFile,NAVSP3EPO *RecordEpo, int iEpoSatNum)
{
InFile.seekg(-30,ios::cur);
char str[82];
CString s;
int i=0;
while(1)
{
InFile.getline(str,82,'\n');
if(strstr(str,"EOF"))
break;
if(strstr(str,"PR")) //just for COD's EPh files
continue;
if (str[0]==0)
continue;
s=str;
RecordEpo[i].EpoTime.iYEAR = atoi(s.Mid(3));
RecordEpo[i].EpoTime.iMONTH = atoi(s.Mid(8));
RecordEpo[i].EpoTime.iDAY = atoi(s.Mid(11));
RecordEpo[i].EpoTime.iHOUR = atoi(s.Mid(14));
RecordEpo[i].EpoTime.iMINUTE = atoi(s.Mid(17));
RecordEpo[i].EpoTime.dSECOND = atof(s.Mid(20));
for(int j=0;j<iEpoSatNum;j++)
{
InFile.getline(str,82,'\n');
if (str[0]==0)
continue;
if (str[0]=='*')
{ printf(" The SP3 file is damaged for absence of satellite Pos record.\n");
for(int isize=0;isize<82;isize++)
if(str[isize]==0)
break;
InFile.seekg(-isize-4,ios::cur);
break;
}
s=str;
int iPRN = atoi(s.Mid(2));
RecordEpo[i].NavSp3[iPRN-1].iPrn = iPRN ;
RecordEpo[i].NavSp3[iPRN-1].xyzt.xyz.lX = atof(s.Mid(4));
RecordEpo[i].NavSp3[iPRN-1].xyzt.xyz.lY = atof(s.Mid(18));
RecordEpo[i].NavSp3[iPRN-1].xyzt.xyz.lZ = atof(s.Mid(32));
RecordEpo[i].NavSp3[iPRN-1].xyzt.lT = atof(s.Mid(46));
/* if (strlen(str)>60)
{
RecordEpo[i].NavSp3[iPRN-1].lDX = atof(s.Mid(60));
RecordEpo[i].NavSp3[iPRN-1].lDY = atof(s.Mid(63));
RecordEpo[i].NavSp3[iPRN-1].lDZ = atof(s.Mid(66));
RecordEpo[i].NavSp3[iPRN-1].lDT = atof(s.Mid(69));
}*/
}
i++;
}
return 1;
}
int ININUMFROMTIME(double dEpoNum,int iPolyOrder)
{
int iTimeOrder= int(dEpoNum/30);
int iIni=0;
int iSemiTimeOrder=(iPolyOrder-1)/2;
if ((iTimeOrder>=iSemiTimeOrder)&&(iTimeOrder<(96-iSemiTimeOrder)))
iIni=iTimeOrder-iSemiTimeOrder;
if (iTimeOrder>=(96-iSemiTimeOrder))
iIni=96-iPolyOrder;
return iIni;
}
// 牛顿法内插卫星星历
void GETSATPOSFROMSP3(long double t,int iIni,int iPolyOrder,NAVSP3EPO *RecordEpo,long double **lCof,SATPOS &Pos)
{ int i;
long double *xi;
xi=new long double[iPolyOrder];
GPSTIME time;
UTCCOVGPS(&RecordEpo[iIni].EpoTime,&time);
xi[0]=time.dWEEKSECONDS;
for (i=1;i<iPolyOrder;i++)
{
xi[i]=xi[i-1]+900;
}
Pos.time.dWEEKSECONDS=t;
Pos.xyz.lX =0,Pos.xyz.lY =0,Pos.xyz.lZ =0;
Pos.Dotxyz.lX=0,Pos.Dotxyz.lY=0,Pos.Dotxyz.lZ=0;
/**/
long double lBase=1;
for (i=0;i<iPolyOrder;i++)
{
lBase*=(t-xi[i-1]);
if(i==0)
lBase=1.0;
Pos.xyz.lX +=(lCof[i][0]*lBase*1e+3);
Pos.xyz.lY +=(lCof[i][1]*lBase*1e+3);
Pos.xyz.lZ +=(lCof[i][2]*lBase*1e+3);
//pSatClk[0]+=(lCof[i][3]*lBase*1e-6);
}/**/
long double lSum;
for (i=0;i<iPolyOrder;i++)
{
if(i==0)
{
lBase=1.0;lSum=0;
}
else
{
lBase*=(t-xi[i-1]);
lSum+=(1/(t-xi[i-1]));
}
Pos.Dotxyz.lX +=lSum*(lCof[i][0]*lBase*1e+3);
Pos.Dotxyz.lY +=lSum*(lCof[i][1]*lBase*1e+3);
Pos.Dotxyz.lZ +=lSum*(lCof[i][2]*lBase*1e+3);
// pSatClk[1] +=lSum*(lCof[i][3]*lBase*1e-6);
}/**/
}
void GETSATCLKFROMSP3(long double t,int iIni,int iPolyOrder,NAVSP3EPO *RecordEpo,long double **lCof,long double *pSatClk)
{ int i;
long double *xi;
xi=new long double[iPolyOrder];
GPSTIME time;
UTCCOVGPS(&RecordEpo[iIni].EpoTime,&time);
xi[0]=time.dWEEKSECONDS;
for (i=1;i<iPolyOrder;i++)
{
xi[i]=xi[i-1]+900;
}
/*
Pos.time.dWEEKSECONDS=t;
Pos.xyz.lT =0;
Pos.Dotxyz.lX=0;*/
pSatClk[0]=0;
pSatClk[1]=0;
/**/
long double lBase=1;
for (i=0;i<iPolyOrder;i++)
{
lBase*=(t-xi[i-1]);
if(i==0)
lBase=1.0;
/*
Pos.xyz.lX +=(lCof[i][0]*lBase*1e+3);
Pos.xyz.lY +=(lCof[i][1]*lBase*1e+3);
Pos.xyz.lZ +=(lCof[i][2]*lBase*1e+3);*/
pSatClk[0]+=(lCof[i][0]*lBase*1e-6);
}/**/
long double lSum;
for (i=0;i<iPolyOrder;i++)
{
if(i==0)
{
lBase=1.0;lSum=0;
}
else
{
lBase*=(t-xi[i-1]);
lSum+=(1/(t-xi[i-1]));
}
/*
Pos.Dotxyz.lX +=lSum*(lCof[i][0]*lBase*1e+3);
Pos.Dotxyz.lY +=lSum*(lCof[i][1]*lBase*1e+3);
Pos.Dotxyz.lZ +=lSum*(lCof[i][2]*lBase*1e+3);*/
pSatClk[1] +=lSum*(lCof[i][0]*lBase*1e-6);
}/**/
}
// 拉格朗日法内插卫星星历
/*void GETSATPOSFROMSP3(double t ,int iTimeOrder ,int iSatPrn,NAVSP3EPO *RecordEpo,SATPOS &Pos,long double *pSatClk)
//iTimeOrder为UTC时转化为日秒在一天中15分间隔对应的顺序号
{ const int iPolyOrder=7;
//实践检验,当iPolyOrder为13或以下值(如11)时其结果最为稳定
//内插精度在几个厘米,中间历元可达2至3毫米,外推一个历元(15分钟)在几个分米
const int iDim=4;
int iSemiTimeOrder=(iPolyOrder-1)/2;
long double *dX=new long double[iPolyOrder];
long double **dY=TwoArrayAlloc(iPolyOrder,iDim);
long double dVec[2*iDim];
VECTORLAGRANGE(t,dX,dY,iPolyOrder,dVec,iDim);
TwoArrayFree(dY);
delete dX;
Pos.iPRN =iSatPrn;
Pos.dT =t;
Pos.xyz.lX =dVec[0]*1e+3;
Pos.xyz.lY =dVec[1]*1e+3;
Pos.dZ =dVec[2]*1e+3;
pSatClk[0]=dVec[3]*1e-6;
Pos.Dotxyz.lX =dVec[4]*1e+3;
Pos.Dotxyz.lY =dVec[5]*1e+3;
Pos.Dotxyz.lZ =dVec[6]*1e+3;
pSatClk[1]=dVec[7]*1e-6;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -