目錄
- 0 PEST++系列文章
- 1 第一位朋友 ZJ
- 2 第二位朋友 LGH
- 3 第三位朋友 XY
0 PEST++系列文章
【PEST++】01 參數優化與靈敏度分析
【PEST++】02 新安江模型參數自動率定
【PEST++】03 水文模型不确定性和靈敏度分析
【PEST++】04 使用者手冊筆記
本文記錄了三位朋友使用PEST++時,我與他們的交流過程,在這裡一并附上。希望對學習PEST++的讀者有幫助。在此感謝三位朋友的授權。
1 第一位朋友 ZJ
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
中參數範圍調大。如果仍然率定效果不理想,那就是模型本身的問題。
2 第二位朋友 LGH
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:最好不要把預熱部分作為率定部分。
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中畫圖,直覺比較率定效果。
3 第三位朋友 XY
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。