Universidade Federal do Espírito Santo Departamento de Informática Algoritmos Numéricos 2016/2 Profa. Claudine Badue Trabalho 1 Objetivos Gauss-Seidel para Solução de Sistemas com Matrizes Banda Usando Armazenamento Especial O objetivo deste trabalho é implementar em Octave o método iterativo de Gauss-Seidel para solução de sistemas lineares com matrizes banda usando os métodos de armazenamento tradicional e especial. É também objetivo deste trabalho comparar o desempenho destes dois métodos de armazenamento em termos de tempo de processamento. Matriz Banda Uma matriz banda é uma matriz esparsa cujas entradas não nulas estão confinadas a uma banda diagonal, compreendendo a diagonal principal e zero ou mais diagonais em ambos os lados. Formalmente, considere uma matriz n n A = (a i,j ). Se todos os elementos da matriz são zero fora de uma banda limitada diagonalmente, cuja extensão é determinada por constante k 1 e k 2 : a i,j = 0 se j < i k 1 ou j > i + k 2, k 1, k 2 0, então as quantidades k 1 e k 2 são chamadas de largura de banda inferior e largura de banda superior, respectivamente. A largura de banda da matriz é k = k 1 + k 2 + 1. Uma matriz é chamada matriz banda se sua largura de banda é razoavelmente pequena. Uma matriz banda com k 1 = k 2 = 0 é uma matriz diagonal; uma matriz banda com k 1 = k 2 = 1 é uma matriz tridiagonal; uma matriz banda com k 1 = k 2 = 2 é uma matriz penta-diagonal e assim por diante. Se k 1 = 0 e k 2 = n 1, então a matriz é triangular superior; similarmente, se k 1 = n 1 e k 2 = 0, então a matriz é triangular inferior. Armazenamento Especial Matrizes banda são usualmente armazenadas pela guarda das diagonais na banda; o resto é implicitamente zero. Por exemplo, uma matriz banda com k 1 = 2 e k 2 = 1 tem largura de banda k = 4. A matriz 8 8: pode ser armazenada como a matriz 8 4: a 1,1 a 1,2 0 0 0 0 0 0 a 2,1 a 2,2 a 2,3 0 0 0 0 0 a 3,1 a 3,2 a 3,3 a 3,4 0 0 0 0 0 a 4,2 a 4,3 a 4,4 a 4,5 0 0 0 0 0 a 5,3 a 5,4 a 5,5 a 5,6 0 0 0 0 0 a 6,4 a 6,5 a 6,6 a 6,7 0 0 0 0 0 a 7,5 a 7,6 a 7,7 a 7,8 0 0 0 0 0 a 8,6 a 8,7 a 8,8
0 0 a 1,1 a 1,2 0 a 2,1 a 2,2 a 2,3 a 3,1 a 3,2 a 3,3 a 3,4 a 4,2 a 4,3 a 4,4 a 4,5 a 5,3 a 5,4 a 5,5 a 5,6 a 6,4 a 6,5 a 6,6 a 6,7 a 7,5 a 7,6 a 7,7 a 7,8 a 8,6 a 8,7 a 8,8 0 Parte 1 : Gauss-Seidel Usando Armazenamento Tradicional Seja um sistema linear Ax = b, em que A é uma matriz banda n n. 1. Implemente uma função para resolver o sistema Ax = b por Gauss-Seidel. a. A função deve ter como parâmetros de entrada a ordem n, a matriz dos coeficientes A, o vetor dos termos independentes b, a tolerância Toler e o número máximo de iterações IterMax. A função deve ter como parâmetros de saída o vetor solução x, o número de iterações gastas Iter e a condição de erro CondErro para verificar se a solução convergiu. (CondErro = 0 significa que houve convergência e CondErro = 1, que não houve.) b. A função deve processar os elementos nulos de A. c. A matriz A deve ser armazenada usando o armazenamento tradicional. 2. Implemente um script para resolver o sistema por Gauss-Seidel usando a função implementada no item anterior. a. O arquivo do script deve ser denominado Principal.m. b. O script deve ter como dados de entrada a matriz dos coeficientes A, o vetor dos termos independentes b, a tolerância Toler e o número máximo de iterações IterMax. c. O script deve ler os dados de entrada de um arquivo de texto denominado ArquivoEntrada.m. Este arquivo de texto deve ter o formato mostrado na Figura 1 e a sua última linha deve ser uma linha em branco. Para ler os parâmetros de entrada do ArquivoEntrada.m, use o comando: load ArquivoEntrada.m; d. O script deve ter como dados de saída o número de iterações gastas Iter, a condição de erro CondErro e o vetor x. e. O script deve escrever os dados de saída em um arquivo de texto denominado ArquivoSaida.m. Para escrever os parâmetros de entrada no ArquivoSaida.m, use o comando: save ArquivoSaida.m Iter CondErro x; 3. Submeta o seu trabalho com o arquivo de entrada mostrado na Figura 1. # name: A # columns: 8 97 88 0 0 0 0 0 0 71 129 31 0 0 0 0 0 11 6 117 46 0 0 0 0 0 81 85 310 58 0 0 0 0 0 94 36 305 94 0 0 0 0 0 93 34 283 85 0 0 0 0 0 62 95 288 61 0 0 0 0 0 83 49 185
# name: b # columns: 1 44 39 94 60 32 17 34 71 # name: Toler 1e-006 # name: IterMax 1000000 Figura 1: Arquivo de entrada do script de Gauss-Seidel com armazenamento tradicional Parte 2 : Gauss-Seidel Usando Armazenamento Especial 1. Implemente as funções da seção anterior usando armazenamento especial. 2. Submeta o seu trabalho com o arquivo de entrada mostrado na Figura 2. # name: A # columns: 4 0 0 97 88 0 71 129 31 11 6 117 46 81 85 310 58 94 36 305 94 93 34 283 85 62 95 288 61 83 49 185 0 # name: b # columns: 1 44 39 94 60 32 17 34 71 # name: Toler 1e-006 # name: IterMax 1000000 Figura 2: Arquivo de entrada do script de Gauss-Seidel com armazenamento especial
Parte 3 : Comparação dos Armazenamentos Tradicional e Especial 1. Implemente uma função para criar um sistema aleatório de ordem n e largura de banda k, no qual k1 = k/2 e k2 = k/2 1, e os elementos da matriz dos coeficientes A e do vetor dos termos independentes b são obtidos aleatoriamente. a. A função deve ter como parâmetros de entrada a ordem n e a largura de banda k. A função deve ter como parâmetros de saída a matriz dos coeficientes A e o vetor dos termos independentes b. b. A função deve também garantir que a matriz A seja diagonal estritamente dominante. c. A matriz A deve ser armazenada usando o armazenamento tradicional. 2. Implemente a função do item anterior usando armazenamento especial. 3. Implemente um script para avaliar o desempenho de Gauss-Seidel com sistemas aleatórios de ordem e largura de banda crescentes armazenados usando armazenamento tradicional e especial e gerados pelas funções implementadas nos itens anteriores. a. O arquivo do script deve ser denominado Principal.m. b. Use sistemas aleatórios de ordem n = 2 i, i = 4, 5, 6, 7, 8, e largura de banda k = n/2 j, j = 4, 3, 2, 1. c. Use IterMax grande o suficiente para garantir CondErro = 0. d. O script deve ter como dado de saída, para cada ordem n, uma tabela em que a primeira coluna contém a largura de banda k; a segunda, a terceira e a quarta colunas contém o tempo de processamento com armazenamento tradicional com Toler = 10 3, Toler = 10 6, Toler = 10 9, respectivamente; e a quinta, sexta e sétima colunas contém o tempo de processamento com armazenamento especial com Toler = 10 3, Toler = 10 6, Toler = 10 9, respectivamente. Para medir o tempo de processamento de um trecho do código, use o comando: tic (); # trecho de código tempo = toc (); e. O script deve escrever a tabela em um arquivo de texto denominado ArquivoSaida.m. f. Comente comandos de impressão antes de medir o tempo de processamento. Instruções para Entrega 1. Este trabalho deverá ser desenvolvido em grupos de no máximo três alunos. 2. Para credenciar o representante do grupo no sistema de submissão de trabalhos, envie um e-mail como o abaixo: Assunto: [SUBSCRIBE] <nome> Substitua <nome> pelo nome completo do representante do grupo. Não use letras latinas (é, í, ç, etc.) no nome. Por exemplo: Assunto: [SUBSCRIBE] Claudine Santos Badue Goncalves 3. Para credenciar o grupo, envie um e-mail como o abaixo: Assunto: [WORKING GROUP] <nome1>:<nome2>:<nome3>
Substitua <nome1>, <nome2> e <nome3> pelo nome completo do membro 1, membro 2 e membro 3, respectivamente, do grupo. Não use letras latinas (é, í, ç, etc.) no nome. Por exemplo: Assunto: [WORKING GROUP] Claudine Santos Badue Goncalves:Sergio Paulo Tavares Goncalves:Christine Badue Goncalves 4. Para enviar cada parte do trabalho, envie um e-mail como o abaixo até às 23:59 horas da data limite de entrega: Assunto: [SUBMIT] <codigo da atividade> Substitua <codigo da atividade> por ANIEM162T1P1, ANIEM162T1P2, e ANIEM162T1P3 para as Partes 1, 2 e 3, respectivamente. Por exemplo, para a Parte 1: Assunto: [SUBMIT] ANIEM162T1P1 Anexe o arquivo do script principal (Principal.m), os arquivos das funções (*.m), o arquivo de entrada (ArquivoEntrada.m) e o arquivo de saída (ArquivoSaida.m). 5. Partes do trabalho com resultados incorretos não serão avaliadas. Caso o resultado da Parte 1 ou da Parte 2 do trabalho esteja incorreto, a Parte 3 do trabalho não será avaliada. 6. A fórmula para desconto por atraso na entrega do trabalho é: 2 d 1 0,32 % onde d é o atraso em dias. Note que após 5 dias, o trabalho não poderá ser mais entregue. 7. Se você enviar o seu trabalho múltiplas vezes, apenas a última versão enviada será considerada, inclusive para efeito de desconto por atraso. Maiores Detalhes Maiores detalhes serão discutidos em sala de aula. Considerações feitas em sala terão valor superior ao daquelas contidas nesta especificação.