段艷慧 葛于祥 張曉瑩 郭 偉
(1. 中國礦業大學(北京) 地球科學與測繪工程學院, 北京 100083;2. 中國礦業大學 環境與測繪學院,江蘇 徐州 221116)
隨著計算機技術愈加廣泛地應用于測量平差,使得測量平差的理論及實踐相比以往發生了極大的變化,因此,測量平差的計算也隨之進入了一個新的時期[1]。在目前水準網平差的研究中,楊福濤基于最小二乘法進行水準網平差的程序設計[2],利用Visual Basic語言編寫,包括數據庫的建立、用戶界面的設計以及程序算法的基本思想等。周長江與顧河河根據水準網間接平差的原理,利用Visual Basic語言實現了三等與四等水準網的平差,并用相關實例驗證了其可行性[3]。他們所使用Visual Basic語言編寫程序相比矩陣實驗室(matrix laboratory,MATLAB)更加復雜,既沒有MATLAB的數據計算功能強大,其對于平差原理的理解和掌握也沒有MATLAB清晰。同樣,在目前的研究中,還包括基于Visual C++語言、C#語言與FORTRAN語言等的研究[4-6],這些語言在軟件生成、封裝等方面的確比較有優勢。但是根據實際情況的數據處理結果,都沒有MATLAB的語言更加簡潔。
而隨著MATLAB在測繪研究中的應用越來越廣泛,也有越來越多的學者開始運用MATLAB進行平差的計算[7-8],使用各種平差方法進行程序設計的研究[9-11]。王鵬磊的研究內容為基于MATLAB的水準網平差[12],其介紹了平差的基本原理,并使用間接平差和條件平差的方法進行MATLAB程序語言的設計,最后運用MATLAB中的GUI功能可視化平差界面,但需手動輸入觀測點數、已知點數和未知點數,增加了誤差出現的概率。趙亞紅對間接平差進行MATLAB程序設計[13],雖不需要手動輸入的步驟,但數據結構設計分為兩個文件,不便于用戶的使用,也沒有使平差界面可視化,可讀性不強。因此,本文總結上述研究的優缺點,設計出一種更加方便易用的水準網間接平差程序,即使用MATLAB對水準網進行間接平差并評價其精度,最后運用GUI功能使平差界面可視化。
選擇幾何模型里的t個獨立量作為平差參數,所選擇的參數的函數為每一個觀測量,列出這樣的n個函數關系式,叫作觀測方程,以觀測方程為平差函數模型的平差方法,就是間接平差法[14]。
間接平差的函數模型為
(1)
誤差方程為
(2)
式中,l是誤差方程的常數項,也稱為觀測值。
平差的準則為
(3)
法方程
(4)

(5)
(6)
除間接平差和條件平差外,平差方法還包括附有參數的條件平差以及附有限制條件的間接平差等多種方法[15]。但在日常測量工作中,比較常用的還是間接平差和條件平差。兩種方法既有區別,又有聯系。
這兩種方法具有許多相同之處,比如模型中的未知量的個數都多余其方程的個數,都具有無窮多解,都采用最小二乘法來求其最優解,然而無論采用二者中的哪一平差方法,由于每種模型的最優解都是唯一的,因此其平差結果和精度是相同的。
他們之間也存在許多的區別。條件平差中是根據多余觀測數列出的條件方程,這些條件方程式的選擇最好是方便建立、形式簡單、互不相關的方程,如果不滿足這些條件,會使平差計算更加復雜。此外,條件平差的直接解算結果是觀測值的改正數,因此要想得到最終的平差結果,還需要加上觀測值。而間接平差的未知參數就是必要觀測數,所選參數一般是最后所要求得的結果。因此間接平差相比條件平差更加常用。
(7)
中誤差的估值為
(8)
(9)
因此,待求點高程平差值中誤差為
(10)
根據布設的網形,水準網可分為附合水準網、閉合水準網以及支水準網,其中,閉合水準網和附合水準網兩種是應用最廣的。為了方便程序的調用,本文設計的數據結構共有六列數據,分別是:起點、終點、高差、距離、點號及其對應的已知高程。其中,起點、終點、高差和距離是為了確定水準路線條數和誤差方程式的個數以便建立誤差方程式,而點號和已知高程是為了表示已知點信息,為了顯示直觀,輸入方便,將這兩組信息放置到一個文件里,也可清晰地看出已知信息和觀測數據間的大致關系。文中為了方便程序調用,以Excel存儲數據,通過xlsread語句讀取數據。數據存儲格式設計如表1所示。

表1 數據存儲格式

