Gauss-Newton求解器:矩形空矩阵的不正确赋值

时间:2015-02-11 19:18:08

标签: matlab matrix numerical-analysis

我不明白为什么我收到此错误消息。我已经实现了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

1 个答案:

答案 0 :(得分:0)

您的代码有三个问题。

  1. 您的for循环语句未对齐。具体来说,您忘记在end循环中的第一个for循环的末尾放置i关键字(即for j = 1 : i-1
  2. 您需要使用j = 1, 2i-1当前解决方案计算Gauss-Newton的值。第一个for循环需要使用x,而从forj = i+1的第二个n循环需要使用x0
  3. 当您求解x的每个值时,您需要除以正确的对角线系数。
  4. 因此:

    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给我们提供的10个小数位精度与MATLAB给我们内置的结果。