【VB.net】测量平差程序设计(条件平差和间接平差)

先说一下,如果是陶老师的学生,建议不要抄!

1.窗口

依然是见仁见智,打码的部分是我的名字学号。
在这里插入图片描述

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.TextFalse)
        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.TextFalse)
        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

当时费劲切片分数据的做法真的笨的可以ε=ε=ε=(#>д<)ノ

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: VB.NET程序设计是一种用于开发Windows应用程序的编程语言,它基于Microsoft .NET框架。PDF(Portable Document Format)是一种流行的跨平台文件格式,用于存储和共享电子文档。网盘是一种云存储服务,可以在互联网上存储和分享文件。 在VB.NET程序设计中,我们可以使用相关的类库和API来处理PDF文件。我们可以使用第三方库(如iTextSharp)来读取、创建和编辑PDF文件。通过VB.NET程序,我们可以实现生成PDF报表、合并多个PDF文件、提取页面或内容等操作。 当涉及到与网盘的集成时,VB.NET提供了许多方法来实现这一功能。我们可以使用WebClient类或HttpWebRequest类来上传和下载文件到网盘。另外,VB.NET还支持使用FTP(文件传输协议)来与网盘进行文件传输。 通过将VB.NET程序与网盘集成,我们可以实现将生成的PDF文件上传到网盘进行共享和备份。我们还可以使用网盘的API来实现自动化操作,例如定期从网盘下载更新的PDF文件。 总而言之,VB.NET程序设计可以与PDF和网盘集成,实现各种功能,例如生成、编辑和共享PDF文件。这为我们的应用程序提供了更多的灵活性和可扩展性。 ### 回答2: VB.NET程序设计是一种使用Visual Basic .NET编程语言进行软件开发的过程。它可以用于开发各种类型的应用程序和系统,包括桌面应用程序、网页应用程序和服务端应用程序等。VB.NET具有简单易学、功能强大和高效的特点,因此在软件开发领域得到广泛应用。 PDF是一种常见的电子文档格式,它可以在不同平台和设备上显示和打印。VB.NET程序设计可以用于创建、编辑和操作PDF文件。通过VB.NET,我们可以使用各种PDF库和API来实现对PDF文档的操作,例如创建PDF文档、向文档中添加内容、修改文档结构和样式、提取文本和图像等。 网盘是一种在线存储和共享文件的服务,通常提供文件上传、下载、分享和同步等功能。VB.NET程序设计可以用于开发网盘应用程序,使用户能够方便地上传、下载和管理文件。通过VB.NET,我们可以实现与网盘服务提供商的API进行交互,通过调用API来实现文件的上传和下载功能,并可添加一些额外功能,如文件分享和权限管理。 总而言之,使用VB.NET程序设计可以开发将PDF和网盘结合的功能强大的应用程序。这些应用程序可以实现对PDF文档的创建、编辑和操作,并能与网盘服务进行交互,方便用户进行文件的上传、下载和管理。 ### 回答3: VB.Net程序设计的PDF网盘是用VB.Net编写的一个用于存储和共享PDF文档的网络平台。 这个PDF网盘可以让用户上传、下载、管理和共享PDF文档。用户可以通过VB.Net程序设计的界面,进行登录和注册,并使用自己的账号密码来访问网盘。在登录之后,用户可以将自己的电脑上的PDF文件上传到网盘中,也可以从网盘中下载其他用户共享的PDF文件。 网盘中的PDF文档可以进行分类和标记,方便用户查找和管理。用户可以创建文件夹,将相关的PDF文档放在一起,便于整理和查找。用户还可以给PDF文档添加标签,通过标签来快速定位和检索所需的文档。 此外,网盘还提供了一些其他的功能,例如文件预览、文件分享和评论等。用户可以在网盘中预览PDF文件的内容,以便确认文件是否符合自己的需求。用户也可以将自己的PDF文档分享给其他用户,方便共同编辑和查看。用户还可以在PDF文档下方发表评论,与其他用户进行交流和讨论。 总之,VB.Net程序设计的PDF网盘是一个方便用户存储、管理和共享PDF文档的工具,通过简单易用的界面和丰富的功能,为用户提供了便捷的操作和愉快的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值