2015-02-11 58 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位小数精度。