function [ obj ] = fe_update( obj, pt, alist )
    if pt < 1 || pt > obj.n
        error( 'the point %d must be in the range of points, 1:%d of the system', ...
            pt, obj.n );
    end
    
    if obj.points( 3, pt ) ~= -Inf
        error( 'the given point is a boundary point with the value %f', obj.points( 3, pt ) );
    end
    
    if obj.updated( obj.to_alias( pt )  == 1 )
        error( 'the stiffness matrix entry for the given point %d have already been updated', ...
            pt );
    end
    
    obj.updated( obj.to_alias( pt ) ) = 1; 
 
    % Get the values associated with the central point
    x1 = obj.points( :, pt );
    m = obj.to_alias( pt );

    % We
    i = alist(end);

    for j = alist
        % Get the second and third points which form the triangle
        x2 = obj.points( :, i );
        x3 = obj.points( :, j );
        
        % Determine the coefficients and the area
        [us, A] = fe_coeffs( x1(1:2), x2(1:2), x3(1:2) );
        
        % Update the diagonal entry of the matrix 'M' and the vector 'b'
        obj.M(m, m) = obj.M(m, m) + us(1);
        obj.b(m) = obj.b(m) - obj.rho*A/3;
   
        % If the vertex 'x2' is unknown, this updates an entry
        % in the matrix 'M'; otherwise, if it is a boundary
        % value, it updates the vector 'b'
        if x2(3) == -Inf
            n = obj.to_alias( i );
            obj.M(m, n) = obj.M(m, n) + us(2);
        else
            obj.b(m) = obj.b(m) - us(2)*x2(3);
        end
        
        % If the vertex 'x3' is unknown
        %     - update the corresponding entry in the matrix 'M'; otherwise
        % if it is a boundary value
        %     - updates the vector 'b'
        if x3(3) == -Inf
            n = obj.to_alias( j );
            obj.M(m, n) = obj.M(m, n) + us(3);
        else
            obj.b(m) = obj.b(m) - us(3)*x3(3);
        end
        
        i = j;
    end
end
