function [xsol,resi,niter] = linsysiter(n,tol,kmax,method) % em method, pode ser colocado uma das seguintes opcoes % (incluir as aspas simples como abaixo) % 'J' % 'GS' % ou, ainda, % 'E' % fixando a semente do gerador aleatorio da distribuicao uniforme rand('seed',1); % criando uma matriz com elementos gerados a partir da distribuicao uniforme (0,1) M = rand(n,n); % criando uma matriz simetrica e definida positiva a partir da matriz M A = M'*M ; % tornado a matriz A estritamente diagonal dominante por linha (para garantir convergencia) % em particular, adicionando-se a diagonal a soma dos elementos nao-diagonais da linha correspondente for i=1:n for j=1:n if (j ~= i) A(i,i) = A(i,i) + A(i,j); end end A(i,i) = A(i,i) + 0.1; % somando + 0.1 somente por seguranca! end % gerando lado direito 'b' tal que a solucao seja % xstar = [1; 1; 1; ... ; 1] b = ( sum(A') )'; if ( ischar(method) == 1) % method eh uma variavel string if ( method == 'J' ) % Gauss-Seidel P = tril(A); elseif ( method == 'GS' ) % Jacobi P = diag(diag(A)); elseif ( method == 'E' ) % "Esquisito" P = triu(A); else fprintf(stdout, '\n ERRO FATAL: metodo inexistente! \n \n' ); fflush(stdout); return end else % a variavel method nao eh um string fprintf(stdout, '\n ERRO FATAL: o metodo tem que ser definido com uma variavel string! \n \n' ); fflush(stdout); return end x0 = zeros(n,1); r = b - A*x0; k = 0; xold = x0; while ( (norm(r) > tol) && (k < kmax) ) % criterio de parada dir = P\r; xnew = xold + dir; k = k + 1; r = b - A*xnew; xold = xnew; end xsol = xnew; resi = r; niter = k; format long g; % se for no Octave % format longG; % se for no MATLAB return end