bullet.gif (3885 bytes) Matrix Inversion including determinant calculation by Gauss-Jordan Elimination with maximization of pivot elements. (線上執行) (原始碼下載)

這裡提供的程式基本上是和以前那個程式一樣的功能,都是解決矩陣求逆的問題,但是這個程式多計算一項額外的數據 Determinant,如此可讓我們知道這個矩陣的逆矩陣是否存在,以及判斷這個矩陣是否可能為 ill-conditioned。以下僅列出副程式供參考,至於範例可以直接套用以前的即可,在此就不再覆述了,但是要記得必須多傳入一個參數 determinant,以免發生run time error。

Public Sub MIMPD(m() As Single, Determinant As Single, ReturnValue() As Single)
     Dim i As Long, j As Long, k As Long, n As Long
     Dim r() As Long, c() As Long, row As Long, temp() As Single
     Dim Pivot As Single, NoCompare As Boolean, order As Long
     Determinant = 1
     row = UBound(m, 1)
     If row <> UBound(m, 2) Then MsgBox "矩陣輸入有誤": Exit Sub
     ReDim r(1 To row), c(1 To row), temp(1 To row), ReturnValue(1 To row, 1 To row)
     For i = 1 To row
          ReturnValue(i, i) = 1
     Next
     For i = 1 To row
          Pivot = 0
          NoCompare = False
          For j = 1 To row
               For n = 1 To i - 1
                    NoCompare = (j = c(n))
                    If NoCompare Then Exit For
               Next n
               If Not NoCompare Then
                    For k = 1 To row
                         For n = 1 To i - 1
                              NoCompare = (k = r(n))
                              If NoCompare Then Exit For
                         Next n
                         If Not NoCompare Then
                              If Abs(m(k, j)) >= Pivot Then
                                   Pivot = Abs(m(k, j))
                                   r(i) = k: c(i) = j
                              End If
                         End If
                    Next k
               End If
          Next j
          Pivot = m(r(i), c(i))
          If Pivot = 0 Then Determinant = 0: Exit Sub Else Determinant = Determinant * Pivot
          If Pivot <> 1 Then
               For k = 1 To row
                    m(r(i), k) = m(r(i), k) / Pivot
                    ReturnValue(r(i), k) = ReturnValue(r(i), k) / Pivot
               Next k
          End If
          For j = 1 To row
               Pivot = m(j, c(i))
               If j <> r(i) And Pivot <> 0 Then
                    For k = 1 To row
                         m(j, k) = m(j, k) - m(r(i), k) * Pivot
                         ReturnValue(j, k) = ReturnValue(j, k) - ReturnValue(r(i), k) * Pivot
                    Next
               End If
          Next j
     Next i
     For i = 1 To row - 1
          If r(i) <> c(i) Then
               order = order + 1
               For j = 1 To row
                    temp(j) = ReturnValue(r(i), j)
                    ReturnValue(r(i), j) = ReturnValue(c(i), j)
                    ReturnValue(c(i), j) = temp(j)
               Next
               For j = i + 1 To row
                    If r(j) = c(i) Then r(j) = r(i): Exit For
               Next
               r(i) = c(i)
          End If
     Next
     Determinant = Determinant * (-1) ^ order
End Sub

 


[ 上一個 | 首頁 | 數值分析 | 下一個 ]

This page was written by Jaric on May. 9, 1999. All rights reserved.

Total pageview since 4/6/1999.