module2.bas

来自「采用VB编写的一个电路分析系统」· BAS 代码 · 共 474 行 · 第 1/2 页

BAS
474
字号
'         dblAR  - single型 n x n 二维数组,线性代数方程组的系数矩阵的实部
'         dblAI   - single型 n x n 二维数组,线性代数方程组的系数矩阵的虚部
'         dblBR  - single型长度为 n 的一维数组,线性代数方程组的常数向量的实部,返回方程组的解向量的实部
'         dblBI   - single型长度为 n 的一维数组,线性代数方程组的常数向量的虚部,返回方程组的解向量的虚部
'  返回值:Boolean型,求解成功为True,无解或求解失败为False
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function LECpxGauss(n As Integer, dblAR() As Single, dblAI() As Single, dblBR() As Single, dblBI() As Single) As Boolean
    ' 局部变量
    Dim I As Integer, j As Integer, k As Integer
    Dim nIs As Integer
    ReDim nJs(n) As Integer
    Dim d As Single, p As Single, q As Single, s As Single
    
    ' 开始求解
    For k = 1 To n - 1
        d = 0#
        
        ' 归一
        For I = k To n
            For j = k To n
                p = dblAR(I, j) * dblAR(I, j) + dblAI(I, j) * dblAI(I, j)
                If p > d Then
                    d = p
                    nJs(k) = j
                    nIs = I
                End If
            Next j
        Next I
        
        ' 无解,返回
        If d + 1# = 1# Then
            LECpxGauss = False
            Exit Function
        End If
        
        ' 消元
        For j = k To n
            p = dblAR(k, j)
            dblAR(k, j) = dblAR(nIs, j)
            dblAR(nIs, j) = p
            p = dblAI(k, j)
            dblAI(k, j) = dblAI(nIs, j)
            dblAI(nIs, j) = p
        Next j
        
        p = dblBR(k)
        dblBR(k) = dblBR(nIs)
        dblBR(nIs) = p
        p = dblBI(k)
        dblBI(k) = dblBI(nIs)
        dblBI(nIs) = p
        
        For I = 1 To n
            p = dblAR(I, k)
            dblAR(I, k) = dblAR(I, nJs(k))
            dblAR(I, nJs(k)) = p
            p = dblAI(I, k)
            dblAI(I, k) = dblAI(I, nJs(k))
            dblAI(I, nJs(k)) = p
        Next I
        
        ' 复数运算
        For j = k + 1 To n
            p = dblAR(k, j) * dblAR(k, k)
            q = -dblAI(k, j) * dblAI(k, k)
            s = (dblAR(k, k) - dblAI(k, k)) * (dblAR(k, j) + dblAI(k, j))
            dblAR(k, j) = (p - q) / d
            dblAI(k, j) = (s - p - q) / d
        Next j
        
        p = dblBR(k) * dblAR(k, k)
        q = -dblBI(k) * dblAI(k, k)
        s = (dblAR(k, k) - dblAI(k, k)) * (dblBR(k) + dblBI(k))
        dblBR(k) = (p - q) / d
        dblBI(k) = (s - p - q) / d
        
        For I = k + 1 To n
            For j = k + 1 To n
                p = dblAR(I, k) * dblAR(k, j)
                q = dblAI(I, k) * dblAI(k, j)
                s = (dblAR(I, k) + dblAI(I, k)) * (dblAR(k, j) + dblAI(k, j))
                dblAR(I, j) = dblAR(I, j) - p + q
                dblAI(I, j) = dblAI(I, j) - s + p + q
            Next j
            p = dblAR(I, k) * dblBR(k)
            q = dblAI(I, k) * dblBI(k)
            s = (dblAR(I, k) + dblAI(I, k)) * (dblBR(k) + dblBI(k))
            dblBR(I) = dblBR(I) - p + q
            dblBI(I) = dblBI(I) - s + p + q
        Next I
    Next k
        
    d = dblAR(n, n) * dblAR(n, n) + dblAI(n, n) * dblAI(n, n)

    ' 无解,返回
    If d + 1# = 1# Then
        LECpxGauss = False
        Exit Function
    End If
    
    p = dblAR(n, n) * dblBR(n)
    q = -dblAI(n, n) * dblBI(n)
    s = (dblAR(n, n) - dblAI(n, n)) * (dblBR(n) + dblBI(n))
    dblBR(n) = (p - q) / d
    dblBI(n) = (s - p - q) / d
        
    ' 回代
    For I = n - 1 To 1 Step -1
        For j = I + 1 To n
            p = dblAR(I, j) * dblBR(j)
            q = dblAI(I, j) * dblBI(j)
            s = (dblAR(I, j) + dblAI(I, j)) * (dblBR(j) + dblBI(j))
            dblBR(I) = dblBR(I) - p + q
            dblBI(I) = dblBI(I) - s + p + q
        Next j
    Next I
    
    ' 调整解的次序
    nJs(n) = n
    For k = n To 1 Step -1
        p = dblBR(k)
        dblBR(k) = dblBR(nJs(k))
        dblBR(nJs(k)) = p
        
        p = dblBI(k)
        dblBI(k) = dblBI(nJs(k))
        dblBI(nJs(k)) = p
    Next k
    
    ' 求解成功
    LECpxGauss = True
    
