VB2010での連立方程式の計算
VB2010でガウスの消去法のプログラムを作りたいんですが、うまく解が求まらないのでメールしました。今回の例は未知数8です。ちなみにVBは初心者です。
Myarrayは、列の1-8個目までが、各未知数の係数、9個目が整数を表しています。
行は式を表していて、未知数が8個あるので8行あります。
Dim MyArray(,) As Double = {{-1, 1, -1, 1, 0, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 0, 0, 0, -1},
{0, 0, 0, 0, 0, 0, 0, 1, -1},
{0, 0, 0, 0, 1, 1, 1, 1, 0},
{0, 0, 1, 0, 0, 0, -1, 0, 0},
{0, 2, 0, 0, 0, -2, 0, 0, 0},
{-6, 2, 0, 0, 0, 0, 0, 0, 0},
{6, 2, 0, 0, 0, 0, 0, 0, 0}
}
Const N = 8
Dim i, j, k, l, pivot As Integer
Dim x(N) As Double
Dim p, q, m As Double
Dim b(1, N + 1) As Double
For i = 0 To N - 1 Step 1
m = 0
pivot = i
For l = i To N - 1 Step 1 'i列の中で一番値が大きい列を選ぶ
If System.Math.Abs(MyArray(l, i)) > m Then
m = System.Math.Abs(MyArray(l, i))
pivot = l
End If
Next
'pivotがiと違えば、行の入れ替え
If pivot <> i Then
For j = 0 To 8 Step 1
b(0, j) = MyArray(i, j)
MyArray(i, j) = MyArray(pivot, j)
Myarray(pivot, j) = b(0, j)
Next
End If
Next
For k = 0 To N - 1 Step 1
p = Myarray(k, k) '対格要素を保存
MsgBox(p)
MyArray(k, k) = 1 '対格要素は1になることが分かっているので代入
For j = k + 1 To N Step 1
MyArray(k, j) = MyArray(k, j) / p
Next
For i = k + 1 To N - 1 Step 1
q = MyArray(i, k)
For j = k + 1 To N Step 1
MyArray(i, j) = MyArray(i, j) - q * MyArray(k, j)
Next
'0となることが分かってるので代入
MyArray(i, k) = 0
Next
Next
'解の計算
For i = N - 1 To 0 Step -1
x(i) = MyArray(i, N)
For j = N - 1 To i + 1 Step -1
x(i) = x(i) - MyArray(i, j) * x(j)
Next
Next
MsgBox(x(0))
MsgBox(x(1))
MsgBox(x(2))
MsgBox(x(3))
MsgBox(x(4))
MsgBox(x(5))
MsgBox(x(6))
MsgBox(x(7))
出力結果としてNAN(非数値)と出てきてしまいます。原因は、pに0が入ってしまっていることがあるからだと思いますが、これを回避する方法はないでしょうか?ご教授よろしくお願いします。
お礼
変数宣言の方法を教えて頂きありがとうございます。