• 计算GDOP


    #include <iostream>
    #include <fstream>
    #include "..includeCPosition.h"
    #include "..includeConstant.h"
    #include "..includeData.h"
    #include<stdio.h>
    #define MATHRES 1E-12
    #define FOUR 4
    typedf struct{
     
           int prn;
           XYZCoor pos;
    }SVPosStruct;
    int Maxsat;
    int ReadSatPosFile(FILE*SVPosFile,SVPosStruct*SV);
    int fun(int n);
    void ComputeDOP2(XYZCoor Obs,XYZCoor SV[4],DOPStruct*DOP);
    void main()
    {
     
      double a=6378137.0;
      double e2=0.00669342162297;
      double PAI=3.1415926535898;
      double P0=PAI/180.0;
      double N;
      XYZCoor ObsPos;
      int LatDeg,LonDeg,LatMin,LonMin;
      float LatSec,LonSec,H,B,L;
      FILE*SVPosFile,*SVDOPFile;
      int i,j,k,ri,num;
      int array[4];
      int temp;
      XYZCoor SV[4];
      int SVNo[4];
      SVPosStruct*SVPos;
      DOPStruct DOP;
      prinf("Please Input local Lat(dd mm.mmmm):");
      scanf("%i %f",&LatDeg,&LatMin);
      B=((float)LatDeg+LatMin/60.0)*P0;
      prinf("Please Input local Lon(ddd mm.mmmm):");
      scanf("%i %f",&LonDeg,&LonMin);
      L=((float)LonDeg+LonMin/60.0)*P0;
      prinf("Please Input local Height(meter):");
      scanf("%f",&H);
      B=(LatDeg+LatMin/60.0+LatSec/3600.0)*P0;
      L=(LonDeg+LonMin/60.0+LonSec/3600.0)*P0;
      N=a/sqr(1.0-e2*sin(B)*sin(B));
      ObsPos.X=(N+H)*cos(B)*cos(L);
      ObsPos.Y=(N+H)*cos(B)*sin(L);
      ObsPos.Z=(N*(1.0-e2)+H)*sin(B);
      if((SVPosFile=fopen("satpos.out","r"))==NULL)
        {
    prinf("cannot open input file
    ");
         exit(1);
          
    }
      if((SVDOPFile=fopen("satdop.out","w"))==NULL)
        {
    prinf("cannot open output file
    ");
         exit(1);
          
    }
      if((SVPos=(SVPosStruct*)malloc(sizeof(SVPosStruct)*12))==NULL)
        {
    prinf("not enough memory to allocate buffer
    ");
         exit(1);
          
    }
      MaxSat=0;
      i=0;
      do
         {
     
          if(ReadSatPosFile(SVPosFile,(SVPos+i)))break;
          i++;
          if(i>=12)break;
          
    }while(1);
      if(MaxSat<4)
        {
    prinf("not enough satellite to compute DOP
    ");
         exit(1);
         
    }
      num=fun(MaxSat)/(fun(MaxSat-4)*fun(4));
      fprinf(SVDOPFile,"SV Combinnation GDOP
    ");
      ri=1;
      array[1]=MaxSat;
      do
         {
     
          if(ri!=FOUR)
          if((ri+array[ri])>FOUR)
          {
    array[ri+1]=array[ri]-1;
           ri++:
           
    }
          else
         {
    ri--;array[ri]--;
    }
          else
         {
    for(j=1;j<=FOUR;j++)
           {
    SVNo[j-1]=(SVPos+array[j]-1)->prn;
            SV[j-1].X=(SVPos+array[j]-1)->pos.X
            SV[j-1].Y=(SVPos+array[j]-1)->pos.Y
            SV[j-1].Z=(SVPos+array[j]-1)->pos.Z;
            
    }
          ComputeDOP2(ObsPos,SV,&DOP);
          fprinf(SVDOPFile,"%02d %02d-%02d-%02d %6.1f
    ",SVNo[0],SVNo[1],SVNo[2],SVNo[3],DOP.GDOP);
          if(array[FOUR]--1)
            {
    ri--;array[ri]--;
    }
          else
            {
    array[ri]--;
    }
           
    }
           
    }while(array[1]!=FOUR-1);
          fclose(SVPosFile);
          fclose(SVDOPFile);
          free(SVPos); 
      int fun(int n)
        {
     int i;
          int res;
          if(n<0)return0;
          res=1;
          for(i=1;i<=n;i++)res*=i;
          return res;
         
    }
      int ReadSatPosFile(FILE*SVPosFile,SVPosStruct*SV)
        {
     char t1[30],t2[30],t3[30];
          if(fscanf(SVPosFile,"%d%s%s%s
    ",&SV->prn,t1,t2,t3))
          return 1;
          SV->pos.X=atof(t1);
          SV->pos.Y=atof(t2);
          SV->pos.Z=atof(t3);
          MaxSat++;
          if(MaxSat>=12)return 1;
          return 0;
         
    }
      void ComputeDOP2(XYZCoor Obs.XYZCoor SV[4],DOPStract*DOP)
        {
     double PAI=3.1415926535898;
          double P0=PAI/180.0;
          int Row=4,Col=4;
          int n=Row;
          double Qp[4][4];
          double Qpt[4][4];
          double QptXQp[4][4]; 
          double Q[4][4];
          int i,j,k,ii,jj;
          double Temp;
          double b,max,A[4][4];
          int *z;
          for(i=0;i<Row;i++)
            {
    Temp=sqrt((Obs.X-SV[i].X)*(Obs.X-SV[i].X)+(Obs.Y-SV[i].Y)*(Obs.X-SV[i].Y)+(Obs.Z-SV[i].Z)*(Obs.X-SV[i].Z));
             Qp[i][0]=(SV[i].X-Obs.X)/Temp;
             Qp[i][1]=(SV[i].Y-Obs.Y)/Temp;
             Qp[i][2]=(SV[i].Z-Obs.Z)/Temp;
             Qp[i][3]=1.0;
             
    }
          for(i=0;i<Row;i++)
          for(j=0;j<Col;j++)
             Qpt[i][j]=Qpt[j][i];
          for(i=0;i<Row;i++)
            {
    for(j=0;j<Col;j++)
               {
    Temp=0.0;
                for(k=0;k<4;k++)Temp=Qpt[i][k]*Qp[k][j];
                QptXQp[i][j]=Temp;
                
    }
              
    }
          z=(int*)malloc(sizeof(int)*2*n);
          for(i=0;i<Row;i++)
            {
    for(j=0;j<Col;j++)
             A[i][j]=QptXQp[j][i];
             
    }
          for(k=0;k<n;k++)
            {
    max=0;
             for(i=k;i<n;i++)
          for(j=k;j<n;j++)
            {
    b=fabs(A[i][j]);
             if(max<b)
              {
    ii=i;jj=j;max=b;
               
    }
             
    }
             if(max<MATHRES)
              {
    free(z);
               prinf(The matrix isn't rank enough...");
               
    }
             max=1.0/((A[ii][jj]));
             A[ii][jj]=1;
             z[2*k]=ii;
             A[2*k+1]=jj
             if(ii!=k)
              {
    for(j=0;j<n;j++)
                {
    b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b;
                 
    }
               
    }
             if(jj!=k)
              {
    for(j=0;j<n;j++)
                {
    b=A[j][jj];A[jj][j]=A[j][k];A[j][k]=b;
     
                 
    }
               
    }
             for(j=0;j<n;j++)
               A[k][j]*=max;
             for(i=0;i<n;i++) 
              {
    if(i!=k)
                {
    max=A[i][k]; A[i][k]=0.0;
                 for(j=0;j<n;j++) A[i][j]=A[i][j]-max*A[k][j];
                 
    }
               
    }
             for(k=n-2;k>=0;k--)
              {
    ii=z[2*k+1];jj=[2*k];
                if(ii!=k)
                 {
    for(j=0;j<n;j++)
                   {
    b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b;
                    
    }
                  
    }
                if(jj!=k)
                 {
    for(j=0;j<n;j++)
                   {
    b=A[j][ii];A[j][ii]=A[j][k];A[j][k]=b;
                    
    }
                  
    }
               
    }
             for(i=0;i<Row;i++)
              {
    for(j=0;j<Col;j++)
               Q[i][j]=A[i][j];
               
    }
             free(z);
             Temp=0.0;for(i=0;i<n;i++)Temp+=Q[i][i];DOP->GDOP=sqrt(Temp);
          
    }
  • 相关阅读:
    合并本地多次commit为一个commit
    git 取消文件跟踪
    遍历进程 遍历窗口
    linux查看程序运行参数
    ubuntu下载地址
    将博客搬至CSDN
    extern"C"的使用
    ESP32-NVS存储(非易失性存储库)
    ESP32-EEPROM存储
    c语言简单数据类型
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/7795778.html
Copyright © 2020-2023  润新知