天天看點

【VB.net】測量平差程式設計(條件平差和間接平差)

先說一下,如果是陶老師的學生,建議不要抄!

1.視窗

依然是見仁見智,打碼的部分是我的名字學号。

【VB.net】測量平差程式設計(條件平差和間接平差)

2.Form代碼

Imports System.IO
Public Class Form1
    '//***********************************檔案夾讀取**************************************************//
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.InitialDirectory = "C:\"
        OpenFileDialog1.Filter = "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*"
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog = DialogResult.OK Then
            TextFileName.Text = OpenFileDialog1.FileName
        End If
        If TextFileName.Text <> "" Then
            Dim fs As FileStream
            fs = New FileStream(TextFileName.Text, FileMode.OpenOrCreate, FileAccess.Read)
            Dim sr As StreamReader
            sr = New StreamReader(fs)
            Text1.Text = sr.ReadToEnd
            sr.Close()
            fs.Close()
        End If
    End Sub
    '//************************************條件平差*******************************************//
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        str1 = Text1.Text
        M1 = Split(Trim(str1), vbCrLf)
        '/******************************************/
        M2 = M1(0).Trim().Split(New Char() {" ", ",", ","})            '結果為(n=4,t=2,y=2)
        M3 = M2(0).Split("=")                                           '結果為(n,4)
        n = CInt(M3(1))                                 '讀取觀測個數n
        M3 = M2(1).Split("=")
        t = CInt(M3(1))                       '讀取必要觀測個數t,即待定點個數
        r = n - t                               '計算多餘觀測量=n-t
        M3 = M2(2).Split("=")
        y = CInt(M3(1))                         '讀取已知點個數y
        Dim H1(y - 1), S(n - 1), X(t - 1), h(n - 1), L(n - 1) As Double
        Dim A(t - 1, n - 1) As Double                 'A矩陣t行n列
        Dim A_1(n - 1, t - 1) As Double              'A的逆矩陣
        Dim Q(n - 1, n - 1), P(n - 1, n - 1), VP(0, n - 1), V(n - 1, 0), V_1(n - 1, t - 1), V_Z(0, n - 1) As Double
        Dim NAA(t - 1, t - 1), NAA_1(t - 1, n - 1), NAA_n(t - 1, t - 1), K1(t - 1, 0), W(t - 1, 0) As Double
        For i = 0 To y - 1
            M2 = Split(Trim(M1(i + 2)), "=")      '取已知點資料,即H1數組中的數值
            H1(i) = CDbl(M2(1))
        Next
        '系數矩陣A的讀取
        For i = 0 To t - 1
            For j = 0 To n - 1
                M4 = M1(y + 3 + i).Trim().Split(New Char() {" ", ",", ","})
                A(i, j) = CDbl(M4(j))
            Next
        Next
        A_1 = ZZ(A, A_1)                             '轉置
        For i = 0 To n - 1
            M5 = M1(y + t + 5 + i).Trim().Split(New Char() {" ", ",", ","})
            h(i) = CDbl(M5(1))
            S(i) = CDbl(M5(2))                           'S,用于定權
        Next
        For k = 0 To n - 1
            For j = 0 To n - 1
                If k = j Then
                    Q(j, k) = S(k)
                Else Q(j, k) = 0
                End If
            Next
        Next                                            'Q矩陣
        P = QN(Q)
        'W矩陣的讀取
        For i = 0 To t - 1
            M6 = M1(y + t + 3).Trim().Split(New Char() {" ", ",", ","})
            W(i, 0) = CDbl(M6(i))
        Next
        NAA_1 = Mmul(A, Q, NAA_1)
        NAA = Mmul(NAA_1, A_1, NAA)
        NAA_n = QN(NAA)                               'NAA的逆矩陣
        For i = 0 To t - 1
            For j = 0 To t - 1
                NAA_n(i, j) = -NAA_n(i, j)              '負的NAA
            Next
        Next
        K1 = Mmul(NAA_n, W, K1)                      '計算K矩陣
        V_1 = Mmul(Q, A_1, V_1)
        V = Mmul(V_1, K1, V)                        '計算V矩陣
        For i = 0 To n - 1
            L(i) = h(i) + V(i, 0) / 1000
        Next                                       '計算觀測量的平內插補點L
        M2 = Split(Trim(M1(2)), "=")
        For k = 0 To t - 1
            M7 = M1(y + t + 6 + n + k).Trim().Split(New Char() {" ", ",", ","})
            X(k) = M2(1)
            For i = 0 To n - 1
                xx = M7(i + 1) * L(i)       '這一步是将與未知點計算有關的平內插補點帶入,有關為0,無關為1
                X(k) = X(k) + xx
            Next
        Next
        '計算機關權中誤差
        V_Z = ZZ(V, V_Z)
        VP = Mmul(V_Z, P, VP)
        sgm = Mmul(VP, V, sgm)
        sigm = Math.Sqrt(sgm(0, 0) / r)
        Text2.Text = "" + "未知點平差後高程值:(機關,米)" + vbCrLf
        For j = 0 To t - 1
            M7 = M1(y + t + 6 + n + j).Trim().Split(New Char() {" ", ",", ","})
            Text2.Text = Text2.Text + M7(0) + ":" + CStr(X(j)) + vbCrLf
        Next
        Text2.Text = Text2.Text + "機關權中誤差為:(機關:毫米)" + vbCrLf
        Text2.Text = Text2.Text + CStr(sigm) + vbCrLf

    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Dim sf As New SaveFileDialog
        sf.Filter = "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*"
        sf.ShowDialog()
        My.Computer.FileSystem.WriteAllText(sf.FileName, Text2.Text, False)
        MsgBox("已儲存檔案到:" & sf.FileName)
    End Sub
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Dim sf As New SaveFileDialog
        sf.Filter = "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*"
        sf.ShowDialog()
        My.Computer.FileSystem.WriteAllText(sf.FileName, Text1.Text, False)
        MsgBox("已儲存檔案到:" & sf.FileName)
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        str2 = Text1.Text
        M1 = Split(Trim(str2), vbCrLf)
        M2 = M1(0).Trim().Split(New Char() {" ", ",", ","})            '結果為(n=4,t=1,y=4)
        M3 = M2(0).Split("=")                                           '結果為(n,4)
        n = CInt(M3(1))                                 '讀取觀測個數n,即方程數
        M3 = M2(1).Split("=")
        t = CInt(M3(1))                         '讀取必要觀測個數t,即參數個數
        r = n - t                               '計算多餘觀測量=n-t
        Dim B(n - 1, t - 1), B_Z(t - 1, n - 1), BZP(t - 1, n - 1), V(n - 1, 0), VZ(0, n - 1), xx(t - 1, 0), BX(n - 1, 0) As Double
        Dim P(n - 1, n - 1), NBB(t - 1, t - 1), NBB_N(t - 1, t - 1), W(t - 1, 0), L(n - 1, 0), VZP(0, n - 1) As Double
        Dim h(n - 1), S(n - 1), X(t - 1), L_1(n - 1) As Double
        '矩陣L的讀取
        M4 = Split(M1(n + 3), ";")
        For j = 0 To n - 1
            L(j, 0) = CDbl(M4(j))
        Next
        '系數矩陣B的讀取
        For i = 0 To n - 1
            For j = 0 To t - 1
                M5 = M1(n + 5 + i).Trim().Split(New Char() {" ", ",", ","})
                B(i, j) = CDbl(M5(j))
            Next
        Next
        B_Z = ZZ(B, B_Z)                             'B的轉置
        For i = 0 To n - 1
            M6 = M1(2 + i).Trim().Split(New Char() {" ", ",", ","})
            h(i) = CDbl(M6(1))
            S(i) = CDbl(M6(2))                           'S,用于定權
        Next
        'P矩陣的讀取
        For k = 0 To n - 1
            For j = 0 To n - 1
                If k = j Then
                    P(j, k) = 10 / S(k)
                Else P(j, k) = 0
                End If
            Next
        Next
        BZP = Mmul(B_Z, P, BZP)
        NBB = Mmul(BZP, B, NBB)
        W = Mmul(BZP, L, W)
        NBB_N = QN(NBB)
        xx = Mmul(NBB_N, W, xx)
        BX = Mmul(B, xx, BX)
        For k = 0 To n - 1
            V(k, 0) = BX(k, 0) - L(k, 0)
        Next
        For i = 0 To t - 1
            M7 = M1(2 * n + i + 6).Trim().Split("=")
            X(i) = CDbl(M7(1)) + xx(i, 0) / 1000
        Next
        For j = 0 To n - 1
            L_1(j) = h(j) + V(j, 0) / 1000
        Next
        VZ = ZZ(V, VZ)
        VZP = Mmul(VZ, P, VZP)
        sgm = Mmul(VZP, V, sgm)
        sigm = Math.Sqrt(sgm(0, 0) / r)
        Text2.Text = "" + "未知點平差後高程值:(機關,米)" + vbCrLf
        For j = 0 To t - 1
            M8 = M1(2 * n + 6 + j).Trim().Split("=")
            Text2.Text = Text2.Text + M8(0) + ":" + CStr(X(j)) + vbCrLf
        Next
        Text2.Text = Text2.Text + "觀測值的平內插補點:(機關,米)" + vbCrLf
        For k = 0 To n - 1
            M9 = M1(2 + k).Trim().Split(New Char() {" ", ",", ","})
            Text2.Text = Text2.Text + M9(0) + ":" + CStr(L_1(k)) + vbCrLf
        Next
        Text2.Text = Text2.Text + "機關權中誤差為:(機關:毫米)" + vbCrLf
        Text2.Text = Text2.Text + CStr(sigm) + vbCrLf
    End Sub
