2015-02-11 42 views
0

我正在使用SOR方法並需要找到最佳的重量因子。我認爲一個很好的方法是使用從0到2的多個omegas運行我的SOR代碼,然後存儲每個這些代碼的迭代次數。然後我可以看到哪個迭代是最低的以及它對應的是哪個歐米伽。然而,作爲新手程序員,我不確定如何去做這件事。找到SOR的最佳重量因子

這裏是我的SOR代碼:

function [x, l] = SORtest(A, b, x0, TOL,w) 
[m n] = size(A);       % assigning m and n to number of rows and columns of A 
l = 0;          % counter variable 
x = [0;0;0];        % introducing solution matrix 
max_iter = 200; 
    while (l < max_iter)      % loop until max # of iters. 
     l = l + 1;        % increasing counter variable 
     for i=1:m        % looping through rows of A 
      sum1 = 0; sum2 = 0;     % intoducing sum1 and sum2 
      for j=1:i-1       % looping through columns 
       sum1 = sum1 + A(i,j)*x(j);  % computing sum using x 
      end 
      for j=i+1:n 
       sum2 = sum2 + A(i,j)*x0(j);  % computing sum using more recent values in x0 
      end 
      x(i) =(1-w)*x0(i) + w*(-sum1-sum2+b(i))/A(i,i); % assigning elements to the solution matrix. 
     end 
     if abs(norm(x) - norm(x0)) < TOL  % checking tolerance 
      break 
     end 
     x0 = x;         % assigning x to x0 before relooping 
    end 

end 
+0

如果歐米茄是1,你會如何運行你的代碼?如果你能回答這個問題,那麼考慮如何使用for循環來增量更改onega並重新運行你的函數。 – David 2015-02-11 21:55:28

+0

如果歐米茄是一個,它只會是高斯賽德爾方法 – user3681755 2015-02-11 23:11:57

回答

1

這是很容易做到。簡單地循環訪問w的值,並確定每個w的迭代總次數。一旦函數完成,檢查這是否是當前獲得解決方案所需的最小迭代次數。如果是,則更新最終解決方案。一旦我們遍歷所有w,結果將是產生最小迭代次數以收斂的解向量。請記住,SOR有w,因此它的確如此,不是包括w = 0w = 20 < w < 2,因此我們不能在該範圍中包含0或2。因此,做這樣的事情:

omega_vec = 0.01:0.01:1.99; 
final_x = x0; 
min_iter = intmax; 

for w = omega_vec 
    [x, iter] = SORtest(A, b, x0, TOL, w); 
    if iter < min_iter 
     min_iter = iter; 
     final_x = x; 
    end 
end 

循環檢查是否迭代的每個w總數小於目前的最低。如果是,記錄下來並記錄解決方案向量。在所有w中最小的最終解決方案矢量將存儲在final_x中。

+0

當我嘗試這個代碼它不能正常運行。它說「忙」,直到我終止它。 – user3681755 2015-02-11 23:11:27

+1

@ user3681755 - 是的...這是因爲你可能提供了一個解決方案不會收斂的歐米茄。標準做法是**限制**迭代的總次數。如果超出這個範圍,你會停下來。將它設置爲while循環:while(l <= 200)',其中200是您要使用的最大迭代次數。 – rayryeng 2015-02-11 23:15:54

+1

@ user3681755 - 順便說一句,你的代碼有錯誤。你想返回**'l' **,**而不是'i' **。你也希望'l'從'0'開始。我編輯了你的代碼來反映這一點。請檢查它。 – rayryeng 2015-02-11 23:34:53