Pride_pppar 源码解析(三)
lsq 最小二乘估计器
使用方法:lsq config_file
在残差编辑和坐标解算以及模糊度固定时均用到了lsq
估计器,其后面跟的配置文件为中间文件,即pride
自行生成的用于lsq
的配置文件,但内容与原始的config_template
相当。
lsq.f90
此程序时lsq可执行程序的主程序。我对其浅陋的理解如下:
- 初始化本地全局变量
dcb
和LCF%prn(i)
。dcb
为差分码偏差;LCF
为整个程序的控制信息结构体;prn
为LCF
结构体内保存的卫星编号。 - 调用函数
get_lsq_args(LCF, SITE, OB, SAT)
对配置文件进行读取并保存到LCF
中。
# 函数作用: 获得最小二乘的参数信息
# 参数:输入: LCF --最小二乘配置信息结构体SITE --测站相关结构体SAT --卫星相关信息结构体
subroutine get_lsq_args(LCF, SITE, OB, SAT)* 读取参数,倘若参数小于1,则输出lsq的帮助语句。否则,读取并打开配置文件;* 读取的内容包括:LCF%jd0 --开始简化儒略日LCF%sod0 --开始的儒略日秒LCF%jd1 --结束时间简化儒略日LCF%sod1 --结束时间的儒略日秒LCF%flnorb --gps卫星轨道文件名LCF%flnpos --结果位置文件名LCF%flnsck --卫星钟差文件名LCF%flnrck --结果接收机钟差文件名LCF%flnztd --结果天顶对流层延迟文件名LCF%flnhtg --结果水平对流层梯度文件名LCF%flnamb --结果浮点模糊度文件名LCF%flnres --结果残差文件名LCF%flncon --结果模糊度约束文件名(整数模糊度)LCF%flnneq --法方称矩阵逆矩阵文件名LCF%flnvmf --对流层投影函数VMF1文件名LCF%flnfcb --相位偏差文件名LCF%flnerp --地球旋转参数文件名LCF%dintv --采样间隔LCF%lrmbias --是否参数消去(true or false)LCF%ztdmod --天顶对流层估计模型LCF%htgmod --水平对流层梯度模型LCF%nprn --总的卫星个数LCF%prn(LCF%nprn) --卫星编号SAT(LCF%nprn)%prn --卫星编号SAT(LCF%nprn)%sys --卫星系统(只有“G” GPS)SAT(LCF%nprn)%typ --卫星类型(只有“Block”)SITE%name --测站名SITE%skd --处理策略(动态K or 静态S)SITE%map --对流层投影函数SITE%obsfil --测站观测O文件SITE%rhdfile --处理后的观测文件SITE%lfnjump --钟跳文件SITE%x --测站位置(xyz)SITE%geod --测站大地坐标(blh)SITE%rot12f --enu2xyz的旋转矩阵SITE%olc --海洋潮汐OB --观测数据结构体* 检查观测文件是否可用
- 调用
read_dcb(dcb)
函数读取dcb。
# 函数作用:读取dcb偏差
# 函数位置:src/lib/read_dcb.f90
# 参数:输出:dcb --dcb偏差(二维数组)
subroutine read_dcb(dcb)* 打开P1C1.dcb文件,将P1C1的dcb保存到dcb(prn0, 1)中,dcb是一个二维数组。* 打开并读取P2C2.dcb文件,将P2C2的dcb保存到dcb(prn0, 2)中
- 调用
read_snx(fcb_file, bias)
函数读取相位偏差。这里的fcb_file是武汉大学生成的相位偏差,包括相位钟和fcb相位偏差。
# 函数作用:读取小数偏差用于模糊度解算
# 函数位置:src/lsq/read_snx.f90
# 参数:输出: bias --小数偏差(二维数组)
subroutine read_snx(flnfcb, bias)* 打开fcb文件,从'+BIAS/SOLUTION'部分以后开始读取偏差值,将偏差保存到dcb(iprn, 4)二维数组中。分别为每颗卫星发射4种GPS信号L1C、L2W,C1W和C2W的伪标定小数相位偏差。
- 调用
get_ant_ipt(fjd_beg, fjd_end, antnam, antnum, iptatx, enu)
函数,对卫星天线相位中心进行改正。
# 函数作用:
# 所在位置:../lib/get_antenna_corr.f90
# 参数:输入: fjd_beg, fjd_end --起止时间antnam, antnum --天线名和序列号输出: iptatx --天线指针enum --天线偏移
subroutine get_ant_ipt(fjd_beg, fjd_end, antnam, antnum, iptatx, enu)* 前面从内存中读取天线名、天线序号的操作也没看懂* 若内存中没有,则从atx文件中读取,调用的是rdatx(fjd_beg, fjd_end, ATX)函数, 将天线相位改正保存在ATX%enu(j,k) 其中j是三个方向上的改正值,k为频率。PCV保存在ATX%pcv()中* 将ATX%enu输出为enu(6),其中前三个为第一个频率的,后三个为第二个频率的。* 疑问:最终只输出了enu,没有输出pcv。
- 打开观测值文件,读取测站天线相关信息,并同样调用
get_ant_ipt()
函数获取测站天线相位改正,并保存在SITE%enu
中。 - 调用
lsq_cnt_prmt(LCF, SITE, NM)
函数统计参数的个数。
# 函数作用:统计最小二乘估计器的待估参数的个数
# 所在位置:src/lsq_cnt_prmt.f90
# 参数:输入: LCF --最小二乘配置相关信息结构体SITE --测站相关信息结构体输出: NM --参数相关结构体
subroutine lsq_cnt_prmt(LCF, SITE, NM)* 统计的时候NM%nc为常数参数的个数;NM%np为过程参数的个数; * 当测站处理策略时S时,即静态时,测站三个坐标当作常数估计;当为K时,即动态时,三个测站坐标当过程参数估计加入NM%np中。* 对流层参数包括天顶对流层、2个方向水平对流层梯度,当其处理策略为分段常数时,都看作过程参数,加入NM%np中。* 接收机钟差当作过程参数,加入NM%np中。* 总参数NM%imtx = 过程参数NM%np + 常数参数NM%nc
- 总的参数的个数即为
NM%imtx
加上模糊度的个数NM%amb_tot
,释放一个PM(NM%npm)
空间存放这些参数。其中NM%npm
即为所有的待求参数个数。 - 正规矩阵的大小。如果需要参数消去,那么参数个数需要加
OB%amb_epo+1
,其中OB%amb_epo
为历元内新添加的模糊度参数最大值;如果不需要参数消去,那么参数个数只需要+1。这里不太明白为什么这样!!!!
,经过这一步以后,正规矩阵的大小即为NM%nmtx
。 - 释放内存,用
NM%norx(1:NM%nmtx,1:NM%nmtx)
这么一个二维数组当作设计矩阵。用NM%iptp(NM%nmtx)
存放;用NM%iptx(NM%nmtx)
存放。 - 调用
lsq_init(LCF, SITE, SAT, OB, NM, PM)
函数初始化设计矩阵。 包括所有最小二乘相关项的初始化。 - 开始按历元循环求解:每个历元操作步骤:
(1)读取观测值,通过RINEX版本不同调用不同的函数读取该历元匹配的RINEX观测值。注意这里读取的观测值已经进行了bias和dcb的改正,都是直接在观测值后面加的。
(2)调用read_obsrhd(jd, sod, nprn, prn, OB)
函数对rhd_函数进行读取,rhd文件为观测值文件的健康诊断文件,可以确定历元内哪颗卫星观测值需要删除,哪个历元哪颗卫星需要新添加模糊度参数。
(3)如果有接收机钟跳,还需要调用read_clkjmp(jd, sod, clkjmp_file, nprn, OB)
函数读取跳秒,这里的钟跳文件由tedit
产生。
(4)对于每颗卫星,调用read_satclk
函数读取并插值卫星钟差,这里插值采用的是线性插值:。调用everett_interp_orbit
函数插值该历元时刻卫星位置和速度。采用的是拉格朗日插值。
(5)调用lsq_add_newamb(jd, sod, name, LCF, OB, NM, OM)
函数添加新的模糊度。添加新模糊度以后需要对待估参数个数以及设计矩阵进行更新。
(6)开始按照测站循环。每个测站的操作步骤如下
一、添加观测方程,OB%omc即为方程左边部分o-c。
二、准备先验接收机钟差改正。
三、调用一种模型计算对流层先验改正。
四、检查高度角和方位角
五、又来一个保存先验接收机钟差改正,而且看代码显示和上面那个正好反过来,不太清楚时什么操作。
六、保存先验对流层水平梯度经度到PM%xini,包括n方向和e方向的梯度
七、调用lsq_add_obs
函数将观测值添加到观测方程中。
(7)每个历元保存一个先验天顶对流层延迟。
(8)调用lsq_process
函数做最小二乘。这里采用的是参数消去求解。 - 添加模糊度限制,即求解模糊度固定解
- 保存法方程
- 生成残差文件头部分
- 参数恢复,计算残差
- 输出模糊度文件,此模糊度为加入模糊度限制后的模糊度解。
- 输出法方程逆矩阵。
存在的问题:
- 天线改正时只输出
enu
,而不输出pcv
?是pcv
没有改正还是。。 - 设计矩阵的大小,为什么在
flrmbias
是否为真都要+1?这个1
是什么意思? - 分配内存那里
NM%iptp
和NM%iptx
分别是什么,其长度都为法方程矩阵的维度? - 先验接收机钟差是怎么保存的?
- 最小二乘中,
find a bias to be removed
之后的操作是在干什么?
Pride_pppar 源码解析(三)相关推荐
- Disruptor源码解析三 RingBuffer解析
目录 系列索引 前言 主要内容 RingBuffer的要点 源码解析 系列索引 Disruptor源码解析一 Disruptor高性能之道 Disruptor源码解析二 Sequence相关类解析 D ...
- OkHttp3源码解析(三)——连接池复用
OKHttp3源码解析系列 OkHttp3源码解析(一)之请求流程 OkHttp3源码解析(二)--拦截器链和缓存策略 本文基于OkHttp3的3.11.0版本 implementation 'com ...
- ReactiveSwift源码解析(三) Signal代码的基本实现
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
- 并发编程与源码解析 (三)
并发编程 (三) 1 Fork/Join分解合并框架 1.1 什么是fork/join Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,开发者可以在不去了解如Thread.R ...
- 前端入门之(vuex源码解析三)
上两节前端入门之(vuex源码解析二)我们把vuex的源码大概的撸了一遍,还剩下(插件.getters跟module),我们继续哈~ 插件童鞋们可以去看看vuex在各个浏览器的状态显示插件,小伙伴可以 ...
- 拆轮子-RxDownload2源码解析(三)
本文为博主原创文章,未经允许不得转载 造轮子者:Season_zlc 轮子用法请戳作者链接 ↑ 前言 本文主要讲述 RxDownload2 的多线程断点下载技术. 断点下载技术前提 服务器必须支持按 ...
- Tomcat源码解析三:tomcat的启动过程
Tomcat组件生命周期管理 在Tomcat总体结构 (Tomcat源代码解析之二)中,我们列出了Tomcat中Server,Service,Connector,Engine,Host,Context ...
- 【Vue.js源码解析 三】-- 模板编译和组件化
前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 模板编译 模板编译的主要目的是将模板 (template) 转换为渲染函数 (render) <div> ...
- Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)
目录 1.前言 2.layer.json中available参数意义 3.EPSG:4626切片及terrain分块原理 4.Cesium的terrain分块规则 5.自定义terrain分块规则 6 ...
- AFNetworking2.0源码解析三
本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程 ...
最新文章
- 把一件简单的事情做好你就不简单了
- 60亿元高新项目落户西安
- 在RHEL5下构建基于系统用户的Postfix邮件系统
- Spring Cloud 加盟重量级成员Spring Cloud Alibaba,打造更符合中国国情的微服务体系...
- python要学多久-零基础python培训需要学多久?
- java se 动态添加视图组件_博为峰Java技术题 ——JavaSE Java Swing在顶层容器中添加菜单栏Ⅰ...
- 程序员不是神……心态决定一切(转载)
- 三、CSS重要的盒子模型知识总结(中篇)
- javascript学习系列(10):数组中的slice方法
- Oracle数据库ORA-12514错误的解决办法
- oracle不弹出另存为,Oracle另存为~
- python 批量自动搜索、自动抓取需要的信息简单教程【selenium】
- ftp 501错误_分享,HTTP协议错误代码大全
- linux 配置远程日志服务器配置,配置远程日志服务器—实现日志的集中管理
- qt creator纯C或C++项目在windows下的命令行中文乱码解决
- 41. Element getElementsByTagName() 方法
- 黑马程序员-android视频播放器
- 台湾移动互联网为什么跑慢了?
- android 图片虚化代码,Android模糊图片技术
- ubuntu12.04/14.04/16.04 安装搜狗输入法 解决shift按键不能切换英文输入
热门文章
- (详细)星空动态特效(基于C语言+EasyX库实现)
- 北京实行电子保单后外地六年内新车年检分享
- c#的winForm启动自动隐藏界面包含任务栏图标
- IBM ThinkPad 的历史,资料,产品
- UEFI开发探索34 – Option ROM前传1
- 2022年湖南省自考考试学前教育原理练习题及答案
- 《中欧商业评论》文章| 企业管理软件的中国模式
- 基于单片机的车辆防碰撞及自动刹车系统(STC89C52RC芯片+超声波传感器HC-SR04+液晶屏1602+继电器+蜂鸣器)...
- 象棋的c++程序语言,纯C++中国象棋控制台程序(学习版)
- 全球人工智能技术创新大赛 - 布匹疵点智能识别参赛笔记(win10采坑不断版本)