行列式の計算 for VBA 行列式の余因子展開式、 X det A = A1j Ã1j , j Ãij は (行列 A の i 行と j 列を取り除いた行列の行列式) × (−1)i+j を利用し、行列式を簡単に数値計算することができます。以下は VBA のソース で、例えば Excel VBA の標準モジュールに貼り付ければ実際に機能します。 Type Matrix ’ 行列の型 Ele(10, 10) As Single Dim As Variant End Type Function Determ(a As Matrix) ’ 行列式 If a.Dim = 1 Then Determ = a.Ele(1, 1) ElseIf a.Dim = 2 Then Determ = a.Ele(1, 1) * a.Ele(2, 2) - a.Ele(1, 2) * a.Ele(2, 1) Else s = 0: For j = 1 To a.Dim s = s + a.Ele(1, j) * CoFactor(a, 1, j) Next j: Determ = s End If End Function Function CoFactor(a As Matrix, i, j) ’ 余因子 Dim b As Matrix: b.Dim = a.Dim - 1 For x = 1 To b.Dim: For y = 1 To b.Dim xd = x: If x >= i Then xd = x + 1 yd = y: If y >= j Then yd = y + 1 b.Ele(x, y) = a.Ele(xd, yd) Next y: Next x CoFactor = Determ(b) * (-1) ^ (i + j) End Function Function CoMatrix(a As Matrix) As Matrix ’ 余因子行列 Dim b As Matrix: b.Dim = a.Dim For i = 1 To b.Dim: For j = 1 To b.Dim b.Ele(i, j) = CoFactor(a, j, i) Next j: Next i CoMatrix = b End Function 行列の型の定義において、Ele は成分、Dim は次数を表すプロパティとして定義 しています。最大で 10 次正方行列まで扱えるようになっています。行列式のプロ 1 シージャにおいて a.Dim = 2 の分岐は不要ですが、処理を軽くするために入れて います。 行列式のプロシージャが余因子のそれを呼び、また逆に余因子のそれが行列式 のそれを呼び、再帰的に行列式が計算されることがわかるでしょう。実際に行列 式や余因子行列を計算させるためには、以下のプロシージャを加えます。 Sub IOMatrix(a As Matrix, y, x, s) ’ 行列入出力 For i = 1 To a.Dim: For j = 1 To a.Dim If s = "in" Then a.Ele(i, j) = Cells(y - 1 + i, x - 1 + j).Value If s = "out" Then Cells(y - 1 + i, x - 1 + j).Value = a.Ele(i, j) Next j: Next i End Sub Sub Test() ’ テスト Dim a As Matrix a.Dim = Cells(1, 1).Value Call IOMatrix(a, 3, 1, "in") Call IOMatrix(CoMatrix(a), a.Dim + 4, 1, "out") Cells(2 * a.Dim + 5, 1).Value = Determ(a) End Sub Excel で Test を実行すると図 1 のようになります。 図 1: 余因子行列と行列式の出力 Excel は行列式や逆行列の関数を独自に持っているので、この処理自体にはさほ ど意味はありませんが、VBA で行列を含む複雑な数値計算をする時に、その基礎 になるであろうスクリプトです。 2
© Copyright 2024 Paperzz