bullet.gif (3885 bytes) Solve a set of simultaneous linear equations including determinant calculation by Gauss-Jordan Elimination with maximization of pivot elements. (線上執行) (原始碼下載)

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

Public Sub GJEMPD(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, col As Long
     Dim Pivot As Single, temp() As Single, order As Long
     Determinant = 1
     row = UBound(m, 1): col = UBound(m, 2)
     If col <> row + 1 Then MsgBox "矩陣輸入有誤": Exit Sub
     ReDim c(1 To row), ReturnValue(1 To row), temp(1 To col)
     For i = 1 To row
          Pivot = 0
          For j = i To row
               For k = i To row
                    If Abs(m(k, j)) > Pivot Then
                         Pivot = Abs(m(k, j))
                         r = k: c(i) = j
                    End If
               Next k
          Next j
          If Pivot = 0 Then Determinant = 0: Exit Sub
          If r <> i Then
               order = order + 1
               For j = 1 To col
                    temp(j) = m(i, j)
                    m(i, j) = m(r, j)
                    m(r, j) = temp(j)
               Next j
          End If
          If c(i) <> i Then
               order = order + 1
               For j = 1 To row
                    temp(j) = m(j, i)
                    m(j, i) = m(j, c(i))
                    m(j, c(i)) = temp(j)
               Next j
          End If
          Pivot = m(i, i)
          Determinant = Determinant * Pivot
          If Pivot <> 1 Then
               For k = 1 To col
                    m(i, k) = m(i, k) / Pivot
               Next
          End If
          For j = 1 To row
               Pivot = m(j, i)
               If i <> j And Pivot <> 0 Then
                    For k = 1 To col
                         m(j, k) = m(j, k) - m(i, k) * Pivot
                    Next
               End If
          Next
     Next i
     For i = 1 To row
          ReturnValue(i) = m(i, col)
     Next
     For i = row To 1 Step -1
          If c(i) <> i Then
               temp(1) = ReturnValue(c(i))
               ReturnValue(c(i)) = ReturnValue(i)
               ReturnValue(i) = temp(1)
          End If
     Next i
     Determinant = Determinant * (-1) ^ order
End Sub

 


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

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

Total pageview since 4/6/1999.