⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrixmodule.bas

📁 清华大学2002年出版的《科学与工程数值计算算法VB》配套源码
💻 BAS
📖 第 1 页 / 共 5 页
字号:
        Next i

        ' 求解失败
        If (d + 1# = 1#) Then
            MCinv = False
            Exit Function
        End If

        If (nIs(k) <> k) Then
          For j = 1 To n
              t = mtxAR(k, j)
              mtxAR(k, j) = mtxAR(nIs(k), j)
              mtxAR(nIs(k), j) = t

              t = mtxAI(k, j)
              mtxAI(k, j) = mtxAI(nIs(k), j)
              mtxAI(nIs(k), j) = t
            Next j
        End If
        If (nJs(k) <> k) Then
            For i = 1 To n
                t = mtxAR(i, k)
                mtxAR(i, k) = mtxAR(i, nJs(k))
                mtxAR(i, nJs(k)) = t
                t = mtxAI(i, k)
                mtxAI(i, k) = mtxAI(i, nJs(k))
                mtxAI(i, nJs(k)) = t
            Next i
        End If

        mtxAR(k, k) = mtxAR(k, k) / d
        mtxAI(k, k) = -mtxAI(k, k) / d
        For j = 1 To n
            If (j <> k) Then
                p = mtxAR(k, j) * mtxAR(k, k)
                q = mtxAI(k, j) * mtxAI(k, k)
                s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(k, k) + mtxAI(k, k))
                mtxAR(k, j) = p - q
                mtxAI(k, j) = s - p - q
            End If
        Next j
        For i = 1 To n
            If (i <> k) Then
              For j = 1 To n
                    If (j <> k) Then
                        p = mtxAR(k, j) * mtxAR(i, k)
                        q = mtxAI(k, j) * mtxAI(i, k)
                        s = (mtxAR(k, j) + mtxAI(k, j)) * (mtxAR(i, k) + mtxAI(i, k))
                        t = p - q
                        b = s - p - q
                        mtxAR(i, j) = mtxAR(i, j) - t
                        mtxAI(i, j) = mtxAI(i, j) - b
                    End If
                Next j
            End If
        Next i

        For i = 1 To n
            If (i <> k) Then
                p = mtxAR(i, k) * mtxAR(k, k)
                q = mtxAI(i, k) * mtxAI(k, k)
                s = (mtxAR(i, k) + mtxAI(i, k)) * (mtxAR(k, k) + mtxAI(k, k))
                mtxAR(i, k) = q - p
                mtxAI(i, k) = p + q - s
            End If
        Next i
    Next k

    ' 调整恢复行列次序
    For k = n To 1 Step -1
        If (nJs(k) <> k) Then
          For j = 1 To n
              t = mtxAR(k, j)
              mtxAR(k, j) = mtxAR(nJs(k), j)
              mtxAR(nJs(k), j) = t
              t = mtxAI(k, j)
              mtxAI(k, j) = mtxAI(nJs(k), j)
              mtxAI(nJs(k), j) = t
            Next j
        End If
        If (nIs(k) <> k) Then
            For i = 1 To n
                t = mtxAR(i, k)
                mtxAR(i, k) = mtxAR(i, nIs(k))
                mtxAR(i, nIs(k)) = t
                t = mtxAI(i, k)
                mtxAI(i, k) = mtxAI(i, nIs(k))
                mtxAI(i, nIs(k)) = t
            Next i
        End If
    Next k
    
    ' 求解成功
    MCinv = True

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MSsgj
'  功能:  计算对称正定矩阵的逆
'  参数:  n     - Integer型变量,矩阵阶数。
'          mtxA  - Double型二维数组,体积为n x n。存放实对称正定矩阵A;返回时存放逆矩阵A-。
'  返回值:Boolean型,成功为True,失败为False。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MSsgj(n As Integer, mtxA() As Double) As Boolean
    ' 局部变量
    Dim i As Integer, j, k, m
    Dim w As Double, g As Double
    ReDim b(n) As Double

    ' 循环重新编号求解
    For k = 1 To n
        w = a(1, 1)
         ' 求解失败
        If (Abs(w) + 1# = 1#) Then
            MSsgj = False
            Exit Function
        End If

        m = n - k - 1
        For i = 2 To n
            g = a(i, 1)
            b(i) = g / w
            If (i <= m) Then b(i) = -b(i)
            For j = 2 To i
              a(i - 1, j - 1) = a(i, j) + g * b(j)
            Next j
        Next i
        a(n, n) = 1# / w
        For i = 2 To n
          a(n, i - 1) = b(i)
        Next i
    Next k

    For i = 1 To n - 1
        For j = i + 1 To n
            a(i, j) = a(j, i)
        Next j
    Next i

' 求解成功
MSsgj = True

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MTinv
'  功能:  用特兰持(Trench)方法求托伯利兹(Toeplitz)矩阵的逆矩阵
'  参数:  n      - Integer型变量,T型矩阵阶数。
'          dblT   - Double型一维数组,长度为n。存放n阶T型矩阵中的上三角元素t0,t1,…tn-1。
'          dblTT  - Double型一维数组,长度为n。其中后n-1个元素tt(1),…,tt(n-1)依次存放n阶T型矩阵中的元素。
'          dblB    - Double型二维数组,体积为n x n。返回n阶T型矩阵的逆矩阵。
'  返回值:Boolean型,成功为True,失败为False。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MTinv(n As Integer, dblT() As Double, dblTT() As Double, dblB() As Double) As Boolean
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer
    Dim a As Double, s As Double
    ReDim c(n) As Double, r(n) As Double, p(n) As Double

    ' 矩阵非T型矩阵
    If (Abs(dblT(1)) + 1# = 1#) Then
        MTinv = False
        Exit Function
    End If

    ' 取初值
    a = dblT(1)
    c(1) = dblTT(2) / dblT(1)
    r(1) = dblT(2) / dblT(1)

    ' 循环计算
    For k = 1 To n - 2
        s = 0#
        For j = 2 To k + 1
          s = s + c(k + 1 - j + 1) * dblTT(j)
        Next j

        s = (s - dblTT(k + 2)) / a

        For i = 1 To k
          p(i) = c(i) + s * r(k - i + 1)
        Next i

        c(k + 1) = -s
        s = 0#
        For j = 2 To k + 1
          s = s + r(k + 1 - j + 1) * dblT(j)
        Next j

        s = (s - dblT(k + 2)) / a
        For i = 1 To k
            r(i) = r(i) + s * c(k - i + 1)
            c(k - i + 1) = p(k - i + 1)
        Next i
        
        r(k + 1) = -s
        a = 0#
        For j = 2 To k + 2
          a = a + dblT(j) * c(j - 1)
        Next j

        a = dblT(1) - a
        If (Abs(a) + 1# = 1#) Then
            MTinv = False
            Exit Function
        End If
    Next k

    dblB(1, 1) = 1# / a
    For i = 1 To n - 1
        dblB(1, i + 1) = -r(i) / a
        dblB(i + 1, 1) = -c(i) / a
    Next i

    ' 计算逆矩阵中的各元素
    For i = 1 To n - 1
        For j = 1 To n - 1
            dblB(i + 1, j + 1) = dblB(i, j) - c(i) * dblB(1, j + 1)
            dblB(i + 1, j + 1) = dblB(i + 1, j + 1) + c(n - j) * dblB(1, n - i + 1)
        Next j
    Next i

    ' 求解成功
    MTinv = True
    
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MDetGauss
'  功能:  用全选主元高斯消去法求行列式的值
'  参数:  n       - Integer型变量,方阵的阶数。
'          mtxA    - Double型二维数组,体积为n x n,存放方阵。
'  返回值:Double型,行列式的值。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MDetGauss(n As Integer, mtxA() As Double) As Double
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer, nIs As Integer, nJs As Integer
    Dim f As Double, det As Double, q As Double, d As Double

    f = 1#
    det = 1#

    ' 选主元
    For k = 1 To n - 1
        q = 0#
        For i = k To n
            For j = k To n
                d = Abs(mtxA(i, j))
                If (d > q) Then
                    q = d
                    nIs = i
                    nJs = j
                End If
            Next j
        Next i

        ' 求解失败
        If (q + 1# = 1#) Then
            MDetGauss = 0
            Exit Function
        End If

        If (nIs <> k) Then
            f = -f
            For j = k To n
                d = mtxA(k, j)
                mtxA(k, j) = mtxA(nIs, j)
                mtxA(nIs, j) = d
            Next j
        End If

        ' 调整
        If (nJs <> k) Then
            f = -f
            For i = k To n
                d = mtxA(i, nJs)
                mtxA(i, nJs) = mtxA(i, k)
                mtxA(i, k) = d
            Next i
        End If

        ' 计算行列式的值
        det = det * mtxA(k, k)
        
        ' 调整方阵为上三角矩阵
        For i = k + 1 To n
            d = mtxA(i, k) / mtxA(k, k)
            For j = k + 1 To n
                mtxA(i, j) = mtxA(i, j) - d * mtxA(k, j)
            Next j
        Next i
    Next k

    ' 计算行列式的值
    det = f * det * mtxA(n, n)

    ' 求解成功
    MDetGauss = det

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'  模块名:MatrixModule.bas
'  函数名:MRank
'  功能:  用全选主元高斯消去法求矩阵的秩
'  参数:  m       - Integer型变量,矩阵的行数。
'          n       - Integer型变量,矩阵的列数。
'          mtxA    - Double型二维数组,体积为m x n,存放待求秩的矩阵。
'  返回值:Integer型,矩阵的秩。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function MRank(m As Integer, n As Integer, mtxA() As Double) As Integer
    ' 局部变量
    Dim i As Integer, j As Integer, k As Integer, l As Integer, nIs As Integer, nJs As Integer, nn As Integer
    Dim q As Double, d As Double

    ' 基数
    nn = m
    If (m >= n) Then nn = n

    ' 消元求解
    k = 0
    For l = 1 To nn
        q = 0#
        For i = 2 To m
            For j = 2 To n
                d = Abs(mtxA(i, j))
                If (d > q) Then
                    q = d
                    nIs = i
                    nJs = j
                End If
            Next j
        Next i

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -