计算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 ...
随机推荐
- hiho1270 建造基地([Offer收割]编程练习赛1)
题目意思很简单, 一道类似于背包的问题,问恰好超过背包容量的最小取值.并且需要计算n次,每计算一次都要将所有的物品的价值w[i] /= t,最后输出背包n次的总使用容量. 如果无法实现输出”No An ...
- Maven 项目不打包 *.hbm.xml 映射文件
使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点 ...
- 关于 TRegEx.Split()
表达式中的括号将严重影响分割结果. uses RegularExpressions; const FSourceText = '1: AAA 2: BBB 3: CCC'; // 分隔符将有三部分构成 ...
- HDU 4122 Alice's mooncake shop (RMQ)
Alice's mooncake shop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- An Isolated DAC Using PWM Output
An Isolated DAC Using PWM Output Arduino‘s (ATmega328P) PWM outputs via analogWrite can be convenien ...
- EasyNetQ介绍
EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...
- delphi CreateAnonymousThread 匿名线程
引用 http://www.cnblogs.com/del/archive/2011/05/18/2049913.html 先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): { ...
- [Node.js]操作mysql
摘要 上篇文章介绍了node.js操作redis的简单实例,这里介绍如何操作mysql. 安装 安装mysql模块 cnpm install mysql 一个例子 新建一个mysql.js的文件,代码 ...
- Android应用开发相关下载资源(2015/08/27更新)
Android应用开发相关下载资源 官方终于发布了Android Studio正式版,Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK ...
- AngularJS表单验证,手动验证或自动验证
AngularJS的表单验证大致有两种,一种是手动验证,一种是自动验证. 手动验证 所谓手动验证是通过AngularJS表单的属性来验证.而成为AngularJS表单必须满足两个条件:1.给form元 ...