代码之家  ›  专栏  ›  技术社区  ›  user3681755

雅可比解算器进入无限循环

  •  0
  • user3681755  · 技术社区  · 10 年前

    我似乎找不到无限循环的修复方法。我已经编写了一个雅可比求解器来求解线性方程组。

    这是我的代码:

    function [x, i] = Jacobi(A, b, x0, TOL)
    [m n] = size(A);
    i = 0;
    x = [0;0;0];
    while (true)
        i =1;
    
         for r=1:m
            sum = 0;
            for c=1:n
                if r~=c
                    sum = sum + A(r,c)*x(c);
                else
                    x(r) = (-sum + b(r))/A(r,c);
                end    
                x(r) = (-sum + b(r))/A(r,c);
     xxx   end                                       xxx
        end
        if abs(norm(x) - norm(x0)) < TOL;
            break
        end
        x0 = x;
        i = i + 1;
    end
    

    当我终止代码时,它以xxx结尾

    1 回复  |  直到 10 年前
        1
  •  1
  •   rayryeng    10 年前

    代码不工作的原因是 if 您的 for 循环。具体来说,您需要累加特定行的所有值 不要 首先属于该行的对角线。一旦完成,你 然后 执行分割。你还需要确保你除以 A 对于您所关注的行,它对应于 x 你想解决的问题。您还需要删除 i=1 语句。您正在重置 i 每次。

    换句话说:

    function [x, i] = Jacobi(A, b, x0, TOL)
    [m n] = size(A);
    i = 0;
    x = [0;0;0];
    while (true)
         for r=1:m
            sum = 0;
            for c=1:n
                if r==c %// NEW
                    continue;
                 end
                sum = sum + A(r,c)*x(c); %// NEW
            end                                      
           x(r) = (-sum + b(r))/A(r,r); %// CHANGE
        end
        if abs(norm(x) - norm(x0)) < TOL;
            break
        end
        x0 = x;
        i = i + 1;
    end
    

    示例用法:

    A = [6 1 1; 1 5 3; 0 2 4]
    b = [1 2 3].';
    [x,i] = Jacobi(A, b, [0;0;0], 1e-10)
    
    x =
    
       0.048780487792648
      -0.085365853612062
       0.792682926806031
    
    
    i =
    
        20
    

    这意味着需要20次迭代才能获得具有容差的解决方案 1e-10 。将其与MATLAB的内置逆函数进行比较:

    x2 = A \ b
    
    x2 =
    
       0.048780487804878
      -0.085365853658537
       0.792682926829268
    

    如您所见,我指定了公差 第1页-10页 ,这意味着我们保证有10位小数的精度。我们当然可以看到,雅各比给我们的精度和MATLAB给我们的内置精度相差10个小数点。