Anda di halaman 1dari 14

UNIVERSIDADE FEDERAL DE OURO PRETO

INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Projeto 01 – Método de Jacobi


Análise Numérica

Alunos:

João Monlevade, Minas Gerais

2016

1
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Sumário

1. Código Implementado .................................................................................................. 3

Código principal ........................................................................................................... 3

Função para Verificar Convergência ............................................................................ 5

Função para Achar o Erro a Cada Iteração ................................................................... 6

2. Caso de Teste 01 ........................................................................................................... 7

3. Caso de Teste 02 ......................................................................................................... 10

4. Caso de Teste 03 ......................................................................................................... 12

2
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

1. Código Implementado

Código principal
disp('Projeto 01 - Método de Jacobi');

% M = (n x n) B = [m x 1]
% M = [aij, a12, a13] B = [1]
% [a21, a22, a23] [2]
% [a31, a32, a33] [3]

n = input('Digite tamanho "n" da matriz n x n: ');


if (n>0)
matriz = zeros(n); %Aloca espaço e coloca 0's
b = zeros(1,n);
% matriz
% b

fprintf('\n***************Preenchendo a matriz***************\n')
for i=1:n
for j=1:n
fprintf('\nDigite o elemento da posição %d x %d: ', i,j);
matriz(i,j)= input('');
end;
end;
disp(matriz);

%Chama a função criada. Se op for igual a 1, converge. Vetor


guarda dos elementos onde i=j
[vetor,op] = Verifica_Convergencia(matriz,n);
%disp(op);

if (op==1) %Se convergir, continua a execução.


disp('O processo irá convergir!');

%Preenche o vetor b (solução do sistema)


for i=1:n
fprintf('\nDigite o resultado da %dª linha: ', i);
b(i) = input('');
end;

solucao1 = zeros(1,n); %Vetor solução da iteração


solucao2 = zeros(1,n); %Vetor solução auxiliar

kmax = input('Digite o número máximo de iterações: ');


%Numero máximo de interações informado pelo usuário
erromax = input('Digite o erro pretendido: ');
%Erro informado pelo usuário
k=0;

%Iteração k = 0. solução = bi/aii

3
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

for i=1:n
solucao1(i) = b(i)/vetor(i);
end;
fprintf('k = %d', k);
disp(solucao1);

k = k+1;
erro = 0;
soma = 0;
while (k<=kmax)||(erro<=erromax) %Enquanto o numero de
iterações não exceder o definido ou o erro ser maior que o
máximo definido

for i=1:n
for j=1:n
if(i~=j)
soma = soma + (-(matriz(i,j)*solucao1(j)));
end;
end;
%Terminando a linha, podemos somar com o B(i) e
multiplicar
%pelo 1/aii
soma = (1/vetor(i))*(soma + b(i)); %Soma contém agora
o X solução
solucao2(i) = soma; %solucao2(i) recebe o valor do x
soma = 0; %Zera o valor para a próxima linha
end;

fprintf('k = %d', k);


k = k+1;
disp(solucao2);
erro = Valor_Norma(solucao1,solucao2,n); %Chama a função
para achar o erro a cada iteração. (Começando em k=1);
fprintf('Erro e = %d\n\n', erro);
solucao1 = solucao2; %Atualiza o valor da solução
anterior;
end;

else
disp('O processo não converge!');
end;

else disp('Valores inválidos!');


end;

4
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Função para Verificar Convergência

function [vetor,op] = Verifica_Convergencia(matriz,n)

%Verifica o critério de convergência


%Se for convergente, retorna 1

op = 1;

vetor = zeros(1,n); %Vetor com 0's de tamanho 1 x n

for i=1:n
for j=1:n
if (j==i)
vetor(i) = abs(matriz(i,j));
end;
end;
end;

soma = 0; %Guarda a soma dos módulos para cada linha

for i=1:n
for j=1:n
if(i~=j)
soma = soma + abs(matriz(i,j)); %Pega todos os
elementos da linha e soma seus valores absolutos
end;
end;
%Após esse for, temos a soma dos absolutos de cada linha.
Pode-se então comparar

if (soma>=vetor(i))
op = 0; %Não converge
break;
end;
soma = 0; %Zera a variável para verificar a próxima linha
end;

return;

