CCCPaste

Scilab, gausseidel function

function [x, k] = gausseidel(A, b, tol, N, x0)
    precision = 1e-10;
    n = size(A,1);
    x = zeros(n, 1);
    xk = zeros(n, 1);
    tolerance = 0;
    x = x0;
    test = 0;
    
    for i = 1:n
        if abs(A(i,i)) < precision then
            error("Coefficient diagonaux trop petit.")
        end
    end
    
    for k = 1:N
        for i = 1:n
            sommeTermesPrec = A(i,1:i-1) * x(1:i-1)
            sommeTermesSuiv = A(i,i+1:n) * x(i+1:n)
            
            // Pour avoir une matrice nulle à la place d'une matrice vide
            // Sur Scilab 6.0+
            if (sommeTermesPrec == []) then
                sommeTermesPrec = [0]
            end
            if (sommeTermesSuiv == []) then
                sommeTermesSuiv = [0]
            end
            
            xk = x;
            x(i) = (b(i) - sommeTermesPrec - sommeTermesSuiv) / A(i,i);
        end
        
        tolerance = norm(x - xk) / norm(x)
        if tolerance < tol then
            // On est rentré dans le test
            test = 1;
            break;
        end
    end
    
    if (test == 0) then
        error("Pas de convergence en Nmax itérations.")
    end
endfunction