End Class

           

3.Module代碼

Module Module1
    Public str1, str2 As String
    Public y, n, t, i, j, k, r As Integer
    Public xx, sgm(0, 0), sigm As Double
    Public M1(), M2(), M3(), M4(), M5(), M6(), M7(), M8(), M9() As String
    '//********************************下面是函數部分*********************************//
    '矩陣相乘函數
    Function Mmul(mtxA(,) As Double, mtxB(,) As Double, ByRef mtxC(,) As Double)
        Dim m As Integer
        Dim n As Integer
        Dim l As Integer
        Dim i As Integer, j As Integer, K As Integer
        m = UBound(mtxA, 1) - LBound(mtxA, 1)
        n = UBound(mtxA, 2) - LBound(mtxA, 2)
        l = UBound(mtxB, 2) - LBound(mtxB, 2)
        For i = 0 To m
            For j = 0 To l
                mtxC(i, j) = 0#
                For K = 0 To n
                    mtxC(i, j) = mtxC(i, j) + mtxA(i, K) * mtxB(K, j)
                Next K
            Next j
        Next i
        Return mtxC
    End Function
    '矩陣轉置函數
    Function ZZ(mtxA(,) As Double, mtxB(,) As Double)
        Dim m As Integer
        Dim n As Integer
        Dim i As Integer, j As Integer
        m = UBound(mtxA, 1) - LBound(mtxA, 1)       '原來的行數
        n = UBound(mtxA, 2) - LBound(mtxA, 2)      '原來的列數
        For i = 0 To m
            For j = 0 To n
                mtxB(j, i) = mtxA(i, j)
            Next j
        Next i
        Return mtxB
    End Function
    '矩陣求逆函數
    Function QN(Mtx(,) As Double)
        Dim N As Double
        N = UBound(Mtx, 1) - LBound(Mtx, 1)               '矩陣的行數/列數
        Dim row(0 To N) As Integer, col(0 To N) As Integer
        Dim d As Double, p As Double
        For k = 0 To N
            d = 0.0#
            For i = k To N
                For j = k To N
                    p = Math.Abs(Mtx(i, j))
                    If (p > d) Then
                        d = p
                        row(k) = i
                        col(k) = j    '記錄變換的位置
                    End If
                Next j
            Next i
            If (d + 1.0# = 1.0#) Then '找到主元,并存儲到行列号
            End If
            If (row(k) <> k) Then
                For j = 0 To N
                    p = Mtx(k, j)
                    Mtx(k, j) = Mtx(row(k), j)
                    Mtx(row(k), j) = p '行變換
                Next j
            End If
            If (col(k) <> k) Then
                For i = 0 To N
                    p = Mtx(i, k)
                    Mtx(i, k) = Mtx(i, col(k))
                    Mtx(i, col(k)) = p '列變換
                Next i
            End If
            Mtx(k, k) = 1.0# / Mtx(k, k)
            For j = 0 To N
                If (j <> k) Then
                    Mtx(k, j) = Mtx(k, j) * Mtx(k, k)
                End If
            Next j
            For i = 0 To N
                If (i <> k) Then
                    For j = 0 To N
                        If (j <> k) Then
                            Mtx(i, j) = Mtx(i, j) - Mtx(i, k) * Mtx(k, j)
                        End If
                    Next j
                End If
            Next i
            For i = 0 To N
                If (i <> k) Then
                    Mtx(i, k) = -Mtx(i, k) * Mtx(k, k)
                End If
            Next i
        Next k
        For k = N To 0 Step -1
            If (col(k) <> k) Then
                For j = 0 To N
                    p = Mtx(k, j)
                    Mtx(k, j) = Mtx(col(k), j)
                    Mtx(col(k), j) = p
                Next j
            End If
            If (row(k) <> k) Then
                For i = 0 To N
                    p = Mtx(i, k)
                    Mtx(i, k) = Mtx(i, row(k))
                    Mtx(i, row(k)) = p
                Next i
            End If
        Next k
        Return Mtx
    End Function
End Module

           

當時費勁切片分資料的做法真的笨的可以ε=ε=ε=(#>д<)ノ

繼續閱讀