續表1
2.2.1水準網高程點的確定
在進行水準網間接平差時,生成包含各點的高程矩陣是列舉誤差方程式的前提,從已知數據文件中利用xlsread函數可以直接提取出已知點號及對應高程。對于程序的編寫與實現而言,直接將觀測高程和已知點數據代入誤差方程式比較簡單快捷,因而在本文的程序設計中,直接將近似值高程值設為0,也就是不考慮近似高程值,將使得MATLAB計算更加簡單,易于實現。
2.2.2誤差方程常數項矩陣L的生成
對一般情況下的水準網間接平差來說,誤差方程式的建立即為最重要的計算步驟,只有誤差方程式列出來之后,才能表示出誤差方程式所對應的常數項矩陣L和系數矩陣B,繼而進行平差的計算。而對程序設計來說,不存在手動建立誤差方程式的步驟,因此需要程序代碼能夠根據已知信息和觀測信息自動生成L和B,這也是水準網間接平差程序設計的重點和難點。在本文的程序設計過程中,利用起始點、終點、高差和距離之間的關系,根據誤差方程式個數與常數項個數一一對應的關系,利用for循環語句計算并確定常數項矩陣的維數,然后再對矩陣進行賦值,最后生成完整的常數項矩陣。
2.2.3誤差方程系數矩陣B的生成
由于水準網系數矩陣B比較特殊,基本上是由0、1、-1組成的矩陣,因此,根據這一特點便可以利用水準網誤差方程式確定其系數矩陣B。在程序設計時,可以先將矩陣B設置為0矩陣,其次利用for循環語句對該0矩陣賦值1或-1,即可生成系數矩陣B。根據誤差方程式的特點,如果一條水準路線的起點是未知點,則其起點對應系數應設置為-1,如果終點是未知點,則其終點對應系數應設置為1。
2.2.4平差計算與結果輸出

在結果輸出時,為了便于查看各未知點高程的平差值及其高程平差值中誤差,使計算結果更加直觀,本文將計算結果輸出到.txt文件中,首先利用fopen函數建立一個名為“平差結果”的空文件,然后再用fprintf函數將計算所得結果按照一定的格式輸出。在本文中,文件輸出內容及順序設置為:已知點高程、各路線的觀測高差、平差后高差、平差后各點高程、高程平差值中誤差。
2.2.5精度評價
精度評定的程序設計部分,由于計算單位權中誤差的所需量在上文已經得出,因此可直接輸入計算語句得到單位權中誤差,同理計算協因數陣。然后根據單位權中誤差以及協因數陣來計算待定點的高程平差值中誤差。最后利用相關語句打開平差結果文件,將所有結果輸入到該文檔中。
MATLAB GUI是專門用做圖形用戶界面的快速開發環境,目的為了使間接平差計算更加直觀,使用更加方便[16]。本文利用MATLAB的GUI功能繪制了一個簡單的可視化窗口,包括“可編輯文本”“靜止文本”“按鈕”3部分。本文設置的可視化界面如圖1所示。

圖1 可視化界面
點擊“水準網間接平差”按鈕之后,程序會自動運行,相應的輸出結果會在MATLAB窗口的左邊欄當前文件夾窗口中顯示出來。
至此,基于MATLAB的水準網平差及精度評價的程序設計部分已設計完成,為了檢驗并確保其正確性,本文從《誤差理論與測量平差基礎》一書中選擇一個水準網路線代入數據進行檢驗。
該水準網布設如圖2所示,共有5條水準路線,已知點的高程值為H1=237.483 m。為了求得2、3、4號點的高程,進行水準測量,測得數據為5條水準路線的高差及長度,將題目中的數據按照設計好的數據結構格式進行整理。

圖2 水準網圖
按照題目要求,選取2、3、4號點的高程為參數,首先,建立誤差方程式;其次,解算常數項矩陣L和系數矩陣B;然后生成權陣;最后,進行水準網間接平差計算。程序運算結果與已知結果對比如表2所示。

表2 結果驗證 單位:m
經對比發現,將小數部分保留三位,則兩者計算結果相同。說明該程序設計無誤,可以達到水準網間接平差計算的要求,且計算結果正確可信。其高程值平差值中誤差如表3所示。

表3 水準網高程平差值中誤差 單位:m
本文的研究內容為利用MATLAB平臺進行水準網平差、精度評價與可視化展示。水準網平差方法多種多樣,較常用的有條件平差與間接平差,由于間接平差誤差方程式建立的規律性很強,十分適合程序設計,而條件平差條件方程式的規律不夠明顯,以至于很難編程求出其最佳的條件方程組,因此,本文基于間接平差的原理與方法利用MATLAB平臺進行程序設計,主要從數據結構設計、水準網程序設計、精度評價3個方面進行。結果顯示,水準網平差結果精度可達到小數點后三位。該程序的設計與直觀的可視化界面的設計可避免因手動輸入測量數據而引起的計算錯誤,并極大地提高了水準網平差及精度評價的速度和精度。但在實際測量中,并不是每個測點都是用數字來記錄點號的,若出現字母或文字等其他符號表示的情況,該程序還需進一步改進,這是本研究下一步需要繼續解決的問題。