【PEST++】01 参数优化与灵敏度分析
【PEST++】02 新安江模型参数自动率定
【PEST++】03 水文模型不确定性和灵敏度分析
【PEST++】04 用户手册笔记
新安江模型是河海大学水文院赵人俊教授于上世纪80年代提出的一个具有世界影响力的水文模型。新安江模型是分布式模型,可用于湿润地区与半湿润地区的湿润季节。当流域面积较小时,新安江模型采用集总模型,当面积较大时,采用分块模型。它把全流域分为许多块单元流域,对每个单元流域作产汇流计算,得出单元流域的出口流量过程。再进行出口以下的河道洪水演算,求得流域出口的流量过程。把每个单元流域的出流过程相加,就求得了流域的总出流过程。
该模型按照三层蒸散发模式计算流域蒸散发,按蓄满产流概念计算降雨产生的总径流量,采用流域蓄水曲线考虑下垫面不均匀对产流面积变化的影响。在径流成分划分方面,对三水源情况,按“山坡水文学”产流理论用一个具有有限容积和测孔、底孔的自由水蓄水库把总径流划分成饱和地面径流、壤中水径流和地下水径流。在汇流计算方面,单元面积的地面径流汇流一般采用单位线法,壤中水径流和地下水径流的汇流则采用线性水库法。河网汇流一般采用分段连续演算的Muskingum法或滞时演算法1。
具体的建模过程和程序源代码,可以参见本人的另一篇博客三水源新安江模型
PEST(Parameter Estimation)自动率定程序是由John Doherty博士于1994年基于GML算法开发的独立于模型参数估计和不确定性分析的综合软件,其具有逆海森方法和最速下降法的优点,可以通过较少的模型运行次数,得到最优的参数结果2 。2009年,Welter等人在美国地质调查局的资助下基于原有的PEST参数自动率定程序开发PEST++非嵌入式参数率定程序3 。PEST++可以进行高度参数化的反演以及使用差分迭代的全局优化,在需要的时候会自动进行奇异值分解辅助反演,易用性更强4。
使用PEST++做模型参数的自动率定需要准备的文件,请参见博客PEST++参数优化
本次率定主要用到新安江模型程序xaj.exe和PEST++套件程序(pestpp.exe和tsproc.exe)。xaj.exe是使用MATLAB R2016a编译输出的,读者如果未安装MATLAB,将无法运行xaj.exe,安装附件中的MCR_R2016a_win64_installer.exe即可。PEST++套件程序(pestpp.exe和tsproc.exe)都是通过命令行运行的程序,直接点击无法运行。为方便读者使用,笔者已编写自动率定脚本自动率定.bat
,读者直接点击运行即可。如读者想探索命令行运行的方式,可在率定文件夹内右键选择在此处打开命令窗口(如无此选项,请自行百度解决),在命令行分别输入.\tsproc.exe tsproc.dat tsproc.rec
和.\pestpp.exe xaj.pst
即可自动率定。
新安江模型参数多,采用人机交互的方式率定耗时多,准确度低。本文尝试使用PEST++自动率定。
本文采用单目标进行参数优化,以流域出口断面模拟流量过程与实测流量过程差的平方和最小为优化目标5 ,目标函数公式为:
m i n f = ∑ i = 1 n ( Q m o d , i − Q o b s , i ) 2 minf= \sum\limits_{i=1}^n(Q_{mod,i}-Q_{obs,i})^2 minf=i=1∑n(Qmod,i−Qobs,i)2
式中: f f f为目标函数; i i i为时段序号; n n n为总时段数; Q m o d , i Q_{mod,i} Qmod,i表示第 i i i时段的出口断面流量模拟值; Q o b s , i Q_{obs,i} Qobs,i表示第 i i i时段的出口断面流量实测值。
在开始率定之前,需要准备各种必需的文件,均为文本文件(txt),后缀名需要改为要求的格式。
将流域出口断面流量过程实测值处理成**站点样本文件(SSF)**格式,即站点标识符、时间、实测值的形式,得到observedflow.ssf
文件。该文件其实是后缀名修改为.ssf
的文本文件,具体形式如下图。
图中estimate
为站点标识符,统一时间序列值取同一个名字;01/01/1989 00:00:00
为时间,格式必须按照mm/dd/yyyy hh:mm:ss
,注意中间至少有一个空格;0.52为实测值。
将需要率定的参数名、初始值、上下限、所属参数组列于文件parameter.txt中。将各参数所属的各组以及步长列于group.txt中。每个参数都属于一个参数组,多个参数可以属于同一个参数组,同一参数组的参数具有物理意义上的联系。一般将没有关系的参数分别设为一个参数组即可。
其中none
表示不操作;fixed
表示固定参数值;log
表示取对数;tied_xx
表示与xx绑定初始值比例。
参数组文件包括参数文件中涉及到的所有参数组
每一个含有待率定参数的模型输入文件都需要对应的模板文件,以方便PEST++自动率定程序每次迭代计算后构建新的模型输入文件。将模型输入文件中待率定参数值的位置替换为参数名,并使用标识符括起来,即为模板文件。模板文件的后缀名必须为.tpl
,文件名则随意,可以与模型输入文件名相同,也可以不同。
其中ptf表示 P ‾ E S T \underline{P}EST PEST t ‾ e m p l a t e \underline{t} emplate template f ‾ i l e \underline{f}ile file,#为标识符,注意之间有一个半角空格。原来参数的位置用参数名替代,并用两个标识符括起来,注意标识符之间的空白部分是空格,而不能用Tab键输入。
命令行文件通常是批处理脚本,由模型应用程序和时间序列处理程序及控制文件组成。后缀名从.txt
修改为.bat
。时间序列处理程序及控制文件将在后面介绍。
在准备好上述文件之后,由于模型输出值为一个时间序列,即流域出口断面流量过程模拟值为固定时间间隔的系列值,因此需要时间序列处理程序tsproc.exe
将模拟值序列处理成与实测值序列相同时间间隔的序列,这一步骤称为内插。tsproc.exe
为PEST++自动率定套件的一部分,可以使用命令行单独运行。需要指出的是,时间序列处理控制文件不仅能使模拟值与实测值相匹配,还可以自动生成PEST++控制文件、指令文件,对处理目标函数为时间序列的自动率定问题非常有用。
时间序列控制文件由多个数据块组成。下面介绍如何编写时间序列控制文件tsproc.dat。tsproc.dat是运行tsproc.exe所必需的文件。
时间序列控制文件由多个数据块组成,其中SETTINGS数据块必须位于文件的开头,用来设置全局的关键词,其余数据块的关键词与之相同或为all,则将被执行,否则将不执行。日期格式可以设置为dd/mm/yyyy
或mm/dd/yyyy
。
模拟值和实测值都以站点样本文件(SSF)格式分别存储在flow.ssf和observedflow.ssf文件中。通过GET_MUL_SERIES_SSF数据块读取,并分别存储在mod_est和mea_est系列中。
由于实测值是一系列不规则的时间序列值,因此需要将固定时间步长的模拟值内插成与实测值时间相对应的序列。这一步使用NEW_TIME_BASE数据块,生成的新模拟值序列为i_mod_est。
使用LIST_OUTPUT数据块,将生成的i_mod_est和i_mod_test序列写入xaj.out输出文件中。
使用时间序列处理程序tsproc.exe不仅可以处理模型输出的模拟值序列,还可以自动生成运行PEST++所必需的PEST++控制文件model.pst
和模型指令文件model.ins
。使用WRITE_PEST_FILES数据块,首先将含有待率定参数的模型输入文件与模板文件对应起来,然后指定各观测值所占权重,最后给出参数文件、参数组文件及命令行文件名。运行时间序列控制文件,即可生成控制文件和指令文件。
上述文件准备好后,即可开始自动率定。点击自动率定.bat
即可开始,大约需要一个小时。参数率定结果见xaj.par文件的第二列数据。
率定结束后,点击参数检验.bat
,查看test.txt即可得1995-1996年数据参数检验结果。
率定所需文件见附件。
附上一些学习资料。
官网、PEST++源代码、官方文档:pestpp 4.2.1、TSPROC User manual
新安江模型,百度百科 ↩︎
杨博,陈莹,陈兴伟,刘梅冰,高路.基于PEST的HSPF模型径流模拟优化[J].中国水土保持科学,2018,16(02):9-16. ↩︎
Doherty, J., White, J. and Welter, D., 2018c PEST and PEST++: An Overview. Watermark Numerical Computing, Brisbane, Australia. ↩︎
White, J.T., Welter, D.E. and Doherty, J., 2018. Manual for Version 4 of PEST++. Published by CAELUM. ↩︎
Jeremy T. White,Michael N. Fienen,Paul M. Barlow,Dave E. Welter. A tool for efficient, model-independent management optimization under uncertainty[J]. Environmental Modelling and Software,2018,100. ↩︎