End Function

Public Function CGetA(R, I As Single) As Double

CGetA = Sqr(R * R + I * I)

End Function

Public Function CGetalpha(R, I As Single) As Single
If R = 0 And I > 0 Then
  CGetalpha = 90
ElseIf R = 0 And I < 0 Then
  CGetalpha = 270
ElseIf R > 0 And I = 0 Then
  CGetalpha = 0
ElseIf R < 0 And I = 0 Then
  CGetalpha = 180
ElseIf R > 0 Then
  CGetalpha = Atn(I / R) * 180 / pi
ElseIf R < 0 Then
  CGetalpha = 180 - Atn(I / R) * 180 / pi
End If
End Function
Public Function MRinv2(n As Integer, mtxA() As Single) As Boolean
    ' 局部变量
    ReDim nIs(n) As Integer, nJs(n) As Integer
    Dim I As Integer, j As Integer, k As Integer
    Dim d As Single, p As Single

    ' 全选主元,消元
    For k = 1 To n
        d = 0#
        For I = k To n
            For j = k To n
                p = Abs(mtxA(I, j))
                If (p > d) Then
                    d = p
                    nIs(k) = I
                    nJs(k) = j
                End If
            Next j
        Next I
        
        ' 求解失败
        If (d + 1# = 1#) Then
            MRinv2 = False
            Exit Function
        End If

        If (nIs(k) <> k) Then
            For j = 1 To n
                p = mtxA(k, j)
                mtxA(k, j) = mtxA(nIs(k), j)
                mtxA(nIs(k), j) = p
            Next j
        End If

        If (nJs(k) <> k) Then
            For I = 1 To n
                p = mtxA(I, k)
                mtxA(I, k) = mtxA(I, nJs(k))
                mtxA(I, nJs(k)) = p
            Next I
        End If

        mtxA(k, k) = 1# / mtxA(k, k)
        For j = 1 To n
            If (j <> k) Then mtxA(k, j) = mtxA(k, j) * mtxA(k, k)
        Next j
        For I = 1 To n
            If (I <> k) Then
                For j = 1 To n
                    If (j <> k) Then mtxA(I, j) = mtxA(I, j) - mtxA(I, k) * mtxA(k, j)
                Next j
            End If
        Next I
        For I = 1 To n
            If (I <> k) Then mtxA(I, k) = -mtxA(I, k) * mtxA(k, k)
        Next I
    Next k

    ' 调整恢复行列次序
    For k = n To 1 Step -1
        If (nJs(k) <> k) Then
          For j = 1 To n
              p = mtxA(k, j)
              mtxA(k, j) = mtxA(nJs(k), j)
              mtxA(nJs(k), j) = p
          Next j
        End If
        If (nIs(k) <> k) Then
          For I = 1 To n
              p = mtxA(I, k)
              mtxA(I, k) = mtxA(I, nIs(k))
              mtxA(I, nIs(k)) = p
          Next I
        End If
    Next k
    
    ' 求解成功
    MRinv2 = True

End Function

⌨️ 快捷键说明

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