计算GDOP
#include <iostream>
#include <fstream>
#include "..\include\CPosition.h"
#include "..\include\Constant.h"
#include "..\include\Data.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[],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[];
int temp;
XYZCoor SV[];
int SVNo[];
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\n");
exit(); }
if((SVDOPFile=fopen("satdop.out","w"))==NULL)
{
prinf("cannot open output file\n");
exit(); }
if((SVPos=(SVPosStruct*)malloc(sizeof(SVPosStruct)*))==NULL)
{
prinf("not enough memory to allocate buffer\n");
exit(); }
MaxSat=;
i=;
do
{ if(ReadSatPosFile(SVPosFile,(SVPos+i)))break;
i++;
if(i>=)break; }while();
if(MaxSat<)
{
prinf("not enough satellite to compute DOP\n");
exit(); }
num=fun(MaxSat)/(fun(MaxSat-)*fun());
fprinf(SVDOPFile,"SV Combinnation GDOP\n");
ri=;
array[]=MaxSat;
do
{ if(ri!=FOUR)
if((ri+array[ri])>FOUR)
{
array[ri+]=array[ri]-;
ri++: }
else
{
ri--;array[ri]--;
}
else
{
for(j=;j<=FOUR;j++)
{
SVNo[j-]=(SVPos+array[j]-)->prn;
SV[j-].X=(SVPos+array[j]-)->pos.X
SV[j-].Y=(SVPos+array[j]-)->pos.Y
SV[j-].Z=(SVPos+array[j]-)->pos.Z; }
ComputeDOP2(ObsPos,SV,&DOP);
fprinf(SVDOPFile,"%02d %02d-%02d-%02d %6.1f\n",SVNo[],SVNo[],SVNo[],SVNo[],DOP.GDOP);
if(array[FOUR]--)
{
ri--;array[ri]--;
}
else
{
array[ri]--;
} } }while(array[]!=FOUR-);
fclose(SVPosFile);
fclose(SVDOPFile);
free(SVPos);
int fun(int n)
{
int i;
int res;
if(n<)return0;
res=;
for(i=;i<=n;i++)res*=i;
return res; }
int ReadSatPosFile(FILE*SVPosFile,SVPosStruct*SV)
{
char t1[],t2[],t3[];
if(fscanf(SVPosFile,"%d%s%s%s\n",&SV->prn,t1,t2,t3))
return ;
SV->pos.X=atof(t1);
SV->pos.Y=atof(t2);
SV->pos.Z=atof(t3);
MaxSat++;
if(MaxSat>=)return ;
return ; }
void ComputeDOP2(XYZCoor Obs.XYZCoor SV[],DOPStract*DOP)
{
double PAI=3.1415926535898;
double P0=PAI/180.0;
int Row=,Col=;
int n=Row;
double Qp[][];
double Qpt[][];
double QptXQp[][];
double Q[][];
int i,j,k,ii,jj;
double Temp;
double b,max,A[][];
int *z;
for(i=;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][]=(SV[i].X-Obs.X)/Temp;
Qp[i][]=(SV[i].Y-Obs.Y)/Temp;
Qp[i][]=(SV[i].Z-Obs.Z)/Temp;
Qp[i][]=1.0; }
for(i=;i<Row;i++)
for(j=;j<Col;j++)
Qpt[i][j]=Qpt[j][i];
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
{
Temp=0.0;
for(k=;k<;k++)Temp=Qpt[i][k]*Qp[k][j];
QptXQp[i][j]=Temp; } }
z=(int*)malloc(sizeof(int)**n);
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
A[i][j]=QptXQp[j][i]; }
for(k=;k<n;k++)
{
max=;
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]=;
z[*k]=ii;
A[*k+]=jj
if(ii!=k)
{
for(j=;j<n;j++)
{
b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b; } }
if(jj!=k)
{
for(j=;j<n;j++)
{
b=A[j][jj];A[jj][j]=A[j][k];A[j][k]=b; } }
for(j=;j<n;j++)
A[k][j]*=max;
for(i=;i<n;i++)
{
if(i!=k)
{
max=A[i][k]; A[i][k]=0.0;
for(j=;j<n;j++) A[i][j]=A[i][j]-max*A[k][j]; } }
for(k=n-;k>=;k--)
{
ii=z[*k+];jj=[*k];
if(ii!=k)
{
for(j=;j<n;j++)
{
b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b; } }
if(jj!=k)
{
for(j=;j<n;j++)
{
b=A[j][ii];A[j][ii]=A[j][k];A[j][k]=b; } } }
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
Q[i][j]=A[i][j]; }
free(z);
Temp=0.0;for(i=;i<n;i++)Temp+=Q[i][i];DOP->GDOP=sqrt(Temp); }
计算GDOP的更多相关文章
- GPS精度因子(GDOP,PDOP,HDOP,VDOP,TDOP)
PDOP:位置精度因子(Position Dilution of Precision),直译为“精度强弱度”,通常翻译为“相对误差”.具体含义是:由于观测成果的好坏与被测量的人造卫星和接收仪间的几何形 ...
- 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧
记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- C语言 · 薪水计算
问题描述 编写一个程序,计算员工的周薪.薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水.如果员工工作的时间在40 到50 ...
- C语言 · 阶乘计算 · 基础练习
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
- C语言 · 最大值与最小值计算
输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0 #include<stdio.h> int main(){ ]; ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
随机推荐
- BZOJ.3265.志愿者招募加强版(费用流SPFA)
题目链接 见上题. 每类志愿者可能是若干段,不满足那个...全幺模矩阵(全单位模矩阵)的条件,所以线性规划可能存在非整数解. 于是就可以用费用流水过去顺便拿个rank2 233. //20704kb ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- Educational Codeforces Round 14 C. Exponential notation 数字转科学计数法
C. Exponential notation 题目连接: http://www.codeforces.com/contest/691/problem/C Description You are gi ...
- android studio 使用总结
网站1:http://stormzhang.com/posts.html 网站2:http://blog.csdn.net/hyr83960944/article/details/38388429
- TVS二极管和稳压二极管的区别
TVS二极管和稳压二极管的区别 TVS管超过它的耐压值后,会瞬间导通短路,反应速度在ns级, 而稳压管是稳压作用的,超过它的稳压值,只要功率不超过它的耐受值,就会稳定在它的稳压值范围内. TVS是瞬态 ...
- linux 内核crash 命令
https://www.dedoimedo.com/computers/crash-book.html#download
- HDU 1075 What Are You Talking About (strings)
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- Python可视化库
转自小小蒲公英原文用Python可视化库 现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策.那么数据有什么价值呢?用什么样的手段才能把数 ...
- Objective-C市场占有率排名升至第4位
TIOBE近日公布了2012年4月份的编程语言排行榜,终于不出小编所料,在上个月的编程语言排行榜中说过的“编程语言的王者之争不久很可能会发生改变”实现了,一方面是Java在上几个月中一直属于下滑状态, ...
- Android4.1中BinderService的作用
http://blog.csdn.net/lsdmx2016/article/details/8772583 Android4.1 中出现了一个新的类,BinderService,所有的Native ...