【PEST++】01 参数优化与灵敏度分析
【PEST++】02 新安江模型参数自动率定
【PEST++】03 水文模型不确定性和灵敏度分析
【PEST++】04 用户手册笔记
本文记录了三位朋友使用PEST++时,我与他们的交流过程,在这里一并附上。希望对学习PEST++的读者有帮助。在此感谢三位朋友的授权。
Q:在tsproc.dat
文件中,导入观测值和实测值序列时,观测值的时间范围要小于等于实测值的时间范围是吧?
A:是的。这样才能将观测值内插到实测值相同序列上,便于精度比较和统计。tsproc.dat
文件是用来处理模型输出结果为时间序列的情况而编写的,比如模型输出结果为流量过程、水位过程等。并且可以自动生成PEST++自动率定所必需的控制文件.pst
。如果模型输出结果仅为若干数值,而不构成时间序列,则不需要编写tsproc.dat
文件,可直接按照PEST++要求手动编写控制文件.pst
。
Q:怎么运行率定程序?命令是输入什么?
A:pestpp.exe
和tsproc.exe
都是在命令行(Command Line)里运行的,不能用鼠标双击运行。配置好率定所需文件后,在模型程序所在文件夹内打开命令行工具(按住shift
键,鼠标右键选择powershell
),运行时间序列处理程序的命令是
.\tsproc.exe tsproc.dat tsproc.rec
运行自动率定程序的命令是
.\pestpp model.pst
建议把命令写在批处理脚本.bat
中,比如示例中给出的自动率定.bat
,这样就不用每次运行都输入命令。
Q:从哪里查看率定结果?
A:.par
文件查看率定结果,记事本打开,第一列就是率定值了,后面不用看。.sen
文件查看灵敏度。图示该列值的大小表示灵敏度,数值越大越灵敏,表示这个参数对目标的影响大。
Q:这俩脚本,batch.bat
为什么没有pestpp model .pst
?
A:batch.bat
的是在程序运行中反复执行的,本身就是用pestpp.exe
调用的,所以不能再写pestpp model.pst
了。直接用运行.bat
运行不会报错,可以先用控制台调试好,没错误再用运行.bat
。主要就是省得每次粘贴。
Q:这个地方表示的什么意思?
A:这表示这一次率定还要再跑44次。
Q:如果自动率定出来的结果,带回原模型,效果不好,那应该怎么改进呢?再率定一次吗?
A:在率定的时候,实测值与模拟值对比不能取整个计算时段,需要提出预热部分。如果结果还是不好,尝试在group.txt
中把倍率调小,在parma.txt
中参数范围调大。如果仍然率定效果不理想,那就是模型本身的问题。
Q:这个模板文件问题出在哪里?
A:第一行的ptf与#之间需要有半角(英文)空格
Q:这里的问题是说#dk有问题吗?是后面的空格不能加这么大吗?
A:根据错误提示,dk
后面你输入的是Tab
键,而不是空格。这样一来,pestpp会把dk
和后面的Tab
一起识别为变量,而不是单纯的dk
这个参数。所以你应该把dk
后面的Tab
键替换成半角空格。这个问题在用Excel处理数据后粘贴到模板文件.tpl
中经常出现,希望读者注意。
Q:参数文件param.txt
这么写是哪里有问题吗?
A:bp的#去掉,另外在group.txt
中添加四组,就是gp1
gp2
gp3
gp4
,像gp1
一样。
Q:group我之前也添加了,是这里写错了吗?
A:是的,你后面的四个还是用0.1或者0.01好了,这里的0.01指的是倍数,就是每次运行程序增加或减少参数初始值的0.01倍。
Q:程序运行结束后,输出了这么多文件,那结果在哪个文件里?
A:在model.par
里面,model.rec
记录了模拟与实测差值。.par1
.par2
.par3
这种是指率定过程中每次运行程序得到的最优参数,最终的最优参数在.par
文件中,文件名不一定是model
,但后缀一定是.par
。
Q:和给的初始值一样,算是率定失败了吗?
A:你的每个断面给个槽率的率定方法,很难得出结果,因为槽率变化对结果影响不大,建议你分段设置槽率。
Q:水动力模型模拟出来的结果有预热的部分,放到输入文件里,需要把它们删掉吗?
A:最好不要把预热部分作为率定部分。
Q:运行模型输出的数据,是怎么识别哪些是要拿来和实测值对比的呢?
A:这个问题中,实测值文件放在observationstage.ssf
里面,为了把模型输出文件stage.ssf
与实测值文件observationstage.ssf
匹配起来,需要在tsproc.dat
文件写明从这两个文件取数对比。
Q:运行程序之后,会报错,这里是说我的输入文件有问题吗?
A:路径名不要有中文、空格等特殊字符,文本文件格式都改为ANSI格式。
Q:我之前是只监测了一个断面的水位,如果我需要再把一个断面的流量加入对比,需要修改什么?是要在tsproc.dat
里加上什么吗?
A:那你要把那个断面的流量也输出来,然后再写个流量的实测值文件,最后在tsproc.dat
文件中导入模型输出流量值。
Q:这里的问题对应的是右边这部分的吗?
A:不是,右边是内插的。可能是你的计算时间步长取短了,内存不够用。或者是实测值时间步长取短了。
Q:model.rec
里面的一些内容不清楚啥意思?比如这里
A:这个文件是PESTPP整个率定的记录,这些参数是在.pst文件中设置的,.pst文件是pestpp运行必需的控制文件,由tsproc.exe运行tsproc.dat自动生成。你可以打开.pst文件查看这些参数。至于参数的物理意义,就需要看pestpp的手册了,一般默认即可。
Q:这里是看最优结果的平均误差的吧?
A:这个记录了实测值与模拟值的对比,是重要的结果,可以直接导入到excel中画图,直观比较率定效果。
Q:新安江参数文件是按照这个来弄吗?
A:我在博客里面写的是示例,实际不用这样弄的。一般类型选择none
就可以了。
Q:bat都是你自己写的吗?
A:是自己写的,就三条语句。
Q:那个参数率定用4年,验证用2年的,为啥?比如为啥不是5年率定、1年验证这种,或者3+3?
A:这是我自己定的,你可以选择别的组合方式。
Q:flow.ssf
是啥流量文件?
A:.ssf
后缀是PESTPP要求的数据格式,可以用记事本打开。这是模型模拟出流的数据。
Q:我安装的PEST好像没看到你的包里面的这两个文件,pestpp.exe
和tsproc.exe
?
A:我用的是PEST++,是PEST的升级版,使用起来比PEST简单方便的多,只有一个免安装自动率定程序pestpp.exe
和一个时间序列处理程序tsproc.exe
。
Q:tsproc这个是把模拟值差值成匹配实测值的工具?
A:是的,就是匹配时间的。同时,它还可以自动生成pestpp所需的控制文件,后缀名为.pst
。
Q:这三个批处理文件,batch.bat
是参数估计用的是吧?batch.bat应该是反演用的吧?给率定定方向用的是吗?或者或降维用的?
A:batch.bat
是程序自动调用的,不用人去点。batch.bat
其实就是每次率定pestpp自动调用xaj.exe
,起这个作用。
Q:这个不是all
吗?
A:不是all,就是test,是用来验证的。
Q:写出test.txt的用处是啥?com_test文件是干啥用的?
A:test.txt就是来验证的,和xaj.out是一类文件。属于给pestpp识别用的,你可以记事本打开看看。com_test是写入各偏差统计值的
Q:record.txt呢,这个是要配置的吗?
A:record.txt是pestpp自动输出运行记录的,不需要手动配置。
Q:是在dos窗口这样运行吗?
A:不用DOS,直接点自动率定.bat
就可以开始率定了。
Q:我这样分开到文件夹也可以吗?不需要配置环境和路径吗?
A:不行,不能分开,都要在一个文件夹里,路径不用配置。
Q:为啥你文章讲需要一个小时,我几分钟就运行完了?
A:运行时间的问题,可能是你的电脑没安装matlab
,无法运行 xaj.exe
,我的新安江模型是用matlab
写的。
Q:PEST++是只有一个独立的pestpp.exe
吗?PEST怎么有这么多?
A:对,是的,只有一个pestpp.exe
,别的什么都没有,不需要安装,只要把它放在文件夹里直接就能用,不需要开控制台,直接点 自动率定.bat 就能自动率定了。pest
的文档我没看,这些好像是把许多功能分开成多个exe了。
Q:那你的那个tsproc.exe
哪来的?pest套装软件包里面好像也没有这个?
A:这是是USGS开发的,专门用来处理时间的,这是tsproc的文档。
Q:pest命名找不到规律,一会儿++ 一会儿PP?
A:pestpp = pest plus plus = pest ++ = PEST++,这其实是一样的。
Q:这几个选取有点不明白了,依据是什么?
A:参数选取我在博客中已经说明了,建议仔细看看。上面是我用来示例的,有需要的时候再这么做,一般就不操作就行,就是使用none
。
Q:%代表是解释吗?后面解释参数的内容是中文还是英文?应该是和模型里面保持一致吧?
A:%不是解释,后面是什么字都无所谓的,只要在模板文件里标好对应位置就行。
Q:xaj的out文件是文本文件?flow.ssf
文件怎么来的?
A:xaj.out
是把模型输出文件flow.ssf
按照与实测值obseravedflow.ssf
时间序列匹配而成的,是文本文件。flow.ssf
就是模型输出文件,三列分别为 标识符、 时间和流量值。这个格式是我在xaj.exe
中修改的,因为pestpp
需要这种格式来识别数据。pestpp
给了几种通用格式,这在pestpp 4.2.1手册中有。这个文档的27页介绍了一些tsproc能处理的数据文件类型,可以看看有没有,比如这个是和 HSPF 还有 Modflow 等其他别的模型,没有的话就得自己写个脚本转换成 SSF格式了。pestpp虽然不需要编程,但是对输出文件格式要求高,这也是pestpp比较麻烦的地方。如果能从模型源码里直接修改输出格式,那就会快还多,相对于输出文件后再转换来说,效率高不少。
Q:还有这个ssf文件是xaj的输出文件格式吧?不是pest的文件格式要求嘛?
A:SSF是PESTPP的要求,我修改了xaj的源程序,使他直接输出这种格式,来满足PESTPP的需求。
Q:这个在CONTEXT具体啥作用?是不是xaj模型里面的字符名?
A:CONTEXT作用就是指定哪些模块可读,在tsproc.dat
文件开头就有CONTEXT关键字,后面的模块与关键字一致的就执行。在运行tsproc.exe时,也可以指定关键字,用以覆盖文件中的关键字。关键字的使用是为了将多个模块写进一个tsproc.dat
中,便于编辑。
Q:这个怎么运行一下,就弹出模型的软件窗口?
A:因为这个需要多次运行模型,实际上就是自动改输入参数,然后多次运行模型,再自动比较,pestpp率定就是干这个事的。这个率定其实不需要图形用户界面的exe,最好就是那种黑屏控制台的模型exe。