2015-02-11 57 views
0

我不明白爲什麼我會收到此錯誤消息。我已經實現了一個Gauss-Newton求解器來求解一個線性方程組。Gauss-Newton求解器:使用矩形空矩陣進行不正確的賦值

口口聲聲說不當分配與矩形空矩陣的行"for i=1:m"

function [x, l] = GS(A, b, x0, TOL) 
[m n] = size(A); 
l = 1; 
x = [0;0;0]; 
while (true) 
    for i=1:m 
     sum1 = 0; sum2 = 0; 
    for j=1:i-1 
     sum1 = sum1 + A(i,j)*x(j); 
     for j=i+1:n 
      sum2 = sum2 + A(i,j)*x(j); 
     end 
    end 
    x(i) = (-sum1-sum2+b(i))./A(i,j);  
end 
if abs(norm(x) - norm(x0)) < TOL 
    break 
end 
x0 = x; 
l = l + 1; 
end 
+0

我已經寫了一個答案。我也用你的Jacobi解算器解決了你的其他問題。如果你不介意,看看我的答案,並接受它,如果我幫助過你......這也是! – rayryeng 2015-02-11 19:32:41

+1

謝謝!我不知道如何接受答案,但我現在看到了。感謝您對我的兩個代碼提供幫助! – user3681755 2015-02-11 19:46:34

+0

沒問題:)我實際上對我的代碼犯了一個小錯誤。我使用'i'在更大的for循環中的兩個for循環中交換了兩個變量。看一看!它雖然沒有改變答案,但它收斂得更快。 – rayryeng 2015-02-11 19:48:59

回答

0

三件事情你的代碼錯誤。

  1. 您的for循環語句是錯誤對齊的。具體而言,您忘記將一個end關鍵字在第一for環路的i循環內的端部(即for j = 1 : i-1
  2. 需要使用從j = 1, 2所述當前溶液達i-1來計算高斯 - 牛頓的值。第一個for環路需要使用x,而第二個for環路從j = i+1直到n需要使用x0
  3. 當您爲每個值x求解時,您需要除以正確的對角線係數。

這樣:

function [x, l] = GS(A, b, x0, TOL) 
[m n] = size(A); 
l = 1; 
x = [0;0;0]; 
while (true) 
    for i=1:m 
     sum1 = 0; sum2 = 0; 
     for j=1:i-1 %// CHANGE 
      sum1 = sum1 + A(i,j)*x(j); %// CHANGE 
     end 
     for j=i+1:n %// CHANGE 
      sum2 = sum2 + A(i,j)*x0(j); 
     end 
     x(i) = (-sum1-sum2+b(i))./A(i,i); %// CHANGE 
    end 

    if abs(norm(x) - norm(x0)) < TOL 
     break 
    end 
x0 = x; 
l = l + 1; 
end 

實施例使用:

format long; 
A = [6 1 1; 1 5 3; 0 2 4] 
b = [1 2 3].'; 
[x,i] = GS(A, b, [0;0;0], 1e-10) 

x = 

    0.048780487792648 
    -0.085365853612062 
    0.792682926806031 


i = 

    21 

這意味着它耗時21次迭代,以實現與公差1e-10的溶液。與MATLAB內置的逆比較:

x2 = A \ b 

x2 = 

    0.048780487804878 
    -0.085365853658537 
    0.792682926829268 

正如你所看到的,我指定的1e-10的公差,這意味着我們保證有準確的10位小數。我們當然可以看到Gauss-Newton給我們的內容與MATLAB給我們內置的內容之間的10位小數精度。