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が入ってしまっていることがあるからだと思いますが、これを回避する方法はないでしょうか?ご教授よろしくお願いします。
No.1ベストアンサー
- 回答日時:
エラーの原因は行の入れ替えを最初の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)
の所でインデックスが配列の境界外です、ってエラーが出てしまいますね。解答の意味を勘違いしてたら申し訳ないです><
No.2
- 回答日時:
>修正プログラム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に変えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) vba 「Nextに対するForが見当たりません」のエラーが発生する原因 1 2022/10/21 15:46
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) シートを配列にいれることはできますか? 3 2023/06/04 19:06
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVから構造体へ代入
-
なぜかわかりませんscanf()の戻...
-
VB2010での連立方程式の計算
-
python 3.10で 同じlistに同じ...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
stable diffusionのエラー
-
Excel VBA メール作成について ...
-
バイナリとBCDコード
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
Excel 1セル当りの文字数が2...
-
char str[256]の256の意味は?
-
VBAでUnicodeしか存在しない文...
-
CGIを勉強しています。¥n(改...
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
1KBが1024byteな理由
-
C言語についてです! 同じ年の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックスのvalue値の取...
-
pythonにCでのexternはありますか
-
python 3.10で 同じlistに同じ...
-
マクロの書き換え箇所がわかり...
-
OpenCvのCvMatについて教えて下...
-
UWSCにおける変数の扱い方
-
多元配列の0初期化
-
$template->output();の時に ...
-
perlのgrepでmyを付けた場合と...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
Excel VBA メール作成について ...
-
stable diffusionのエラー
-
DataGridViewの特定列に入力さ...
-
エクセルシート名の制限を変更...
-
なんでブラウザでPHPを動かすた...
-
COBOLのCOMP形式について
-
ポインター引数の関数でコンパ...
-
char str[256]の256の意味は?
-
メールの件名をデコードしたい
おすすめ情報