Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 1 Projeto 01 – Método de Jacobi Análise Numérica Alunos: Arthur Douglas Nekson Professor: Harlei Miguel de Arruda Leite – DECSI-ICEA/JM João Monlevade, Minas Gerais 2016 UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 2 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 UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 3 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 UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 4 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; UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 5 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; UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 6 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 UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 7 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. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 8 UNIVERSIDADE FEDERAL DE OURO PRETOINSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 9 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. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 10 3. Caso de Teste 02 Para esse teste, o sistema linear utilizado é mostrado abaixo. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 11 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. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 12 4. Caso de Teste 03 Para esse teste, o sistema linear utilizado é mostrado abaixo. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 13 Figura 03 – Caso de teste 03. UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E APLICADAS 14 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.
Compartilhar