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が入ってしまっていることがあるからだと思いますが、これを回避する方法はないでしょうか?ご教授よろしくお願いします。
お礼
回答ありがとうございます。計測結果を再検討したところやはり同期処理の時間が関係していそうです。