連立一次方程式を解くプログラムがちょっと必要になって、ニューメリカルレシピに載っていたLU分解のライブラリを移植してみた。
ソースはこちら↓
「Matrix.txt」をダウンロード
使い方は、まずax = bを解きたいとき、
とりあえずconst のnに行列の大きさを定義しておいて、
Dim a(n,n) as double
Dim b(n) as double
で行列、ベクトルを定義。
Call ludcmp(a, indx, d)
Call lubksb(a, indx, b)
とするとbにxの値が入る。てことで、aとbは呼び出すと破壊されます(もともとそういう仕様)。
もっと簡単には
Call linsolve(a,b)
を勝手に用意しましたよ。
ついでに逆行列も
Call invmat(a)
行列式も
d = det(a)
なんかで計算できます。ご承知の通り、一切エラーチェックをしてないので、不具合が出ても責任はもてません。。。
こんな感じで使う。
Sub ボタン1_Click()
Dim a(n, n) As Double
Dim indx(n) As Integer
Dim b(n) As Double
Dim d As Double
Dim i As Integer, j As Integer
For i = 1 To n
For j = 1 To n
a(i, j) = 0#
Next j
Next i
a(1, 1) = 5#
a(1, 2) = 10#
a(1, 3) = 14#
a(2, 1) = 3#
a(2, 2) = 8#
a(2, 3) = 2#
a(3, 1) = 2#
a(3, 2) = 5#
a(3, 3) = 4#
b(1) = 15
b(2) = 1
b(3) = 6
Call linsolve(a, b)
For i = 1 To n
For j = 1 To n
Worksheets("Sheet1").Cells(i, j) = a(i, j)
Next j
Next i
For i = 1 To n
Worksheets("Sheet1").Cells(i, n + 4) = b(i)
Next i
End Sub
最近のコメント