會員 ![]() | 【求助】請幫我看一下這個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 |
回覆 |
嘴炮戰隊隊長 | 錯的一榻糊塗... 第三部份應該是如此吧? 語法: 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 測試條件 (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 附上題目說明,謝謝!! 已知有一個流場的邊界如下圖所示: 而其中關於O與N的收斂值部分,我之前是問同學如何讓這個矩陣判定結束迴圈,我同學的建議是任一抽取其中的一個數值作為基準,在以此值計算的新值與舊值做比較來作為結束迴圈的條件.所以我才會作如此的假設.但是如此的假設似乎是造成無法跑出迴圈的原因,所以想請問能否有更好的方式呢? |
回覆 |
|
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。