Baixe o app para aproveitar ainda mais
Prévia do material em texto
Matemática Cálculo Numérico Marcelo Gomes Pereira Roberto Hugo Bielschowsky Cálculo Numérico Matemática Marcelo Gomes Pereira Roberto Hugo Bielschowsky Natal – RN, 2014 Cálculo Numérico 2ª Edição Catalogação da publicação na fonte. Bibliotecária Verônica Pinheiro da Silva. COORDENAÇÃO DE PRODUÇÃO DE MATERIAIS DIDÁTICOS Marcos Aurélio Felipe COORDENAÇÃO DE REVISÃO Maria da Penha Casado Alves COORDENAÇÃO DE DESIGN GRÁFICO Ivana Lima GESTÃO DO PROCESSO DE REVISÃO Rosilene Alves de Paiva GESTÃO DO PROCESSO DE DESIGN GRÁFICO Dickson de Oliveira Tavares PROJETO GRÁFICO Ivana Lima REVISÃO DE MATERIAIS Camila Maria Gomes Cristinara Ferreira dos Santos Emanuelle Pereira de Lima Diniz Eugenio Tavares Borges Janio Gustavo Barbosa Jeremias Alves de Araújo Kaline Sampaio de Araújo Luciane Almeida Mascarenhas de Andrade Priscila Xavier de Macedo Rhena Raize Peixoto de Lima Thalyta Mabel Nobre Barbosa Verônica Pinheiro da Silva Orlando Brandão Meza Ucella FICHA TÉCNICA EDITORAÇÃO DE MATERIAIS Alessandro de Oliveira Paula Amanda de Lima Cabral Amanda Duarte Anderson Gomes do Nascimento Carolina Aires Mayer Carolina Costa de Oliveira Dickson de Oliveira Tavares Heloisa Fernandes Ferreira Nunes José Agripino de Oliveira Neto Leticia Torres Luciana Melo de Lacerda Mauricio da Silva Oliveira Junior Revisão de estrutura e linguagem Eugenio Tavares Borges Janio Augusto Barbosa Thalyta Mabel Nobre Barbosa Revisão de língua portuguesa Janaina Tomaz Capistrano Kaline Sampaio de Araújo Samuel Anderson de Oliveira Lima Revisão de normas da ABNT Verônica Pinheiro da Silva Diagramação Elizabeth da Silva Ferreira Ivana Lima Johann Jean Evangelista de Melo José Antonio Bezerra Junior Mariana Araújo Brito Criação e edição de imagens Adauto Harley Carolina Costa de Oliveira Heinkel Hugenin Leonardo dos Santos Feitoza Módulo matemático Joacy Guilherme de A. F. Filho Revisão tipográfi ca Adriana Rodrigues Gomes Letícia Torres Margareth Pereira Dias Nouraide Queiroz IMAGENS UTILIZADAS Banco de Imagens Sedis (Secretaria de Educação a Distância) - UFRN MasterClips IMSI MasterClips Collection, 1895 Francisco Blvd, East, San Rafael, CA 94901,USA. MasterFile – www. masterfi le.cpom MorgueFile – www.morguefi le.com Pixel Perfect Digital – www.pixelperfectdigital.com FreeImages – www.freeimages.co.uk FreeFoto.com – www.freefoto.com Free Pictures Photos – www.fre-pictures-photos.com BigFoto – www. bigfoto.com FreeStockPhotos.com – www.freestockphotos.com OneOddDude.net – www.oneodddude.net Flickr.com - www.fl ickr.com Governo Federal Presidenta da República Dilma Vana Rousseff Vice-Presidente da República Michel Miguel Elias Temer Lulia Ministro da Educação Henrique Paim Universidade Federal do Rio Grande do Norte – UFRN Reitora Ângela Maria Paiva Cruz Vice-Reitora Maria de Fátima Freire Melo Ximenes Secretaria de Educação a Distância (SEDIS) Secretária de Educação a Distância Maria Carmem Freire Diógenes Rêgo Secretária Adjunta de Educação a Distância Ione Rodrigues Diniz Morais Todos as imagens utilizadas nesta publicação tiveram suas informações cromáticas originais alteradas a fi m de adaptarem-se aos parâmetros do projeto gráfi co © Copyright 2005. Todos os direitos reservados a Editora da Universidade Federal do Rio Grande do Norte – EDUFRN. Nenhuma parte deste material pode ser utilizada ou reproduzida sem a autorização expressa do Ministério da Educação – MEC Pereira, Marcelo Gomes. Cálculo Númerico / Marcelo Gomes Pereira, Roberto Hugo Bielschowsky – 2. ed. – Natal: EDUFRN, 2014. 300 p.: il. ISBN 978-85-425-0362-3 Disciplina ofertada ao curso de Matemática a Distância da UFRN. 1. Algébra Linear. 2. Algoritmo. 3.Interpolação Polinomial. 4. Integração Númerica. 5. Scilab. I. Bielscho- wsky, Roberto Hugo. II. Título. CDU 519.6 P436c Sumário Apresentação Institucional 5 Aula 1 Aritmética de ponto flutuante e erros numéricos 7 Aula 2 Introdução ao Scilab 29 Aula 3 Sistemas de equações lineares 55 Aula 4 SEVs do Rn, Bases e ajustes de modelos com quadrados mínimos 81 Aula 5 Autovalores e Valores Singulares 107 Aula 6 Valores singulares e erros numéricos ao resolver Ax = b 133 Aula 7 Algoritmos e programação com o Scilab – Parte I 159 Aula 8 Algoritmos e programação com o Scilab – Parte II 179 Aula 9 Zeros de funções 201 Aula 10 Interpolação polinomial 221 Aula 11 Integração numérica 241 Aula 12 Introdução Numérica às Equações Diferenciais Ordinárias 265 Apresentação Institucional A Secretaria de Educação a Distância – SEDIS da Universidade Federal do Rio Grande do Norte – UFRN, desde 2005, vem atuando como fomentadora, no âmbito local, das Políticas Nacionais de Educação a Distância em parceira com a Secretaria de Educação a Distância – SEED, o Ministério da Educação – MEC e a Universidade Aberta do Brasil – UAB/CAPES. Duas linhas de atuação têm caracterizado o esforço em EaD desta instituição: a primeira está voltada para a Formação Continuada de Professores do Ensino Básico, sendo implementados cursos de licenciatura e pós-graduação lato e stricto sensu; a segunda volta-se para a Formação de Gestores Públicos, através da oferta de bacharelados e especializações em Administração Pública e Administração Pública Municipal. Para dar suporte à oferta dos cursos de EaD, a SEDIS tem disponibilizado um conjunto de meios didáticos e pedagógicos, dentre os quais se destacam os materiais impressos que são elaborados por disciplinas, utilizando linguagem e projeto gráfico para atender às necessidades de um aluno que aprende a distância. O conteúdo é elaborado por profissionais qualificados e que têm experiência relevante na área, com o apoio de uma equipe multidisciplinar. O material impresso é a referência primária para o aluno, sendo indicadas outras mídias, como videoaulas, livros, textos, filmes, videoconferências, materiais digitais e interativos e webconferências, que possibilitam ampliar os conteúdos e a interação entre os sujeitos do processo de aprendizagem. Assim, a UFRN por meio da SEDIS integra-se ao grupo de instituições que assumiram o desafio de contribuir com a formação desse “capital” humano e incorporou a EaD como modalidade capaz de superar as barreiras espaciais e políticas que tornaram cada vez mais seleto o acesso à graduação e à pós-graduação no Brasil. No Rio Grande do Norte, a UFRN está presente em polos presenciais de apoio localizados nas mais diferentes regiões, ofertando cursos de graduação, aperfeiçoamento, especialização e mestrado, interiorizando e tornando o Ensino Superior uma realidade que contribui para diminuir as diferenças regionais e transformar o conhecimento em uma possibilidade concreta para o desenvolvimento local. Nesse sentido, este material que você recebe é resultado de um investimento intelectual e econômico assumido por diversas instituições que se comprometeram com a Educação e com a reversão da seletividade do espaço quanto ao acesso e ao consumo do saberE REFLETE O COMPROMISSO DA SEDIS/UFRN COM A EDUCAÇÃO A DISTÂNCIA como modalidade estratégica para a melhoria dos indicadores educacionais no RN e no Brasil. Secretaria de Educação a Distância SEDIS/UFRN 5 1 Aula Aritmética de ponto flutuante e erros numéricos Aula 1 Cálculo Numérico 9 Apresentação Bem-vindo à disciplina Cálculo Numérico! Está curioso para saber do que se trata? O Cálculo Numérico diz respeito às resoluções aproximadas de problemas. Seu principal alvo está nas aplicações a modelos que retratem algum fenômeno concreto. Em particular, nesta disciplina, trabalharemos modelos ligados à dinâmica populacional com dados do IBGE e que permitem estimar populações em tempos futuros, calcular a trajetória de um cometa, conhecendo alguns pontos de sua órbita, estimar áreas de regiões num mapa, modelar problemas simples em engenharia, representar soluções numéricas de problemas modelados por equações diferenciais etc... Esta é uma disciplina que tem muito mais a ver com Matemática aplicada do que com Matemática pura e tem como um de seus objetivos propiciar uma ideia inicial de temas e métodos em Matemática aplicada. Em particular, será muito útil na disciplina “Modelos Matemáticos”, que consta em seu currículo e na qual você trabalhará diferentes temas de realidade concreta que admitem uma modelagem matemática significativa. Aqui, trataremos de questões ligadas ao Cálculo e à Álgebra Linear, usando o computador para encontrar aproximações. Esperamos que você não torça o nariz para a palavra “aproximações”. É verdade que uma solução aproximada de um problema traz naturalmente um erro. Mas isso não significa que seja inútil. Pelo contrário, muitos problemas matemáticos não têm solução exata ou ela simplesmente não nos interessa. Na verdade, não existe medida precisa de grandezas no mundo real. Todas as medidas de fenômenos reais contêm, necessariamente, imprecisões a partir de alguma casa decimal. O Cálculo Numérico vem se tornando uma ferramenta cada vez mais importante na modelagem matemática de problemas aplicados, na medida em que computadores fazem contas numéricas com grande velocidade, desde que se admitam pequenos erros de arredondamento em cada operação. Muito em especial, a Álgebra Linear vem se tornando uma ferramenta cada vez mais indispensável nas aplicações, por ser uma espécie de elo de ligação através do qual modelos matemáticos dialogam com os computadores. O grosso do tempo computacional gasto num programa para resolver uma aplicação relevante, com alguma complexidade numérica, é usualmente gasto em rotinas de Álgebra Linear. Já o velho Cálculo, pelo menos tão velho quanto Newton e Leibnitz, continua tão fundamental como sempre, pois cá de nosso cantinho de onde conseguimos enxergar as coisas, olhando para as equações que regem fenômenos naturais, às vezes dá a impressão que derivada e integral teriam sido as principais ferramentas utilizadas na criação do Universo. Aula 1 Cálculo Numérico10 O velho cálculo continua sendo cada vez mais a ferramenta fundamental com a qual se escrevem não apenas as equações dos primórdios de nosso Universo e da Física como um todo, mas também de ecossistemas marinhos, de dinâmicas econômicas, do clima em nosso Planeta, de reatores químicos etc. Com uma diferença fundamental do que acontecia até cerca de sessenta anos atrás: agora, sabemos fazer contas rapidamente, entrando no computador com dados escritos na forma de vetores e matrizes de números. Daí a importância crescente do Cálculo Numérico. Linhas gerais de como está organizada a disciplina Organizaremos a disciplina como uma espécie de revisita à Álgebra Linear e ao Cálculo, conduzida pelo Scilab, que é um programa bom nesta coisa de fazer contas rapidamente, além de ser muito amigável e livre (grátis). Nas aulas 2, 3, 4, 5 e 6, privilegiaremos uma revisita à Álgebra Linear, através dos comandos do Scilab, de forma a reconhecer muitos dos métodos que você estudou em Álgebra Linear I e II. AL1 e AL2, como a elas nos referiremos. O ponto central desta revisita à Álgebra Linear é que será realizada em aritmética de ponto flutuante, como veremos nesta aula, por oposição à aritmética exata, ou seja, com números reais sem aproximações, como você viu em AL1 e AL2. Por um lado, isso faz com que as contas sejam realizadas com velocidade extraordinária num computador, o que é fundamental nas aplicações. Pelo outro, gera erros de arredondamento que podem se acumular a ponto de inviabilizar completamente as soluções obtidas nos computadores, conforme teremos a oportunidade de ver em vários momentos e, muito em especial, na Aula 6, na qual trataremos da sensibilidade de um sistema linear a dados. De modo que, bem distinto de uma repetição de algo já visto, trata-se de revisitar a Álgebra Linear com um olhar bem diferente. Em especial, gostaríamos de combinar com você que, nesta disciplina, sobretudo nas aulas 2, 3, 4, 5 e 6, tenha sempre à mão as aulas de Álgebra Linear I e II e que revejam essas disciplinas sempre que recomendarmos. Além disso ser muito importante nesta disciplina e evitar repetições inúteis de conteúdo, esperamos convencê-lo de um princípio pedagógico que nos parece importante. Ao revisitarmos conceitos, com mais experiência e sob uma nova ótica, os consolidamos de uma maneira surpreendente. Em particular, o que nos parecia tão difícil antes, de repente fica bem fácil de entender e bem mais interessante. Aula 1 Cálculo Numérico 11 As aulas 7 e 8 (Algoritmos e programação com Scilab I e II) serão dedicadas a uma introdução a algoritmos e a sua programação em Scilab. Trata-se principalmente de dar um pontapé inicial num assunto fundamental para o cálculo numérico e no qual o Scilab é especialmente amigável. Nas demais aulas, trataremos de algoritmos relacionados a cálculo diferencial e integral, visando encontrar zeros de funções, realizar interpolação polinomial, calcular aproximações numéricas de integrais, resolver numericamente equações diferenciais, obter estimativas para os erros cometidos em alguns dos métodos estudados, aplicar as técnicas desenvolvidas a problemas interessantes etc. Esta primeira aula, em linhas gerais Esta primeira aula fala da aritmética de ponto flutuante e de erros numéricos decorrentes de se arredondar resultados de contas. Esse é um tema fundamental, que nos acompanhará transversalmente em toda a disciplina. A aritmética de ponto flutuante corresponde, grosso modo, a considerarmos apenas um certo número de algarismos para representar grandezas, como usualmente fazemos com medidas de tamanho. Que sentido tem representar com vinte casas decimais resultados operados a partir de medidas feitas com precisão de quatro casas apenas? A contrapartida é que em cada operação realizada ocorrerão erros de aproximação em alguma casa decimal. O acúmulo de erros numéricos, mesmo que bem pequenos cada um, em problemas envolvendo bilhões de operações aritméticas, pode deformar completamente a solução obtida, a depender do problema em questão e do algoritmo empregado para resolvê-lo. Esse é um dos temas centrais da análise numérica, e o tangenciaremos na Aula 5. Nesta aula, pretendemos alertar você sobre dificuldades numéricas que podem ocorrer ao se trabalhar com o computador. Objetivos Calcular erros absoluto e relativo. Efetuar arredondamento e truncamento. Representar números em diferentes bases. Introduzir o sistema “aritmética de ponto flutuante”. 1 2 3 4 Aula 1 Cálculo Numérico12 Introdução Imagine-se na situação de alguém que tem um terreno medindo 10m por 10m e precisa dividi-lo ao meio por uma cerca na diagonal do terreno. Para comprar arame e fazer a cerca, você precisa saber qual o comprimento dela. Como descobrir isso? 10 10 x Felizmente, você conhece o teorema de Pitágoras e sabe que as medidas em questão devem satisfazer a equação x 2 = 102 + 102 = 2 102. Então, a cerca na diagonal terá um comprimento de 10 √ 2m.Mas, não dá para pedir 10 √ 2m de cerca na loja de ferragens. O que você faz é utilizar uma calculadora ou o computador para traduzir essa informação em um número mais compreensível. Pedimos que, neste momento, você pare a leitura, pegue uma calculadora (de celular ou científica) ou ligue o computador e acione o Scilab. Em seguida, calcule 10 √ 2m. De acordo com o número que encontrar, pense em quanto de cerca seria razoável pedir. Usamos uma calculadora de celular e o resultado encontrado foi: 10 √ 2 = 14, 1. Já em uma calculadora científica, o resultado encontrado foi: 10 √ 2 = 14, 14213562 . No computador, com o programa Scilab, encontramos: 10 √ 2 = 14, 142135623730951. Na verdade, nenhum dos valores encontrados é exatamente 10 √ 2 . O fato é que esse é um número irracional, com infinitas casas decimais que não se repetem de acordo com um padrão. Então, por mais poderosa que seja a ferramenta que utilizarmos para efetuar esse cálculo, tudo o que poderemos encontrar são aproximações de 10 √ 2 . Felizmente, para o nosso problema da cerca, não é necessário ter o valor exato. Bastaria saber que 14,2 metros de cerca já é mais do que o necessário. Esse tipo de situação em que não se pode ter a solução exata do problema, mas ficamos satisfeitos com uma solução aproximada, é muito comum em nosso dia-a-dia. Aula 1 Cálculo Numérico 13 Erros Quando falamos de soluções aproximadas, falamos também em erros numéricos. No exemplo da cerca, no início desta aula, foram calculados três valores diferentes para 10 √ 2. Cada um deles tem uma certa distância do valor exato. Essa distância é o que estamos chamando de erro. Ter controle sobre os erros é fundamental quando se trabalha com aproximações. Dois tipos são do nosso interesse: os erros absolutos e os relativos. O erro absoluto é simplesmente a diferença entre o valor exato de um número x e seu valor aproximado x . No caso de 10 √ 2 , é impossível obter o valor exato do erro absoluto. Num caso como esse o que se faz é obter uma estimativa para o módulo do erro absoluto. Por exemplo, como sabemos que 10 √ 2 está entre 14 e 14,2, podemos garantir que o erro cometido com a aproximação obtida no celular é menor que 0, 2, que é a maior diferença possível para valores x que estão entre 14 e 14,2. Já com os valores 14,14213562 e 14,142135623730951 podemos ter uma estimativa mais precisa do valor de 10 √ 2. Observe que as duas aproximações coincidem até o segundo algarismo 2. Podemos então estreitar o intervalo que contém a solução exata. Concluímos que 10 √ 2 é um número entre 14,14213562 e 14,14213563. Assim, a nossa última aproximação possui um erro absoluto menor que 0,00000001. À primeira vista, esse último erro é muito pequeno. Imagine que alguém lhe dissesse que cometeu um erro de 0,00000001. A primeira reação é achar que esse número é insignificante, quase zero. Isso pode ser verdade em muitas situações. Mas, o fato é que nossa noção de pequeno depende daquilo que estamos observando. No caso de 10 √ 2 , o erro cometido é satisfatório para muitos problemas práticos. Porém, se pensarmos em uma situação em que a solução exata é 0,0000000000000002, então uma aproximação que tem um erro de 0,00000001 está muito longe do ideal. Por causa dessa necessidade de se comparar o erro com as grandezas medidas, emprega-se a definição de erro relativo, que é o erro absoluto dividido pelo valor aproximado. No exemplo anterior, se a solução exata é 0,0000000000000002 e cometemos um erro absoluto de 0,00000001, então podemos ter encontrado a aproximação 0,0000000099999998. Dessa forma, o erro relativo seria de ER = EA x = 0, 00000001 0, 0000000099999998 ∼= 1, 0000000200000004000000080000002 . Ou seja, mais de 100% de erro. Já no exemplo de 10 √ 2 , temos: |ER| = |EA| |x| < 0, 00000001 14, 142135623730951 ∼= 0, 0000000007 = 7 × 10−10 . Atividade 1 Aula 1 Cálculo Numérico14 a) Encontre aproximações de π com o máximo de algarismos que conseguir. b) Calcule os erros absoluto e relativo cometidos pela sua aproximação. Aula 1 Cálculo Numérico 15 Arredondamento e truncamento Vamos fazer um pequeno exercício com uma planilha eletrônica (Excel, BrOffice). Na barra de fórmulas, digite “=PI()”. Esse comando retorna a constante π = 3,141592... Na barra de ferramentas, procure pelo botão ,00,0 “diminuir casas decimais” e aperte-o até que sua tela fique parecida com esta: Agora, procure pelo botão ,0 ,00 “aumentar casas decimais” e aperte-o duas vezes. O valor de π que aparece é 3,142. Se você apertar o botão ,0,00 mais uma vez, aparecerá 3,1416. Outra vez, e aparecerá 3,14159. Por que o valor de π, mostrado na planilha, muda tanto? A resposta é que cada vez que apertamos um dos botões mostrados, estamos dizendo ao programa que queremos ver uma aproximação de π com um determinado número de casas decimais. Para escolher qual será o último algarismo mostrado, o programa faz um arredondamento, analisando o algarismo seguinte ao último a ser mostrado. Suponha que queremos usar uma aproximação do número N = I, d1d2d3d4 com apenas três casas decimais. Aqui, I é a parte inteira de N e os di são os dígitos após a vírgula. Então, o programa faz o seguinte: � se d4 < 5, então N é apresentado como N = I, d1d2d3; � se d4 ≥ 5, então, no lugar de d3, usa-se d3 + 1. Desse modo, quando você disse à planilha que queria uma aproximação de π com somente um algarismo após a vírgula, ela verificou que a segunda casa após a vírgula é ocupada pelo número 4, que é menor do que 5. Assim, não houve alteração na primeira casa decimal. Aula 1 Cálculo Numérico16 Já quando foi dito ao programa que ele deveria mostrar π com três casas decimais após a vírgula, verificou-se que o quarto algarismo após a vírgula é 5, que é maior do que ou igual a 5. Então, foi adicionado 1 ao terceiro algarismo, resultando em 3,142. O número π é irracional. Portanto, não tem uma representação finita. Vamos ver até onde vai a capacidade do programa? Continue apertando o botão de aumentar as casas decimais. Em algum momento, você terá um resultado parecido com este: Observe que após o último 9, somente zeros aparecem, como se π fosse racional. O que aconteceu aqui? Acontece que computadores e calculadoras só trabalham com quantidades finitas de casas decimais. Existe um limite para o número de algarismos que podem ser armazenados pelas máquinas. Quando esse número é maior do que a capacidade da máquina, uma das seguintes saídas é utilizada: arredondamento ou truncamento. Nesse último exemplo foi usado o truncamento, que é simplesmente ignorar o restante das casas decimais. O número π foi “cortado” na 14ª casa decimal. Aula 1 Cálculo Numérico 17 Atividade 2 A utilização de arredondamento ou truncamento implica em erros. Para ilustrar esse fato, suponha uma calculadora que mostra somente 5 dígitos. a) Como seria mostrado o resultado da multiplicação de 0,937 por 0,1272 ? (Leve em consideração os dois métodos de aproximação: arredondamento e truncamento). b) Qual o erro cometido pela calculadora em cada caso? Aula 1 Cálculo Numérico18 Representação de números racionais em diferentes bases Existem infinitas maneiras de se representar um número. Estamos acostumados a representar 123 (cento e vinte e três) dessa forma porque nosso sistema de numeração utiliza a base 10. Isso significa que o último algarismo deve ser multiplicado por 100, o penúltimo por 101, o antepenúltimo por 102 e os resultados devem ser somados. Ou seja, 123 = 1 102 + 2 101 + 3 100. Mas, essa é apenas uma forma de fazê-lo. Quem disse que temos que usar 10 como base? Poderíamos usar outra? Como ficaria cento e vinte e três na base 7? Note que 123 = 2 72 + 3 71 + 4 70. Então, se usássemos a base 7, escreveríamos cento e vinte e três como 234. É comum distinguir as representações de um número usando a seguinte notação: (djdj–1...d2 d1d0)β = dj β j + dj–1 β j–1 +... + d2β 2 + d1β 1 + d0β 0. Assim, temos (123)10 = (234)7. Exercício resolvido 1 Converta (10111)2 para a base 10 e (123)10 para a base 2. Solução É fácil converter para a base 10. Basta fazer a conta 1 24 + 0 23 + 1 22 + 1 21 + 1 20 = (23)10. Já para fazer a conversão da base 10 para a base 2, dividimos 123 por 2 e observamos que 123 = 61 2 + 1. Aula 1 Cálculo Numérico 19 Dividimos 61 também por 2. Assim, verificamos que 123 = (30 2 + 1) 2 + 1. Agora repetimos o procedimento com 30. Daí, 123 = ((15 2 + 0) 2 + 1) 2 + 1. Continuando, dessa forma, encontraremos a seguinte sequência de igualdades: 123 = (((7 2 + 1) 2 + 0) 2 + 1) 2 + 1 = ((((3 2 + 1) 2 + 1) 2 + 0) 2 + 1) 2 + 1 = ((((1 2 + 1) 2 + 1) 2 + 1) 2 + 0) 2 + 1) 2 + 1. Então, distribuindo as multiplicações, podemos ver que: 123 = 1 20 + 1 21 + 0 22 + 1 23 + 1 24 + 1 25 + 1 26. Ou ainda, reordenando os coeficientes, (123)10 = (1111011)2. Atividade 3 Converta (11111)2 para a base 10 e (11)10 para a base 2. Aula 1 Cálculo Numérico20 Vale lembrar que o mesmo raciocínio é válido para representações com casas decimais. A representação (2,35)10 significa que o número em questão é obtido como 2 100 + 3 10–1 + 5 10–2. A vírgula indica o lugar da potência de expoente zero e que, a partir daquele lugar, as potências utilizadas terão expoentes negativos. Da mesma forma, (10,01)2 = 1 21 + 0 20 + 0 2–1 + 1 2–2 = (2,25)10. Aritmética de ponto flutuante Um computador normalmente opera com a representação binária (base 2). Mas, além da escolha da base, a representação de um número real é feita no sistema denominado aritmética de ponto flutuante. Nesse sistema, um número é representado na forma: –+ (0.d1d2...dk ) β e, onde β é a base utilizada e os dígitos kddd ...21 são chamados de mantissa do número. Funciona da seguinte maneira: se a base de representação é 10 e queremos colocar o número 280,4 no sistema de aritmética de ponto flutuante, escrevemos 0.2804 103. Ou seja, deslocamos a vírgula até obtermos 0,2804 e multiplicamos por uma potência de 10 cujo expoente é determinado pelo deslocamento da vírgula. Como os computadores e as calculadoras geralmente trabalham com ponto no lugar da vírgula, também fizemos essa substituição. O procedimento é o mesmo com qualquer base. Tome, por exemplo, o número (10,01)2. Fazemos o deslocamento e multiplicamos pela potência de 2. Então, a representação em aritmética de ponto flutuante é 0.1001 22. Cuidado, se você for verificar essa conta! Lembre- se que 0.1001 está na representação binária. Ele representa o número 1 2–1 + 0 2–2 + 0 2–3 + 1 2–4 = (0,5625)10. Em qualquer que seja a máquina podemos contar somente com uma capacidade finita de representação de números. Por limitações físicas, as máquinas só operam com um determinado número de dígitos na mantissa. Também é finita a quantidade de expoentes disponíveis. Por exemplo, considere uma máquina que opere com base 10, com 5 dígitos na mantissa e expoentes entre –8 e 8. Os números serão representados na forma 0.d1d2d3d4d5 10e, onde cada dígito di está entre 0 e 9, com d1 =/ 0 e e ∈ [– 8,8]. Qual o menor número positivo que pode ser representado nessa máquina? Aula 1 Cálculo Numérico 21 Como devemos ter d1 =/ 0, a menor possibilidade é m = 0.10000 10–8 = 10–9. E o maior? Aqui, escolhemos os maiores valores possíveis para os dígitos e para o expoente. Daí, temos M = 0.99999 108 = 99999000. Seja G = { x ∈ ℜ | m ≤ x ≤ M }. Dado um número real x, uma das seguintes possibilidades ocorre: 1) x ∈ G se for este o caso, há ainda duas possibilidades: 1.1) x tem uma quantidade de dígitos menor que ou igual a cinco na mantissa e, portanto, é representado exatamente nessa máquina; 1.2) x tem uma quantidade de dígitos na mantissa maior que 5. Então, não pode ser representado exatamente nessa máquina. Tome como exemplo o número 28,0476. Esse é um número que possui 6 dígitos na mantissa. Sua representação em ponto flutuante é 0.280476 102. Para ser representado pela máquina, será feito um truncamento ou um arredondamento. Dessa forma, o número usado pela máquina será 0.28047 102 ou 0.28048 102. 2) |x | < m ou |x | > M a máquina dará, teoricamente, uma mensagem de erro, pois o número não pode ser representado nela. Por exemplo, os números 10–10 ou 1010 não podem ser representados nessa máquina. Na prática, o “zero” em ponto flutuante é, em muitos programas, geralmente representado com o menor expoente possível naquele programa e não como o zero dos números reais. Isso deriva dos problemas numéricos inerentes a operações com números abaixo deste “zero”, em valor absoluto, ou cujos resultados, em valor absoluto, estejam abaixo deste “zero”. Tais programas são mais precavidos e advertem da possibilidade de riscos numéricos, se determinadas operações resultam em números abaixo deste “zero” do programa. No caso do Scilab, com o qual trabalharemos, e onde o “zero” do programa seria da ordem de 10–324, ele considera todos os números que surjam entre 0 e 10–324 como “zero”, sem maiores precauções em denunciar que aconteceram problemas nas operações realizadas, caso tais números excepcionalmente pequenos surjam lá pelo meio das contas. Atividade 4 Aula 1 Cálculo Numérico22 Complete a Tabela 1 dando as representações dos números em um sistema de aritmética de ponto fl utuante de três dígitos, base 10 e expoente entre –4 e 4. Tabela 1 – Representações dos números em um sistema de aritmética de ponto fl utuante de três dígitos, base 10 e expoente entre –4 e 4 X Representação obtidapor arredondamento Representação obtida por truncamento 1,25 10,053 –238,15 2,71828... 0,000007 718235,82 Erros relativos em aritmética de ponto fl utuante: estabilidade na adição e possível amplifi cação na subtração Observe, no Exemplo 1, como o erro relativo na subtração de dois números positivos, relativamente próximos entre si, pode fi car muito maior que os erros relativos no truncamento de cada um dos números, enquanto que o mesmo não acontece com sua adição. Exemplo 1 Considere x = 2617/45871 e y = 2618/45872. 1) Calcule √ x −√y e √ x + √ y usando uma máquina de calcular comum. A nossa calculadora utiliza 11 dígitos signifi cativos e nos deu: d = √ y − √ x = 0, 00004302799; s = √ y + √ x = 0, 47776691255. 2) Obtenha d = √x −√y e s = √ x + √ y em aritmética de ponto fl utuante, sempre na base 10. Porém, usando apenas 5 dígitos signifi cativos e truncando a partir da sexta casa. Aula 1 Cálculo Numérico 23 Nesse caso, x = 0.05706 e y = 0,05708. Ao calcular √ x −√y e √ x + √ y , utilizando apenas 5 casas decimais em cada operação realizada, truncando a sexta casa, obtivemos: � d = √ y − √ x = 0, 00004; � s = √ y + √ x = 0, 47776. 3) Avalie os erros relativos das duas contas feitas no item anterior. Começamos avaliando os erros absolutos cometidos até 4 casas decimais significativas e operando sempre por truncamento, como sendo: � ∆sAbs 0,477766912 – 0,47776 = 0, 6912*10–6; � ∆dAbs 0,000043027 – 0,00004 = 0,3027*10–6. Os correspondentes erros relativos podem então ser estimados por: � ∆Srel ≈ ∆SAbs / (√ y + √ x ) = 6912∗10∧(−6)/0.47776 = 0.144∗10−5 . � ∆drel ≈ ∆dAbs / (√ y − √ x ) = 0, 3027∗10−6/0.00004 = 0.757∗10−2. Observação – Note que, no Exemplo 1, obtivemos um erro relativo ∆s rel 0.144*10–5, na soma s = √ y + √ x , feita com cinco dígitos, indicando um acerto em cinco casas decimais nesta conta. Melhor que isso não poderíamos esperar, já que estamos truncando as contas na quinta casa decimal. Já na subtração d = √ y − √ x , obtivemos ∆d rel 0.757*10–2, indicando um acerto de apenas duas casas decimais, o que é consideravelmente pior. Isso não foi por acaso e leva o nome de erro de cancelamento. Indicamos, a seguir, por que a subtração de dois números relativos pode amplificar drasticamenteos erros relativos em x e y, enquanto que a soma é mais estável, produzindo resultados da mesma ordem de grandeza que os erros absolutos em x e y. Digamos que x e y representam aproximações de dois números reais positivos x e y. Os erros absolutos dessas aproximações seriam, então, ∆x = x − x e ∆y = y − y . Considere ainda: � s = x + y e d = x – y (soma e subtração de x e y); � s = x + y e d = x − y e s = x + y e d = x − y (soma e subtração das correspondentes aproximações). Os correspondentes erros relativos ∆drel e ∆srel satisfarão, então: � |∆Srel | = |(S − s)/s| = |∆x + ∆y| x + y ≤ |∆x| x + y + |∆y| x + y ≤ |∆x| x + |∆y| y = |∆xrel |+ |∆yrel | � ∆drel = (d − d)/d = ∆x − ∆y x − y = ∆x x − y − ∆y x − y Resumo Aula 1 Cálculo Numérico24 Veja que, para a soma, nossa conta acima diz que o seu erro relativo seria, em módulo, limitado pela soma dos módulos dos erros relativos em x e y. Já para a diferença, se os números x e y estiverem próximos, os denominadores de ∆x x − y e ∆y x − y indicam que ∆drel pode ser consideravelmente maior que os erros relativos ∆xrel = ∆x x e ∆yrel = ∆y y , como aconteceu no Exemplo 1. No Exemplo 1 e na Observação 1 já temos um indício do preço a pagar por usarmos aritmética de ponto flutuante no lugar de aritmética exata. Na verdade, a mais severa das limitações ao se trabalhar com a aritmética de ponto flutuante reside na possibilidade do acúmulo de erros numéricos resultar em erros significativos no resultado devolvido, ao cabo de muitas operações aritméticas realizadas sequencialmente, mesmo que cada um dos erros seja relativamente pequeno. Inclusive, podendo distorcer completamente a solução procurada de algum problema, conforme teremos a oportunidade de verificar em algumas das aulas seguintes, a depender de cada problema e dos algoritmos empregados. Na aula 5, discutiremos um pouco mais a questão da amplificação de erros numéricos em aritmética de ponto flutuante. Autoavaliação 1) Responda às questões a seguir: a) Qual a diferença entre erro absoluto e erro relativo? b) O que é arredondamento? E truncamento? c) Como encontrar a representação de um número em uma base diferente da base 10? d) Como se representa um número no sistema aritmética de ponto flutuante? Nesta aula, você aprendeu a calcular erros de aproximações. Viu que se pode obter aproximações por arredondamento e truncamento. Aprendeu a converter representações de números e viu que as máquinas operam com aritmética de ponto flutuante. Aula 1 Cálculo Numérico 25 Exercícios propostos 1) Converta os seguintes números decimais para sua forma binária: a) 25; b) 2345; c) 0,5. 2) Converta os seguintes números binários para sua forma decimal: a) (10111)2; b) (0,1101)2; c) (11,11)2. 3) Considere um sistema de aritmética de ponto flutuante de quatro dígitos e base decimal. Dados os números x = 0.937 104 e y = 0,1272 102, efetue as seguintes operações e obtenha o erro relativo no resultado, supondo que x e y estão exatamente representados: a) x + y; b) xy. 4) Considere uma máquina cujo sistema de representação de números é definido por: β = 10, quatro dígitos na mantissa e e ∈ [–5, 5]. Pede-se: a) Qual o menor e o maior números em módulo representados nesta máquina? b) Como será representado o número 73.758 nesta máquina, se for usado arredondamento? E se for usado truncamento? c) Se a = 42.450 e b = 3, qual o resultado de a + b? d) Qual o resultado da soma S = 42450 + 10∑ k=1 3 nesta máquina? Referências FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006. PIRES, Paulo Sérgio da Motta. Introdução ao Scilab: versão 3.0. Natal: Departamento de Engenharia de Computação e Automação; Universidade Federal do Rio Grande do Norte, 2004. Disponível em: <www.dca.ufrn.br/~pmotta/sciport-3.0.pdf>. Acesso em: 30 jan. 2009. RUGGIERO, Márcia A. Gomes; LOPES, Vera Lúcia da Rocha. Cálculo numérico: aspectos teóricos e computacionais. São Paulo: Makron Books, 1996. Aula 1 Cálculo Numérico26 Respostas dos exercícios propostos 1) a) (11001)2; b) (100100101001)2; c) (0,1)2 2) a) (23)10 ; b) (0,8125)10 ; c) (3,75)10 3) x + y é 0.9383 104 no arredondamento e 0.9382 104 no truncamento. xy é 0.1192 106 no arredondamento e 0.1191 106 no truncamento. 4) a) m = 0.1000 10–5 e M = 0.9999 105; b) No arredondamento: 0.7376 102. No truncamento: 0.7375 102; c) a + b = 0.4245 105; d) S = 0.4245 105. Aula 1 Cálculo Numérico 27 Anotações Aula 1 Cálculo Numérico28 Anotações Aula 2 Introdução ao Scilab Aula 2 Cálculo Numérico 31 Apresentação Esta aula é uma pequena introdução ao programa Scilab, voltado para aplicações numéricas, livre e organizado por um consórcio europeu. Ele será de extrema importância nesta disciplina, já que a nossa viagem pelo Cálculo Numérico terá o Scilab como principal veículo. Várias aplicações da teoria exposta nas aulas deverão ser feitas no computador com o auxílio do Scilab. Esperamos que ele se torne uma ferramenta útil no restante do seu curso e na sua vida profissional. O Scilab é um parente bem próximo, porém bem mais barato (em U$) do que o famoso Matlab; se você aprender a usar o primeiro, aprenderá a usar o segundo. Começaremos a nossa aula orientando−o como instalar o Scilab em qualquer computador que você deseje, desde que rode com Windows ou com Linux. Em especial, você dispõe dos computadores nos polos da SEDIS, nos quais você pode providenciar uma instalação do Scilab (caso isto ainda não tenha sido feito). De forma a lhe facilitar a instalação desse programa, também lhe disponibilizamos, no Moodle, o vídeo Instalacao_do_Scilab.wmv. No entanto, uma coisa nós precisamos combinar, sem o que esta aula não faz nenhum sentido: você tem que dar um jeito de se sentar na frente do computador e fazer o que nós estamos lhe propondo aqui. Em compensação, temos a expectativa de que, ao final da aula, você se surpreenda em ver como o Scilab é amigável e tome gosto em brincar com ele. Se você se empenhar nas atividades propostas, quando menos esperar vai se familiarizar com comandos de matrizes e vetores que serão fundamentais ao longo de toda a disciplina. A primeira regra de ouro é entrar no Scilab e conhecê−lo. Quanto mais, melhor. Chega a ser divertido, quando você entra no jogo. Aí, adeus contas, pois quem faz contas é computador. A segunda regra de ouro é usar e abusar dos arquivos de ajuda aos comandos, o popular help. Para facilitar a aplicação dessa segunda regra de ouro, providenciamos uma tradução do help do Scilab para o português, realizada com capricho por um aluno do curso de bacharelado da UFRN, Daniel de Souza Grilo, através de um projeto financiado pela Sedis e orientado por nós. Na página da nossa disciplina, no Moodle, damos as dicas de como você deve proceder para substituir o arquivo de ajuda em inglês pela versão que organizamos em português. Os arquivos de ajuda do Scilab contêm exemplos e são extremamente úteis para orientar como usar os comandos. Uma ferramenta adicional que pode lhe ser muito útil é o excelente tutorial Scilab, em português, elaborado pelo professor Paulo Motta, do departamento de Engenharia Elétrica da UFRN, a quem muito agradecemos por colocá−lo inteiramente a nossa disposição e no qual nos inspiramos para escrever esta aula. Recomendamos, também, o material de suas aulas da disciplina Métodos Computacionais em Engenharia (uma versão de Cálculo Numérico para engenheiros, adotada nos currículos das engenharias da UFRN), cujo suporte computacional também é o Scilab. Scilab Tanto o tutorial do programa quanto as aulas de Métodos Computacionais em Engenharia se encontram à disposição para download em nossa página, no Moodle, bem como em: <www.dca.ufrn. br/~pmotta/>. Acesso em: 30 jan. 2009. 1 3 2 4 5 Aula 2 Cálculo Numérico32 Objetivos Efetuar cálculos simples no Scilab. Manipular polinômios. Operar com vetores e matrizes.Desenhar gráficos. Introduzir a discretização de funções. Instalação A primeira coisa a ser feita é verificar se o seu computador tem o Scilab instalado. Procure pelo ícone em sua área de trabalho. Caso não encontre, precisaremos instalar o programa. Se o Scilab já está instalado em seu computador, você já pode passar para a próxima seção. Na página da nossa disciplina, no Moodle, há um vídeo mostrando em detalhes como instalar o Scilab em seu computador. Basta repetir os passos apresentados. O procedimento, em linhas gerais, é o seguinte: 1) Acesse a página do Consórcio Scilab em <http://www.scilab.org/>; 2) Baixe o arquivo “scilab−5.0.2.exe” (ou o mais atual), se o seu sistema operacional for o Windows. Se for Linux, baixe “scilab−5.0.2.bin.linux−i686.tar.gz”; 3) Execute o arquivo seguindo as instruções. Aula 2 Cálculo Numérico 33 Iniciando o Scilab Agora que o Scilab está instalado, coloque−o para rodar. Você deverá ter em sua tela uma janela parecida com esta: Figura 1 – Janela do prompt do Scilab A seta −−> na janela é o prompt do Scilab. É por ali que você vai fornecer ao programa dados e comandos. Sempre que você a vir nas nossas aulas, será a indicação da digitação de um ou mais comandos Scilab, na sequência e na mesma linha. Nas linhas subsequentes, você verá a resposta que o Scilab lhe devolve, na tela do computador, ao(s) comando(s) digitado(s). O Scilab possui algumas variáveis permanentes, cujos valores não podem ser modificados nem apagados. Um exemplo é a variável %pi (π). Digitando esse nome e apertando a tecla enter, temos o seguinte resultado: −−>%pi %pi = 3.1415927 Aula 2 Cálculo Numérico34 Se você tentar atribuir outro valor a essa variável, receberá uma mensagem de erro. −−>%pi = 2 !−−error 13 Redefining permanent variable. Usando o Scilab como calculadora Vamos atribuir às variáveis a e B os valores 3 e 2, respectivamente, e depois apresentar sua soma: −−>a = 3; −−>B = 2; −−>a + B ans = 5. Observe que o ponto-e-vírgula no final da linha impede a apresentação do resultado. Repita a digitação feita sem colocar o ponto-e-vírgula nas linhas de a e B, e colocando na linha de a + B. Outra coisa que merece destaque: o Scilab leva em consideração a diferença entre maiúsculas e minúsculas. Assim, B é diferente de b. Experimente pedir que ele calcule a + b. Outras dessas variáveis permanentes são: %i (a unidade imaginária √ −1); %e (a base do logaritmo neperiano e = 2.7182818...); %T (verdadeiro); %F (falso) e muitos outros. Para ver todas as variáveis permanentes, digite o comando who e aperte a tecla enter. Aula 2 Cálculo Numérico 35 Os valores atribuídos às variáveis podem ser complexos. Vamos fazer adição, subtração, multiplicação e divisão dos números 2 + 3i e 1 – 4i. Para não repetir a digitação dos números, atribuiremos esses valores às variáveis a e b. −−> a = 2 + 3*%i a = 2. + 3.i −−> b = 1 – 4*%i b = 1. – 4.i −−> a + b // adição ans = 3. – i −−> a – b // subtração ans = 1. + 7.i −−> a*b // multiplicação ans = 14. – 5.i −−> a/b // divisão ans = – 0.5882353 + 0.6470588i Observe que o que está digitado depois de “//” não é levado em conta pelo programa. Essa é uma maneira de inserir comentários durante o seu trabalho, muito útil na programação com o Scilab, como você verá na Aula 7, Programação com o Scilab I. Os próximos exemplos mostram como calcular senos, cossenos, tangentes, potências, raízes e logaritmos. −−> sin(%pi/2) // seno de π/2 ans = 1. −−> cos(1) // cosseno de um ans = 0.5403023058681397650105 −−> tan(0) // tangente de zero ans = 0. Atividade 1 1 2 3 Aula 2 Cálculo Numérico36 −−> 3 ^ 5 // 3 elevado à quinta potência ans = 243. −−>sqrt (–4) // raiz quadrada de –4 ans = 2.i −−> log(%e) // logaritmo natural de e ans = 1. Sendo a = 1,35, b = 2,7 e c = 3, calcule: a)a b − c b ; b) ab−c b ; c) a b−c b . Sabendo que 1 polegada equivale a 2,54 centímetros, encontre uma aproximação com 4 casas decimais, em centímetros, para a área de um círculo de raio medindo 3 polegadas. O comando factor() fornece a fatoração prima de um inteiro positivo. Por exemplo, factor(6) retorna os números 2 e 3. Utilize esse comando para encontrar a decomposição em fatores primos de 8712870, 48506557, 505149 e 2812281. Agora, responda: os números 8712870 48506557 e 505149 2812281 são iguais? Aula 2 Cálculo Numérico 37 Matrizes O fato de computadores serem muito adequados à manipulação de matrizes e vetores reforça a ideia de que matrizes constituem o tijolo básico da modelagem numérica de problemas. No Scilab, isso é muito visível. Números são representados como matrizes 1 × 1. Vetores são representados ora como matrizes linha 1 × n, ora como matrizes coluna n × 1, e são manipulados como se matrizes fossem. Matrizes podem ser inseridas no Scilab de diversas maneiras. A mais imediata é digitando linha por linha, deixando o conjunto todo entre colchetes. Duas entradas numa mesma linha são separadas por um espaço ou por uma vírgula. Duas linhas são separadas por um ponto−e−vírgula. A = [1 2 1; 3 2 1] // Matriz com 2 linhas e 3 colunas A = 1. 2. 1. 3. 2. 1. B = [ –1, 1, 0; 1, –2, 4] // Matriz com 2 linhas e 3 colunas B = – 1. 1. 0. 1. – 2. 4. As operações de multiplicação por escalar e multiplicação de matrizes usam o mesmo operador *. Lembre−se que, para fazer a multiplicação entre matrizes, o número de colunas da primeira precisa ser igual ao número de linhas da segunda. Nesse caso, não podemos fazer A*B, mas podemos fazer a multiplicação entre A e a transposta de B, que é representada como B’. C = B’ // C é a transposta de B C = – 1. 1. 1. – 2. 0. 4. A*C // A vezes a transposta de B ans = 1. 1. – 1. 3. Aula 2 Cálculo Numérico38 Para adição e subtração de matrizes, são usados os sinais usuais + e –, respectivamente. Outros comandos importantes são size(), eye(), zeros() e ones(). Eles facilitam bastante o trabalho com matrizes. O comando size() retorna as dimensões da matriz em forma de vetor; eye( ) permite que criemos uma matriz identidade sem a necessidade de digitar seus elementos; zeros() cria uma matriz nula e ones( ) cria uma matriz com todas as suas entradas iguais a 1. −−> size(A) // A é uma matriz 2 × 3 ans = 2. 3. −−> eye(4,4) // Matriz identidade 4 × 4 ans = 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. −−> zeros(2,4) // Matriz nula 2 × 4 ans = 0. 0. 0. 0. 0. 0. 0. 0. −−> ones(2,4) // Matriz 2 × 4 cujas entradas são todas iguais a 1 ans = 1. 1. 1. 1. 1. 1. 1. 1. Em alguns problemas, precisamos usar algum elemento específico de uma matriz. O Scilab permite que façamos isso. Para tanto, basta entrar com o nome da matriz e a posição do elemento. Permite, ainda, de maneira bem fácil, que se extraia da matriz uma linha, uma coluna ou ainda submatrizes formadas por linhas e colunas. −−> D = [1 2 3 4; 5 6 7 8; 9 10 11 12] // A matriz D D = 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. −−> D(1,2) // Elemento da primeira linha e segunda coluna da matriz D ans = 2 Aula 2 Cálculo Numérico 39 −−> D (2,1:3) // Matriz 1 × 3 formada pela segunda linha de D, colunas de 1 a 3 ans = 5. 6. 7 −−> D (2: 3,2: 4) ans = 6. 7. 8. // Matriz formada com as linhas 2 e 3, colunas de 2 a 4 10. 11. 12. Podemos extrair qualquer submatriz com o comando D(I,J), se I e J forem vetores com índices de linhas e colunas de D. Além disso, podemos, também, alterar uma matriz nas posições indicadas em I e J, prescrevendo uma outra matriz no lugar. −−> D(1,2) = 100 // Substitui o valor de D na linha 1, coluna 2 por 100. D = 1. 100. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. −−> I = [1,3], J = [1,3,4] //I e J são matrizes−linha ou vetores (como preferir) I = 1. 3. J = 1. 3 .4. −−> E = D(I, J) // Matriz formada pelas linhas 1 e 3, colunas 1, 3 e 4 de D E = 1. 3. 4. 9. 11. 12. −−> D(I,J) = zeros(2,3) // Zera os valores deD nas posições correspondentes D = 0. 100. 0. 0. // às linhas em I e colunas em J. 5. 6. 7. 8. 0. 10. 0. 0. Aula 2 Cálculo Numérico40 Muitas vezes é importante concatenar matrizes para formar matrizes maiores, ou para defini−las através de blocos de matrizes. O Scilab trabalha com blocos de matrizes, com a mesma lógica que antes. Ou seja, separados por espaços ou por vírgulas, se forem concatenados na horizontal, e por ponto−e−vírgula, se forem concatenados na vertical. −−> F = [D ones(3,1)] // Forma F, adicionando uma coluna de números um à matriz D F = 0. 100. 0. 0. 1. 5. 6. 7. 8. 1. 0. 10. 0. 0. 1. −−>D ( : ,5 : 6) = [15 16; 17 18; 19 20] // Adiciona duas colunas a D preexistente D = 0. 100. 0. 0. 15. 16. 5. 6. 7. 8. 17. 18. 0. 10. 0. 0. 19. 20. −−> G = [eye(2,2) –2*ones(2,3); zeros(2,2) [1 2 3; 4 5 6] ] // Forma G com 4 blocos G = 1. 0. –2. –2. –2. 0. 1. –2. –2. –2. 0. 0. 1. 2. 3. 0. 0. 4. 5. 6. Observação 1 − Vetores no ℜn Podemos representar os vetores na forma de uma coluna de números, ou de uma linha de números. Assim, um elemento v de ℜ3 tanto pode aparecer com o formato v = x1 x2 x3 como v = [x1 x2 x3]. No Scilab, não há um comando específico para vetores. Serão representados ora como matriz 1 × n, ora como matriz n × 1. Felizmente, como você poderá ver ao longo dessa disciplina, representar vetores por matrizes muito mais ajuda que atrapalha, apesar de parecer meio estranho no começo. Vetores por Matrizes Na bibliografia ligada à Álgebra Linear Numérica, costuma-se representar vetores por matrizes. O usual (default), na Álgebra Linear Numérica, é tratar vetores como matrizes coluna, ou seja, representados na forma x = xnx1. Provavelmente, devido ao fato do produto matriz-vetor ser tão fundamental para a Álgebra Linear no ℜn e no Cn. Se x = xnx1 e A = Anxn, isto permite calcular o produto da matriz A pelo vetor x, assim como o produto das matrizes A e x. Atividade 2 1 2 3 Aula 2 Cálculo Numérico 41 O produto interno de dois vetores x e y será x * y, se você entrou com x na forma x 1 x n e y na forma yn x 1. Se você tiver entrado na forma mais usual da Álgebra Linear Numérica, que é x = xn x 1 e y = yn x 1, o produto será xTy. −−> x = [1 2 3] // O vetor x, como matriz 1 × 3 x = 1. 2. 3. −−> y = [1; 2; 3] // O vetor y, como matriz 3 × 1 y = 1. 2. 3. −−> x*y // x*y é uma matriz 1 × 1 que calcula o produto interno x ⋅ y. ans = 14 −−> y*x // O produto de y = y 3×1 por x = x1×3 dá uma matriz 3 × 3 ans = 1. 2. 3. 2. 4. 6. 3. 6. 9. −−> y’*x’ // Note que y’*x’ = y(1) × (1) + y(2) × (2) + y(3) × (3) = x*y ans = 14 Verifique se os vetores v = (sen(π / 6), π), e w = (e, ln 2) são ortogonais. Ache, em matemática exata, a projeção ortogonal de v na direção de w. (Sugestão: digamos que tal projeção ortogonal seja v . Isso significa que v = cw e v – v agora é ortogonal a w. Conclua que c = (vT w)/(wTw). Faça essa mesma conta, agora, no Scilab. Aula 2 Cálculo Numérico42 Atividade 3 Observação 2 – Relembramos, com a tabela a seguir, a notação matemática adotada por nós para matrizes e vetores, comparando−a com a linguagem correspondente do Scilab. Tabela 1 – Matematiquês X Scilabês Notação Matemática Notação em Scilab Entrada na linha i e na coluna j Aij A(i, j) j − ésima coluna de A A(j) A(1 : m,j), ou A( : , j ) I − ésima linha de A Ai A(i, : ) ou A(i, 1 : n) Matriz transposta de A AT A’ Produto de A por B AB ou A*B A*B Potência de A An Aˆn Produto, divisão e potenciação de A por B, entrada a entrada Não se define, aparentemente A.*B, A./B e A.ˆB (muito útil) A atividade a seguir é muito importante, pois lhe permite treinar comandos com matrizes e revisitar, via Scilab, propriedades elementares do produto matriz-vetor e fundamentais na manipulação de matrizes. 1 Carregue A = [ 3 6 9 ; 2 4 6; 1 2 3], B = [1 1 1; 2 2 2; 3 3 3], c = [1; 2; 2] e d = [2; 1; 1] no Scilab. Traduza a linguagem matemática usada abaixo para a linguagem do Scilab e verifique, no programa, que: a) Aij é o produto da linha i pela coluna j, ou seja, que Aij = AiB(j); b) A j-esima coluna de AB é AB(j) e a i-ésima linha de AB vale AiB; c) A i-ésima coordenada de Ac é Aic; d) Ac = c 1 A(1) + c 2 A(2) + c 3 A(3) (Atenção! Essa identidade é muito importante); e) ||c||2 = cTc = c 1 2 + c 2 2 + c 3 2 – Quadrado da norma euclidiana de c; f) cTd = c 1 d 1 + c 2 d 2 + c 3 d 3 – Produto interno entre c e d. Para as mesmas A e B do item anterior: a) Compare os resultados de AB, com A.*B e explique o que cada um faz. b) Compare os resultados de Aˆ2 com A.ˆ2 e explique o que cada um faz. 2 Aula 2 Cálculo Numérico 43 Atividade 5 Atividade 4 1 Entre com A = [1 2 3; 10 9 8 ], B = [4 5; 7 6 ], x = [0 0 0 1 2 ] e y = ones(1,5). a) Monte uma matriz C cujas duas primeiras linhas sejam formadas, nessa ordem, pelos blocos A e B, a terceira por x e a quarta por y. b) Calcule D = CTC, F = CCT (observe que são quadradas e simétricas). c) Observe que D 23 é o produto interno das colunas 2 e 3 de C, e que F 23 é o produto interno das linhas 2 e 3 de C. d) Prove que, dada uma matriz Y = Ymxn, então Z = YTY e W = YYT são quadradas e simétricas. Mostre, ainda, que Zij é o produto interno das colunas i e j de Y e que Wij representa o produto interno das linhas i e j de Y. O comando rand(m,n) gera uma matriz com m linhas e n colunas cujos elementos são números aleatórios entre 0 e 1, uniformemente distribuídos. É muito útil para testar algoritmos e fazer experimentos numéricos. Nas duas próximas atividades, pedimos a você que o explore para fazer alguns experimentos numéricos. Digite “R = rand(2,2);” e encontre o traço de R, onde traço (R) = R 11 + R 22 . Digite help trace no prompt do Scilab e veja o que ele lhe diz sobre este comando. Depois, use−o para calcular o traço de R. Armazene em X e Y matrizes 4 × 4 com entradas aleatórias e calcule X*Y e Y*X. O resultado é diferente! É isso mesmo? Repita mais 10 vezes a operação e veja se em alguma situação ocorreu X*Y = Y*X. Certo ou errado? Justifique: Se X e Y são matrizes 4 × 4, então X*Y ≠ Y*X. Armazene X = rand(4,4) e Y = inv(X). Calcule X*Y e Y*X. O resultado foi igual, a menos que existam erros de arredondamento. Mas pode mesmo acontecer X*Y = Y*X? O que este item tem a ver com o anterior? 2 3 4 5 Aula 2 Cálculo Numérico44 Polinômios O forte de Scilab reside em matemática numérica, muito mais que em matemática simbólica. Contudo, Scilab também sabe operar com algo de matemática simbólica, como faz com polinômios. Ainda bem, pois vamos precisar (e muito) de polinômios nesta disciplina. Os polinômios são criados no Scilab por meio da função poly. Para criar o polinômio p = x2 – 3x + 2, fazemos o seguinte: definimos seu nome; chamamos a função poly e informamos um vetor c; inserimos a letra representando a variável a ser usada, entre aspas, e a palavra “coeff”, se queremos um polinômio cujos coeficientes sejam as coordenadas de c. Se queremos um polinômio cujas raízes sejam as coordenadas de c, digitamos “roots” em vez de “coeff”. Já roots(q) devolve as raízes do polinômio q. Olhe o que o help do Scilab diz sobre esses dois comandos. Observe o que acontece na tela. −−> p = poly([2 –3 1], “x”, “coeff”) p = 2 –3x + x2 −−> r = poly([2 –3 1], “x”, “roots”) r = 6 – 7x + x3 −−> roots(r) ans = 1. 2. – 3. Para avaliar o polinômio em determinado valor de x, usamos a função horner. No exemplo a seguir, encontramos p(2) = 0. −−>horner(p,2) ans = 0. Roots significa raízes, em inglês. Com polinômios, também podemos fazer adição, subtração, multiplicação e divisão. Nos exemplos as seguir, usamos q = x3 + 2. Aula 2 Cálculo Numérico 45 −−> q = poly([2 0 0 1], “x”, “coeff”) // Definindo q q = 2 + x3 −−> p+q // Adição ans = 4 – 3x + x2 + x3 −−> p – q // Subtração ans = – 3x + x2 – x3 −−>p*q // Multiplicaçãoans = 4 – 6x + 2x2 + 2x3 – 3x4 + x5 −−> p/q //Divisão ans = 2 + x3 2 – 3x + x2 −−> [r,Q] = pdiv(q,p) // Divisão com resto: q = pQ + r Q = 3 + x r = – 4 + 7x −−>roots(p) // raízes de p ans = 1. 2. −−> roots(q) // raízes de q Ans = 0.6299605 + 1.0911236i 0.6299605 – 1.0911236i – 1.259921 −−> roots(p*q) // Esta conta é até desnecessária, dada roots(p) e roots(q). Por quê? ans = 1. – 1.259921 0.6299605 + 1.0911236i 0.6299605 – 1.0911236i 2. Atividade 6 Aula 2 Cálculo Numérico46 Utilize o comando horner para encontrar (p ° q) (x) e (q ° p) (x), onde p e q são os polinômios usados nos exemplos do texto. Calcule os restos das divisões de P = x3 – 2x2 – 5x + 3 por nos casos em que: a) = x – 1; b) = x – 2; c) = x – 3. Calcule, também, P(1), P(2), e P(3). O que se observa? Pode−se fazer alguma conjectura? Você consegue provar? 1 2 Discretização de funções Muitas pessoas confundem funções com as fórmulas que as representam, como era usual no século XVIII. Nos dias atuais, o conceito de função não se confunde com o de uma fórmula que a represente. É bem mais amplo que isso. Como você bem sabe, é tão somente uma relação que, a cada ponto de um conjunto A, associa um único ponto de um conjunto B. E ainda bem que é assim, pois a imensa maioria das funções que aparecem na vida real não surgem representadas por fórmulas. Será que faz sentido ficar procurando fórmulas matemáticas usuais para representar o vôo de um besouro, uma fotografia ou a gravação de Tom Jobim e Elis Regina de Águas de Março? No entanto, podemos modelar tais fenômenos como funções. Um vôo realizado por um certo besouro pode perfeitamente ser modelado por uma função c: ℜ −>ℜ3, já que se trata de uma curva no ℜ3. Uma dada fotografia em preto e branco pode ser modelada por uma função que, a cada ponto de um retângulo, associa um número entre 0 e 1 que informa o tom de cinza daquele ponto. A gravação de uma música pode ser modelada pelo sinal elétrico gerado na saída do amplificador, que é uma função do tempo. Ao acionarmos os alto falantes – e sem mexermos nos seus botões de ajuste – esse sinal reproduz a música de maneira sempre igual, ao ser emitido num mesmo aparelho de som. Uma das questões mais importantes da matemática reside exatamente em como representar funções. O que se tem visto, de duas décadas para cá, é que a representação digital das funções vem ganhando cada vez mais espaço na nossa vida cotidiana exatamente por ser a que mais se adequa à manipulação por computadores. Todos vivemos num mundo no qual as gravações, fotografias e registros de um modo geral vão sendo cada vez mais Aula 2 Cálculo Numérico 47 digitalizados. Já nos acostumamos com jargões desta representação, como resolução, pixels, jpg, mp3, bytes e gigabytes. Matematicamente, representar uma função de maneira digital, ou discretizá−la (para usar uma linguagem mais antiga), significa representá−la por um vetor de valores medidos em intervalos mais ou menos espaçados das variáveis. Numa linguagem mais antiga, a função f(x) = x2, no intervalo [0,1], pode ser discretizada numa partição de [–2,2] em 10 subintervalos de igual tamanho h = 0.4, pelo vetor Y = [f(–2), f(–1.6), ..., f(1.6), f(2.0)]. O comando Scilab para fazê−lo seria: −−> P = –2.0:0.4:2.0 // P = P 1 × 11 é um vetor que armazena a partição prescrita. P = – 2. – 1.6 – 1.2 – 0.8 – 0.4 0. 0.4 0.8 1.2 1.6 2. −−>Y = P.ˆ2 // Y é o vetor que discretiza y = x2 , na partição P. 4. 2.56 1.44 0.64 0.16 0. 0.16 0.64 1.44 2.56 4. Numa linguagem mais atual, Y seria uma digitalização do sinal y = x2, com uma resolução h = 0.4. No Cálculo Numérico, a representação das funções é, por sua própria essência, discreta. Um ponto a favor das representações discretas das funções é que a própria Natureza nos induz a isto. A discretização temporal de um filme costuma ser de 24 fotos por segundo. Mais rápido que isso não faz muita diferença para nossa capacidade visual. As funções que usualmente aparecem no Cálculo já estão programadas em Scilab para aceitar um vetor v como entrada, e devolvem vetores calculados nas coordenadas de v. Como exemplo, temos a função cos( ): à P = [0, 0.1,0.3, 0.7,1.0, 1.2, 1. 3, 1.57]; Y = cos(P) Y = 1. 0.99500 0.95533 0.76484 0.54030 0.36235 0.26749 0.0007963 -2.0 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 Aula 2 Cálculo Numérico48 Gráficos Coerentemente, o Scilab trabalha gráficos bidimensionais fazendo uso de representações discretas das funções. Ou seja, ligando com segmentos de reta os pontos do gráfico de f que você escolheu para discretizá-la. Nem adianta informar a fórmula de uma função para ver o seu gráfico no Scilab. Você precisa informar quais são as abscissas dos pontos que o Scilab deve utilizar num vetor (digamos P) e as respectivas ordenadas num vetor Y ( = f(P)). Ao digitar plot(P,Y), com P e Y, como no exemplo logo acima, o Scilab gera um gráfico de y = x2, a partir da discretização gerada pela partição do intervalo [–2, 2], em 10 subintervalos de igual comprimento h = 0.4. −−>P = –2:0.4:2.0; Y = P.^2; plot(P,Y) Logo após este comando, o Scilab abre uma janela com o gráfico da Figura 2. Figura 2 – Gráfico de y = x2, gerado com 11 pontos igualmente espaçados. A resolução na Figura 2 não ficou das melhores, não é? Tentemos corrigir isto com uma partição do intervalo [–2,2] em 400 subintervalos de tamanho 0.01: −−> P = –2:0.01:2.0; Y = P.^2; plot(P,Y). Aula 2 Cálculo Numérico 49 -2.0 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 Figura 3 – Gráfico de y = x2, gerado com 400 pontos igualmente espaçados Atividade 7 1 2 Veja, no help de plot2d, as várias opções que lá existem. Em especial, preste atenção como fazer gráficos com várias funções de uma só vez. Considere as funções f, g e h : ℜ→ℜ, dadas por f(x) = sen(x), g(x) = sen(3x) e h(x) = sen(9x). Esboce as três funções entre 0 e 2 π num mesmo gráfico, com partições do [0, 2π] em 20 e em 600 subintervalos de mesmo tamanho. Para desenhar gráficos de funções de duas coordenadas em três dimensões, o procedimento é parecido com anterior. A diferença é que, para discretizar funções de duas variáveis, alguns elementos de programação podem se tornar indispensáveis. Portanto, deixaremos o tema para a Aula 7, Programação com o Scilab I. Se você quiser ir adiantando, dê uma olhada no comando ‘plot3d’ no help do Scilab. Aula 2 Cálculo Numérico50 Resumo Nesta aula, você viu comandos básicos do programa Scilab. Aprendeu a usar seus comandos de ajuda e a fazer uso desse programa para resolver problemas envolvendo aritmética, polinômios, vetores e matrizes. Compreendeu, também, como representar funções discretamente e como fazer gráficos em duas dimensões. Autoavaliação 1) Você foi ao computador, entrou no Scilab e tentou executar as atividades programadas? Se não o fez, pare aqui, volte e faça-o. 2) Você tentou executar as tarefas programadas e conseguiu? Se conseguiu, parabéns. Você pode prosseguir. Se não conseguiu, entre em contato conosco e batalhe até conseguir. Isso é fundamental para o resto da disciplina. Temos a certeza que você conseguirá dar conta de todas as atividades desta aula. 3) Você aprendeu direitinho o caminho para o help do Scilab? Se não aprendeu, volte e tente ver o que ele diz dos comandos que você executou. Experimente com exemplos lá do help e perceba como isto pode lhe ajudar a usar o programa. 4) Você tomou gosto pelo Scilab e brincou um pouco com ele por conta própria? Se ainda não brincou, tente fazê-lo. Esse programa gosta de brincadeiras numéricas. Se você tentou brincar, mas não gostou, sinta-se à vontade para nos dizer, por e−mail, o que achou... 5) Resolva os exercícios propostos. Exercícios propostos 1) Vá no help do Scilab e veja como os comandos timer( ) e tic, toc funcionam. Use esses comandos para calcular os tempos de execução de A*B e A*c, onde A = rand(n,n),B = rand(n,n) e c = rand(n,1), para n = 100. Não se esqueça de usar o ponto−e−vírgula para evitar que apareçam cachoeiras de números na sua tela. 2) Digite stacksize(‘max’) no prompt do Scilab, para que ele libere espaço para rodar este problema. Repita o Exercício 1 para n = 100, 200, 300, 400, 500, 600, 700, 800, 900 e 1000 e armazene os dados obtidos numa matriz de nome Tempo, 10 × 2. Nas duas colunas Aula 2 Cálculo Numérico 51 da primeira linha, coloque os tempos obtidos para calcular AB e Ac, nesta ordem, para n = 100. Na segunda, faça o mesmo, para n = 200. E assim por diante, até chegar na linha 10 de Tempo. 3) Esboce os gráficos de Tempo( :, 1)/n3 contra n e de Tempo( :, 2)/n2 contra n, obtidos no problema anterior. Dá para intuir alguma coisa nesses gráficos sobre a relação entre n e o tempo de execução de cada um dos dois comandos? Referências PIRES, Paulo Sérgio da Motta. Introdução ao Scilab: versão 3.0. Natal: Departamento de Engenharia de Computação e Automação; Universidade Federal do Rio Grande do Norte, 2004. (Disponível na página da nossa disciplina). Disponível em: <www.dca.ufrn.br/~pmotta/ sciport−3.0.pdf>. Acesso em: 30 jan. 2009. Respostas dos exercícios propostos Comandos Scilab sempre precedidos de −−>. Comentários numa linha de comando precedidos de //. 1) −−> n = 100; A = rand(n,n); B = rand(n,n); c = rand(n,1); // Gera as matrizes A,B e c, com n = 100. −−> timer( ); A*B; t1 = timer( ), A*c ; t2 = timer(); // t1 e t2 são os tempos de execução de A*B e A*c. 2) Comandos Scilab −−> stacksize(‘max’) Repete−se este mesmo comando abaixo para n = 100, 200,... 1000, mudando em cada execução apenas a linha de Tempo. Ou seja, fazendo na chamada n, Tempo(n,1) no lugar de Tempo(1,1) e Tempo(n,2) no lugar de Tempo(2,1) −−> n = 100; A = rand(n,n); B = rand(n,n); c = rand(n,1); // Para n = 100, calcula A,B e c 100 0.0e+000 0.5e−010 1.0e−009 1.5e−009 2.0e−009 2.5e−009 3.0e−009 3.5e−009 4.0e−009 200 300 400 500 600 700 800 900 1000 100 0.0e+000 2.0e−008 4.0e−008 6.0e−008 8.0e−008 1.0e−007 1.2e−007 1.4e−007 1.6e−007 1.8e−007 200 300 400 500 600 700 800 900 1000 Aula 2 Cálculo Numérico52 −−> timer(); A*B; Tempo(1,1) = timer(), A*c; Tempo(1,2) = timer() // 1a linha de Tempo −−> n = 1000 ; A = rand(n,n); B = rand(n,n); c = rand(n,1); // Para n = 1000, calcula A, B e c −−> timer(); A*B; Tempo(10,1) = timer(), A*c; Tempo(10,2) = timer() // 10a linha de Tempo 3) i −−> x = (100:100:1000)’; // Vetor x = [100; 200;...; 1000] −−> T1 = Tempo(:,1)./x.^3; //T1 = [Tempo(1,1)/1003, Tempo(2,1)/2003,..., Tempo(10,1)/10003] −−> T2 = Tempo(:,2)./x.^2; //T2 = [Tempo(1,1)/1003, Tempo(2,1)/2003,..., Tempo(10,1)/10003] −−> plot (x,T1); // Esboça o primeiro dos gráficos pedidos −−> clf; plot (x,T2, ‘b’) // clf limpa a janela corrente para o gráfico de T2 Aula 2 Cálculo Numérico 53 ii.1 – No primeiro gráfico parece bem claro que, para n > 500, o gráfico tende a ser uma reta horizontal. Isto corresponderia a dizer que o tempo de execução de A*B é proporcional a n3. Na verdade, é fácil contar o número de operações executadas para obter A*B. Veja que ocorrem exatamente n pares de multiplicação e soma para cada entrada da matriz. Como são n2 entradas, isso corresponde a n3 operações. Portanto, o tempo de execução será n3*u, onde u é o tempo gasto numa soma seguida de uma multiplicação. Diz−se, ainda, que a complexidade do produto de duas matrizes n × n é O(n3). ii.2 – Nesta demonstração não fica tão claro (mas é igualmente verdade) que o gráfico tende a uma reta horizontal, à medida que n cresce, e que o tempo de execução é proporcional a n2. Se aumentarmos o valor de n até n = 2000, isso ficará mais claro. Diz−se, ainda, que a complexidade do produto matrizn × n – vetor é O(n2). Aula 2 Cálculo Numérico54 Anotações Aula Sistemas de equações lineares 3 1 2 3 Aula 3 Cálculo Numérico 57 Apresentação Sistemas de equações lineares talvez constituam a ferramenta mais recorrente nas aplicações da matemática, sobretudo com o advento de computadores cada vez mais velozes. Aparecem, muito frequentemente, em problemas da ordem de centenas de equações e variáveis, podendo chegar a centenas de milhões, em áreas tão diversas quanto tomografia médica, sismologia, metereologia, redes neurais, tráfego aéreo, dinâmica de fluidos etc. Em linhas gerais, ao discretizarmos um dado problema, estamos nos candidatando a encontrar sistemas de equações lineares pela frente. Nesta aula, trabalharemos com dois algoritmos implementados no Scilab e adequados para resolver sistemas de equações lineares de médio porte. De maneira vaga, pense num problema de médio porte, neste ano de 2009, como da ordem de até 5000 variáveis e equações, a depender do computador. Nos complementos desta aula, o aluno mais interessado encontrará na nossa página, no moodle, uma discretização para o problema da distribuição de temperatura numa chapa retangular condutora de calor, desembocando num sistema linear de algumas centenas de equações e variáveis. Num segundo complemento, você disporá de uma introdução a métodos iterativos, de modo a lhe dar uma idéia geral do que acontece com problemas de grande porte. Objetivos Estudar sistemas de equações lineares de médio porte, do ponto de vista numérico, com a ajuda do Scilab. Traba lhar com a lguns comandos do Scilab destinados a manipular e resolver sistemas lineares. Revisitar o método de Gauss-Jordan e a eliminação de Gauss, de forma a associar-lhes o que fazem os programas Scilab que os empregam. 1. 2. 1. 2. –1. 0. – 2. – 4. 2. 2. 0. 9. 1. 0. 1. 3. Aula 3 Cálculo Numérico58 Sistemas de equações lineares Se você puxar pela memória, provavelmente, se lembrará de inúmeras situações nas quais se deparou com sistemas de equações lineares, ao resolver problemas de Física, Química, Geometria, Aritmética etc. Em geral, eram problemas com poucas variáveis e equações. Algo como: x1 + 2x2 + x3 + 2x4 = 8 −x1 − 2x3 − 4x4 = −7 2x1 + 2x2 + 9x4 = 15 x1 + x3 + 3x4 = 5 (I) Nas disciplinas de Álgebra Linear que cursou, você certamente deve ter percebido a importância de escrevê-lo na sua forma vetorial, ou seja, Ax = b. Ao digitar no prompt do Scilab A = [1, 2, 1, 2; –1 0 –2 –4; 2, 2, 0, 9; 1 0 1 3], b = [8; –7; 15; 5], ele devolverá, a menos de uma arrumadinha no layout: −−> A = [1, 2, 1, 2; –1 0 –2 –4; 2, 2, 0, 9; 1 0 1 3] // Matriz dos coeficientes de I A = −−> b = [8; –7; 15; 5] // Vetor dos termos independentes de I b = 8. –7. 15. 5. Atividade 1 Atividade 2 Aula 3 Cálculo Numérico 59 Procure problemas de Física, Química, Geometria e Aritmética (pelo menos um de cada área), cujas soluções passam pela resolução de um sistema de equações lineares. Trabalharemos, nesta aula, com dois comandos do Scilab para resolver numericamente sistemas lineares Ax = b. Começamos com o comando ‘\’, que programa o método de Gauss-Jordan visto em Álgebra Linear I. Na aula 7 (Programação com o Scilab I), teremos a oportunidade de discutir sua programação. O segundo, ‘linsolve‘ , usa o método dos valores singulares, que é bem mais robusto e cuja explicação precisará esperar pela aula 5 (Autovalores, valores singulares e sensibilidade de um sistema linear a dados). Dê uma olhada nas aulas 3, 4 e 5 da disciplina Álgebra linear I, relativas a sistemas de equações lineares e preste especial atenção ao método de Gauss-Jordan. Em particular, reveja com carinho o algoritmo da eliminação de Gauss pois ele é uma espécie de “pau pra toda a obra” na álgebra linear numérica, sendo fundamental não apenas no algoritmo de Gauss-Jordan, mas também para achar bases de subespaços vetoriais, calcular determinantes, produzir a importante fatoração LU, a qual veremos ao final desta aula, inverter matrizes etc. A = 1 1 1 1 1 −2 3 1 −5 −1 −1 0 e b = 3 2 −7 U = 1 1 1 1 3 1 −2 3 1 2 −5 −1 −1 0 −7 −−−−−−−−−−→U2 ← U2 − U1 1 1 1 1 3 0 −3 2 0 −1 −5 −1 −1 0 −7 −−−−−−−−−−−→ U3 ← U3 + 5U1 1 1 1 1 3 0 −3 2 0 −1 0 4 4 5 8 −−−−−−−−−−−−→U3 ← U3 + 4/3U2 1 1 1 1 3 0 −3 2 0 −1 0 0 20/3 5 20/3 Aula 3 Cálculo Numérico60 Resolvendo Ax = b, via eliminação de Gauss Em linhas gerais, numa primeira etapa, ao digitar x = A\b no prompt do Scilab, o programa Scilab aplica a eliminação de Gauss, utilizando apenas duas das chamadas operações elementares nas linhas da matriz aumentada [A, b], do sistema: i) permuta de duas linhas; ii) substitui uma linha pela soma dela mesma com um múltiplo de outra. A eliminação de Gauss realizada pelo Scilab é ligeiramente diferente da que você viu na disciplina de Álgebra Linear, na medida em que não multiplica nem divide linhas por constantes. Permite, entre outras coisas, obter como subprodutos a importante fatoração LU de A, que veremos ao final da aula, bem como o determinante de A para matrizes quadradas. A única desvantagem é que a matriz escalonada U, aqui obtida, não estará mais na forma escada reduzida e obrigará a resolver posteriormente um sistema triangular. Vamos ver um pouco como isso funciona no exemplo 1. Exemplo 1 Vamos usar o método de Gauss-Jordan para resolver Ax =b, no caso Solução Para resolver Ax = b, inicialmente aplicamos a eliminação de Gauss na matriz ampliada = [A b], usando apenas a operação ii, apresentada no início desta seção, sem permutar linhas: Variações A variante usualmente implementada em programas como o Scilab consiste em fazer uso também da permuta de linhas, de modo a usar como pivô sempre a maior entrada disponível, por razões de estabilidade numérica (vide atividade 3). x1 + x2 + x3 + x4 = 3 − 3x2 + 2x3 = −1 20 3 x3 + 5x4 = 20 3 x1 + x2 + x3 = 3 − 3x2 + 2x3 = −1 20 3 x3 = 20 3 Aula 3 Cálculo Numérico 61 Obtemos um sistema linear equivalente, na forma escalonada: Uma solução para este sistema pode ser obtida fazendo a variável livre x 4 = 0 e resolvendo o sistema triangular resultante. Resolvendo, de baixo para cima, o sistema triangular resultante: Obtemos x 3 = 1; x 2 = (–1 – 2x 3 )/(–3) = 1 e x 1 = 3 – x 2 – x 3 = 1 Com pequenas variações, Scilab faz algo muito parecido ao digitarmos x = A\b no seu prompt. Ou seja, começa aplicando uma eliminação de Gauss para obter um sistema Ux = – b, com as mesmas soluções que Ax = b e U na forma de uma escada. A segunda etapa do algoritmo implementado no Scilab é bem mais rápida. Quando Ax = b tem solução, consiste em anular as variáveis livres e obter uma solução do sistema triangular resultante. Resolvendo o mesmo sistema do exemplo 1, usando o Scilab, obtemos o que vemos no exemplo a seguir. Exemplo 2 −−> A = [1 1 1 1; 1 –2 3 1; –5 –1 –1 0]; b = [ 3; 2; –7]; // Entradas do sistema −−> x = A\b // Procurando uma solução de A*x = b 1. 1. 1. 0 Testando a solução para verificar se Ax – b 0 −−> teste = norm (A *x –b)/norm(b) // Testando a solução obtida teste = 4.106D –16 Atividade 3 Aula 3 Cálculo Numérico62 Observação 1 – No exemplo 2 nem precisávamos testar a solução obtida, pois coincidiu com a solução do exemplo 1. Mas, usualmente, é bom fazê-lo. Nunca é demais lembrar que estamos trabalhando com aritmética de ponto flutuante e, portanto, obtendo aproximações numéricas das soluções de Ax = b. Ou seja, não podemos esperar soluções exatas do sistema. Inclusive, há casos nos quais os erros de arredondamento podem falsificar completamente a solução do sistema, como teremos ocasião de verificar na aula 5 e também no exercício proposto 2, ao final desta aula. Portanto, é recomendável, sempre que possível, aplicar um teste para verificar se obtivemos uma solução aceitável para Ax = b. Um teste relativamente simples consiste em verificar se o erro Ax – b, às vezes também chamado de resíduo, cometido ao se admitir que x é a solução de Ax = b, resulta suficientemente perto de zero. Para tanto, calculamos a norma de A *x –b. Um resíduo na décima quinta casa decimal, como o obtido acima, é um bom resultado, já que trabalhamos com cerca de 16 algarismos significativos. O algoritmo da eliminação de Gauss escolhe, em cada coluna, um pivô, com o qual zera os elementos que estão abaixo dele. No caso do exemplo 1, preferimos não fazer nenhuma troca de linhas, o que é permitido, já que não apareceu nenhum zero na posição de pivô. Resultaram, ao final, os números 1, –2 e 20/3 como pivôs. No Scilab, em cada iteração, sempre é escolhido o maior pivô possível, mediante troca de linhas, por razões de estabilidade numérica. Aplique o algoritmo da eliminação de Gauss à mesma matriz A dos exemplos 1 e 2, com a diferença de usar a possibilidade de permutar linhas, de modo a escolher como pivô sempre o maior elemento, em módulo, da coluna e disponível para tal, ou seja, o maior elemento, em módulo, da diagonal para baixo, na coluna do pivô em questão. Aula 3 Cálculo Numérico 63 Caso Ax = b não tenha solução Quando Ax = b não tem solução, x = A\b será uma solução da equação normal ATAx =ATb, que você viu na aula 12 (Ortogonalidade) de Álgebra Linear I. Tal solução é denominada solução de quadrados mínimos de A e é, num certo sentido que discutiremos com mais detalhes na próxima aula, a “melhor solução possível”. Veja o exemplo a seguir. Exemplo 3 Tentando calcular a solução de um sistema Ax = b, que não tem solução. −−> A = [1,2,3;4,5,6;7,8,9]; b = [1;0;0] −−> x =A\b Warning : matrix is close to singular or badly scaled. rcond = 1.5420D–18 computing least squares solution. (see lsq). x = – 0.6666667 0. 0.5 −−> teste = norm(A*x–b)/norm(b) teste = 0.4082483 −−>teste2 = norm(A'*A*x – A'*b)/norm(b) teste2 =1.005D –14 Nesse caso, a matriz A não é invertível e o sistema Ax = b não tem solução. Como dissemos acima, x resulta ser uma solução de quadrados mínimos. Nesse caso, Scilab até que foi gentil e devolveu uma advertência (Warning), na qual afirma que a matriz pode ser não- invertível (singular), e que o x devolvido é uma solução de quadrados mínimos (least squares solution). Teste 2 igualmente confirma que ATAx –ATb ≈0. Inversa de A no Scilab Veja que dada uma matriz invertível A = Ann , se X =Xnn for a inversa de A, então, A*X = [AX(1), AX(2),...,AX(n)] = [I(1), I(2), ..., I(n)], onde I(j) representa a j-ésima coluna da identidade. Isso significa que cada coluna X(j) da inversa de A é a solução de Ax = I(j). Para obter a inversa de A, Scilab resolve, de uma maneira esperta, esses n sistemas lineares, essencialmente por uma variante do método de Gauss-Jordan, porém realizando uma única eliminação de Gauss de A. Veja uma versão desse procedimento nas páginas 9-11, da aula 4 de AL1 Ax = b Aula 3 Cálculo Numérico64 Cálculo de matrizes inversas e determinantes, usando eliminação de Gauss Inversão de matrizes As matrizes invertíveis são, necessariamente, quadradas e muito importantes na Álgebra Linear (Dê uma espiadinha na parte final da aula 4 – Justificativa do método Gauss-Jordan – AL1). Como você sabe, A=Ann é invertível se existir matriz X que com ela comute e tal que A*X = X*A = Inn. Em geral, a inversa é denotada por A–1. Matrizes invertíveis funcionam de forma análoga a números não nulos, no que diz respeito à multiplicação. Por exemplo, se A é invertível, então, o sistema Ax = b tem solução única x = A–1b. Dada uma matriz invertível A = Ann, inv(A) calcula a inversa de A no Scilab. Teríamos aí uma alternativa para resolver Ax = b, fazendo x = inv(A) *b. Por exemplo: −−> A= [1 1 1 ; 1 –2 3 ; –5 –1 –1 ]; b = [3,2,–7]; −−> x = inv(A)*b, teste=norm(A*x–b)/norm(b), x = 1. 1. 1. teste = 5.64D–17 Atividade 4 1 2 3 x = inv(A)*b O número de operações gasto em x = inv(A)*b é mesmo ligeiramente acima do dobro do que é gasto para resolver x =A\b , sem oferecer muita coisa a mais, pois utiliza a mesma eliminação de Gauss usada em A\b, de
Compartilhar