-
【求助】請幫我看一下這個vb程式碼哪邊錯了
執行會出現錯誤
== 第一部分.宣告 ==
'---設定Visual Basic選項---
Option Explicit
'---針對節點開一個11x11的矩陣---
Dim M(1 To 11, 1 To 11) As Double
Dim i As Integer, j As Integer
'---宣告區段到此結束.以下是執行程序---
' == 第二部分.初始假設 ==
'---假定矩陣各元素之初始值(由0開始)---
Private Sub Command1_Click()
M(1, 1) = 0: M(1, 2) = 0: M(1, 3) = 0: M(1, 4) = 0: M(1, 5) = 0: M(1, 6) = 0: M(1, 7) = 0: M(1, 8) = 0: M(1, 9) = 0: M(1, 10) = 0: M(1, 11) = 0
M(2, 1) = 0: M(2, 2) = 0: M(2, 3) = 0: M(2, 4) = 0: M(2, 5) = 0: M(2, 6) = 0: M(2, 7) = 0: M(2, 8) = 0: M(2, 9) = 0: M(2, 10) = 0: M(2, 11) = 0
M(3, 1) = 0: M(3, 2) = 0: M(3, 3) = 0: M(3, 4) = 0: M(3, 5) = 0: M(3, 6) = 0: M(3, 7) = 0: M(3, 8) = 0: M(3, 9) = 0: M(3, 10) = 0: M(3, 11) = 0
M(4, 1) = 0: M(4, 2) = 0: M(4, 3) = 0: M(4, 4) = 0: M(4, 5) = 0: M(4, 6) = 0: M(4, 7) = 0: M(4, 8) = 0: M(4, 9) = 0: M(4, 10) = 0: M(4, 11) = 0
M(5, 1) = 0: M(5, 2) = 0: M(5, 3) = 0: M(5, 4) = 0: M(5, 5) = 0: M(5, 6) = 0: M(5, 7) = 0: M(5, 8) = 0: M(5, 9) = 0: M(5, 10) = 0: M(5, 11) = 0
M(6, 1) = 0: M(6, 2) = 0: M(6, 3) = 0: M(6, 4) = 0: M(6, 5) = 0: M(6, 6) = 0: M(6, 7) = 0: M(6, 8) = 0: M(6, 9) = 0: M(6, 10) = 0: M(6, 11) = 0
M(7, 1) = 0: M(7, 2) = 0: M(7, 3) = 0: M(7, 4) = 0: M(7, 5) = 0: M(7, 6) = 0: M(7, 7) = 0: M(7, 8) = 0: M(7, 9) = 0: M(7, 10) = 0: M(7, 11) = 0
M(8, 1) = 0: M(8, 2) = 0: M(8, 3) = 0: M(8, 4) = 0: M(8, 5) = 0: M(8, 6) = 0: M(8, 7) = 0: M(8, 8) = 0: M(8, 9) = 0: M(8, 10) = 0: M(8, 11) = 0
M(9, 1) = 0: M(9, 2) = 0: M(9, 3) = 0: M(9, 4) = 0: M(9, 5) = 0: M(9, 6) = 0: M(9, 7) = 0: M(9, 8) = 0: M(9, 9) = 0: M(9, 10) = 0: M(9, 11) = 0
M(10, 1) = 0: M(10, 2) = 0: M(10, 3) = 0: M(10, 4) = 0: M(10, 5) = 0: M(10, 6) = 0: M(10, 7) = 0: M(10, 8) = 0: M(10, 9) = 0: M(10, 10) = 0: M(10, 11) = 0
M(11, 1) = 0: M(11, 2) = 0: M(11, 3) = 0: M(11, 4) = 0: M(11, 5) = 0: M(11, 6) = 0: M(11, 7) = 0: M(11, 8) = 0: M(11, 9) = 0: M(11, 10) = 0: M(11, 11) = 0
'------------------------------------------------------------------------------------------------------------------------------------------------------------
' == 第三部分.運算部分 ==
'---1.計算邊界數值---
If 1 <= i <= 11 And j = 1 Then
M(i, j) = 0 + i * (30 / 10)
End If
If 1 <= i <= 11 And j = 11 Then
M(i, j) = 50 + i * (50 / 10)
End If
If 2 <= j <= 10 And i = 1 Then
M(i, j) = 0 + j * (50 / 10)
End If
If 2 <= j <= 10 And i = 11 Then
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
End If
'---2.計算內部數值(每個點之值=鄰近四點和/4)---
If 2 <= i <= 10 And 2 <= j <= 10 Then
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
End If
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' == 第四部分.迴圈結構 ==
'---Do Loop 由猜值推估修正到正確值---
Dim O As Double
Dim N As Double
Do
If 2 <= i <= 10 And 2 <= j <= 10 Then
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
M(6, 6) = O
End If
If 2 <= j <= 10 And i = 11 Then
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
End If
If 2 <= i <= 10 And 2 <= j <= 10 Then
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
M(6, 6) = N
End If
If 2 <= j <= 10 And i = 11 Then
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
End If
Loop Until (O / N) <= 10 ^ (-5) '---如果(舊值/新值)<10^(-5),則離開迴圈---
'--------------------------------------------------------------------------------------------------------------------------------------------------
' == 第五部分.結果輸出 ==
'---將此問題的結果輸出(檔案名"solution")---
Open "solution" For Output As #1
Print #1, M(i, j)
End Sub
錯誤訊息是
執行階段錯誤 '9'
陣列索引超出範圍
偵錯後說
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
有問題
thx
-
錯的一榻糊塗...
第三部份應該是如此吧?
[code]
For i = 1 To 11
For j = 1 To 11
Select Case j
Case 1
M(i, j) = 0 + i * (30 / 10)
Case 11
M(i, j) = 50 + i * (50 / 10)
Case Else
Select Case i
Case 1
M(i, j) = 0 + j * (50 / 10)
Case 11
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
Case Else
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
End Select
End Select
Next j
Next i
[/code]
第四部分錯的更離譜,沒For Next迴圈來Assign i,j的值,O與N也沒給初值,
測試條件 (O / N) <= 10 ^ (-5) <-- 肯定是一跑就錯誤 0/0 除數為零,迴圈中也沒指定新值給 O and N ,就算你給初值給 O and N這Do...Loop迴圈不是只跑一次,就是永不結束。
-
這是經過ivan lin 指導修改過的 可是還是有點問題 請問哪邊還需要修改 我第一次寫程式 不知道如何表達 我要達成的目的
Private Sub Command1_Click()
' == 第一部分.初始假設 ==
'---針對節點開一個11x11的矩陣---
Dim M(1 To 11, 1 To 11) As Double
Dim i As Integer
Dim j As Integer
Dim O As Double
Dim N As Double
'---假定矩陣各元素之初始值(由0開始)---
For i = 1 To 11
For j = 1 To 11
M(i, j) = 0
Next j
Next i
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' == 第二部分.運算部分 ==
'---1.計算邊界數值---
'1-1.下邊界數值
For i = 1 To 11
For j = 1 To 1
M(i, j) = 0 + i * (30 / 10)
Next j
Next i
'1-2.上邊界數值
For i = 1 To 11
For j = 11 To 11
M(i, j) = 50 + i * (50 / 10)
Next j
Next i
'1-3.左邊界數值
For i = 1 To 1
For j = 2 To 10
M(i, j) = 0 + j * (50 / 10)
Next j
Next i
'1-4.右邊界數值
For i = 11 To 11
For j = 2 To 10
Option Explicit
M(i, j) = (2 * M(10, j) + M(11, j - 1) + M(11, j + 1)) / 4
Next j
Next i
'---2.計算內部數值(每個點之值=鄰近四點和/4)---
For i = 2 To 10
For j = 2 To 10
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
Next j
Next i
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
For i = 1 To 11
Debug.Print i, ;
For j = 1 To 11
'Debug.Print Left(M(i, j), 8), ;
Debug.Print Format(M(i, j), ".##########"), ;
Next j
Debug.Print
Next i
Debug.Print "M(6,6): "; M(6, 6)
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' == 第三部分.迴圈結構 ==
'---Do Loop 由猜值推估修正到正確值---
Do
'1.計算一次內部值,並取 M(6, 6)的數值作為舊值(O)
For i = 2 To 10
For j = 2 To 10
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
Next j
Next i
O = M(6, 6)
'2.計算一次右邊界值
For i = 11 To 11
For j = 2 To 10
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
Next j
Next i
'3.再計算一次內部值,並取 M(6, 6)的數值作為新值(N)
For i = 2 To 10
For j = 2 To 10
M(i, j) = (M(i + 1, j) + M(i - 1, j) + M(i, j + 1) + M(i, j - 1)) / 4
Next j
Next i
N = M(6, 6)
'4.再計算一次右邊界值
For i = 11 To 11
For j = 2 To 10
M(i, j) = (2 * M(i - 1, j) + M(i, j - 1) + M(i, j + 1)) / 4
Next j
Next i
Debug.Print O, N, (O / N)
DoEvents
Loop Until (O / N) <= 10 ^ (-1) '---如果(舊值/新值)<10^(-5),則離開迴圈---
MsgBox "ok"
'--------------------------------------------------------------------------------------------------------------------------------------------------
' == 第四部分.結果輸出 ==
For i = 1 To 11
Debug.Print i, ;
For j = 1 To 11
'Debug.Print Left(M(i, j), 8), ;
Debug.Print Format(M(i, j), ".##########"), ;
Next j
Debug.Print
Next i
Debug.Print "M(6,6): "; M(6, 6)
'---將此問題的結果輸出(檔案名"solution")---
Open "solution" For Output As #1
Print #1, M(i, j)
End Sub
附上題目說明,謝謝!!
已知有一個流場的邊界如下圖所示:
[img]http://home.pchome.com.tw/love/hackerbobo/PCfin.JPG[/img]
而其中關於O與N的收斂值部分,我之前是問同學如何讓這個矩陣判定結束迴圈,我同學的建議是任一抽取其中的一個數值作為基準,在以此值計算的新值與舊值做比較來作為結束迴圈的條件.所以我才會作如此的假設.但是如此的假設似乎是造成無法跑出迴圈的原因,所以想請問能否有更好的方式呢?