【求助】請幫我看一下這個vb程式碼哪邊錯了



贊助商連結


hackerbobo
2005-01-07, 02:53 AM
執行會出現錯誤



== 第一部分.宣告 ==

'---設定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

贊助商連結


ivantw
2005-01-07, 12:44 PM
錯的一榻糊塗...

第三部份應該是如此吧?


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


第四部分錯的更離譜,沒For Next迴圈來Assign i,j的值,O與N也沒給初值,
測試條件 (O / N) <= 10 ^ (-5) <-- 肯定是一跑就錯誤 0/0 除數為零,迴圈中也沒指定新值給 O and N ,就算你給初值給 O and N這Do...Loop迴圈不是只跑一次,就是永不結束。

hackerbobo
2005-01-08, 10:47 PM
這是經過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

附上題目說明,謝謝!!
已知有一個流場的邊界如下圖所示:
http://home.pchome.com.tw/love/hackerbobo/PCfin.JPG

而其中關於O與N的收斂值部分,我之前是問同學如何讓這個矩陣判定結束迴圈,我同學的建議是任一抽取其中的一個數值作為基準,在以此值計算的新值與舊值做比較來作為結束迴圈的條件.所以我才會作如此的假設.但是如此的假設似乎是造成無法跑出迴圈的原因,所以想請問能否有更好的方式呢?