5
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Função para Achar o Erro a Cada Iteração


function [erro] = Valor_Norma(solucao1, solucao2, n)

% Função responsável pelo cálculo da norma-oo para cada iteração;


% (|x1 - x0|/|x1|); (|x2 - x1|/|x2|) ...

diferenca = zeros(1,n); %Vetor que guarda as diferenças dos


valores das iterações.

for i=1:n
diferenca(i) = abs(solucao2(i) - solucao1(i)); % Pega o
valor absoluto da diferença.
end;

erro = (max(diferenca))/(max(solucao2)); % O erro é igual à


maior diferença dividido pelo maior valor da solução 2

return

6
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

2. Caso de Teste 01

Para a realização do primeiro teste, foi utilizado o sistema linear mostrado abaixo:

Os valores do sistema linear assim como o máximo de iterações a serem realizadas e o


erro máximo desejado, são fornecidos como dados de entrada. O programa, realiza
então o teste de convergência através da função “Verifica_Convergencia”. Caso o
sistema não convirja, uma mensagem é exibida e o programa é finalizado. Caso
contrário, a execução prossegue dando início à entrada do vetor solução do sistema.

Com o número máximo de execuções e o valor máximo do erro fornecido, o cálculo das
soluções é iniciado. A cada iteração a função que calcula o erro é chamada
(“Valor_Norma”) e retorna o erro. Os valores são impressos, mostrando a iteração, o
erro e o vetor solução. Assim, quando o erro for menor que o erro definido ou o “kmax”
for ultrapassado, o programa finaliza sua execução.

7
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

8
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Figura 01 – Caso de teste 01.

Observando a figura 01, pode-se analisar o funcionamento do programa. Assim que foi
informado a matriz n x n é informado sobre a convergência do método, neste caso
verdadeiro, logo a mensagem informada é: “O processo irá convergir”. Em sequência é
solicitado ao usuário os valores resultado para cada linha da matriz! Logo após, o
usuário indica qual seria o numero máximo de interações, neste caso 10,
sequencialmente é solicitado também o valor para o erro ao qual se pode considerar que
a solução encontrada é satisfatória. A condição de parada determinada se deu quando o
erro se tornou menor do que o erro desejado pelo usuário, pois com o erro informado de
0.01 na 5ª interação (K=4) obteve-se o valor do erro igual a 0,005297246. Apesar de o
número máximo de iterações não ter sido alcançado o erro estabelecido foi alcançado.
Assim, o programa imprimiu a solução das iterações realizadas e o erro como esperado.

9
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

3. Caso de Teste 02

Para esse teste, o sistema linear utilizado é mostrado abaixo.

10
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Figura 02 – Caso de teste 02.

Neste caso teste 02 a convergência do método, é verdadeira, logo a mensagem


informada é: “O processo irá convergir”. Solicitado o numero máximo de interações,
neste caso 15, indicado também o erro satisfatório de 0.001. A condição de parada foi
encontrada na 8ª interação (K=7), Assim a condição de parada foi o critério de erro.

11
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

4. Caso de Teste 03
Para esse teste, o sistema linear utilizado é mostrado abaixo.

12
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Figura 03 – Caso de teste 03.

13
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS

Neste caso teste 03, o teste de convergência foi verdadeiro, assim a aplicação do método
convergirá, informado 20 para o valor para a quantidade máxima de interações, indicado
também o erro satisfatório de 0.0001. A condição de parada foi encontrada na 12ª
interação (K=11), Assim a condição de parada foi o critério de erro. É notável, portanto
que caso haja a diminuição do numero de interação, por exemplo 10, considerando esse
mesmo erro, como na figura 04: abaixo

Figura 04 – Caso de teste 03 (Com Kmax = 10).

A condição de parada que aconteceria primeiro seria o alcance do numero máximo de


interações, ou seja, o método para de ser executado, quando K for igual a 10, assim, se
pode comprar o vetor solução para as duas situações, que no casso possui valores
ligeiramente distintos para X1. Veja que a solução encontrada para Kmax = 20 foi
[1.0000; 1.0000; 1.0000] e para Kmax = 10 foi [1.0001; 1.0000; 1.0000], sendo assim, é
possível identificar que quanto maior o numero de interações, melhor será a resolução
encontrada.

14