プロが教える店舗&オフィスのセキュリティ対策術

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が入ってしまっていることがあるからだと思いますが、これを回避する方法はないでしょうか?ご教授よろしくお願いします。

A 回答 (2件)

エラーの原因は行の入れ替えを最初の1回しかしていないからです。



行の入れ替えは、各行の計算ごとに行う必要があります。


For i = 0 To N - 1 Step 1
  m = 0
  pivot = i
  ・・・・・
  ・・・・・
Next

For k = 0 To N - 1 Step 1
  p = Myarray(k, k) '対格要素を保存
  ・・・・・
  ・・・・・
Next


この部分を、

For k = 0 To N - 1 Step 1
  m = 0
  pivot = k
  ・・・・・
  ・・・・・

  p = Myarray(k, k) '対格要素を保存
  ・・・・・
  ・・・・・
Next


とすれば大丈夫でしょう。
初めのFor文のインデックスをiからkに変えているので注意してください。

この回答への補足

解答ありがとうございます。修正プログラムfor分の終わりのNEXTが元のプログラムの2つ目のfor分の終わりのNEXTの場所でよいでしょうか?

色々やってみましたが if pivot <> i thenの中の
b(0,j) = MyArray(i,j)
の所でインデックスが配列の境界外です、ってエラーが出てしまいますね。解答の意味を勘違いしてたら申し訳ないです><

補足日時:2011/10/11 16:09
    • good
    • 0

>修正プログラムfor分の終わりのNEXTが元のプログラムの2つ目のfor分の終わりのNEXTの場所でよいでしょうか?



それでいいです。要するに2つのFor文を1つにまとめただけです。


>色々やってみましたが if pivot <> i thenの中の
>b(0,j) = MyArray(i,j)
>の所でインデックスが配列の境界外です、ってエラーが出てしまいますね。

For文の変数iをkに変えたので、1つめのFor文の中のiをすべてkに変えてください。
    • good
    • 0
この回答へのお礼

よく考えたらそうですよね。不注意失礼しました><

無事に動きました。本当にありがとうございました!

お礼日時:2011/10/11 17:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!