Você está na página 1de 300

Matemática

Cálculo Numérico

Marcelo Gomes Pereira


Roberto Hugo Bielschowsky
Cálculo Numérico
Marcelo Gomes Pereira
Roberto Hugo Bielschowsky

Matemática

Cálculo Numérico

2ª Edição

Natal – RN, 2014


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 Secretária Adjunta de Educação a Distância
Maria Carmem Freire Diógenes Rêgo Ione Rodrigues Diniz Morais

FICHA TÉCNICA
COORDENAÇÃO DE PRODUÇÃO DE MATERIAIS DIDÁTICOS
Marcos Aurélio Felipe

COORDENAÇÃO DE REVISÃO EDITORAÇÃO DE MATERIAIS Criação e edição de imagens


Maria da Penha Casado Alves Alessandro de Oliveira Paula Adauto Harley
Amanda de Lima Cabral Carolina Costa de Oliveira
COORDENAÇÃO DE DESIGN GRÁFICO Amanda Duarte Heinkel Hugenin
Ivana Lima Anderson Gomes do Nascimento Leonardo dos Santos Feitoza
Carolina Aires Mayer
GESTÃO DO PROCESSO DE REVISÃO Carolina Costa de Oliveira
Dickson de Oliveira Tavares Módulo matemático
Rosilene Alves de Paiva
Heloisa Fernandes Ferreira Nunes Joacy Guilherme de A. F. Filho
José Agripino de Oliveira Neto
GESTÃO DO PROCESSO DE DESIGN GRÁFICO Leticia Torres Revisão tipográfica
Dickson de Oliveira Tavares Luciana Melo de Lacerda Adriana Rodrigues Gomes
Mauricio da Silva Oliveira Junior Letícia Torres
PROJETO GRÁFICO Margareth Pereira Dias
Ivana Lima Nouraide Queiroz
Revisão de estrutura e linguagem
Eugenio Tavares Borges IMAGENS UTILIZADAS
REVISÃO DE MATERIAIS Janio Augusto Barbosa Banco de Imagens Sedis (Secretaria de Educação a Distância) -
Camila Maria Gomes Thalyta Mabel Nobre Barbosa UFRN MasterClips IMSI MasterClips Collection, 1895 Francisco
Cristinara Ferreira dos Santos
Blvd, East, San Rafael, CA 94901,USA. MasterFile – www.
Emanuelle Pereira de Lima Diniz Revisão de língua portuguesa masterfile.cpom MorgueFile – www.morguefile.com Pixel
Eugenio Tavares Borges Janaina Tomaz Capistrano Perfect Digital – www.pixelperfectdigital.com FreeImages –
Janio Gustavo Barbosa Kaline Sampaio de Araújo www.freeimages.co.uk FreeFoto.com – www.freefoto.com Free
Jeremias Alves de Araújo Samuel Anderson de Oliveira Lima Pictures Photos – www.fre-pictures-photos.com BigFoto – www.
Kaline Sampaio de Araújo
bigfoto.com FreeStockPhotos.com – www.freestockphotos.com
Luciane Almeida Mascarenhas de Andrade
Revisão de normas da ABNT OneOddDude.net – www.oneodddude.net
Priscila Xavier de Macedo
Verônica Pinheiro da Silva Flickr.com - www.flickr.com
Rhena Raize Peixoto de Lima
Thalyta Mabel Nobre Barbosa
Verônica Pinheiro da Silva Diagramação
Orlando Brandão Meza Ucella Elizabeth da Silva Ferreira
Ivana Lima
Johann Jean Evangelista de Melo
José Antonio Bezerra Junior
Mariana Araújo Brito

Catalogação da publicação na fonte. Bibliotecária Verônica Pinheiro da Silva.

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

Todos as imagens utilizadas nesta publicação tiveram suas informações cromáticas originais alteradas a fim de adaptarem-se
aos parâmetros do projeto gráfico © 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
Sumário

Apresentação Institucional5 

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árias265


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 saber E 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
Aritmética de ponto flutuante
e erros numéricos

Aula

1
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érico 9


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.

10 Aula 1  Cálculo Numérico


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.
1
Efetuar arredondamento e truncamento.
2
Representar números em diferentes bases.
3
Introduzir o sistema “aritmética de ponto
4 flutuante”.

Aula 1  Cálculo Numérico 11


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?

x
10

10

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 2 m. Mas, não dá para pedir 10 2 m 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 2 m. 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.

12 Aula 1  Cálculo Numérico


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
EA 0, 00000001 ∼
ER = = = 1, 0000000200000004000000080000002. Ou seja,
x 0, 0000000099999998
mais de 100% de erro.

Já no exemplo de 10 2 , temos:

|EA| 0, 00000001 ∼
|ER| = < = 0, 0000000007 = 7 × 10−10 .
|x| 14, 142135623730951

Aula 1  Cálculo Numérico 13


Atividade 1

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.

14 Aula 1  Cálculo Numérico


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 ,0 “diminuir casas decimais” e aperte-o até que sua
,00

tela fique parecida com esta:

,0
Agora, procure pelo botão ,00 “aumentar casas decimais” e aperte-o duas vezes. O
valor de π que aparece é 3,142. Se você apertar o botão ,00,0 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, d1d 2d 3d 4 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 d 4 < 5, então N é apresentado como N = I, d1d 2d 3;


ƒƒ 

se d 4 ≥ 5, então, no lugar de d 3, usa-se d 3 + 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érico 15


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.

16 Aula 1  Cálculo Numérico


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érico 17


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 10 0, o penúltimo
por 101, o antepenúltimo por 102 e os resultados devem ser somados. Ou seja,

123 = 1  102 + 2  101 + 3  10 0.

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...d 2 d1d 0)β = dj β j + dj–1 β j–1 + ... + d 2β 2 + d1β 1 + d 0β 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.

18 Aula 1  Cálculo Numérico


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érico 19


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  10 0 + 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:
e
– (0.d1d 2...dk) β ,
+

onde  β  é a base utilizada e os dígitos d1 d 2 ...d k 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.d 1d 2d 3d 4d 5 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?

20 Aula 1  Cálculo Numérico


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.

Aula 1  Cálculo Numérico 21


Atividade 4
Complete a Tabela 1 dando as representações dos números em um sistema de
aritmética de ponto flutuante 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
flutuante de três dígitos, base 10 e expoente entre –4 e 4

Representação obtida Representação obtida


X
por arredondamento por truncamento
1,25
10,053
–238,15
2,71828...
0,000007
718235,82

Erros relativos em aritmética de ponto flutuante:


estabilidade na adição e possível amplificaçã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 ficar 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 significativos 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 flutuante, sempre na
base 10. Porém, usando apenas 5 dígitos significativos e truncando a partir da sexta casa.

22 Aula 1 Cálculo Numérico


√ √ √ √
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 drasticamente os 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 s==x x++y  yeeed


  d==x x−−y y (soma e subtração das correspondentes aproximações).

Os correspondentes erros relativos ∆d rel e ∆s rel satisfarão, então:


|∆x + ∆y| |∆x| |∆y| |∆x| |∆y|
|∆Srel | = |(S − s)/s| =
ƒƒ  ≤ + ≤ + = |∆xrel | + |∆yrel |
x+y x+y x+y x y
∆x − ∆y ∆x ∆y
ƒƒ  ∆drel = (d − d)/d = = −
x−y x−y x−y

Aula 1  Cálculo Numérico 23


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
∆x ∆y
números x e y estiverem próximos, os denominadores de x − y e x − y indicam que
∆x ∆y
∆d rel pode ser consideravelmente maior que os erros relativos ∆xrel = e ∆yrel = ,
x 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?

Resumo
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.

24 Aula 1  Cálculo Numérico


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?


10

d)  Qual o resultado da soma S = 42450 + 3 nesta máquina?
k=1

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érico 25


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.

26 Aula 1  Cálculo Numérico


Anotações

Aula 1  Cálculo Numérico 27


Anotações

28 Aula 1  Cálculo Numérico


Introdução ao Scilab

Aula

2
Apresentação

E
sta 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 Scilab
orientar como usar os comandos. Tanto o tutorial do
programa quanto as
Uma ferramenta adicional que pode lhe ser muito útil é o excelente tutorial Scilab, em aulas de Métodos
português, elaborado pelo professor Paulo Motta, do departamento de Engenharia Elétrica Computacionais em
Engenharia se encontram
da UFRN, a quem muito agradecemos por colocá−lo inteiramente a nossa disposição e à disposição para
no qual nos inspiramos para escrever esta aula. Recomendamos, também, o material de download em nossa
suas aulas da disciplina Métodos Computacionais em Engenharia (uma versão de Cálculo página, no Moodle, bem
como em: <www.dca.ufrn.
Numérico para engenheiros, adotada nos currículos das engenharias da UFRN), cujo suporte br/~pmotta/>. Acesso em:
computacional também é o Scilab. 30 jan. 2009.

Aula 2  Cálculo Numérico 31


Objetivos
Efetuar cálculos simples no Scilab.
1

Manipular polinômios.
2

Operar com vetores e matrizes.


3

4 Desenhar gráficos.

Introduzir a discretização de funções.


5

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.

32 Aula 2  Cálculo Numérico


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 (p). Digitando esse nome e apertando a tecla
enter, temos o seguinte resultado:

−−>%pi

%pi = 3.1415927

Aula 2  Cálculo Numérico 33


Se você tentar atribuir outro valor a essa variável, receberá uma mensagem de erro.

−−>%pi = 2

!−− error 13

Redefining permanent variable.


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.

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.

34 Aula 2  Cálculo Numérico


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 p/2

ans = 1.

−−> cos(1)    // cosseno de um

ans = 0.5403023058681397650105

−−> tan(0)   // tangente de zero

ans = 0.

Aula 2  Cálculo Numérico 35


−−> 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.

Atividade 1
Sendo a = 1,35, b = 2,7 e c = 3, calcule:
1
ab − c ab−c b−c
a) b
; b) b ; c) a b
.

Sabendo que 1 polegada equivale a 2,54 centímetros, encontre uma


2 aproximação com 4 casas decimais, em centímetros, para a área de
um círculo de raio medindo 3 polegadas.

3 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 e 505149 são iguais?
48506557 2812281

36 Aula 2  Cálculo Numérico


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érico 37


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

38 Aula 2  Cálculo Numérico


−−> 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 de D 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érico 39


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.
Vetores por Matrizes
0.  0.   4. 5. 6.
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, Observação 1 − Vetores no ℜn
representados na forma
x = xnx1. Provavelmente, Podemos representar os vetores na forma de uma coluna de números, ou de uma
devido ao fato do produto
linha de números. Assim, um elemento v de ℜ3 tanto pode aparecer com o formato
matriz-vetor ser tão
 
fundamental para a x1
Álgebra Linear no ℜn e  
v =  x2 
no Cn. Se x = xnx1 e
A = Anxn, isto permite x3 como v = [x x x ]. No Scilab, não há um comando específico para vetores.
1 2 3
calcular o produto da
Serão representados ora como matriz 1 × n, ora como matriz n × 1. Felizmente, como você
matriz A pelo vetor x,
assim como o produto poderá ver ao longo dessa disciplina, representar vetores por matrizes muito mais ajuda que
das matrizes A e x. atrapalha, apesar de parecer meio estranho no começo.

40 Aula 2  Cálculo Numérico


O produto interno de dois vetores x e y será x * y, se você entrou com x na forma x1 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 = y3×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

Atividade 2
Verifique se os vetores v = (sen(π / 6), π), e w = (e, ln 2) são
1 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
2 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.


3

Aula 2  Cálculo Numérico 41


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 A.*B, A./B e A.ˆB


Não se define, aparentemente
B, entrada a entrada (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.

Atividade 3
Carregue A = [ 3 6 9 ; 2 4 6; 1 2 3], B = [1 1 1; 2 2 2; 3 3 3],
1 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 = c1A(1) + c2A(2) + c3A(3) (Atenção! Essa identidade é muito importante);
e) ||c||2 = cTc = c12 + c22 + c32 – Quadrado da norma euclidiana de c;
f) cTd = c1d1 + c2d2 + c3d3 – Produto interno entre c e d.

Para as mesmas A e B do item anterior:


2
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.

42 Aula 2  Cálculo Numérico


Atividade 4
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) M
 onte 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 D23 é o produto interno das colunas 2 e 3 de C, e que F23 é o
produto interno das linhas 2 e 3 de C.
d) P rove 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.

Atividade 5
Digite “R = rand(2,2);” e encontre o traço de R, onde traço
1 (R) = R11 + R22.
Digite help trace no prompt do Scilab e veja o que ele lhe diz sobre este
2 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
3 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.
4
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.
5 Mas pode mesmo acontecer X*Y = Y*X? O que este item tem a ver
com o anterior?

Aula 2  Cálculo Numérico 43


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
Roots 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
significa raízes,
em inglês. 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.

Com polinômios, também podemos fazer adição, subtração, multiplicação e divisão. Nos
exemplos as seguir, usamos q = x3 + 2.

44 Aula 2  Cálculo Numérico


−−> 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ção

ans = 4 – 6x + 2x2 + 2x3 – 3x4 + x5

−−> p/q    //Divisão


2 – 3x + x2
ans =
2 + x3
−−> [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.

Aula 2  Cálculo Numérico 45


Atividade 6
Utilize o comando horner para encontrar (p ° q) (x) e (q ° p) (x), onde
1 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


2 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?

Discretização de funções

M
uitas 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

46 Aula 2  Cálculo Numérico


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 = P1 × 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

Aula 2  Cálculo Numérico 47


Gráficos

C
oerentemente, 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.

4.0
3.5
3.0
2.5
2.0
1.5
1.0
0.5
0.0
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0

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).

48 Aula 2  Cálculo Numérico


4.0
3.5
3.0
2.5
2.0
1.5
1.0
0.5
0.0
-2.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
Veja, no help de plot2d, as várias opções que lá existem. Em especial,
1 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)


2 = sen(3x) e h(x) = sen(9x). Esboce as três funções entre 0 e 2 p num
mesmo gráfico, com partições do [0, 2p] 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érico 49


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

50 Aula 2  Cálculo Numérico


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.
−−> t imer( ); 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

Aula 2  Cálculo Numérico 51


−−> 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


4.0e −009

3.5e −009
3.0e −009

2.5e −009
2.0e −009

1.5e −009

1.0e −009

0.5e −010

0.0e+000
100 200 300 400 500 600 700 800 900 1000

−−> clf; plot (x,T2, ‘b’) // clf limpa a janela corrente para o gráfico de T2

1.8e −007
1.6e −007
1.4e −007

1.2e −007

1.0e −007
8.0e −008

6.0e −008

4.0e −008

2.0e −008

0.0e+000
100 200 300 400 500 600 700 800 900 1000

52 Aula 2  Cálculo Numérico


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érico 53


Anotações

54 Aula 2  Cálculo Numérico


Sistemas de equações
lineares

Aula

3
Apresentação

S
istemas 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
1 porte, do ponto de vista numérico, com a ajuda
do Scilab.

Tr a b a l h a r c o m a l g u n s c o m a n d o s d o
2 Scilab destinados a manipular e resolver
sistemas lineares.

Revisitar o método de Gauss-Jordan e a eliminação


3 de Gauss, de forma a associar-lhes o que fazem os
programas Scilab que os empregam.

Aula 3  Cálculo Numérico 57


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

 −x
1 − 2x3 − 4x4 = −7


 2x1 + 2x2 + 9x4 = 15   (I)

 x
1 + x3 + 3x4 = 5

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= 1. 2. 1. 2.
–1. 0. – 2. – 4.
2. 2. 0. 9.
1. 0. 1. 3.

−−> b = [8; –7; 15; 5]   // Vetor dos termos independentes de I

b = 8.

–7.

15.

5.

58 Aula 3  Cálculo Numérico


Atividade 1

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).

Atividade 2

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.

Aula 3  Cálculo Numérico 59


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

   
1 1 1 1 3
   
A =  1 −2 3 1  e b= 2 
−5 −1 −1 0 −7

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:

   
1 1 1 1 3 1 1 1 1 3
  −−−−−−−−−−→  
U =  1 −2 3 1 2  U2 ← U2 − U1  0 −3 2 0 −1 
−5 −1 −1 0 −7 −5 −1 −1 0 −7
   
1 1 1 1 3 1 1 1 1 3
−−−−−−−−−−−→   −−−−−−−−−−−−→  
U3 ← U3 + 5U1  0 −3 2 0 −1  U3 ← U3 + 4/3U2  0 −3 2 0 −1 
0 4 4 5 8 0 0 20/3 5 20/3

60 Aula 3  Cálculo Numérico


Obtemos um sistema linear equivalente, na forma escalonada:



 x1 + x2 + x3 + x4 = 3


− 3x2 + 2x3 = −1



 20 20
x + 5x4 =
3 3 3

Uma solução para este sistema pode ser obtida fazendo a variável livre x4 = 0 e resolvendo o
sistema triangular resultante. Resolvendo, de baixo para cima, o sistema triangular resultante:



 x1 + x2 + x3 = 3


− 3x2 + 2x3 = −1



 20 20
x =
3 3 3

Obtemos x3 = 1; x2 = (–1 – 2x3)/(–3) = 1  e  x1 = 3 – x2 – x3 = 1

Com pequenas variações, Scilab faz algo muito parecido ao digitarmos x = A\b no Variações
seu prompt. Ou seja, começa aplicando uma eliminação de Gauss para obter um sistema
– A variante usualmente
Ux = b, com as mesmas soluções que Ax = b e  U na forma de uma escada. A segunda implementada em
etapa do algoritmo implementado no Scilab é bem mais rápida. Quando Ax = b tem solução, programas como o Scilab
consiste em fazer uso
consiste em anular as variáveis livres e obter uma solução do sistema triangular resultante. também da permuta de
Resolvendo o mesmo sistema do exemplo 1, usando o Scilab, obtemos o que vemos no linhas, de modo a usar
exemplo a seguir. como pivô sempre a maior
entrada disponível, por
razões de estabilidade
numérica (vide atividade 3).

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.

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

Aula 3  Cálculo Numérico 61


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.

Atividade 3
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.

62 Aula 3  Cálculo Numérico


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
A Ax = A Tb, que você viu na aula 12 (Ortogonalidade) de Álgebra Linear I. Tal solução é
T

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.

Aula 3  Cálculo Numérico 63


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=A nn é invertível se existir matriz X que com ela comute e
tal que A*X = X*A = I nn. 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
Inversa de A no Scilab uma matriz invertível A = Ann, inv(A) calcula a inversa de A no Scilab. Teríamos aí uma
Veja que dada uma matriz
alternativa para resolver Ax = b, fazendo x = inv(A)*b. Por exemplo:
invertível A = Ann , se
X = Xnn for a inversa de −−> A = [1 1 1 ; 1 –2 3 ; –5 –1 –1 ]; b = [3,2,–7];
A, então, A*X = [AX(1),
AX(2),...,AX(n)] = [ I(1), −−> x = inv(A)*b, teste=norm(A*x–b)/norm(b),
I(2), ..., I(n)], onde I(j)
representa a j-ésima x = 1.
coluna da identidade. Isso
1.
significa que cada coluna X(j)
da inversa de A é a solução 1.
de Ax = I(j). Para obter
teste = 5.64D –17
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

64 Aula 3  Cálculo Numérico


Atividade 4

Trabalhando com os comandos ‘rand ’ , ‘\’, ‘inv’ , ‘triu’ e ‘timer( ) ’, realize o


que se pede a seguir.

1 Defina, numa sessão do Scilab, as matrizes e vetores a seguir:

−−> n = 3

−−> Y = rand(n,n)   // Matriz nn, cujas entradas são nos aleatórios entre 0 e 1

−−> b = rand(n,1)  // Vetor n1, com entradas aleatórias entre 0 e 1

−−> U = triu(A)  // Matriz triangular superior obtida com a parte superior de A

−−> c = rand(1,n–1)  // Vetor 1(n –1), com entradas aleatórias entre 0 e 1

−−> Z = Y ; Z(n,1:n) = c*Z(1:n –1,1:n)

Verifique que Z é obtida de Y, substituindo sua última linha por uma combinação
linear das (n –1) primeiras linhas de Y e explique por que isso se deu através
dos comandos digitados. Resolva Yx = b, Ux = b e Z*x = b, tanto usando
‘ \’, como usando ‘inv ( )’. Teste os resultados e diga por que não conseguiu x = inv(A)*b
resolver Z*x = b O número de operações
gasto em x = inv(A)*b
é mesmo ligeiramente
Faça o mesmo que no item 1, com n = 20 e depois com n = 200,
2 n = 400, e n = 800, sem esquecer de por ‘ ; ’ depois de cada um dos
acima do dobro do que
é gasto para resolver
x = A \b , sem oferecer
comandos para não ter que ver matrizes enormes na sua tela.
muita coisa a mais, pois
utiliza a mesma eliminação
de Gauss usada em A\b,
O comando timer( ) diz quanto tempo de CPU foi gasto desde
3
de modo a encontrar cada
a última vez que foi digitado. Por exemplo, ao digitar timer( ), uma das n colunas de A–1.

x = A\b ; timer( ), Scilab calcula x, e logo em seguida quanto tempo Só que de forma totalmente
desnecessária, se o objetivo
de processamento foi gasto na CPU para resolver x = A\b. Aproveite é resolver um único sistema
para testar o tempo de processamento gasto com cada um dos dois Ax = b. Ainda por cima

comandos. Veja que para n = 400 e n = 800, o tempo gasto em arriscando a aumentar os
erros de arredondamento
x = inv(A)*b é um pouco mais que o dobro do tempo gasto com acumulados na solução de
x = A\b. Ax = b.

Aula 3  Cálculo Numérico 65


Determinantes
O determinante é uma função de grande importância teórica, pois através dele pode-se
calcular volumes de paralelepípedos, encontrar soluções para sistemas de equações em termos
literais, decidir se uma matriz é invertível ou não, em matemática exata, encontrar autovalores
de uma matriz etc. Em aritmética de ponto flutuante, o determinante pode ser muito traiçoeiro,
como veremos na aula 5. Numericamente, ele é usualmente calculado como subproduto da
eliminação de Gauss, usando as seguintes propriedades de determinantes que você viu na
aula 2 – Determinantes – de Álgebra Linear I.

i. Permuta de duas linhas troca o sinal do determinante.

ii. Ao substituir uma linha de uma matriz A pela soma da referida linha com um múltiplo
de qualquer outra linha, o determinante não se altera.

iii. Se U é uma matriz triangular det (U) = U11U22...Unn.

Daí resulta que uma maneira prática de calcular o determinante de A é aplicar a eliminação de
Gauss usando apenas as operações i e ii nas linhas de A, de forma a se obter uma matriz triangular
superior U, linha equivalente a A. Com isso, obtém-se det(A) =  det(U) =  U11U22.....Unn,
onde o sinal é ‘+’ se o número de troca de linhas realizada na eliminação de Gauss for par e ‘–’,
caso seja ímpar. Em linhas gerais, Scilab implementa esse método para calcular determinantes
através do comando det( ).

−−>A = [1,2,3;4,5,6;7,8,9];

−−>det(A)

ans = 6.661D –16

Resolvendo Ax =b com
linsolve(A,– b)
A atividade logo a seguir revisita sistemas nos quais temos mais de uma solução.

66 Aula 3  Cálculo Numérico


Atividade 5

x1 − x2 + x3 = 0
Considere o sistema e responda:
−x1 + x2 + x3 = 0

a)  O que se pode dizer sobre a quantidade de suas soluções?

b)  O que acontece quando tentamos resolvê-lo usando o comando ‘ \ ’?

c)  O que foi encontrado com esse comando era esperado? É suficiente para
definir todas as soluções do sistema?

Nossa segunda recomendação para resolver sistemas lineares é por meio do comando
linsolve( ). Esse comando fornece soluções de uma equação do tipo Ax + b = 0. No nosso
caso, devemos usar o vetor b com o sinal invertido.

−−> A = [1 1 1 ; 1 –2 3 ; –5 –1 –1 ]; b = [3,2,–7];

−−> x = linsolve(A,–b);

x = 1.

1.

1.

linsolve(A,–b) é bem mais seguro que A\b, na medida em que usa um método
bem mais robusto para resolver Ax = b. Trata-se de um método que trabalha com os valores
singulares de A, que trataremos na aula 5, e usaremos, entre outras coisas, para descrever
como linsolve funciona. A contrapartida é que linsolve(A,–b) é muito mais lento que A\b.

Aula 3  Cálculo Numérico 67


Linsolve(A,–b) acaba sendo algo da ordem de 60 a 80 vezes mais lento para
resolver A nnx = b, com n entre 500 e 1000, do que A\b. O tempo gasto
depende de cada computador, obviamente. No computador que estamos usando
(com um processador Corel 2 Duo da Intel, de 2 processadores e relógio de
1.4 MHz cada), linsolve(A,–b) é processado em cerca de 3 segundos, para
n = 500, enquanto A\b gasta da ordem de 0.05 segundos apenas, para ser
executado. Teste num computador ao qual você tenha acesso, para ver quanto
tempo de processamento cada um dos dois comandos gastará para resolver
Ax = b, usando A = rand(n,n) e b = rand(n,1), com n = 500.

Em compensação, além de muito mais confiável para resolver Ax = b numericamente,


linsolve tem as seguintes propriedades:

quando o sistema Ax = b não tem solução, ele não calcula nada e avisa (warning:) que
ƒƒ 
o sistema não tem solução;

ƒƒ você viu em Álgebra Linear que duas soluções diferentes de Ax = b diferem por uma
solução da equação Ax = 0. Em particular, dada uma solução x p, as demais são da
forma xl = xp + S*l, onde S é uma matriz nk, l é k1, e S*l é uma solução geral
da equação homogênea Ax = 0. Uma maneira de obter uma tal matriz S é digitar
[x,S] = linsolve(A,b), no prompt do Scilab.

Por exemplo, aplicando linsolve ao sistema do exemplo 3:

−−> A = [1,2,3;4,5,6;7,8,9]; b = [1;0;0];

−−> [x,S ]=linsolve(A,b)

WARNING: Conflicting linear constraints!

S =[ ]

x =[ ]

Ou seja, com um tal b, como Ax = b não tem solução, linsolve informa isso com uma
WARNING ( ADVERTÊNCIA): “Restrições lineares conflitantes!”

Se agora fizermos b = A(1:3:,3) + 2*A(1:3:,2), linsolve nos dará:

−−> A = [1,2,3;4,5,6;7,8,9]; b = 2*A( : ,2) + A( : ,3);

−−> [xp,S]=linsolve(A,b)

68 Aula 3  Cálculo Numérico


S = – 0.4082483

0.8164966

– 0.4082483

xp = 0.5

1.

1.5

Isto significa que a solução geral de Ax = b agora existe e será uma família a um
parâmetro de soluções, neste caso descrita na forma

x l = xp+ S*l

Atividade 6

a)  Ache l, de tal forma que [0; 2; 1] = xl, na solução acima, e explique por
que não é coincidência encontrar um tal l.

b)  Verifique que a = {S} constitui uma base para N(A) = {x  n3 | Ax = 0}.

Aula 3  Cálculo Numérico 69


Exercício resolvido 1
Suponhamos que uma determinada indústria química produza 6 compostos,
Pr1,Pr2,...,Pr6. Para produzi-los, além de água, usa-se seis tipos diferentes de substâncias
como matéria prima. A Tabela 1 a seguir nos fornece, na sua i-ésima linha, a quantidade de
cada uma das seis matérias primas, em toneladas, necessária para produzir uma tonelada do
i-ésimo produto.

Tabela 1 – Matérias primas para produzir uma tonelada de composto i

MatPr1 MatPr 2 MatPr 3 MatPr 4 MatPr 5 MatPr 6


Pr1 0.134 0.21 0.223 0.043 0.154 0.123
Pr 2 0.232 0.144 0.154 0.246 0.124 0.024
Pr 3 0 0 0.265 0.394 0.245 0
Pr4 0.121 0.025 0.142 0.21 0.354 0
Pr5 0.321 0.124 0.134 0.124 0.033 0.221
Pr 6 0.213 0.112 0.21 0 0.12 0.372

1)  Qual é a quantidade de cada uma das matérias primas necessária para produzir os
compostos nas quantidades p1 = 1.7, p2 = 1.4, p3 = 1.5, p4 = 1.5, p5 =1.7 e p6 = 2.2,
medidos em toneladas?

2)  E se alterarmos apenas a produção de p2 , para p2 = 1.5, isso faria sentido?

Solução

1)  Designando o vetor de matérias primas por m = m 61 e por p = p 61, o vetor dos
compostos produzidos, cada linha da Tabela 1, nos dirá que:

0.134m1 + 0.21m2 + 0.223m3 + 0.043m4 + 0.154m5 + 0.123m6 = 1.7

                     
0.232m1 + 0.144 m2 + 0.154m3 + 0.246m4 + 0.124m5 + 0.24m6 = 2.2

Ou seja, temos que resolver o sistema A*m = p, onde

70 Aula 3  Cálculo Numérico


A = A66 = 0.134 0.21 0.223 0.043 0.154 0.123
0.232 0.144 0.154 0.246 0.124 0.024
0.114 0. 0.265 0.394 0.245 0.
0.121 0.025 0.142 0.21 0.354 0.
0.321 0.124 0.134 0.124 0.033 0.221
0.213 0.112 0.21 0. 0.12  0.372

Com linsolve, o vetor m das matérias primas necessárias é:

−−> m = linsolve(A,–p)  m = [ 1.537 1.693 1.735 0.624 2.525 2.729 ]

2)  Com a alteração de p(2) = 1.4 para p(2) = 1.5, repetindo a conta acima, obteríamos,
neste novo caso:

−−> m = linsolve(A,–p)  m = [–0.409 4.091 –.981 2.85 2.791 4.57]'

Portanto, precisaríamos de quantidades negativas da primeira e da terceira matérias


primas, o que em princípio só faria sentido se pudermos interpretá-las como quantidades
produzidas, em vez de como matérias primas propriamente ditas.

Exercício resolvido 2
(Interpolação polinomial e trigonométrica)
Considere os pontos A = ( 0, 2), B = (1,–2), C = (2,4) e D = (3,1), E = (4,3),
F = (5,2).

1)  Encontre um polinômio p(x), de grau 5, que interpole os 6 pontos dados. Ou seja, tal que
os pontos A,B,C, D, E e F sejam pontos do gráfico de p(x).

2)  Encontre um “polinômio” de Fourier q(x) na forma

q(x) = a0 + a1cos(w0x) + a2cos(w0x) + b1sin(2w0x) + b2sin(2w0x)

que interpole os seis dados, considerando w0 = 2*π/5.

Aula 3  Cálculo Numérico 71


Solução de 1 (Interpolação polinomial)
Se p(x) = c1 + c2x + c3x 2 + c4x 3 + c5x 4 + c6x 5 interpola os seis dados, isto significa:


 c1 = 2




 c1 + c2 + c3 + c4 + c5 + c6 = −2

 c + 2c
1 2 + c3 22 + c4 23 + c5 24 + c6 25 = 4


 c1 + 3c2 + c3 32 + c4 33 + c5 34 + c6 35 = 1



 c + 4c + c3 42 + c4 43 + c5 44 + c6 45 = 3


1 2

c1 + 5c2 + c3 52 + c4 53 + c5 54 + c6 55 = 2

Ou seja, chegamos a um sistema C*x = b, fácil de escrever no Scilab, usando o vetor de


abscissas dos dados, X = [0;1;2;3;4;5] e o vetor b, formado pelas ordenadas dos dados b.

−−> C = [ones(6,1) , X, X.^2, X.^3, X.^4, X.^5 ], b = [ 2; –2; 4; 1; 3; 2];

C= 1. 0. 0. 0. 0. 0.
1. 1. 1. 1. 1. 1.
1. 2. 4. 8. 16. 32.
1. 3. 9. 27. 81. 243.
1. 4. 16. 64. 256. 1024.
1. 5. 25. 125. 625. 3125.

Tentando linsolve para achar os coeficientes de p, obteremos

−−> c =linsolve(F,–b); p = poly(c,'x','coefs')

p = 2 – 34.583333x + 52.541667x 2 – 27.458333x 3 + 5.9583333x 4 – 0.4583333x 5

Neste caso, uma boa maneira de checar a solução é visual, pedindo o gráfico de p(x),
junto com os dados armazenados em X e b. Para fazê-lo, discretizamos o domínio (0,5) na
variável x. Usando ‘horner’, obtemos em y os correspondentes valores calculados com p.

−−> x = 0.:0.01:5.; y = horner(p,x); plot(x,y,'k–',X,b,'k*')

–2

–4

–6
0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

Figura 1 – Gráfico da interpolação de seis dados a um polinômio de grau 5

72 Aula 3  Cálculo Numérico


Solução de 2 (Interpolação trigonométrica)
Igual a antes, queremos que q(x) = c1 + c2cos(w0x) + c3cos(w0x) + c4sin(2w0x)
+ c5sin(2w0x) interpole os seis pontos dados, com w0 = 2*p/5, abscissas armazenadas
em X e ordenadas em b.


 c1 + c2 + c3 = 2




 c1 + c2 cos(w0 ) + c3 cos(2w0 ) + c4 sen(w0 ) + c5 sen(2w0 ) = −2

 c + c cos(2w ) + c cos(4w ) + c sen(2w ) + c sen(4w ) = 4
1 2 0 3 0 4 0 5 0


 c 1 + c2 cos(3w 0 ) + c3 cos(6w0 ) + c4 sen(3w 0 ) + c5 sen(6w 0) = 1



 c1 + c2 cos(4w0 ) + c3 cos(8w0 ) + c4 sen(4w0 ) + c5 sen(8w0 ) = 3


c1 + c2 cos(5w0 ) + c3 cos(10w0 ) + c4 sen(5w0 ) + c5 sen(10w0 ) = 2

Analogamente a antes, temos aí um sistema F*c = b, onde a matriz F é dada por

−−> w0=2*%pi/5;F = [ones(6,1); cos(X*w0);cos(2*X*w0);sin(X*w0);


sin(2*X*w0)]

F = 1. 1. 1. 0. 0.
1. 0.3090170 –0.8090170 0.9510565 0.5877853
1. –0.8090170 0.3090170 0.5877853 –0.9510565
1. –0.8090170 0.3090170 –0.5877853 0.9510565
1. 0.3090170 –0.8090170 –0.9510565 –0.5877853
1. 1. 1. –2.449D–16 –4.899D –16

Note que a matriz F= F65, neste caso, tem a primeira e a sexta linhas iguais, a menos
que haja erros de arredondamento. De fato, isso era previsível, pois a função q(x) é periódica
de período 5, a primeira linha dá a equação F(1,:)*c = q(0) = b(1) = 2, enquanto a última
impõe a mesma equação F(6,:)*c = q(5) = b(6) = 2. Portanto, a última equação é, nesse
caso, redundante e poderia até ser eliminada, resultando num novo sistema 55, com as
mesmas soluções. Resolvendo com linsolve:
−−> c = linsolve(F,b)
c = 1.6
– 0.6944272
1.0944272
– 1.1967707
– 2.3168383

Do mesmo modo que antes, podemos gerar um gráfico dessa interpolação:


−−> x = (0:.01:5)'; n = size(x,1); F1 = ones(n,1);

−−> Fx = [F1, cos(w0*x), cos(2*w0*x),sin(w0*x),sin(2*w0*x)]; y = Fx*c

−−> plot(x,y,'k–',X,b,'k*')

Aula 3  Cálculo Numérico 73


5
4
3
2
1
0
–1
–2
–3
0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

Figura 2 – Interpolação dos dados a um “polinômio” de Fourier de ordem 2

Observação 2 – Não foi por acaso que as matrizes C e F resultaram invertíveis. A matriz
da interpolação polinomial leva o nome de matriz de Vandermonde e é sempre invertível em
matemática exata, embora numericamente problemática, à medida que n cresce, como você
poderá constatar no problema proposto 2. Ambas as interpolações são muito importantes
e retornarão de diversas formas nesta disciplina. A interpolação polinomial retornará na
próxima aula, será o tema da aula 10 – Interpolação polinomial – e a base do método de
integração numérica que trabalharemos na aula 11 – Integração. Já o método de interpolação
trigonométrica tem a vantagem de ser numericamente bem mais estável, como teremos a
oportunidade de ver na aula 5, dado o fato que as colunas da matriz F resultam ortogonais.
Nos complementos da próxima aula, a utilizaremos para introduzir as famosas bases de Fourier
discretas de 2n , tão importantes na análise de sinais.

Fatoração LU
No exemplo 1, aplicamos a eliminação de Gauss à matriz
   
1 1 1 1 3 1 1 1 1 3
   
A =  1 −2 3 1 2  e obtivemos U =  0 −3 2 0 −1 
−5 1 −1 0 −7 0 0 20/3 5 20/3

Para tanto, calculamos os multiplicadores das posições (2,1), (3,1) e (3,2), encontrando,
respectivamente, 1, –5 e –4/3. Seriam perfeitamente descartáveis, uma vez obtida a matriz
U , não fosse a seguinte “mágica”. Considere uma matriz triangular inferior L cuja diagonal
principal é toda formada com Lii = 1 e cujas entradas Lij abaixo da diagonal são os respectivos
multiplicadores, ou seja, L21 = 2, L31 = –1, L32 = 2. Resultaria

74 Aula 3 Cálculo Numérico


 
1 0 0
 
L= 1 1 0 
−5 −4/3 1

Agora, multipliquemos L por U. Resultará


    
1 0 0 1 1 1 1 3 1 1 1 1 3
    
L∗ U =  1 1 0  0 −3 2 0 −1 = 1 −2 3 1 2  = A
−5 −4/3 1 0 0 20/3 5 20/3 −5 1 −1 0 −7

Ou seja, obtivemos A = LU . Na verdade, essa “mágica” não só funciona sempre que


o algoritmo da eliminação de Gauss chega a um bom termo sem troca de linhas e pode ser
demonstrada, como tem um nome e é muito importante. Trata-se da fatoração LU, a qual
tem inúmeras aplicações práticas e teóricas. Por exemplo, se queremos resolver um sistema
Ax = b e sabemos que A = LU, não precisaremos aplicar de novo a eliminação de Gauss à
matriz ampliada AAamp = [A b]. Podemos resolver inicialmente o sistema triangular inferior
Lw = b e em seguida o triangular superior, Ux = w, pois se Ux = w e Lw = b, então:

Ax = LUx = L(Ux) = Lw = b

A vantagem é que L e U são agora sistemas triangulares. Como veremos na aula 7, a resolução
de sistemas triangulares é muito mais barata computacionalmente que a eliminação de Gauss. Por
exemplo, verifique que se b = [1; –1; 2 ], ao resolver o sistema triangular inferior Lw = b, obteremos
w =[1; –3; 9]'. Ao resolvermos Ux = w, obteremos x = [10; 3; –9]. Agora cheque que, de fato,
A[10; 3; –9]' = b.

Atividade 7
Trabalhando com matrizes de permutação

Define-se como matriz de permutação uma matriz obtida da identidade, mediante


trocas das posições de suas linhas entre si.

Considere a matriz de permutação P, obtida da identidade 44, trocando a


segunda linha pela primeira, depois a quarta pela terceira. No Scilab:

−−> P = eye(4,4); aux = P( : ,1); P(:,1) = P(:,2);P(:,2) = aux;

−−> aux = P(:,3); P(:,3) = P(:,4); P(:,4) = aux.

Aula 3  Cálculo Numérico 75


Armazene P no Scilab e verifique que PTP = PPT = I44.
1
Considere uma matriz A = rand(4,4) e descubra que P*A resulta na
2 mesma matriz A, porém com as linhas trocadas do mesmo jeito que
foram trocadas as linhas de I44 para se chegar a P.

Mostre que o resultado acima não foi uma coincidência. Ou seja, se P é


3 uma matriz de permutação, então, PTP = Inn e P*A é a mesma A com
as linhas trocadas do mesmo jeito que P, ao ser obtida da identidade.

Quando há permuta de linhas, considere a matriz à formada a partir das linhas


permutadas na mesma sequência que o foram ao se processar a eliminação de Gauss. É
essa matriz à que, agora, pode ser fatorada na forma à = L*U, onde U é a matriz triangular
superior e L é uma matriz triangular inferior, com o número 1 na diagonal e multiplicadores,
obtidos na eliminação de Gauss, na sua parte inferior. Contudo, os multiplicadores estarão
agora com lugares trocados na matriz L. O comando lu do Scilab devolve as matrizes, L, U
e P, se solicitadas. P é uma matriz de permutação (vide atividade 7). Ela é tal que à = P*A.
No Scilab, com o comando lu, obtemos:

−−> A=[1 1 1 1; 1 –2 3 1; –5 –1 –1 0] ;

−−> [L,U,P] = lu(A);

P = 0. 0. 1.
0. 1. 0.
1. 0. 0.

U = –5. –1. –1. 0. –7


0. –2.2 2.8 1. 0.6
0. 0. 1.8181818 1.3636364 1.8181818

L = 1. 0. 0.
– 0.2 1. 0.
– 0.2 – 0.3636364 1.

76 Aula 3  Cálculo Numérico


−−> P*A   // Observe que o efeito de multiplicar P por A é o de trocar suas linhas

–5. – 1. – 1. 0.
1. – 2. 3. 1.
1. 1. 1. 1.

−−> L*U   // Observe que obtivemos P*A = L*U, de fato

– 5. – 1. – 1. 0.
1. – 2. 3. 1..
1. 1. 1. 1.

Na verdade, como P é uma matriz ortogonal, ou seja, P'*P = I33, a fatoração LU se


escreve aqui como

A = (P'*P)*A = P'*(P*A) = P'*L*U    A = P'*L*U

Observação 3 - Pode-se provar que toda matriz pode ser fatorada na forma

A = PTLU

onde P é uma matriz de permutação, L uma matriz triangular inferior, com 1 na diagonal e
U uma matriz na forma escada. Em inglês, L vem de Lower, que significa inferior, e U vem
de Upper, que em inglês significa superior. Até na França, que tem horror a qualquer tipo de
concessão ao inglês, a designação fatoração LU colou. Esta é a primeira das quatro grandes
fatorações da Álgebra Linear e resulta como subproduto da eliminação de Gauss.

Resumo
Nesta aula, você estudou dois comandos do Scilab para resolver sistemas de
equações lineares, sendo também introduzida a fatoração LU de uma matriz. O
primeiro deles implementa o algoritmo de Gauss-Jordan, um velho conhecido
seu. O segundo deles, o ‘linsolve( )’, implementa um método que veremos na
aula 5, mais confiável numericamente e permite que se obtenha todas as soluções
de Ax = b, caso haja mais que uma. Ao se familiarizar com os dois comandos
do Scilab e com suas aplicações, você viu o quanto eles podem ser úteis para a
resolução de problemas.

Aula 3  Cálculo Numérico 77


Autoavaliação
Você foi ao computador usar os comandos ‘\’ e linsolve para resolver sistemas
1 lineares com os exemplos e atividades desta aula? Se não foi, faça-o. Se tiver
dificuldades em usá-los, contate-nos sobre suas dificuldades.

O que o comando ‘\’ tem a ver com o algoritmo de Gauss-Jordan que você viu em
2 Álgebra Linear I? Em que a eliminação de Gauss programada no Scilab difere da que
foi apresentada em Álgebra Linear I?

3 Como você entendeu as principais diferenças entre linsolve(A,b) e A\b?

4 Resolva os exercícios propostos.

Exercícios propostos
1)  Verifique no help do scilab o que faz o comando diag

a)  Armazene em b, c e d vetores de ordem 6 , 5 e 3, respectivamente, com entradas


aleatórias entre 0 e 1.

b)  Usando o comando diag, armazene em A = A66 uma matriz simétrica cuja diagonal
principal seja b, cujas paralelas à diagonal principal, logo abaixo e acima, sejam iguais
a c, e as paralelas que estão situadas a 3 linhas abaixo e acima da principal valham d.

c)  Resolva Ax = b, com os comandos ‘ \ ’ e ‘linsolve ‘. Teste o resultado.

d)  Obtenha C, a partir de A, substituindo a quarta coluna de C pela soma das colunas
de C anteriores a ela e tente resolver Cx = b, com linsolve. Teste para ver o que
aconteceu e diga por que não deu para resolver Cx = b neste caso.

2) 
Usando o comando ‘linsolve’ do Scilab, de maneira análoga ao que fizemos no
exercício resolvido 2

a)  Tente interpolar um polinômio do grau n por n+1 pontos de abscissas igualmente
espaçadas entre –5 e 5, nos casos n = 5 e n = 15 e de ordenadas aleatórias entre 0 e 1.

b)  Visualize o gráfico do polinômio obtido, junto com os pontos a serem interpolados, em cada
caso. Observe que o resultado foi satisfatório no caso n = 5, mas não no caso n = 15.

78 Aula 3  Cálculo Numérico


c)  Calcule o resíduo deixado na solução de cada um dos problemas lineares
correspondentes e compare-o com eventuais inadequações nos gráficos.

3)  Comparando tempos de execução do Scilab

a)  Digite stacksize(‘max’) no prompt do computador para que ele libere espaço para matrizes
maiores e brinque um pouco com o comando timer( ) para testar tempos de execução
do Scilab dos comandos A*C, inv(A)*b, A\b, A*b e norm(b). Obtenha A = Ann ,
C =Cnn e b = bn1 com o comando rand( ) de modo a descobrir uma intuição sobre
a ordem de grandeza dos tempos de execução do Scilab para cada um dos 5 comandos
acima. Teste valores de n mais altos que 200, pois abaixo disso os tempos dados por
timer( ) acabam medindo mais o tempo de aquisição dos dados pela CPU do que
propriamente o tempo de execução das operações numéricas, que é o que nos interessa.

b)  Teste os tempos de CPU gastos em A*C, para n(1) = 200, n(2)= 400, n(3)= 800 e
n(4)=1600 (se seu computador tiver memória suficiente). Tente ver se consegue descobrir
relações entre esses tempos, do tipo (n(i)/n(1))k, à medida que n(i) vai dobrando, onde
k = 1, 2 ou 3. Faça o mesmo para cada um dos demais comandos inv(A), A\b, A*b
e norm(b).

4)  Faça X = rand(4,5), Y = XTX e peça a Scilab que calcule Z = inv(Y). Observe que,
além de Scilab advertir que Y parece uma matriz não-invertível, Z resulta não ser mesmo
a inversa de Y. Como você explica o fato que Y não ser invertível?

Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

LOPES, Jonas Gonçalves; PEREIRA, Marcelo Gomes. Álgebra Linear I. Natal: EDUFRN, 2006.

______. Álgebra Linear II. Natal: EDUFRN, 2007.

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.

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 3  Cálculo Numérico 79


Anotações

80 Aula 3  Cálculo Numérico


SEVs do ℜn, Bases e ajustes
de modelos com quadrados
mínimos

Aula

4
Apresentação

C
ontinuamos a revisitar a Álgebra Linear no n , do ponto de vista da aritmética de ponto
flutuante. Nesta aula, vamos focalizar os conceitos de Subespaço Vetorial (SEV), bases,
ortogonalidade, projeção ortogonal num SEV e o problema de quadrados mínimos.
O ponto alto dessa aula consiste no ajuste de modelos matemáticos a dados experimentais de
algum fenômeno observado. Por exemplo: ajustaremos polinômios de forma que funcionem como
modelos matemáticos para prever a evolução da população brasileira após 1991, usando dados do
IBGE sobre a população brasileira coletados entre 1940 e 1991. A solução de quadrados mínimos
de um sistema linear, que você estudou na Aula 12 de Álgebra Linear I (Ortogonalidade), será a
ferramenta disponível para fazer o referido ajuste de modelos matemáticos a dados experimentais.

Objetivos
1 Introduzir formas de achar bases de um SEV do n e a fatoração QR.

2 Ajustar modelos a fenômenos via problema de quadrados mínimos.

Aula 4  Cálculo Numérico 83


Subespaços Vetoriais (SEVs),
bases ortonormais e fatoração QR
Nas Aulas 6, 7 e 8 de Álgebra Linear I foram introduzidos três dos conceitos que alicerçam
toda a teoria da Álgebra Linear. Referimo-nos aos conceitos de Subespaço Vetorial (SEV), base
de um SEV e de coordenadas de um vetor numa base.

O teorema 3 da Aula 9 de Álgebra Linear I (Dimensão de um espaço vetorial) garante que


todo SEV W = {0} do m admite uma base α . Obviamente, essa base α pode ser escrita como
colunas de uma matriz A, ou seja, α = {A(1) , A(2) , . . . , A(n) }. Isso significa duas coisas:

i- W é gerado por todas as combinações lineares das colunas de A.


W = {c1 A(1) + c2 A(2) + . . . + cn A(n) | c1 , c2 , . . . , cn ∈ } = {Ac | c ∈ n }

Existem, aí, duas formas de pensar W. Se a da esquerda justifica denotar W = Col(A),


a da direita, W = {Ac | c ∈ n } , justifica seu outro nome, W = Im(A).

ii- α é linearmente independente, o que significa Posto(A) = n.

Para saber mais...

Alternativamente, uma base β de um SEV W do m pode ser representada como


linhas de uma matriz Bn ×m, de posto n. W = Lin(B) agora leva o nome de espaço
das linhas de uma matriz. Mas, enquanto vetores de m, as linhas de B são
as colunas de BT. Isto significa identificar Lin(B), com Col(BT). Dito de outra
maneira, W = Lin(B) = {c1 B1 + c2 B2 + . . . + cn Bn | c1 , c2 , . . . , cn ∈ }
= {cT B | c ∈ n } = {(B T c)T | c ∈ n } = {B T c | c ∈ n } = Col(B T ) .
N(A) = { x | Ax = 0}
Na penúltima passagem, estamos usando o fato que vetores do n são
Se x ∈ N(A), isso significa
distintos de matrizes, na medida em que um mesmo vetor v ∈ n tanto
Ai x = 0, para i = 1,...,m.
Ou seja, as linhas de A pode ser representado por uma matriz coluna v = vn ×1 como pela matriz linha
são ortogonais à N(A). v T = [v1 , v2 , . . . , vn ], como é mais usual no cálculo diferencial.
Na verdade, como você
viu em Álgebra Linear I, o
espaço das linhas de A é o
complemento ortogonal de
N(A). Daí a interpretação
geométrica de N(A) Uma alternativa fundamental para representar SEVs no n , lá da Álgebra Linear I, é
como SEV definido a
partir de geradores de seu
como o conjunto formado por todas as soluções da equação homogênea Ax = 0. Leva o
complemento ortogonal. nome sugestivo de espaço nulo de A. Denotamos esse conjunto por N(A) = { x | Ax = 0}.

84 Aula 4  Cálculo Numérico


Mesmo depois que você tiver esquecido tudo que aprendeu em Álgebra Linear, ainda há
de se lembrar como é importante o conceito de base de um SEV W, pois funciona como um
sistema de coordenadas em W. Como exemplo, relembramos o importante problema de achar
uma projeção ortogonal em W da Aula 12 de Álgebra Linear I. Lá, para encontrar a projeção
ortogonal de um ponto b do m em W, utilizamos uma base α = {A(1) , A(2) , . . . , A(n) }
de W. Ou seja, W = Col(A) e Posto(A) = n. Denotando por b a projeção ortogonal de b em
W, lembramos a você que isso significa duas coisas:

ƒƒ 
b = c1 A(1) + c2 A(2) + . . . + cn A(n) = Ac (Impõe a condição b ∈ W)

ATAc = ATb
ƒƒ  (Impõe a condição b − b é ortogonal a W)

Em particular, nossa incógnita agora é o vetor c, que também leva o pomposo nome de
vetor de coordenadas de b na base α(c = [ b ]α ). Na prática, trata-se de resolver a equação
normal ATAc = ATb. O ponto alto dessa equação é que, nesse caso, a matriz ATA é invertível,
ou seja, nesse caso a equação normal tem solução única, em matemática exata. A escolha de
uma base para resolver a equação normal é decisiva nesse problema. Por exemplo, se α for
uma base ortonormal, isso significa que:

(i)T (j) 1, se i = j
ƒƒ  (A A)ij = A A =
T
⇒ AT A = In×n (Você se lembra?)
0, se i = j

Nesse caso, não há mais nada a resolver, e c = ATb, já que ATA = In×n.

Encontrar bases de um SEV adequadas a cada problema significa encontrar o referencial


adequado ao problema, e é frequentemente decisivo na sua solução. No problema da projeção
ortogonal, usar bases ortonormais é o que existe de mais robusto em termos numéricos.
Além disso, torna muito rápida a resolução computacional do problema, muito rápido,
computacionalmente, se dispomos de uma base ortonormal do SEV, pois custa apenas
duas multiplicações de matriz por vetor. Obter uma base ortonormal é o que pode ser
computacionalmente caro no problema.

Nos complementos desta aula, trabalharemos bases discretas de Fourier para o 2n , que
são vitais para analisar discretizações de registros de fenômenos tipicamente oscilantes (como
ocorre, por exemplo, com som e luz). Na próxima aula, revisitaremos as bases de autovetores
associadas a uma função linear, bem como definiremos as bases ortonormais de vetores
singulares associadas a uma matriz, essenciais na Álgebra Linear Numérica.

Maneiras práticas de encontrar bases


de Col(A) e N(A)
Julgamos a Atividade 1 importante. Nela, a tarefa é achar bases de N(A), Col(A) e
Col(AT), revisitando o que lhe foi apresentado em Álgebra Linear I.

Aula 4  Cálculo Numérico 85


Atividade 1

Considere a matriz A = [1,2,3,4;5,6,7,8;9,10,11,12].

a)  Use o comando lu para obter uma matriz U, na forma escada linha equivalente
a A.

b)  Encontre uma base de Col(A), sem nenhuma conta a mais. (Sugestão: use
o teorema 1 da Aula 10 de Álgebra Linear I, Subespaços especiais.)

c)  Ache as soluções canônicas de Ux = 0 e diga por que elas formam uma
base de N(A). (Sugestão: dê uma espiadinha na Aula 5 de Álgebra Linear I,
Estudo das soluções de sistemas lineares.)

d)  Explique por que as linhas não nulas de U definem uma base para Col(AT).
(Sugestão: reveja a demonstração do teorema 1 da Aula 10 Álgebra Linear I
e a seção “Para saber mais” anterior)

Bases de N(A) - Veja que [x,S] = linsolve(A,b) devolve, nas colunas de S, uma
base de N(A), se b = 0m ×1. Alternativamente, S = kernel(A) também define
base de N(A).

Bases ortonormais de Col(A) - Recomendamos dois comandos para encontrar


bases ortonormais de Col(A). O primeiro deles é Q = orth(A), que devolve
em Q uma matriz com colunas ortonormais e tal que Col(Q) = Col(A).
Em particular, as colunas de Q definem uma base ortonormal de Col(A).

86 Aula 4  Cálculo Numérico


Exemplo 1
O objetivo, aqui, é encontrar bases ortonormais de Col(A) e de N(AT).

−−> A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12];

−−> S = kernel(A ) // As colunas de S formam uma base ortonormal de N (AT )

S= 0.1905589 0.5135049
0.1286655 −0.8267074
−0.8290076 0.1129001
0.5097832 0.2003024

−−> Q = orth(A) // As colunas de Q formam uma base ortonormal de Col(A)

Q = −0.1408767 0.8247144
−0.3439463 0.4262639
−0.5470159 0.0278135
−0.7500855 −0.3706369

Atividade 2

Com as matrizes usadas no Exemplo 1:

a)  Teste ATS num computador ao qual você tenha acesso, para ver que
ATS = 03×2 .

b)  Teste S TS e conclua que suas colunas definem uma base ortonormal de
N(AT ).

c)  Teste SS T e diga por que SS T ≠ I4×4 era previsível.

d)  Teste que, de fato, obtivemos Col(Q) = Col(A).

Aula 4  Cálculo Numérico 87


Atividade 3

a)  Reveja, na Aula 12 de Álgebra Linear I, os conceitos de ortogonalidade entre


vetores do n e de conjuntos ortonormais de vetores. Em particular, constate lá
que um conjunto α = {Y (1) , Y (2) , . . . , Y (n) } ⊂ m é dito ortonormal caso:

ƒƒ  Y (i) e Y (j) sejam ortogonais sempre que i ≠ j. Vale dizer que Y (i)T Y (j) ≠ 0,
se i ≠ j.

ƒƒ ||Y (i) || = 1, para todo i = 1,...,n.

b)  Prove que, se as colunas de Y forem ortonormais, então Y TY é a identidade


m ×m. (Sugestão: use o item d da Atividade 4 da Aula 2, Introdução ao
Scilab, para ver que (YTY)ij = 0 se i ≠ j e que (Y T Y )ii = ||Y (i) ||2 = 1 ,
nesse caso.)

c)  Ainda no caso das colunas de Y serem ortonormais, mostre que, se m = n,


então Y é uma matriz quadrada e vale YYT = YTY = In×n. Nesse caso, diz-se
que a matriz Y é ortogonal. Ou seja, diz-se que uma matriz é ortogonal se for
quadrada, invertível e Y –1 = Y T.
||Yb|| = ||b||

Veja que d)  Mostre que, se m n e Y TY = In ×n , então YYT ≠ Im×m. (Sugestão: dê uma

||Yb||= ||b|| significa


espiadinha na Propriedade 4 sobre posto de matrizes, na Aula 10 de Álgebra
que b e Yb “têm o
Linear I, e use-a para mostrar que, nesse caso, posto(YYT ) m.)

mesmo tamanho”,
considerando que a
medida de tamanho
de um vetor é sua
e)  Se Y = Yn n é uma matriz ortogonal e
×
b ∈ n , então ||Yb|| = ||b||.
norma. Este fato terá
grande relevância Ao digitar [Q,R] = qr (A) no prompt do Scilab, ele devolve:
nas aulas 4 e 5. Uma
maneira de enxergar Em Q, uma matriz quadrada com colunas ortonormais. Ou seja, suas
ƒƒ 
isso é pensar que a colunas definem uma base ortonormal de n e QTQ = Im×m .
função linear
T : n → n, dada
Em R = Rm ×n, uma matriz com dois blocos. O bloco de cima é triangular
ƒƒ 
por T(b) = Yb,
“preserva tamanhos”,
superior n × n e seu posto p define a dimensão de Col(A), já que Q
se Y é uma matriz é invertível (por quê?). O bloco de baixo é formado por zeros (vide
ortogonal. Em Exemplo 4).
“matematiquês”,
diz-se que uma
As primeiras colunas de Q formam uma base ortonormal de Col(A). A novidade
função que preserva
tamanhos é aqui é a fatoração A = QR resultante, que constitui a segunda das 4 grandes
uma isometria. fatorações da Álgebra Linear.

88 Aula 4  Cálculo Numérico


Exemplo 2
O objetivo, aqui, é achar uma base ortonormal de Col(A), checar a fatoração A = QR e
obter a projeção ortogonal de um ponto b em Col(A), para A e b dados abaixo.

−−>  A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; b = [1; 0; 0; 0]; [Q, R] = qr(A)


R = −12.884099 −14.59163 −16.299161
0. −1.0413152 −2.0826304
0. 0. −3.828D − 15
0. 0. 0.

Q = −0.0776151 −0.8330522 0.4861226 −0.2523585


−0.3104602 −0.4512366 −0.4600665 0.6988124
−0.5433054 −0.0694210 −0.5382347 −0.6405493
−0.7761505 0.3123946 0.5121787 0.1940954

−−>  Q ∗ R // Observe que obtemos A = QR de volta


ans = 1. 2. 3.
4. 5. 6.
7. 8. 9.
10. 11. 12.

Para finalizar, como Q é uma base ortonormal de Col(A), conforme vimos acima, a
projeção ortogonal de b em Col(A) será b_proj = Q ∗ c , onde c = QTb. Portanto,

−−>  c = Q ∗ c; b_proj = Q ∗ c ;

Para testar a solução b_proj , precisamos verificar se b − b_proj é ortogonal a todas


as colunas de A. Uma maneira de fazermos isso é testando a norma de A ∗ (b − b_proj)
(por quê?).

−−>  teste = norm(A ∗ (b − b_proj))


teste = 6.071D − 15

Observação 1 – Há vários métodos para se obter a fatoração A = QR. O mais rápido deles
(embora não seja o mais robusto) é o método de ortogonalização de Gram-Schmidt, que
você estudou na Aula 12 de Álgebra Linear I. Se você estiver interessado apenas na fatoração
A = QR, é mais recomendável digitar a versão econômica [Q, R] = qr(A, ”e”), que elimina
as m –n colunas finais de Q e as linhas nulas de R, tornando R triangular superior.

Em matemática exata, como já afirmamos acima, Q invertível e A = QR garante que a dimensão


de Col(A) será p = posto(R). O posto de uma matriz é um conceito fundamental, também, na
Álgebra Linear feita com aritmética de ponto flutuante (porém, bem mais complexo; iremos

Aula 4  Cálculo Numérico 89


aprofundá-lo na próxima aula). Neste ponto, gostaríamos apenas de chamar a sua atenção.
Veja que nesse exemplo não há maiores dúvidas em interpretar p = 2 como a dimensão de
Col (A), pelo fato de que R3×3 ≈ 0, ou seja, R3×3 é da ordem de grandeza dos erros de
arredondamento cometidos.

Mas e se, por exemplo, R3×3 = 10∧ (−10)? Será que também o consideraríamos desprezível
e diríamos que dim(Col(A)) = posto(R) = 2? Ou não? Nesse caso, consideraríamos que
Col(A) tem dimensão 3 e que as três colunas de Q que formam uma base de Col(A)? Por si
só, esse fato ilustra bem a complicação, mas vamos parar por aqui e retornar a essa questão
na próxima aula, com ferramentas adequadas para enfrentá-la. Já orth(A) usa as técnicas que
discutiremos na próxima aula e uma tolerância padrão (default) para dizer que a dimensão de
Col(A) é dois.

Observação 2

No Exercício resolvido 2 da Aula 10 de Álgebra Linear I, você viu que, pelo menos em
matemática exata, a equação normal A TAc = A Tb tem sempre solução, mesmo que
Ac = b não tenha solução. Além disso, você igualmente viu, naquela mesma aula, que
posto(A) = posto(ATA). Em especial, isso significa que, se α é uma base de Col(A), então
n = Posto(A) = Posto(ATA), onde A = Am×n . Portanto, ATA será invertível, e a equação
normal terá solução única c = (ATA)–1ATb. Em ponto flutuante, podemos ter problemas
numéricos por aí, como você pôde ver no Exercício Proposto 1 da aula passada, Sistemas de
equações lineares.

Observação 3

Refrescamos a sua memória para o importante fato de que a projeção ortogonal de b em W


calcula também a distância de b a W, no sentido que minimiza a distância de b a todos os
pontos de W. Dito de outra forma, se b não pertence a W = Col(A), então Ac = b não tem
solução. O que estamos dizendo, embasados pela Observação 2, é que o problema de encontrar
o ponto b = Ac de W mais próximo de b tem sempre solução, no sentido de minimizar a soma
de quadrados dada por

||b − Ax||2 = (b1 − A1 x)2 + (b2 − A2 x)2 + . . . + (bn − An x)2 , com x ∈ n .

Daí o sugestivo nome de solução de quadrados mínimos para o valor de c, que


resolve a equação normal A TAc = A Tb. Em resumo, já que é impossível resolver
Ac = b, a equação normal resolve algo que é possível, e que corresponde a encontrar o valor de c
que minimiza a norma do erro ||b – Ax ||. Uma das principais aplicações disso é o ajuste de dados
experimentais a modelos, que exploramos a seguir.

90 Aula 4  Cálculo Numérico


Ajuste de dados pelo método dos
quadrados mínimos
O método dos quadrados mínimos não é novidade para você, pois foi um dos assuntos
centrais da Aula 12 de Álgebra Linear I. Sugerimos que você dê uma olhadinha nesse material
antes de prosseguir. Começamos discutindo um exemplo que poderia ser típico daquela aula.

Exemplo 3
Suponha que uma pedra seja abandonada, no instante t = 0, de uma certa altura,
sem velocidade inicial, na Lua. Alguns dados de tempo X da altura de sua trajetória foram
registrados na tabela abaixo. Calcule a altura da qual foi lançada a pedra, bem como a aceleração
da gravidade nesta região da Lua.

Tabela 1 – Variação da altura da pedra, com o tempo

Tempo (s) 0 5 7 10

Altura (m) 80 61 40.5 0

O movimento dessa pedra será retilíneo e uniformemente acelerado, como sabemos


da Física. Dado que a velocidade inicial é nula, podemos modelar o movimento com
y (t) = y0 – g/2 t 2, onde a posição inicial y0 e aceleração da gravidade g são as incógnitas
de nosso modelo. Preferimos representá-lo por yc (t) = c1 + c2t 2, e nossa incógnita agora é
o vetor c = [c1; c2 ]. Se os quatro dados tivessem sido medidos com precisão absoluta, eles
satisfariam as equações:



 yc (1) = c1 = 80

 y (5) = c + 25c
c 1 2 = 61


 yc (7) = c1 + 49c2 = 40.5

 y (10) = c + 100c = 0
c 1 2

   
1 0 80
   
 1 25   61 
Ou seja, Ac = y , onde A = 
exp

 e y exp = 
 
.

 1 49   40.5 
1 100 0

É muito fácil verificar que Ac = yexp não tem solução. Isso já era esperado, pois sempre
há erros de medida em dados experimentais. Observe que a diferença entre dados teóricos e
experimentais, para cada k = 1,...,4, será

Aula 4  Cálculo Numérico 91


Ek = yc (tk ) − ykexp = c1 + Ak2 c2 − ykexp = Ak c − ykexp .

Podemos interpretar Ek como sendo o erro cometido na k-ésima medida da altura, com
relação ao modelo teórico. Veja a Figura 1, mais abaixo.
Modelo Teórico
Como Ac = b não tem solução, o melhor que podemos esperar é tornar o erro
O vetor de erros
E =E(c)= Ac – yexp o menor possível, como por exemplo minimizando sua norma. Nosso
E = [ E1 E2 E3 E4 ]' = Ac – yexp
é também conhecido como problema, agora, é minimizar ||E(c)||2 = || Ac – yexp ||2 , com c ∈ 2 .
vetor de resíduos.
Como vimos acima, trata-se do problema de quadrados mínimos, que podemos resolver
no Scilab com

−−> c = A\y_exp

 c = 80.819159

– 0.8101522

80 (1,80)
E1 = A1*c – 80

70
(5,61)
60 E2 = A2*c – 61

50 E3 = A3*c – 40.5

40
(7,40.5) y = 78 – 0.75t 2
30

20 E4 = A4*c – 0

10

0
(10,0)
0 2 4 6 8 10

Figura 1 – Erros nos dados, com relação ao modelo y = 78 – 0.75 t 2.

Ou seja, c1 = 80.82 e c2 = – 0.81. Isso significa que a pedra foi lançada de uma altura
x 0 = 80.82 m, e que a gravidade lunar foi estimada, em nosso modelo, como
g = – 2c2 = 1.62 m/s 2. Este é, até três algarismos significativos, o valor conhecido para a
gravidade lunar no equador de sua superfície. O tamanho do erro correspondente, também
conhecido como resíduo, resultou em

||E|| = ||A ∗ c − y exp || = 0.784 .

O Exemplo 3 foi bem típico do problema de ajuste de modelos usando quadrados mínimos
que trabalharemos nesta aula. Nele, tínhamos uma determinada lei yc(t), que descrevia o
movimento da pedra na Lua, dependendo de duas constantes que conseguimos determinar a
partir de dados experimentais.

92 Aula 4  Cálculo Numérico


Ingredientes matemáticos do problema
de ajuste de dados a um modelo teórico
Matematicamente, um ajuste de dados experimentais a um modelo teórico tem
como ingredientes:

1)  Um vetor de dados experimentais armazenados em yexp ∈ m .

2)  Um vetor de posições t = [t1,t2, ····· , tm ], nos quais estes dados experimentais foram
exp
obtidos. Ou seja, ti indica a posição na qual a i-ésima medida yi foi realizada. Pode ser
tempo, mas pode representar, também, outras grandezas (como no Exemplo 5).

3)  Uma família de modelos teóricos yc(t), na qual encontraremos o modelo procurado,
determinando o valor de c que “melhor adequa” yc(t) aos dados.

O valor ideal para c seria aquele que propiciasse uma interpolação exata de yc(t) aos
dados do problema. Ou seja, que garantisse

yc (t1 ) = y1exp ; yc (t2 ) = y2exp ; . . . . . . . . . ; yc (tm ) = ym


exp
.

Isso não faz muito sentido em problemas reais, nos quais temos erros de medida a levar
em conta e modelos que são quase que invariavelmente simplificações da realidade. Tendo em
mente o que fizemos no Exemplo 3, a saída é considerar o vetor E = E(c), de coordenadas:

E(c)1 = yc (t1 ) − y1exp ; E(c)2 = yc (t2 ) − y2exp ; . . . . . . . . . ; E(c)N = yc (tN ) − yNexp .

Do mesmo jeito que antes, cada coordenada de E(c) mede o erro cometido na respectiva
medida, fixado um vetor de parâmetros c. Ainda seguindo os passos do Exemplo 3, uma vez
que não podemos esperar E(c) = 0, procuramos o valor de c, que minimiza o erro, em algum
sentido. No nosso caso, procuramos o valor de c que minimiza a norma de E(c). Ou seja,
nosso problema é:
N

 2
minimizarc ∈ n |E(c)| = ||yc (texp ) − y exp ||2 = (yc (tk ) − ykexp )2 .
k=1

Na verdade, com a generalidade colocada acima, o problema vai bem além do que achamos
adequado nessa disciplina. Nossa opção será trabalhar no caso particular em que yc(t) é uma
função do tipo yc(t) = c1g1(t) + c2g2(t) + ········ + cngn(t), onde g1(t), g2(t), ········ , gn(t) são
funções dadas. No caso do Exemplo 1, n = 2, g1(x) = 1 e g2(x) = x 2 . Desse modo, a dependência
do modelo yc(t) com c é linear. O problema correspondente é dito problema de quadrados
mínimos lineares.

Aula 4  Cálculo Numérico 93


Nesse caso, para cada i = 1,····,m, teremos
E(c)1 = yc (t1 ) − y1exp = c1 g1 (t1 ) + c2 g2 (t1 ) + . . . . . . + cn gn (t1 ) − y1exp
E(c)2 = yc (t2 ) − y2exp = c1 g1 (t2 ) + c2 g2 (t2 ) + . . . . . . + cn gn (t2 ) − y2exp
.. .. ..
. . .
E(c)m = yc (tm ) − ym
exp
= c1 g1 (tm ) + c2 g2 (tm ) + . . . . . . + cn gn (tm ) − ym
exp

Ou seja, E(c) = Ac – y exp, onde A ij = g j (t i). Como nossa opção é minimizar


||E(c)||2 = ||Ac – yexp||2, cá estamos nós de volta ao nosso velho problema de quadrados
mínimos lá da Álgebra Linear. Já sabemos, das Observações 2 e 3, que c resolve a equação
normal. E mais: sabemos que essa solução c é única se a matriz A=Am×n tiver colunas
linearmente independentes, ou seja, posto n. Vamos acrescentar dois pontos importantes
nas aplicações:

1)  Se o ajuste é polinomial, ou seja, se as funções gj(t) = t j –1, então Aij= gj(ti) = ti j –1.
Ou seja, a primeira coluna é toda igual a 1, a segunda coluna é o vetor t, e as demais são
A(j) = [ti j –1 t2j –1 ···· tmj –1]T. Ou seja,
 
1 t1 t21 ··· tn1
 
 1 t2 t22 ··· tn2 
A=
 .. .. .. .. .

 . . . ··· . 
1 tm t2m · · · tnm

Em geral, para fazermos um ajuste razoável de dados a um modelo, precisamos de


mais medidas que o número de parâmetros. Vale dizer que m ≥ n + 1. Vamos discutir
separadamente dois casos:

m = n + 1.
ƒƒ 

Este caso é relevante. A matriz A = A(n+1) × (n+1), nesse caso, é quadrada, e tem até nome:
chama-se matriz de Vandermonde. Já apareceu na aula anterior, no Exercício resolvido 1, relativo
à interpolação polinomial. Seu determinante vale (vide complementos desta aula):
 
1 t1 t21 · · · tm
1
 
 1 t2 t22 · · · tm 
det  .. .. ..
2
.  = (t − t )(t − t ) . . . (tm − t )(t − t )(t − t ) . . . . . . (tm − tm−1 ) =
 0
 
· · · ..
2 1 3 1 1 3 2 4 2
 . . . 
1 tm t2m · · · tm
m

Ou seja, por ser o produto de termos (t i –t j), todos não nulos, se t não tem coordenadas
repetidas, então det(A) ≠ 0. Portanto, A é invertível, e Ac = yexp tem solução única, em
matemática exata. Em especial, isso significará que o polinômio encontrado interpola os dados
experimentais, ou seja, satisfaz os dados experimentais. Daí o nome de polinômio interpolador.
O fato da matriz de Vandermonde ser invertível garante a existência de um único polinômio do
grau n, que interpola n +1 pontos do plano com abscissas diferentes. Na Aula 10, Interpolação
polinomial, discutiremos com bem mais detalhes os polinômios interpoladores. Mas cuidado:

94 Aula 4  Cálculo Numérico


a matriz de Vandermonde é invertível; porém, numericamente pouco confiável na medida em
que n cresce, como se pode ver no Exercício proposto 1 da aula anterior.

n
ƒƒ   m–1

Nesse caso, as colunas de A = Am ×n serão as n + 1 primeiras colunas da matriz de


Vandermonde, que é m × m e invertível. Em particular, isso significa que elas são linearmente
independentes (por quê?). Mas isso significa, também, que a matriz A tem posto n + 1, e
que, pela Observação 1, a correspondente equação normal ATAc = ATy exp tem solução única,
em matemática exata. Na verdade, para isso acontecer nesse caso de ajuste polinomial, basta
fazermos todas as medidas em pontos t1, t2,...,tm diferentes entre si, e com m maior ou igual
ao número n de parâmetros.

2)  No Scilab, podemos resolver a equação normal ATAc = ATb com linsolve, ou até fazendo
c = A\b. Como já vimos, c = A\b devolve uma solução de quadrados mínimos se
Ax = b não tiver solução. Mas o problema é, em si, tão relevante que há um outro
comando específico para ele no Scilab, de nome lsq, destinado a tirar proveito de sua
particular estrutura. Veja lá no help do Scilab a diferença entre o comando ‘lsq‘, destinado
exclusivamente a resolver o problema de quadrados mínimos lineares, e nosso ‘ \‘.

Polinômios como modelos


para crescimento populacional
No Exemplo 3 dispúnhamos de um modelo matemático inequivocamente adequado ao
fenômeno, com parâmetros a serem ajustados aos dados. Infelizmente, isso nem sempre
pode ser estabelecido com tanta segurança em outras realidades, como, por exemplo, em
demografia. Mesmo assim faz sentido ajustar dados a polinômios, muito embora se tenha que
ter alguns cuidados a mais. A seguir, discutiremos diferentes modelos polinomiais objetivando
modelar a evolução da população brasileira, entre 1940 e 2000, segundo censos do IBGE
sintetizados na seguinte tabela.

Tabela 2 – Evolução da população brasileira, segundo censos do IBGE

Ano 1940 1950 1960 1970 1980 1991 2000


População
41.23 51.84 70.07 93.14 118.00 146.82 169.80
(milhões)

Vamos usar o método de quadrados mínimos para modelar a evolução da população brasileira
entre 1940 e 1991, com polinômios y = x1 + x2t +...+ xn t n –1, de graus 1 a 5. Reservamos o
dado de 2000 para checar as previsões feitas por cada um dos modelos. Consideramos 1940
como o ano t = 0. Medimos os anos em décadas e as populações em milhões.

Aula 4  Cálculo Numérico 95


Para n =1:  y1 = x1 + x2 t . Obtemos 6 equações nas incógnitas x1 e x2:

   
41.23 = x1 1 0 41.23
 1 1   51, 84 
51, 84 = x1 + x2     
   
70, 07 = x1 + 2x2  1 2  x1  70, 07 
⇒ Ax = 


 x =pexp
=



93, 13 = x1 + 3x2  1 3  2  93, 13 
118, 00 = x1 + 4x2
   
 1 4   118 
146, 82 = x1 + 5.1x2 1 5.1 146, 8

A solução de quadrados mínimos x resolverá a respectiva equação normal:

      
6.0 15.1 x1 522.33 33.67
AT Ax = = AT pexp = ⇒x=
15.1 56.01 x2 1696.57 21.21

No Scilab, basta digitar A\pexp. Resultou y1 (t) = 33.67 + 21.21∗ t . Correspondentemente,


a previsão para 2000 é y1(6) = 160.95 milhões.

Para n=2: y2 = x1 + x2t + x3 t2

   
41.23 = x1 1.0 0.0 0.0 41.23
51, 84 = x1 + x2 + x3  1.0 1.0 1.0    51, 84 
   
  x1  
70, 07 = x1 + 2x2 + 4x3  1.0 2.0 4.0 
 x 
 70, 07 
⇒ Ax = 
   = p exp
= 



93, 13 = x1 + 3x2 + 9x3  1.0 3.0 9.0 
2
 93, 13 
  x3  
118, 00 = x1 + 4x2 + 16x3  1.0 4.0 16.0   118 
146, 82 = x1 + 5.1x2 + 26.01x3 1.0 5.1 26.01 146, 8

A solução de quadrados mínimos, do mesmo modo que antes, daria o resultado:

     
6.00 15.10 56.01 522.33 39.88
     
AT Ax =  15.10 56.01 232.65  = AT pexp =  1696.56  ⇒ x =  12.12 
56.01 232.65 1030.52 6893.94 1.784

Resulta o modelo y2 (t) = 39.88 + 12.12∗ t + 1.784∗ t2. Correspondentemente, a previsão


para 2000 seria y2(6) = 176.89 milhões.

96 Aula 4  Cálculo Numérico


De forma inteiramente análoga, obteríamos os correspondentes modelos e previsões
para os demais polinômios, registrados na Tabela 3:

Tabela 3 – Modelos para a evolução da população brasileira entre 1940 e 2000

Modelo y(t) Previsão 2000 y(6) Previsão 2008 y(6.8)


Grau
obtido (em milhões) (em milhões)

1 33.67 + 21.21∗ t 160.95 178.98

2 39.88 + 12.12∗ t + 1.784∗ t2 176.89 206.69

3 41.25 + 6.092 t + 5.017 t2 − 0.4218 t3 167.29 182.80

4 41.23 + 6.44 t + 4.65 t2 − 0.305 t3 − 0.0115 t4 166.56 180.29

5 41.23 + 5.22 t + 6.72 t2 − 1.47 t3 + 0.25 t4 − 0.0217 t5 162.44 161.63

O censo de 2000 do IBGE estimou a população brasileira, na ocasião, em 169.80 milhões


de habitantes. A estimativa que o IBGE fazia da população brasileira, em novembro de 2008,
é de 190.16 milhões. Pela tabela acima, o polinômio de grau 3 parece se sair melhor nas 190.16 milhões
previsões, com o de grau 4 chegando perto. Os gráficos abaixo ajudam a entender o que está Vide: <http://www.
acontecendo. O primeiro deles compara os ajustes feitos com polinômios de graus 1, 2 e 3. ibge.gov.br/home/
O segundo compara os ajustes com polinômios de graus 3, 4 e 5. disseminacao/online/
popclock/metpopcl.
Não há um modelo teórico ideal, aplicável indiscriminadamente a fenômenos como esses. shtm>. Acesso em:
4 fev. 2009.
A principal dificuldade na previsão de fenômenos reside na adequação dos modelos utilizados
e nos seus limites de validade. Vale a pena compararmos os ajustes feitos. Alguns modelos
parecem mais adequados, outros nem tanto.

ƒƒ 
O polinômio de grau 2, em especial, mostrou-se inadequado. Uma explicação para isso
vem do fato de estarmos analisando um crescimento populacional que é acelerado na
sua parte inicial (concavidade para cima) e que depois evolui para um crescimento
desacelerado, a partir de algum ponto de inflexão. Veja que, antigamente, os casais tinham
muitos filhos, e hoje poucos são os que têm mais de dois. Vale dizer que a evolução
estudada começa com y”(t) > 0 , e depois muda para y”(t) < 0 , passando por um
ponto no qual y”(t) = 0 . Já polinômios de grau 2 têm segunda derivada constante, e
não admitem ponto de inflexão, ou seja, no qual y”(t) = 0 . Até mesmo o polinômio do
primeiro grau faz melhores previsões, apesar de se ajustar de maneira muito mais pobre
à evolução entre 1940 e 1991.

Já o polinômio de grau 5 interpola exatamente os 6 dados utilizados, como previsto acima,


ƒƒ 
para o caso onde o número de dados m iguala o número de coeficientes procurados.
Contudo, é o que faz previsões mais inadequadas. Isso exemplifica bem uma confusão
comum entre interpolar dados e modelar um fenômeno. A interpolação de dados por
uma função não tem compromissos em prever nada, mas apenas que seu gráfico cubra

Aula 4  Cálculo Numérico 97


exatamente n pontos prescritos no plano e de abscissas diferentes. Já um modelo para
a queda de uma pedra na Lua parte de uma lei para o fenômeno. Infelizmente, isso nem
sempre é possível, e muitas vezes precisamos apelar para modelos que sabemos não
descrever exatamente os fenômenos. Boa parte dos modelos tem sua capacidade de
previsão muito limitada em função disso.

300

250

200
Dados ajustado do IBGE
Dados do IBGE, usados para controle
150 y1(t) = 33.67 + 21.21t
y2(t) = 39.88 + 12.12t +1.784t 2
100 y3(t) = 41.25 + 6.092t + 5.017t 2 – 0.4218t 3

50

0
1940 1950 1960 1970 1980 1990 2000 2010 2020 2030

Figura 2 – Ajustes de polinômios de graus 1, 2 e 3.

200
180

160
140 Dados ajustado do IBGE
Dados do IBGE, usados para controle
120 y3(t) = 41.25 + 6.092t + 5.017t 2 – 0.4218t 3
y4(t) = 41.23 + 6.44t + 4.65t 2 – 0.305t 3 – 0.0115t 4
100 y3(t) = 41.23 + 5.22t + 6.721t 2 – 1.47t 3 + 0.25t 4 + 0.0217t 5
80

60

40
1940 1950 1960 1970 1980 1990 2000 2010 2020 2030

Figura 3 – Ajustes polinomiais de graus 3, 4 e 5.

ƒƒ 
Apesar disso, nos casos dos polinômios de graus 3 e 4, esse ajuste revelou-se razoável
por 10 anos. Enquanto o censo do IBGE nos dá um aumento populacional no Brasil de
cerca de 23 milhões de pessoas entre 1991 e 2000, o acréscimo correspondente previsto
pelo polinômio do grau 3 foi de 20.5 milhões. Ou seja, um erro relativo da ordem de
11%. Já num período de 17 anos, desde 1991, a se confirmar a estimativa atual do IBGE
da ordem de 190 milhões de habitantes no Brasil em 2008, a estimativa de cerca de
182.8 milhões feita pelo nosso modelo do grau 3 embutiria um erro relativo de
aproximadamente (190–182.8)]/(190 – 146.8) = 0.167, ou seja, de 16.7% .

98 Aula 4  Cálculo Numérico


Atividade 4
Com base na tabela a seguir, resolva:

Tabela 4 – Evolução da população rural no Brasil, segundo o IBGE

Ano 1940 1950 1960 1970 1980 1991 2000

Pop. Rural
28.36 33.16 38.77 41.05 38.57 35.83 31.85
(milhões)

a)  Ache polinômios de graus 1 a 5 que melhor se adequem aos dados da população rural
da tabela acima, usando apenas os dados entre 1940 e 1991, e deixando o dado de 2000
para controle.

b)  Observe que o melhor ajuste aparenta ser, agora, obtido pelo polinômio do grau 2; observe,
ainda, que o ajuste de grau 3 dá um resultado razoável e que os de grau 4 e 5 aparentam
ser muito ruins. Você teria como explicar por que, nesse caso, o polinômio de grau 2
ajustou-se bem e no Exemplo 2 produziu um péssimo ajuste?

N

c)  Calcule os resíduos Ei = (yi (tk ) − pexp
k ) para cada um dos cinco polinômios yi(t)
2

k=1
que você encontrou e observe que os resíduos vão decrescendo até E5 = 0. Como você
interpreta isso?

d)  Observe que, aparentemente, tanto nessa atividade como na modelagem discutida logo
acima polinômios de grau alto interpolam melhor, mas tendem a prever pior que polinômios
de grau intermediário. Você teria algum palpite para indicar que esse fato possa ter alguma
razão para acontecer com certa frequência?

Aula 4  Cálculo Numérico 99


Dois exemplos adicionais de ajuste usando
quadrados mínimos lineares
Em muitos casos, o ajuste a ser feito não conduz a um problema de quadrados mínimos
lineares. Contudo, em muitos deles há condições de substituí-lo por um outro que seja linear.
É o caso do exemplo a seguir:

Exemplo 4
A quantidade de bactérias produzida num meio de cultura, medida a cada 6 horas, foi
registrada como sendo:

Tabela 5 – Evolução, no tempo, da quantidade de bactérias num meio de cultura.

T (horas) 6 12 20 28 40 48 60

Bactérias (g) 110 200 450 950 3100 6550 23800

O modelo usual para o crescimento de bactérias num meio de cultura, sem inibição, é
y(t) = y0 e kt. Os parâmetros a determinar são y0 e k. Essa função não depende linearmente
dos parâmetros. Contudo, seu logaritmo

h(t) = ln(y(t)) = ln(y0) + kt

é um polinômio de grau 1 em ln(y 0 ) e k. Isso sugere adequarmos os dados de


h(t) = ln(y(t)) = ln(y 0 ) + kt ao logaritmo dos dados. O vetor y exp fica sendo
yexp = [ln(110), ln(200),...., ln(23800)] = [4.70 , 5.30 , 6.11, 6.86, 8.04, 8.89, 10.13].

Analogamente aos exemplos anteriores, vamos ajustar h(t) = c1 + c2t, com


   
1 6 4.7
   
 1 12   5.3 
   
 1 20   6.11 
   
   
A =  1 28  e y exp =  6.86 , de modo a obter ln(y0) = c1 e k = c2.
   
 1 40   8.04 
   
   
 1 48   8.79 
1 60 10.08

Do mesmo jeito que antes, resolvemos a equação normal.


     
7 214 49.9 4.106
AT Ax = c = AT y exp = ⇒c= .
214 8868 1754.4 0.0986

100 Aula 4  Cálculo Numérico


1111 ×10
×10
4 4

2.52.5

Log da evolução das bactérias


Log da evolução das bactérias
1010 + +

Log da evolução das bactérias


Log da evolução das bactérias
99 22

88 1.51.5

77
11
66

66 0.50.5

44
00 1010 2020 3030 4040 5050 6060 00
00 1010 2020 3030 4040 5050 6060
Tempo
Tempo
emem
horas
horas
Tempo
Tempo
emem
horas
horas
Dados
Dadosdos
doslogaritmo
logaritmo
dada
evolução
evolução
dasdas
bactérias
bactérias Evolução
Evoluçãodas
das
bactérias
bactérias
emem
4848horas
horas
Ajuste
Ajuste
aoao
logaritmo
logaritmodada
evolução
evolução
das
das
bactérias
bactérias Ajuste
Ajuste
à evolução
à evolução
das
das
bactérias
bactérias

Figura 4 – Ajuste para a evolução das bactérias, feito relativamente a ln(yexp).

Portanto, o modelo h(t) = 4.106 + 0.0987 t implica

y(t) = e4.106 e0.0987t = 60.86∗ e0.0987t.

Os gráficos de h(t) e de y(t) na Figura 4 sugerem uma boa adequação.

Na verdade, a variável t não precisa ser tempo, nem tampouco as funções gi(t) precisam
ser funções de uma única variável. No exemplo a seguir, tratamos de um problema no qual
cada dado de posição ti é um polinômio de duas variáveis nas coordenadas de um ponto da
trajetória de um cometa em torno do Sol.

Exemplo 5
Um pequeno cometa só foi percebido pela primeira vez quando já se aproximava do Sol. Com
base em telescópios lá do século XVIII, hipotéticos astrônomos trabalharam com 8 pontos de sua
trajetória, registrados com o Sol na origem, e tendo como eixo dos x a direção Sol-Terra, de modo
a prever sua órbita. A unidade usada é uma Unidade Astronômica (1 U.A. = 149.6*106 km), que
corresponde à distância média entre a Terra e o Sol. Procura-se a equação da trajetória desse cometa.

Tabela 6 – Coordenadas de posição do cometa, medidas em U.A.

X1 (em U.A.) 3.6 0.2 –0.97 –0.76 1.4 5.5 8.1 14.
X2 (em U.A.) 7.4 3.7 0.72 –0.34 –1.6 –1.2 –0.48 2.0

Como a trajetória de um cometa que orbita em torno do Sol é uma elipse, sabemos que
satisfaz a uma equação do segundo grau nas coordenadas x = (x1,x2). Ou seja, podemos supor
que a órbita do cometa satisfaz a uma equação do tipo

c1 x12 + 2c2x1x2 + c3x22 + c4x1+ c5x2 = – c6 .

Aula 4  Cálculo Numérico 101


Além disso, essa equação tem um grau de liberdade evidente, pois se dividirmos
todos os seus membros por c6, obtemos a mesma elipse. Ou seja, procuramos números
c1, c2 , ·····,c5 , tais que c1x12 + 2c2x1x2 + c3x22 + c4x1+ c5x2 = –1, nos pontos de sua
trajetória. Podemos interpretar isso dizendo que os valores de c ajustarão o modelo
H(x1,x2) = c1 x12 + 2c2x1x2 + c3x22 + c4x1 + c5x2 ao vetor F, cujas coordenadas são todas
iguais a –1. Se cada ponto da órbita do cometa satisfizesse exatamente nosso modelo, teríamos:

c1 3.62 + 2c2 3.6∗ 7.4 + c3 7.42 + c4 3.6 + c5 7.4 = −1


c1 0.22 + 2c2 0.2∗ 3.7 + c3 3.72 + c4 0.2 + c5 3.7 = −1
...........................................................
c1 14 + 2c2 14∗ 2 + c3 22 + c4 14 + c5 2 = −1
2

Veja que se trata de um sistema linear Ac = b, com 8 equações lineares e 5 incógnitas,


sem muita chance de ter solução. A saída é a mesma de antes, ou seja, resolver a equação
normal ATAc = ATb. Com ‘lsq’ do Scilab, obtivemos:

20

15

Órbita prevista para o cometa


10
Sol
Terra
5 Dados do cometa
Eixo X1 - Sol -Terra
0

-5
0 5 10 15 20 25 30 35

Figura 5 – Órbita prevista para o cometa a partir de 8 dados de posição.

−−> c = lsq(A, b)

– 0.1125 0.1337 –0.2633 0.9602 0.5835

Isto significa que a elipse encontrada obedece à equação:

–0.1125x12 + 0.1337x1x2 – 0.2633x22 + 0.9602x1 + 0.5835x2 = –1.

Usando o comando contour, obtivemos, na Figura 5, a órbita do cometa, juntamente com


as posições medidas dos cometas, da Terra e do Sol.

102 Aula 4  Cálculo Numérico


Resumo
Nesta aula, você reviu conceitos importantes da álgebra linear, como bases
e representações matriciais de SEVs, bem como formas de manipulá-las
computacionalmente para resolver problemas. Trabalhou o método dos quadrados
mínimos para ajustar modelos a dados.

Autoavaliação
Essa aula lhe ajudou a relembrar os conceitos de SEV, de bases e de projeção
1 ortogonal? Se você teve muita dificuldade em rever esses conceitos, contate-nos.
Vamos conversar.

Por que todo SEV de n é do tipo Col(A), para alguma matriz A = Am×n?
2
Por que a projeção ortogonal num SEV fica mais fácil se temos uma base ortogonal
3 do SEV? Tente, também, uma explicação geométrica, além da algébrica.

Como você explica que ATAc = ATb não é suficiente para garantir Ac = b? Supondo
4 que ATAc = ATb, dê pelo menos duas interpretações diferentes para Ac – b.

Dada a matriz C = ATA, como você calcularia o ângulo entre A(1) e A(3) ?
5
Se A = Am×n, m n e ATA = In×n , por que se afirma que AAT ≠ Im×m ?
6

Resolva os Exercícios propostos. As soluções para estes exercícios estão disponíveis


7 no Moodle.

Aula 4  Cálculo Numérico 103


Exercícios propostos
1)  Armazene em Scilab A = rand(5,4)*rand(4,5) e B = rand(5,3)*rand(3,5). Ache as
bases ortonormais de V = Col(A) e W = Col(B). Diga, também, por que seria mesmo
de se esperar que dim(V) ≤ 4 e dim(W) ≤ 3.

2)  Encontre a reta que melhor se aproxima dos pontos A = (–2,1), B = (4,5), C =(7, 8), no
sentido de quadrados mínimos. Teste para ver se A e B estão na reta que você encontrou.
Sem fazer mais nenhuma conta, diga se existe alguma reta contendo os pontos A, B e C,
justificando sua resposta.

3)  Na Aula 11 de Álgebra Linear I (Geometria de espaços euclidianos) você viu a definição
de complemento ortogonal de um SEV W ⊂ n como sendo W ⊥ = {x ∈ n : x
é ortogonal a todos os vetores de W}. Lá você viu que, se W = Col(A), então
W ⊥ = N (AT ). O objetivo deste exercício é trabalhar esse resultado usando o Scilab.

i - Considere a matriz X = [S Q], formada com as matrizes S e Q do Exemplo 1.

Mostre que X é uma matriz ortogonal, ou seja, que XTX = XXT = I4×4 .

ii - Conclua que β = {S (1) , S (2) , Q(1) , Q(2) } é uma base ortonormal do 4 e diga
por que isso significa que N (AT ) = Col(A)⊥.

iii - Teste para ver se o que aconteceu em i acontece em geral. Ou seja, escolha
matrizes A = Am ×n, a seu gosto, peça a Scilab que calcule S = kernel(A') e
Q = orth(A), e veja que X = [S Q] resulta numa matriz ortogonal, em cada caso.
Explique o que isso significa, nesses casos testados em que N(AT) = Col(A) ⊥.

4)  Este exercício deve ser feito para que você perceba como o método de ortogonalização
de Gram-Schmidt aplicado às colunas de A = A4×3 , de posto 3, produz uma fatoração
A = QR.

i - Comece revendo o método de ortogonalização de Gram-Scmidt, aplicando-o


às colunas de uma matriz A = A4x3 , de posto 3, e observe que você obtém as
seguintes relações entre as colunas de A e as colunas ortonormais Q (1), Q (2) e
Q (3) de Col(A) obtidas: A(1) = R11Q (1); A(2) = R12Q (1) + R22Q (2); A(3) = R13Q (1) +
R23Q (2)+ R33Q (3), onde os Rij são números que resultam da aplicação do método.

ii - Conclua que A = QR, onde QTQ =I3x3 e R são triangulares superiores, sem
zero na diagonal.

104 Aula 4  Cálculo Numérico


Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

LOPES, Jonas Gonçalves; PEREIRA, Marcelo Gomes. Álgebra Linear I. Natal: EDUFRN, 2006.

______. Álgebra Linear II. Natal: EDUFRN, 2007.

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 4  Cálculo Numérico 105


Anotações

106 Aula 4  Cálculo Numérico


Autovalores e Valores
Singulares

Aula

5
Apresentação

E
sta aula e a próxima estão intimamente interligadas. Nesta Aula 5, iniciamos revisitando
os principais resultados sobre autovalores e autovetores que você viu em AL2.
Trabalharemos algumas aplicações com o Scilab, de forma a consolidar a idéia de uso
de bases do n , formadas por autovetores de A e discutiremos um pouco as dificuldades
numéricas que surgem no cálculo de autovalores e autovetores. Nosso principal foco nesta
aula é partir do teorema da diagonalização das matrizes simétricas, de modo a obter a
Decomposição em Valores Singulares (DVS) de uma matriz A = Am × n . A DVS; provavelmente,
será para você uma novidade teórica, pois você não a viu nas disciplinas AL1 e AL2. A ênfase
na DVS vem do fato de que ela fundamentará toda a nossa discussão de erros numéricos
na resolução de um sistema linear e que constitui o foco do que faremos na Aula 6 (Valores
Singulares e Erros Numéricos ao resolver Ax = b). A diagonalização de A corresponde à
terceira e a DVS à última das 4 grandes fatorações que resumem a Álgebra Linear Numérica.
Infelizmente, teremos de deixar para a Aula 6 toda a discussão de aplicações da DVS, já que
não teremos espaço para fazê-lo nesta aula.

Objetivos
Revisitar os teoremas de diagonalização de matrizes, com
1 ênfase na diagonalização de matrizes simétricas.

Trabalhar, via Scilab, problemas envolvendo diagonalização


2 de matrizes.

Definir vetores e valores singulares de uma matriz


3 A = Am × n , bem como a fatoração correspondente a
Decomposição em Valores Singulares.

Aula 5  Cálculos Numéricos 109


Autovalores e autovetores
Recomendamos enfaticamente que você dê uma refrescada no assunto das Aulas 7 e 8
de AL2. Lá você viu, inicialmente, que:

x ≠ 0 é autovetor de A = An × n , caso Ax = λx , para algum número λ


ƒƒ 

um tal λ é dito autovalor de A e é raíz do polinômio característico, ou seja:


ƒƒ 

p(λ ) = det (A – λ I )

Como esse polinômio tem grau n, o teorema fundamental da álgebra diz que é possível
encontrar exatamente n raízes de p(λ) = 0 , contadas as suas multiplicidades, ou seja, a
fatoração de p(λ) em fatores lineares.

p(λ) = (λ − λ1 )n1 (λ − λ2 )n2 . . . (λ − λk )nk , onde n = n1 + n2 + . . . + nk

Só que essa fatoração só é sempre possível se admitimos raízes complexas. Nesta aula
vamos nos ater ao caso no qual, não apenas a matriz A tem entradas reais, como também
AV1
todos os autovalores são reais. Há dois resultados fundamentais sobre esse assunto nas Aulas
AV1 corresponde ao 8 e 11 de AL2:
teorema 2 da aula 8 de AL2.
Quanto a AV 2, na aula 8
você viu uma versão para
n = 2 dele. O teorema 1 da
aula 11, garante que todos
AV1 - Se os autovalores de A são reais e distintos entre si, então os n respectivos
os autovalores de uma
matriz simétrica são reais. autovetores formam uma base do n .
Se forem também distintos,
AV1 garante AV2. Mas ele AV 2 - Se a matriz A é simétrica, então é possível encontrar uma base ortonormal
vale também no caso mais do n , formada com autovetores de A.
geral, mesmo que A admita
autovalores repetidos.

110 Aula 5  Cálculos Numéricos


No Scilab, o comando spec encontra essas bases, caso existam. O nome spec está
relacionado ao espectro em português (spectrum em inglês e spectre em francês), que é um
nome dado ao conjunto de autovalores de uma matriz. Ao se digitar [S,D] = spec(A), S será
uma matriz cujas colunas são autovetores de A e D, uma matriz diagonal, cujos elementos
serão os respectivos autovalores.

Exemplo 1
−−> A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; [S, D] = spec(a)
D = 16.116844 0 0
0 −1.116844 0
0 0 −2.908D − 16
S = −0.2319707 −0.7858302 0.4082483
−0.5253221 −0.0867513 −0.8164966
−0.8186735 0.6123276 0.4082483

Vamos testar se A*S (1) = D11S (1), testando a norma de A*S (1) – D11S (1)

−−> norm(A*S(:,1) – D(1,1)*S(1,1)),

ans = 4.351D – 15

Deu certo, até aqui. Em particular, lembre que a j -ésima coluna de A*S é A*S (j) e que
a j -ésima coluna de S ∗D é S ∗D(j) = D1j S (1) + D2j S (2) + D3j S (3) = Djj S (j). Portanto,
você não vai se surpreender ao digitar no Scilab A*S, S *D e descobrir que A*S = S*D, a
menos de erros de arredondamento desprezíveis.

−−> A*S
ans = −3.7386354 0.8776498 −4.441D − 16
−8.4665342 0.0968877 −8.882D − 16
−13.194433 −0.6838743 −1.332D − 15
−−> S *D
ans = −3.7386354 0.8776498 −1.187D − 16
−8.4665342 0.0968877 2.374D − 16
−13.194433 −0.6838743 −1.187D − 16

Em particular, sempre que os autovalores forem diferentes entre si, vale dizer os elementos
na diagonal de D, nosso primeiro resultado garante que as colunas de S formarão uma base de
n . Nesse caso, a matriz S será invertível, o que nos permite ilustrar a terceira das fatorações
fundamentais da Álgebra Linear, qual seja, A = S *D *S –1. Checando neste exemplo,
−−> S *D *inv(S )
ans = 1. 2. 3.
4. 5. 6.
7. 8. 9.

Aula 5  Cálculos Numéricos 111


Ao testar S T S, obtemos:

−−> S’ *S // Testando S TS
ans = 1. −0.2734344 −1.110D − 16
−0.2734344 1. −3.886D − 16
−1.110D − 16 −3.886D − 16 1.
T
Veja que as duas primeiras colunas de S não são ortogonais, já que S (1) S (2) = –0.2734344 ≠ 0.
Nem tinham a obrigação de sê-lo. Contudo os autovetores S (j) são todos unitários, em norma, já
T
que ||S (j )|| 2 = S (j ) S (j ) = 1, para j = 1,2,3. Entre todos os possíveis autovetores, spec devolveu,
nas colunas de S, vetores de norma 1. Se você for lá checar, já havia feito isso anteriormente nos
comandos kernel, orth, linsolve e qr. Tal prática constitui um padrão em softwares numéricos,
qual seja o de devolver, sempre que tiver a opção, matrizes com colunas ou linhas de norma 1.
Isso as torna mais equilibradas e tende a reduzir erros de arredondamento na solução de
sistemas lineares.

Exemplo 2
−−> A = rand(3, 3); B = A∗A;

B = 1.3459816 1.1654342 0.6865300


1.1654342 1.0744718 0.511551
0.6865300 0.511551 0.4748383
Veja que, nesse caso, B resultou simétrica (vide a Atividade 4 da Aula 2).

−−> [S, D] = spec(B)


D = 0.0034818 0. 0.
0. 0.1824132 0.
0. 0. 2.7093967
S= 0.7086344 −0.0426920 0.7042831
−0.5774960 0.5383962 0.6137002
−0.4053835 −0.8416097 0.3568716
T
Verifique que também aqui obtivemos A = S *D *S –1. Ao checar S S, obteremos

−−> S' *S
ans = 1. 5.551D − 17 −2.776D − 17
5.551D − 17 1. 5.551D − 17
−2.776D − 17 5.551D − 17 1.

O fato de S' *S ser a identidade indica que as colunas de S definem uma base ortonormal
do  . Esse é o diferencial na diagonalização de uma matriz simétrica. Sempre propiciará uma
3

base ortonormal do n, formada por autovetores. Em termos matriciais, isso quer dizer que
S é uma matriz ortogonal, ou seja, S –1 = S T. Vide a Atividade 3.c, da Aula 4 desta disciplina.

112 Aula 5  Cálculos Numéricos


Atividade 1
Digite no Scilab: −−> n = 5; A = rand(n,n); B = ATA; [SB,DB] = spec(B).

Teste para ver que B = SB *DB *SB –1, que todos os autovalores de B
1 são reais e que os autovetores obtidos nas colunas de SB formam uma
base ortonormal do n. Explique por que isso não foi uma coincidência.

Digite no Scilab [SA,DA] = spec(A). Provavelmente SA e DA têm


2 entradas complexas. Se não as tiver, tente com uma nova A = rand(5,5).
Teste algumas vezes e observe que é mais comum obter SA e DA com
entradas complexas do que sem nenhuma. Verifique que ainda assim
vale a fatoração A = SA*DA*SA–1. Continua sendo verdade que as
colunas de SA são autovetores de A e os termos da diagonal de DA
os correspondentes autovalores?

Observe que A tem um autovalor real. Diga por que, mesmo testando
3 1000 vezes com valores diferentes de A = rand (5,5), sempre existirá
um autovalor real de A.

Atividade 2
Peça a Scilab [S,D] = spec(A) para várias matrizes A = rand(n,n) e
1 diferentes valores de n ≤ 1000 e observe que em todas elas você obteve
S invertível e A = S *D *S –1.

Você já estava meio esquecido dessa coisa de autovetores e estava


2 começando a desconfiar que toda matriz A admite uma base de
autovetores no C n , não é? Pois então faça n = 5 e teste de novo
com a matriz A = eye(n,n) + diag (b ,1), onde b = rand(n –1,1).
Veja que nesse caso continua valendo A*S = S *D, mas S agora não
é mais invertível. Verifique que, nesse caso, não há dois autovetores
linearmente independentes.

Aula 5  Cálculos Numéricos 113


Regra de ouro DIAG
Se para A = An × n , você estiver interessado na relação y = Ax e dispuser de uma base
β = {S (1), S (2), ..., S (n)} de n , formada por autovetores de A, considere a possibilidade de
usar β como sistema de coordenadas no n . Veja que, desse modo,

Se x = [x]β , isso significa

ƒƒ 
x = Sx = x1 S (1) + . . . + xn S (n)

y = Ax = A(x1 S (1) + . . . + xn S (n) ) = x1 λ1 S (1) + . . . + xn λn S (n)


ƒƒ 

O formato matricial de nossa regra de ouro é a diagonalização D = S –1AS.


Equivalentemente, é a fatoração A = SDS –1. Veja a relação entre os dois formatos:

    
λ1 x1 λ1 0 ... 0 x1
    
 λ2 x2   0 λ2 ... 0  x2 
y = [y]β = [Ax]β =
 .. = .
  . .. .. .. 
 ..  = Dx =

−1
S AS x

 .   . . . .  . 
Diagonalização [x]β
λn xn 0 0 . . . λn xn de A
     
[x]β
D = [T]ββ representa
x → T(x) = Ax,
na base β

Exemplos e atividades envolvendo a regra de ouro


Vamos dedicar o resto da aula a trabalhar consequências de nossa regra de ouro.
Começaremos explorando-a para resolver sistemas lineares com matrizes simétricas.

Exemplo 3 – Resolvendo
Ax = b, no caso de A ser simétrica
Considere a matriz B do Exemplo 2. Ela é simétrica e dispomos de uma base ortonormal de
autovetores calculada pelo Scilab. Como vimos acima, isso significa que S –1 = S T, neste caso.
A partir daí, a regra de ouro diz que para resolver Bx = c, é melhor trabalhar na base β , ou seja:

114 Aula 5  Cálculos Numéricos


Ax = x1 λ1 S (1) + x2 λ2 S (2) + x3 λ3 S (3) = c = c1 S (1) + c2 S (2) + c3 S (3) = Sc

onde c = Sc ⇒ c = S T c , já que S –1 = S T. Daí segue que,


 
 x
 1 1 λ = c1  x1 = c1 /λ1

x2 λ2 = c2 ⇒ x2 = c2 /λ2

 

x3 λ3 = c3 x3 = c3 /λ3

No Scilab, trabalhando A, B, S e D obtidos no Exemplo 2 e c = rand(3,1), basta digitar:

−−> c = rand(3,1); c_bar = S’ *c; d = diag(D) // Obtendo c e c_bar = [c]β = S Tc

−−> x_bar = c_bar./d; //Dividindo cada c_bar(i) por D(i,i), de forma a obter x_bar(i)

−−> x = S *x_bar; teste = norm(A*x–c)/norm(c) // Calculando x e testando.

Isso significa evitar a eliminação de Gauss e fazer apenas uma multiplicação matriz-vetor,
seguida de 3 divisões. É fácil constatar que esse método funciona para qualquer valor de n,
com B simétrica. Para n grande, isso é bem mais rápido que Gauss-Jordan, desde que você
tenha a base β . O difícil, computacionalmente, é obter a base β . Vide Atividade 3 logo a seguir.

Atividade 3
Considere n = 500; A = rand(n,n); B = A+A’ ; c = rand (n ,1). Lembra
ainda do comando timer(  ), usado nas Aulas 2 e 3 para calcular tempo de CPU?
Olha ele aqui de volta...

Resolva Bx = c com ‘\‘ e armazene em t_GJ o tempo de CPU para


1 fazê-lo.

Obtenha a fatoração B = SDS –1 e armazene em t_sp o tempo de CPU


2 para obtê-la.

Resolva Bx = c, usando o método empregado no Exemplo 3 e


3 armazene em t_D o tempo para executá-lo.

Constate que t_D < t_GJ < t_sp.


4

Aula 5  Cálculos Numéricos 115


Exemplo 4
Vamos voltar ao caso da órbita do cometa do Exemplo 6, da Aula 4. Naquele exemplo,
vimos que a órbita do cometa era uma elipse, dada pela equação do 20 grau:

P(x) = – 0.1125x 12 + 0.1337x 1 x 2 – 0.2633 x 22 + 0.9602x 1 + 0.5835x 2 + 1 = 0

Nosso objetivo aqui é encontrar um sistema de coordenadas no qual a mesma elipse esteja
na sua forma canônica. Em particular, você vai calcular a maior distância entre o sol e o cometa,
naquele exemplo. Antes de prosseguir, veja as Aulas 12 de AL2, sobre formas quadráticas e
13, sobre cônicas. Em especial, o exercício resolvido 2, da Aula 13. Para encontrar a forma
canônica desejada, veja o que diz o resumo da Aula 12:

Associar uma forma quadrática à equação e diagonalizá-la para eliminar os termos


x 1x 2. Em seguida, basta completar os quadrados e eliminar os termos x 1 e x 2.

Começamos escrevendo P(x) na sua forma matricial. Em seguida, nos itens 1 e 2 fazemos
o que prescreve o trecho do resumo da Aula 12 que destacamos.
 
−0.1125 0.06685
P (x) = xT Ax + Kx + f = xT x + [0.9602 0.5835]x + 1
0.06685 −0.2633

1)  Base ortonormal β = {S (1) , S (2) }, que diagonaliza x TAx:


Com spec, Scilab nos devolve o que queremos

−−> A = [−.1225, 0.06685; 0.06685, −0.2633]; [S, D] = spec(A)


D = −0.2899829 0.
0. −0.0958171
S = −0.3707063 −0.9287502
0.9287502 −0.3707063

Ao substituir em x = Sx em P (x) = xT Ax + Kx + f , obtemos

P (x) = P (Sx) = (Sx)T A(Sx) + KSx + 1 = xT T


 SASx +KSx + 1
=xT S −1 ASx=xT Dx

= −0.2899x21 − 0.0958x22 + 0.1860x1 − 1.108x2 + 1

2)  Completando quadrados de forma a eliminar e em x1 e x2 em P (x)::

Corresponde a substituir x = x + c em P (x) em (de modo a obter:

P (x) = P (x + C) = −0.2899 x21 − 0.0958 x22 + F

Com o velho truque de completar quadrados lá da Aula 12 de AL2, obtemos:

c = [5.8781; 2.6004]  e  F = 7.7531.

116 Aula 5  Cálculos Numéricos


Dessa forma, a elipse P (x) = P (x) = P (x) = 0 fica dada por:
2 2
x1 x2
−0.2899 x21 − 0.0958 x22 + 7.7531 = 0 ⇒ + =1
5.17072 8.99532

Podemos pensar que, no sistema de coordenadas com origem em c e base {S (1), S (2)},
a elipse original estará na forma canônica.

Atividade 4
Volte à Figura 5, da Aula 4, e lá esboce os pontos c, bem como a base
1 {S (1), S (2)} do sistema de coordenadas encontrado no exemplo logo acima.

Sabendo que o sol está num dos focos da elipse, calcule a maior distância
2 alcançada entre o sol e o cometa, no Exemplo 6 da aula passada.

Aula 5  Cálculos Numéricos 117


Atividade 5

O objetivo desta atividade é explorar as facilidades da fatoração A = SDS –1 para


calcular potências e raízes de A.

Faça n = 4; A = rand(n,n); B = ATA; [S,D] = spec(B). Observe que


1 D 2 =D *D também é uma diagonal, com entradas D(i,i) 2. Verifique que
B 2 = S *D 2S –1.

Verifique que B 3 = SD 3S –1 e que B 4 = SD 4S –1.


2
Mostre que, para cada n o natural k, D k = D *D *....*D é uma matriz
3 diagonal com entradas D(i,i)k e que B k = SD k S –1.

Com k = 2, considere a matriz diagonal E, tal que E(i,i) = D(i,i)1/k


4 e faça C = SES –1. Verifique que C k = B e explique por que não foi
coincidência isso acontecer. Digite T = B^(1/k) no Scilab e verfique
que resulta B = T k.

Faça o mesmo que em 4, para k = 3 e k = 4, no lugar de k = 2


5 e depois mostre que C = SD 1/k S –1 é uma raíz k de B, ou seja, que
C k = B, para todo k inteiro.

Vá no help do Scilab, veja o que ele diz sobre ‘^’ e explore esse
6 comando. Em particular, teste o que ele devolve ao pedir A^x, com
diferentes valores de A = An × n e de x ∈ n, contra o que você obtem
calculando A = SDS –1 e fazendo Ax = SD x S –1 (D x seria aqui uma
matriz diagonal cujas entradas são D(i,i ) x ).

118 Aula 5  Cálculos Numéricos


Sobre algoritmos para
obter autovalores e autovetores

E
m AL2 a maneira que tínhamos para obter autovalores era calculando-os como raízes do
polinômio característico. Infelizmente, do ponto de vista da aritmética de ponto flutuante,
o problema de encontrar raízes de polinômios é, numericamente, muito “traiçoeiro”, à
medida que n cresce. Na Atividade 6, vamos pedir-lhe que reproduza o célebre exemplo de
Wilkinson que demonstra bem o que foi mencionado. Um método eficiente e robusto para
encontrar autovetores e autovalores não é uma tarefa fácil e está muito além do que cabe numa Autovalores
disciplina inicial de Cálculo Numérico. Via de regra, primeiro procura-se os autovetores, para Por exemplo, um livro
daí obter, como subproduto, os autovalores. Apenas para dar uma ideia de métodos típicos de referência em Álgebra
para encontrar autovetores, na Atividade 7 você vai encontrar um autovetor de uma matriz Linear Computacional
como o de Golub-Van
simétrica por um desses métodos, no caso, o método da potência. Na Aula 8 vamos ver como Loan, referido ao final
se programa o algoritmo da potência no Scilab. Nos complementos da Aula 8 você terá, se desta aula, gasta cerca de
quiser, a oportunidade de conhecer um algoritmo para diagonalizar matrizes simétricas. 100 páginas para trabalhar
seu algoritmo destinado
a obter autovalores e
autovetores de uma matriz.

Atividade 6
Exemplo de Wilkinson

Faça n = 5, c = 1:n, no Scilab e armazene em p o polinômio cujas


1 raízes são as entradas de c, usando o comando poly(c,“x ”,“roots”).
Depois use o comando roots para pedir-lhe as raízes de p. Constate que
deu certo e roots(p) lhe devolveu as cinco raízes esperadas.

Tente fazer o mesmo com n = 30 e constate que não deu certo.


2
Se todas as contas fossem em aritmética exata, isso também
3 aconteceria? Será que erros de arredondamento/truncamento na décima
sexta casa decimal podem falsificar tanto o resultado no caso n = 30?

Aula 5  Cálculos Numéricos 119


Atividade 7

O objetivo desta atividade é você observar como o algoritmo da potência funciona


para encontrar o maior autovalor da matriz A = [1,2,3; 2,3,4; 3,4,0]. O
algoritmo da potência começa num ponto xc e realiza várias iterações com esse
xc, até chegar num autovetor

i - Digite no prompt do Scilab:

−−> A = [1, 2, 3; 2, 3, 4; 3, 4, 0]; x0 = rand(3, 1);

−−> xc = x0/norm(x0); //xc = x0/x0 é nosso ponto inicial

−−> xc = A∗ xc ; //A 1a iteração começa substituindo xc por A∗ xc

−−> xc = xc/norm(xc) ; //A 1a iteração se conclui normalizando xc.

ii - Peça a Scilab que repetidamente substitua xc por:

−−> xc = A∗ xc ; xc = xc/norm(xc); ////Na Na verdade,


verdade, todas
todas as
as iterações são iguais a 1a
iterações são
iguais a 1a até que xc estabilize num valor e pare de mudar.

iii - Verifique que o xc assim obtido é um autovetor. (Sugestão: Faça s valer o


quociente entre a primeira coordenada de A*xc e a de xc e depois teste para
ver que A*xc = s *xc).

Observação 1 – A razão pela qual o algoritmo da potência funcionou pode ser vista, usando
nossa regra de ouro, da seguinte maneira:

1.i – A é simétrica. Portanto há uma base ortonormal do  , β = {S , S , S }, formada


3 (1) (2) (3)

por autovetores de A, com respectivos autovalores reais, que suporemos ordenados de tal
forma que |λ1 | > |λ2 | ≥ |λ3 |. Na verdade, essa é uma limitação do método. Ele precisa de um
autovalor dominante, no sentido de maior que os demais, em valor absoluto. Vamos escrever
o x 0 inicial na base β como

x 0 = Sx0̅ = x ̅0 S (1) + x ̅0 S (2) + x ̅0 S (3)


1 2 3

Ou seja, x0 = [x0 ]β é a representação de x 0 inicial na base β . Uma segunda hipótese, esta


muito razoável, é x0 1 = 0 . Ao acaso, é quase certo acontecer x0 1 = 0 . Felizmente, o método
é pouco sensível a valores relativamente pequenos de |x0 1 |.

120 Aula 5  Cálculos Numéricos


1.ii – Veja que, na n-ésima iteração xc é um múltiplo de norma 1 do vetor Anx 0. Ou seja,
fazendo K = 1/|| Anx 0 ||, obtemos:

xc = K ∗ An x0 = K ∗ An (x0 1 S (1) + x0 2 S (2) + x0 3 S (3) ) =


= K ∗ (λn1 x0 1 S (1) + λn2 x0 2 S (2) + λn3 x0 3 S (3) )
= K ∗ (λn1 x0 1 S (1) + λn2 x0 2 S (2) + λn3 x0 3 S (3) )
λn2 λn3
= K ∗ λn1 (x0 1 S (1) + x S (2)
+ x S (3) )
λn1 0 2 λn1 0 3

Afirmamos que, “com um pouquinho de sorte”, xc → ± S (1), à medida que n → ∞


(O “pouquinho de sorte” se refere a estarmos supondo x0 1 = 0 e |λ1 | > |λ2 | ≥ |λ3 |.
Isso significa exatamente o que você constatou na Atividade 7. Ou seja, que xc “encontra” o
autovetor S (1) a partir de alguma iteração n.

Para justificar a afirmação, veja que λn2 /λn1 → 0 e λn3 /λn1 → 0 , já que estamos supondo
 
|λ2 | |λ1 | < 1 e |λ3 | |λ1 | < 1. Significa que, na conta logo acima, os dois termos a esquerda
tendem a zero, a medida que n → ∞ . Portanto:

xc − K ∗ λn1 x0 1 S (1) → 0, à medida que n → ∞


 
Em particular, obtemos daí K ∗ λn1 x0 1 S (1)  = K ∗ λn1 x0 1   
S (1)  → xc = 1
  
=1
→1

Mas |K ∗ λn1 x0 1 | → 1, à medida que n → ∞ , significa então:

xc ≈ K ∗ λn1 x0 1 S (1) → ± S (1)


  
→±1

Decomposição em Valores
Singulares (DVS) de uma matriz

A
DVS de uma matriz A = Am×n é muito relevante na Álgebra Linear Numérica e
corresponde à quarta grande fatoração da Álgebra Linear. Vamos obtê-la aplicando nossa
regra de ouro à matriz ATA. É nela que o algoritmo linsolve de Scilab se baseia para
resolver Ax = b. Os valores singulares geram a forma mais “popular” de dizer se uma matriz
A é melhor ou pior condicionada, no sentido de gerar soluções mais ou menos confiáveis do
respectivo sistema linear Ax = b. É também a melhor ferramenta disponível para conceituar
o posto de A, do ponto de vista numérico. Indicaremos ainda uma maneira de compactar uma
imagem digitalizada, usando DVS. Como não dará para fazer tudo nesta aula, deixaremos as
aplicações para a próxima aula.

Aula 5  Cálculos Numéricos 121


Vamos definir os valores singulares de uma matriz A = Am×n a partir dos autovalores
de A A. Nosso ponto de partida é que A TA é simétrica (vide Atividade 4 da Aula 2). Portanto,
T

podemos aplicar nossa regra de ouro. Todos os seus autovalores serão números reais. Um
ponto crucial é que nenhum dos autovalores de ATA é negativo. A razão é que, se λ é autovalor
de ATA e x ≠ 0 é um correspondente autovetor, então:

0 ≤ Ax2 = (Ax)T Ax = (xT AT )Ax =


= xT (AT Ax) = xT (λx) = λx2

Mas 0 ≤ λx2 , com x > 0, significa λ ≥ 0.

Definição

Os valores singulares de A = Am ×n são as raízes quadradas positivas dos


autovalores de ATA. Ou seja,

Se λ1 ≥ λ2 ≥ · · · ≥ λn ≥ 0 são os autovalores de ATA, então os valores


singulares de A serão
  
σ 1 = λ 1 ≥ σ 2 = λ2 ≥ · · · ≥ σn = λ n ≥ 0

Além disso, se um autovalor λ de ATA tiver multiplicidade algébrica k, o


> 0também considerado com multiplicidade k.
correspondente valor singular σpserá

Observação 2 – É usual ordenar os valores singulares do maior para o menor, na


forma acima. Assim o faremos nas nossas aulas.

Como ATA é simétrica, apliquemos nossa regra de ouro. Seja α = {V(1), V(2),
......, V (n)} base ortonormal do n , com autovetores de ATA correspondentes
a σ12 ≥ σ22 ≥ . . . ≥ σn2

α é denominada de base dos vetores singulares à direita de A.

Uma das propriedades mais relevantes dos vetores singulares à direita reside em:

AV (i) e AV (j) são vetores ortogonais, se i ≠ j


ƒƒ 
ƒƒ AV (i)  = σi , para i = 1, . . . , n
Dado que α é ortonormal, ambas as afirmações
 resultam de
0, se i = j
(AV (i) )T (AV (j) ) = λj V (i)T V (j) =
λi = σi2 , se i = j

122 Aula 5  Cálculos Numéricos


Decomposição em
Valores Singulares “reduzida” (DVSr)
Trabalharemos a definição de vetores singulares à esquerda em duas etapas. Nessa
primeira etapa, definiremos uma base ortonormal importante de Col(A):

Definição 2 - Vetores singulares à esquerda, em Col(A)

Suponha que σp > 0 seja o menor valor singular não nulo de A. Vale dizer,
ou bem p = n, ou então σp+1 = . . . = σn = 0 . Nesse caso, definimos os p
primeiros vetores singulares à esquerda de A como:

U (1) = AV (1) /σ1 , U (2) = AV (2) /σ2 , . . . , U (p) = AV (p) /σp

Observação 3 – β = {U (1) , U (2) , . . . , U (p) } resulta um conjunto ortonormal de vetores em


Col(A), pelo que destacamos um pouco mais acima. Na verdade, β é uma base ortonormal
de Col(A)

Prova

Para concluir que β é uma base ortonormal de Col(A), basta mostrar que β gera Col(A).
Para tanto, tome y ∈ Col(A), ou seja, y = Ax, para algum x ∈ n . Descrevendo x na base
ortonormal α do n , formada pelos vetores singulares à direita de A, obtemos:
 
x = V x = x1 V (1) + · · · + xn V (n) ⇒ y = Ax = A x1 V (1) + · · · + xn V (n)

⇒ y = x1 σ1 U (1) + · · · + xp σp U (p) + xp+1 σp+1 U (p+1) + · · · + xn σn U (n)


 
=0 =0

Isso mostra que todo vetor y ∈ Col(A) é gerado por combinações lineares de U (1), U (2),
···, U (p) . Vale dizer que β gera Col(A).

Em particular, p = Posto(A) = dim(Col(A)).

Obtemos ainda uma “versão reduzida” da DVS, na forma:

Aula 5  Cálculos Numéricos 123



 (1) = σ U (1)
 AV
 1    
..
. ⇒ AV (1)
, · · · , AV (p)
= σ 1 U (1)
, · · · , σ p U (p)
⇒ AV = U Σ(p)


 AV (p) = σ U (p)    
2
 
3
p

AV = AV ( : , 1 : p ) σ1 · · · 0 7
   6
6 . . 7
6 . ..
Vb em scilabês U Σ(p) =U 6 . . .. 7 7
4 5
0 · · · σp

Na verdade, veja que, para cada 1 ≤ k ≤ p, podemos falar numa “DVS k -reduzida”:
 
σ1 · · · 0
 
AV = U  Σ(k) = U  ... . . . ... ,
 
0 · · · σk

Aqui estamos representando por V e U  as matrizes formadas com os k primeiros vetores


singulares à direita e à esquerda, respectivamente e por Σ(k) uma matriz diagonal, com
os k primeiros valores singulares de A na diagonal.

Observação 4 – Chamamos sua atenção para um pequeno truque de notação nestas aulas,
que consiste em trabalharmos com duas notações distintas para representar nossas variáveis.
Uma em “matematiquês” (σ1 , V (1) , U (1) , . . .) e outra, correspondentemente, em “Scilabês”
(sig(1), V(:,1), U(:,1), ...). Infelizmente, Scilab parece não gostar de letras gregas... Já em
“matematiquês”, a letra σpé>a mais
0 popular para representar valores singulares. Por outro
lado, em “Scilabês”, dá para descrever uma matriz numérica pequena numa única linha, em
“matematiquês” só forçando a barra, etc. Na verdade, julgamos importante que você tenha
“fluência” nas duas “linguagens”.

Exemplo 5
Nosso objetivo aqui é usar o comando ‘spec’ para obter valores e vetores singulares da
matriz A abaixo, bem como observar a correspondente DVS “reduzida” de A.

−−> A = [7, 6; −9, −2]


A= 7. 6.
−9. −2.
−−> [S, D] = spec(A∗ A)
D = 10. 0.
0. 160.
S= 0.4472136 −0.8944272
−0.8944272 −0.4472136

124 Aula 5  Cálculos Numéricos


 √  √
Valores Singulares: σ1 = D22 = 160 e σ2 = D11 = 10 .

−−> sig = [sqrt(D(2, 2)); sqrt(D(1, 1))]//sig é 2×1; sig(1) é o maior valor singular e sig(2) o menor

sig = 12.649111
3.1622777

Vetores Singulares à direita: V (1) = S (2) e V (2) = S (1)

−−> V (:, 1) = S(:, 2) //V é matriz 2×2, cuja coluna V(:,1) armazena o 10 vetor singular à esq.

V = −0.8944272
−0.4472136
−−> V (:, 2) = S(:, 1), // A 2a coluna de V armazena o vetor singular à esq. associado a sig(2)

V = −0.8944272 0.4472136
−0.4472136 −0.8944272

Vetores Singulares à esquerda: U (1) = AV (1) /σ1 e U (2) = AV (2) /σ2

−−> U = [A∗ V (:, 1)/sig(1), A∗ V (:, 2)/sig(2)] // Vetores singulares à direita nas colunas de U

U = −0.7071068 −0.7071068
0.7071068 −0.7071068

Em matematiquês,
  
AV (1) = σ1 U (1) σ1 0
⇒ AV = U ⇒ AV = U Σ
AV (2) = σ2 U (2) 0 σ2
  
M atriz Σ

Como V é uma matriz ortogonal, ou seja, V TV = VV T = I 2 ×2 , obtemos, nesse caso:

AV = U Σ ⇒ A = A I = A V V T = UΣ V T

Veja que podemos obter diretamente a fatoração A = U Σ V T , com o comando ‘svd’


(de Singular Value Decomposition, em inglês). −−> [U, SIG, V ] = svd(A)

V = −0.8944272 −0.4472136
−0.4472136 0.8944272

SIG = 12.649111 0.
0. 3.1622777

U = −0.7071068 0.7071068
0.7071068 0.7071068

Aula 5  Cálculos Numéricos 125


Atividade 8
Consulte o help sobre ‘svd’ e armazene A = [20,-10;20,-35;24,-32], no Scilab;

Diagonalize ATA, ou seja, ache a fatoração ATA = SDS T, usando o


1 comando ‘spec’.

Use S e D para obter a DVS “reduzida” de A. Ou seja, ache U = U3×2


2 e V = V2× 2 tais que A*V = U *SIG, com SIG = SIG2×2 sendo a
matriz diagonal dos valores singulares, tal que SIG(1,1) ≥ SIG(2,2)
e UTU = V TV = I 2×2.

Verifique que, nesse caso, também vale também fatoração


3 A = U*SIG*V T. Mostre que Col (A) resultou ser um plano no 3 e
esboce um desenho de Col (A), junto com as bases β = {U (1) , U (2) }
e δ = {A(1) , A(2) }.

Digite [U2, SIG2,V2] = svd(A). Veja que agora ‘svd’ lhe deu uma
4 coluna a mais em U2 e uma linha de zeros a mais em SIG2, mas vale
a fatoração A = U2 *SIG2 *V2 T.

Observe que U não é uma matriz ortogonal, mas U2 é. Veja também que
5 a terceira coluna de U2 é um vetor ortogonal ao plano Col (A) e complete
o esboço feito no item 3, adicionando-lhe a terceira coluna de U2.

Exemplo 6
Cheque que ao entrar no Scilab com

−−> A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12] // A é matriz 4×3

−−> [S, D] = spec(A∗A); // Diagonalização de A’ *A


 
obteremos σ1 = D(3, 3) = 25.4625, σ2 = D(2, 2) = 1.2907 e σ3 = 1.255∗ 10−23 ≈ 0

Como σ3 ≈ 0, na versão reduzida de DVS definida acima, só temos dois vetores singulares
à esquerda. Podemos calculá-los com

126 Aula 5 Cálculos Numéricos


−−> V = [S(:, 3)S(:, 2)S(:, 1)]  // Vetores singulares à direita de A

−−> U = [A∗ V (:, 1)/sig(1), A∗ V (:, 2)/sig(2)]  // Vetores singulares à esquerda, em Col(A)

Com isso obtemos a DVS “reduzida” AV = U


 Σ(2)
   
1 2 3   0.1409 −0.8247
  0.5045 −0.7608   

 4 5 6     0.2428 −0.4262  25.4625 0
  0.5745 −0.0571 =  0.5470


 7 8 9   0.0278  0 1.2907
0.6445 0.6464   
10 11 12    −0.7501 −0.3706 Σ(2)
   Vb   
A b
U

Cheque que ‘−−> [U 2, SIG2, V 2] = svd(A)’ dará, a menos de trocas de sinais simultâneas
nas colunas de U e V, V2 = V e U2 como U com duas colunas a mais. SIG 2 virá 4×3:
 
25.4625 0 0
   
 0 1.2967 0  Σ (2) 0
SIG2 = 

≈

2×1

 0 0 1.56 ∗ 10−15  02×2 02×1


0 0 0

a menos de erros de arredondamento.

Cheque, com o Scilab, que U2 é uma matriz ortogonal. Veja que Col(A) tem dimensão
2 e as duas colunas adicionais de U2 são obtidas por Scilab, nesse caso, como uma base
ortonormal de Col (A)⊥ = N(AT ) (Vide a Aula 11 de AL1, bem como o exercício proposto 3
da aula passada. Olhe ainda o comando kernel, visto na Aula 4).

Continua valendo que A *V 2 = U2 *SIG. A vantagem é que agora tanto V 2 como U2


serão matrizes ortogonais proporcionando a fatoração

A = U 2 * SIG *V2 T

Não deixe de checar isso no computador ao qual você tem acesso. É uma boa maneira
de visualizar como essas coisas funcionam.

Decomposição em Valores Singulares “usual”


Você terá a oportunidade de perceber, na Aula 6, que versões “reduzidas” de DVS, podem
ser muito úteis, por exemplo, na compactação de imagens digitais, com k << p = Posto(A).
Contudo, têm um “defeito”. Como V = [V (1) · · · V (k) ] tem colunas ortonormais, vale que
V T V = Ik×k . Contudo, se k < n, V não é ortogonal. Em particular, V V T = In×n . Já a
matriz dos vetores singulares à direita, V = [V (1) · · · V (n) ] é uma matriz ortogonal. A forma
de consertar isso é considerando:

�  
V = Vn ×n é uma matriz ortogonal, cujas colunas são autovetores de ATA.

Aula 5  Cálculos Numéricos 127


 
Σ(p) 0px(n−p)
�  
Σ = Σm×n = ⋅Σ armazena em Σ ii , para 1 ≤ i ≤ p,
0(m−p)xp 0(m−p)x(n−p)
os valores singulares não nulos σ1 , . . . , σp de A, sendo zero nas demais entradas. Veja
que p = Posto(A) ≤ m e p ≤ n. Se m = p, somem as linhas de zeros de baixo em Σ.
Se p = n, somem as colunas de zeros à direita, em Σ. Se m = n = p, então Σ = Σ(p) .

�  U = Um ×m agora também é ortogonal. A base ortonormal β de Col (A), formada pelos
vetores singulares à esquerda definidos anteriormente, ocupa suas p colunas iniciais,
onde p = Posto(A) = n0 de valores singulares não-nulos.

�  
Se p < m, as colunas U (p +1), U (p +2), ... , U (m) são obtidas como uma base ortonormal
de Col(A)⊥ = N(AT ). Foi o que ‘svd’ calculou no Exemplo 6 e na Atividade 7, a partir
da DVS “reduzida”. Veja ainda a Aula 11 de AL1 e o exercício proposto 3 da aula anterior
para se convencer que a nova U resulta uma matriz ortogonal.

Dessa forma, obtemos a fatoração A = U ∗ Σ∗ V T , que resume a DVS na sua forma


padrão. É o que se obtem ao digitar [U,SIG,V ] = svd(A) no Scilab. As colunas de U são
chamadas de vetores singulares à esquerda. Para ver por que isso funciona, com U, Σ e V
assim obtidos, veja que:

AV = [AV (1) . . . AV (n) ] = [σ1 U (1) . . . σn U (n) ] = [σ1 U (1) σ2 U (2) . . . σp U (p) 0 . . . 0] = U Σ

Como V é ortogonal,  AV = U Σ ⇒ A = AV V T = U ΣV T .

Autoavaliação
Quando você viu os teoremas de diagonalização de matrizes em AL2, você os tinha
1 entendido satisfatoriamente? E agora, ficou mais fácil ou mais difícil seu entendimento
daqueles resultados? Se você não os tinha assimilado adequadamente e permanece
com dificuldades de entender aqueles resultados, por favor, contacte-nos e vamos
trabalhar nisto. Se você entendeu antes e agora se confundiu, mande as pedradas!

Justifique a seguinte afirmação: “Numa base do n formada por autovetores β de


2 A = An ×n , a ação da função linear dada por T(x) = Ax é, na base β , multiplicar
cada coordenada de xi de x = [x]β , pelo autovalor λi .

Faça um resumo das 4 grandes fatorações da Álgebra Linear Numérica que você viu
3 nesta disciplina. Obtenha-as para uma matriz A = rand(m,n), com m = 5 e n = 3.

128 Aula 5  Cálculos Numéricos


Uma matriz A = An×n não invertível pode ser diagonalizável, ou seja, gerar uma base
4 do n formada por autovetores de A? (Sugestão: Teste essa possibilidade com a
matriz A = [1,2,3;4,5,6;7,8,9], do Exemplo 1)

Cheque que A=[34,–2,–10; –2,31,5;–10,5,55] só tem 2 autovalores distintos, mas


5 é diagonalizável. É possível?

É verdade que A = An ×n sempre tem uma DVS, mas pode não ser diagonalizável?
6
Mostre que, se A = A2 × 2 tem valores singulares 2 e 5 e x = x 2× 1 é tal que ||x|| = 1,
7 então 2 ≤ ||Ax|| ≤ 5.

Resolva os exercícios propostos a seguir.


8

Resumo
Nesta aula, você revisitou alguns resultados de autovalores e autovetores e
aprendeu a trabalhar com eles no Scilab. Em particular, usou bases de autovetores
para resolver problemas e aprendeu como a diagonalização de matrizes simétricas
gera a Decomposição em Valores Singulares de uma matriz A = Am × n.

Exercícios propostos
1)  Considere a sequência de Fibonacci f 1, f 2 ,..., definida por f 1 = f 2 = 1 e pela relação
fk+2 = f k +1 + f k , para todo k ≥ 2. O objetivo deste exercício é você perceber que, para k
muito grande, a sequência de Fibonacci se confunde com uma P.G., usando uma técnica
típica de sistemas dinâmicos lineares que introduziremos a seguir:
 
f k
i – Considere, para cada k ≥ 1, o vetor z (k) = e calcule z (1) , z (2) , z (3) e z (4)
fk+1

ii – Considere a matriz A = [0 1;1 1] e verifique que z (2) = Az (1), z (3) = Az (2) e z (4) = Az (3)

iii – Mostre que z (k +1) = Az (k) = A2z (k –1) = A3z (k –2) = ....= Akz (1), se k  é um n0 natural.

Aula 5  Cálculos Numéricos 129


iv – Ache os autovalores λ 1 > λ 2 de A e correspondentes autovetores S (1) e S (2).

v – Teste com Scilab que z (k)/||z (k)|| coincide com ± S (1)/||S (1)|| até 7 algarismos significativos,
para valores de k ≥ 20. Teste também que, para k ≥ 20, f21 /f 20 coincide com λ 1, até 7 algarismos
significativos.

vi - Prove que z (k) /z (k)  → ± S (1) /S (1)  , para k → ∞ e mostre que isso implica
fk+1 /fk ≈ λ1, para k suf. Grande. (Sugestão: pense no método da potência)

2)  Com n = 2, defina A = rand(n,n) e b = rand (n ,1), digite [U,SIG,V ] = svd(A) e


considere as bases α e β de vetores singulares à direita e esquerda respectivamente.

i - Cheque que A = U *SIG *V T e que U e V são matrizes ortogonais. Diga por que U e V
serem ortogonais é o mesmo que dizer que α e β são bases ortonorrmais de n.

ii – Faça b_bar = U’ *b e explique por que isso significa que b_bar = [b]β

iii – Ache x_bar = b_bar./diag(SIG) e faça x = V *x _bar. Teste para ver que um tal x é
uma solução de Ax = b e explique, matematicamente, por que deu certo.

iv – Repita o que fez acima, com n = 3 e n = 4.

Resumos de soluções dos exercícios propostos estão disponíveis no Moodle.

Referências
GOLUB, Gene; LOAN, Charles van. Matrix computations. 3th ed. Baltimore, Maryland: The
John Hopkins University Press, 1996.

LAY, D. C. Álgebra linear e suas aplicações. 2. ed. Rio de Janeiro: Livros Técnicos e
Científicos, 1999.

LOPES, Jonas Gonçalves; PEREIRA, Marcelo Gomes. Álgebra Linear I. Natal: EDUFRN, 2006.

______. Álgebra Linear II. Natal: EDUFRN, 2007.

POOLE, David. Álgebra linear. São Paulo: Thompson, 2006.

130 Aula 5  Cálculos Numéricos


Anotações

Aula 5  Cálculos Numéricos 131


Anotações

132 Aula 5  Cálculos Numéricos


Valores singulares e erros
numéricos ao resolver Ax = b

Aula

6
Apresentação

N
esta aula, terminamos nossa revisita à álgebra linear no ℜn, do ponto de vista da
aritmética de ponto flutuante. Começaremos explorando a DVS obtida ao final da
aula 5 (Autovalores e valores singulares), conforme havíamos prometido. Até aqui,
esperamos que você já esteja percebendo as enormes potencialidades operacionais que
oferece a abordagem da Álgebra Linear com aritmética de ponto flutuante, graças à rapidez
dos computadores em fazer contas com um número grande, porém, finito de algarismos.

Desde a primeira aula, estamos alertando-o para uma importante contrapartida nesta
abordagem, que reside na possibilidade de distorção de resultados devido a erros de
truncamento e arredondamento. Esse tema é muito importante. Nele, reside o preço a se pagar
por estarmos usando aritmética de ponto flutuante em vez de aritmética exata, uma vez que os
erros de arredondamento podem, em alguns problemas importantes, se propagar, de modo a
falsificar completamente um resultado obtido com um algoritmo teoricamente impecável, em
aritmética exata. Nesta aula, nosso foco é avançar um pouco a discussão de erros numéricos
na resolução de sistemas lineares e definir parâmetros que nos permitam identificar potenciais
instabilidades nesta resolução.

Objetivos
Trabalhar com aplicações da Decomposição
1 em Valores Singulares (DVS).

Aplicar a DVS à análise de erros na resolução


2 de sistemas lineares, através do conceito de
número de condição.

Aula 6  Cálculo Numérico 135


Regra de ouro DVS
Começamos pedindo que você faça uma atividade com o objetivo de observar que, no
caso de matrizes simétricas, a DVS é supérflua, nada acrescentando, na prática, ao que já
dizia a diagonalização A = SDST de matrizes simétricas.

Atividade 1
O objetivo principal desta atividade é você perceber, nos itens 2 e 3, a
diagonalização de simétricas e a DVS diferem por filigranas. O item 1 é para
você observar isso num caso concreto. Comece armazenando a matriz simétrica
A = [3 2 2; 2 2 0; 2 0 2] no Scilab e digite, em seguida, [S,D] = spec(A) e
[U,SIG,V] = svd(A).

Verifique que os valores singulares e os autovalores de A coincidem


1 e que as três bases (de autovetores, de vetores singulares à direita e
de vetores singulares à esquerda) são, essencialmente, as mesmas.
Seus elementos só diferem, quando muito, pela ordenação das bases
e pelo sinal ().

Suponha que B = Bn × n é uma matriz simétrica e mostre que seus


2 valores singulares coincidirão com os módulos dos autovalores de A.

Dado o que se viu no item 2, ordene os autovalores da matriz


3 simétrica B na forma induzida pela ordenação dos valores singulares.
Ou seja, considere:

¾1 = |λ1|≥ ¾2 = |λ2|≥ ... ≥ ¾n = |λn|.

Seja ® = {S (1), S (2), ... , S (n) } a correspondente base de autovetores, mostre que
se os autovalores forem todos distintos entre si, e [U,SIG,V] = svd(A), então:

�    U(i) = V (i) = S (i), se λi > 0


�  
U(i) = – V (i) = S (i), se λi < 0

136 Aula 6  Cálculo Numérico


Já no caso geral, com A = Am × n , se m ≠ n, sequer podemos falar em autovetores de
A. Mesmo quando m = n, frequentemente não há bases de autovetores no ℜn.

Para saber mais: no caso de matrizes quadradas, é bastante usual se passar


ao C n, já que a diagonalização A = ZDZ–1 em C n é a regra sempre que os
autovalores de A sejam distintos, como você viu em AL2. Há situações, como
no caso onde se está interessado em potências ou raízes de A, nas quais a DVS
pouco ajuda e a diagonalização em C n é uma ferramenta fundamental. Como
você deve ter visto em AL2 e experimentado com o Scilab na atividade 5 da aula
5, a diagonalização em C n é inteiramente análoga à diagonalização em ℜn. A
única diferença relevante é que a existência de autovalores complexos inviabiliza
a diagonalização em ℜn, mas não em C n.

Mesmo quando temos bases de autovetores no ℜn, elas não serão ortonormais. De modo
que, no caso de matrizes que não são simétricas, a DVS é a nossa regra de ouro alternativa
para trabalhar a relação y = Ax sem sair do ℜn. A contrapartida é que agora temos duas
bases ortonormais em jogo, ao invés de uma só. Se pensamos na função linear T : ℜn → ℜm,
dada por T(x) = Ax, podemos pensar nos vetores singulares à direita, V (1), ..., V (n), como
gerando uma base ortonormal ®, no domínio de T; e nos vetores singulares à esquerda
U(1), ... ,U(m), como gerando uma base ortonormal ¯, no contradomínio de T. Ou seja, usamos
os vetores singulares à direita para representar x em ® = {V(1), ..., V(n)} e os da esquerda
para representar y = Ax nas bases ¯r= {U(1), U(2), ..., U(p)}, de Col(A) ou ¯ = {U(1), U(2),
..., U(m)}, do ℜm. Na prática, isso significa:

U –1
= U T  :  U é uma matriz ortogonal

V –1
= V T : V é uma matriz ortogonal

De forma bem sintética, a fatoração A = U §VT nos diz que:


 
σ1 x1
 . 
 .. 
Ax = U Σ 
T
x =U
V x = U Σ  
 = σ x U (1) + · · · + σp xp U (p)
 1 1

x=[x]α [x]α
 σp xp    
Descrição de Ax na base ¯r de
0
   Col(A)
[Ax]β
com p<m

Aula 6  Cálculo Numérico 137


Vamos detalhar um pouco mais nossa regra de ouro DVS.

Representar x ∈ ℜn, na base ®, corresponde a substituir x por V x :


ƒƒ 

x = x1 V (1) + · · · + xn V (n) = V x ⇔ x = V 
T
V x = V T x
In×n

Neste caso, y = Ax surge descrito naturalmente nas bases ¯ e ¯r , já que


ƒƒ 
 
y = Ax = A x1 V (1) + · · · + xn V (n)

= x1 AV (1) + · · · + xn AV (n)
= x1 σ1 U (1) + · · · + xp σp U (p) + 0 ∗ U (p+1)
 + . ..
se p<m
 
x1 σ1
 . 
 .. 
Ou seja, na base ¯, se p < m ,    y = U 

 = Uy

 xp σp 
0
  
y=[Ax]β =Σ x
 
x1 σ1
 . 
Alternativamente, na base ¯r de Col(A), [Ax]βr = . 
 . 
xp σp

Exemplo 1
Vamos aplicar nossa regra de ouro DVS ao caso da matriz A do exemplo 3, da aula 5.
Lá, obtivemos nossas bases ortonormais do ℜ2, ® = {V (1),V (2)} e ¯ = {U (1),U (2)}. Vamos
explorá-las para resolver Ax = b e estabelecer duas propriedades importantes:

a)  Resolver Ax = b torna-se bem simples, nas bases ® e ¯.

Ax = A(x1 V (1) + x2 V (2) ) = x1 σ1 U (1) + x2 σ2 U (2) = b = b1 U (1) + b2 U (2)



x1 = b1 /σ1
⇒ , onde b = U T b (já que U −1 = U T )
x2 = b2 /σ2

138 Aula 6  Cálculo Numérico


Para resolver Ax = b no Scilab, dados A = [7, 6; –9, –2] e sua DVS, obtida no exemplo
3 da aula 4 (SEVs do ℜn, bases e ajustes de modelos com quadrados mínimos):

     
7 6 −0.7071 −0.7071 12.6491 0 −0.8944 −0.4472
A= =
−9 −2 0.7071 −0.7071 0 3.1623 0.4472 −0.8944
      
U SIG VT

e b =[1 ; 2], basta fazer:

−−> b_bar = U’*[1;2];     // Calcula b_bar = [b]¯

−−> sig = diag(SIG)      //Armazena no vetor sig os dois valores singulares de A

−−> x_bar = b_bar./sig;   // Acha x_bar = [x]®, resolvendo SIG*x_bar = b_bar

−−>x = V *x_bar ;      // Calcula x = x_bar(1)*V(:,1) + x_bar(2)*V(:,2) = V*x_bar

Esta é, essencialmente, a maneira de linsolve resolver Ax = b, no caso de Ax = b


ter solução. Veja que, dadas U, § e V, pudemos dispensar a eliminação de Gauss. Bastaram
duas multiplicações matriz vetor e n = 2 divisões pelos valores singulares. O caro, em termos
computacionais, é obter V, com n grande.

b)  ¾1 é o maior valor obtido por ||Ax || no círculo ||x || = 1 e ¾2 o menor.

Como ||AV(1)|| = ||¾1U (1)|| = ¾1 e ||AV (2)|| = ||¾2U (2)|| = ¾2, basta ver que

¾2  ||Ax||  ¾1, se || x || = 1

Isso segue do fato que ® e ¯ são bases ortonormais de ℜ2, uma vez que, neste caso,
x = x = 1 e vale:

 ≤ σ 2 (x2 + x2 ) = σ 2
1 1 2 1
Ax2 = x1 σ1 U (1) + x2 σ2 U (2) 2 = (x1 σ1 )2 + (x2 σ2 )2
 ≥ σ 2 (x2 + x2 ) = σ 2
2 1 2 2

c)  Interpretação geométrica da decomposição em valores singulares.

A Figura 1, à esquerda, representa o domínio da função linear T : ℜ2 → ℜ2, dada por


T(x) = Ax. Nela representamos a base ® = {V(1), V(2)}, formada pelos vetores singulares à
direita de A e o círculo unitário C1 centrado em (0,0). Ainda com relação à Figura 1, à direita,
representa o contradomínio de T. Nela colocamos a imagem T(C1) dos pontos de C1, pela

Aula 6  Cálculo Numérico 139


função T, a base ¯ = {U (1), U (2)}, formada pelos vetores singulares à esquerda de A, bem
como as imagens AV(1) = ¾1U (1) e AV (2) = ¾2U (2). O ponto a se destacar é que:

T(C1) = {Ax : || x || = 1} é uma elipse de semieixos AV(1) = ¾1U(1) e AV(2) =


¾2U (2).

T (C1 ) = elipse de semi-eixos


σ1U (1) e σ2U (2), no contradomínio
Círculo C1 , no domínio de T, junto 10
com base α = {V (1), V (2) } AV (1) = σ1U (1)
8
1
0.8 6
0.6
4
0.4
0.2 2
U (1)
0
0
-0.2
U (2)
-0.4 -2
V (1) AV (2) = σ2U (2)
-0.6 -4
-0.8
-1 V (2) -6

-1 -0.5 0 0.5 1 -8

-8 -6 -4 -2 0 2 4 6 8

Figura 1 – A transformação linear T(x) = Ax leva C1 numa elipse cujos semi-eixos medem ¾1 e ¾2.

Para conferir, matematicamente, que a imagem de C1 é mesmo uma elipse, vamos olhar
para a representação de y = Ax, na base ¯. Já vimos anteriormente que:
 
x1 σ1
x = x1 V (1) + x2 V (2) = V x ⇒ y = y 1 U (1) + y 2 U (2) , onde y =
x2 σ2

Como ® e ¯ são bases ortonormais, se || x || = 1, também teremos x = 1 e:

y 21 y 22
+ = x21 + x22 = 1
σ12 σ22

Mas, isso significa que, no sistema de coordenadas ortonormal ¯, T(C1) é uma elipse
na forma canônica, de semieixos medindo ¾1 e ¾2.

140 Aula 6  Cálculo Numérico


Atividade 2

Para gerar C1 e T(C1), como no exemplo 1, confira no computador ao


1 qual você tem acesso que basta pedir a Scilab:

−−> t = 0:0.01:2*pi;    // Discretiza o intervalo [0,2π] com dt = 0.01

−−> plot(cos(t),sin(t))   // Desenha o círculo de raio 1, usando a discretização dada


por t

−−> elip =A*[cos(t); sin(t)]   // elip é uma discretização correspondente da imagem


T(C1)

−−> plot(elip(1,:), elip(2,:))   // Desenha T(C1), valendo-se da mesma discretização t

Varie a matriz A = A2 × 2 e observe o que acontece com a elipse T(C1).


2 Sobretudo, brinque também com matrizes que tenham pelo menos um
número grande em módulo. Brinque também com matrizes com n0s
grandes e “próximas” de matrizes não invertíveis, observando sempre o
que acontece com a elipse T(C1). Teste ainda com matrizes A = A2 × 2
cujas entradas sejam números entre 1 e 2, mas que estejam “próximas”
de matrizes que não são invertíveis.

A partir do que você viu no item 2, observe que quanto maior a norma
3 euclidiana do vetor [A11 ; A12 ; A21 ; A22], tanto maior será o maior valor
singular de A. Veja que tal norma vale (A112 + A122 + A212 +A222)1/2
e leva o nome de norma de Frobenius de A. Falaremos mais nela no
complemento C1 desta aula, disponível no Moodle.

Faria sentido associar a “proximidade” entre A e matrizes não


4 invertíveis a ¾2?

Faz sentido para você dizer que a “proximidade relativa” de A a uma


5 matriz não invertível está associada ao quociente ¾2/¾1?

Aula 6  Cálculo Numérico 141


Atividade 3
Considere a matriz A = [1 2; 3 4; 5 6], b = [1 ; 0 ; 0]. O objetivo desta atividade
é você usar a mesma técnica com DVS usada antes para perceber que Ax = b
não tem solução e obter a solução de quadrados mínimos via DVS, neste caso.

Peça ao Scilab que calcule ‘−−>[U,SIG,V] = svd(A)’ e considere as


1 bases ortonormais ® = {V(1), V(2)}, de ℜ2 e ¯ = {U(1),U(2),U(3)} de ℜ3.

Ache b = [b]β e mostre que b = b1 U (1) + b2 U (2) é a projeção


2 ortogonal de b em Col(A).


Calcule teste = (b − b) norm(b) e conclua que b ∉ Col(A). Diga
3 por que isso garante que Ax = b não tem solução.

Como b ∈ Col(A), use a mesma técnica do exemplo 1 para resolver


4 b b
Ax = b . Ou seja, faça , x = 1 U (1) + 2 U (2) , x = V x e constate
σ1 σ2

que teste = A∗ x − b b. ≈ 0.

Diga por que x, obtido no item 4, é a solução de quadrados mínimos


5 de Ax = b.

Resolução de sistemas lineares via DVS


Resolver Ax = b via DVS usando nossa regra de ouro é bem mais caro computacionalmente
que com ‘\’, mas é bem mais confiável pelas razões que exporemos a seguir e funciona do
mesmo jeito que no exemplo 1 e na atividade 3. Essencialmente, é o método usado pelo Scilab
para programar ‘linsolve’, embora nos pareça que ‘linsolve’ não explore plenamente toda a
potencialidade do método.

Para começar, considere a matriz A = Amn de posto p e sua DVS A= U§V T, bem como
o vetor b ∈ ℜm. Considere ainda as três bases ortonormais de vetores singulares com as quais

142 Aula 6  Cálculo Numérico


estivemos trabalhando até aqui. Ou seja, a base ® = {V (1)...,V (n)} do ℜn, ¯ = {U(1)...,U(m)} do
ℜm e a base ¯r = {U (1)...,U (p)} de Col(A). O método que discutiremos a seguir fundamenta-
se em três idéias básicas:

Ax = b tem solução sss b ∈ Col(A)


ƒƒ 

A projeção ortogonal b , de b em Col(A) é o ponto de Col(A) mais próximo de b.


ƒƒ 

Em particular, a distância relativa de b a Col(A) é dada por



test = b − b b

Temos uma base ortonormal ¯r de Col(A). Como já vimos na aula 4, neste caso, b pode
ƒƒ 
ser calculado com apenas duas multiplicações matriz-vetor:
 
 U
b=U  T b = b U (1) + · · · + bp U (p) , onde U
 = U (1) U (2) · · · U (p)
 1

b = [ b ]βr

O que torna esse método mais confiável é que ele permite ao usuário decidir, com base
num critério numérico sólido, se Ax = b tem solução ou não. Se test estiver muito abaixo da
precisão de seus dados, pode-se pensar que b = b , a menos de ruído, e que a solução de
Ax = b é a solução de Ax = b. Caso contrário, pode-se declarar que Ax = b não tem solução.
Há, portanto, dois casos a considerar.

I – Se b ≈ b (ou seja, test = b − b b ≈ 0 ), então, Ax = b tem solução.

Neste caso, uma solução particular x de Ax = b é obtida do mesmo jeito que no exemplo 1
e na atividade 3, começando com x = [x]α , através:

Ax = A(x1 V (1) +· · ·+xp V (p) ) = x1 σ1 U (1) +· · ·+xp σp U (p) = b = b1 U (1) +· · ·+bp U (p)


 x1 = b1 /σ1


..
⇒ . ⇒ x = V x = x1 V (1) + · · · + xp V (p)


 x = b /σ
p p p

Se p = posto(A) < n, como você viu na aula 5 de AL1 – Estudo das soluções de sistemas
lineares –, isso significa que a solução geral de Ax = b terá n – p graus de liberdade. Uma
tal solução geral de Ax = b será do tipo x + Kλ, onde x é a solução particular obtida acima
e Kλ uma solução geral de Ax = 0. Veja que AV(p+1) =... = AV(n) = 0. Em particular,
isso significa que {V (p +1),..., V (n)} é uma base ortonormal de N(A) e podemos tomar
K = [V (p+1) ...V(n) ] (Por que mesmo isso ocorre?).

Aula 6  Cálculo Numérico 143


É mais ou menos isso que Scilab calcula quando Ax = b tem solução e se pede

−−>[x,K] = linsolve(A,–b).

II – Se b = b (ou seja, b − b b > 0 ), então, Ax = b não tem solução.

Como dissemos anteriormente, a questão crucial aqui é decidir se vamos considerar


 
b − b b > 0 , ou não . Se b − b b ≈ 1 , não haverá dúvidas em decidir que
b = b . Nesse caso, pode-se dizer que Ax = b não tem solução, sem pestanejar. Se

b − b b = 1.03∗ 10−15 , podemos entender que b ≈ b , a menos de erros de

arredondamento e resolver Ax = b como acima. Mas e se b − b b = 10−6. Bem, aí
reside a vantagem de resolver Ax = b por SVD. Neste caso, o usuário pode decidir, com base na
precisão de seus dados, se Ax = b tem ou não solução. Por exemplo, se seus dados de entrada
têm uma precisão de no máximo 4 casas decimais, é razoável substituir b por b , resolver

Ax = b e pensar que a distância relativa entre b e b , ou seja, test = b − b b = 10−6
apenas está medindo um ruído nos dados.

De qualquer modo, já que calculamos b sempre se tem a opção de resolver Ax = b ,


como você fez na atividade 3 de modo a obter uma solução de quadrados mínimos de Ax = b.

Atividade 4

Faça A = [1,2,3;4,5,6;7,8,9;10,11,12]; c ε =[1;1;1;1] + ε *rand(4,1).

i – Com ε = 0, use o método acima para ver se Ax = c 0 tem solução e calcule a


solução geral de Ax = c0 , se for o caso. Compare a solução geral obtida com a
que você obtém por linsolve e diga se as soluções encontradas são as mesmas.

ii – Repita o item 1 com ε = 10 –6 e ε = 10 –3.

iii – Suponha dados com apenas 3 casas decimais de precisão. Você diria que,
neste caso, Ax = cε tem solução com ε = 10 –3 ?

144 Aula 6  Cálculo Numérico


Erros numéricos na resolução de
Ax = b e número de condição de A

De forma a simplificar a exposição, daqui até o final da aula vamos supor que
A = Ann seja uma matriz invertível, além de quadrada. Portanto, seus valores
singulares são todos não-nulos, digamos ¾1≥ ¾2≥ ... ≥ ¾n > 0.

No exercício proposto 2 da aula 3 – Sistemas de equações lineares –, relativa a sistemas


lineares, pedimos para você encontrar polinômios de graus 5 e 15 que interpolassem,
respectivamente, 6 e 16 dados. Basicamente, os coeficientes de cada um dos polinômios
procurados resolviam uma equação linear Ax = b, onde A é uma matriz invertível (de
Vandermonde). A interpolação de dados por um polinômio de grau 5 deve ter funcionado
direitinho, mas por um polinômio de grau 15 não. Isso ocorre, basicamente, por causa de erros
de arredondamento que foram se amplificando ao longo da execução do programa. Vamos
agora ver outro exemplo no qual isso acontece.

Exemplo 2
Vamos usar o Scilab para resolver dois sistemas triangulares Ux =b, nos quais:

U é triangular superior e obtida de A = rand(n,n) , cortando a parte inferior de A e depois


ƒƒ 
somando uma matriz 0.1*Inn, inicialmente no caso n = 3 e depois com n = 100. Uma
tal U resulta teoricamente invertível, por ser triangular e sem zeros na diagonal (detalhe
melhor esse argumento!);

correspondentemente, b = rand(n,1).
ƒƒ 

Confira que os comandos abaixo fazem isso. No nosso caso, obtivemos:

−−>n=3; A = rand(n,n); U = triu(A) + 0.1*eye(n,n);  // Gerando U33 triangular e invertível

−−> b = rand(n,1); x = linsolve(U,–b); // Gerando a solução de Ux = b

−−> teste3 = norm(U*x–b)/norm(b) // Testando a solução de Ux = b

teste3 = 1.010D –15

Aula 6  Cálculo Numérico 145


Neste caso, teste3 ≈ 0 indica que x resolve satisfatoriamente Ux = b. Fazendo a mesma
coisa para n = 100, no nosso caso, resultou:

−−>n =100; A = rand(n,n); U = triu(A) + 0.1*eye(n,n);   // Gerando U triangular


e invertível

−−> b = rand(n,1); x = linsolve(U,–b); // Gerando a solução de Ux = b

−−> teste100 = norm(U *x–b)/norm(b) // Testando a solução de Ux = b

Teste100 = 0.215

teste100 > 0.2 indica que linsolve se atrapalhou e produziu uma solução “errada” de Ux = b,
apesar de Ux = b ter solução única em matemática exata, já que U é teoricamente invertível.
O mesmo teria ocorrido com o comando ‘ \ ’.

Esses fatos são muito mais comuns do que podemos pensar e o principal objetivo desta
aula é jogar alguma luz sobre o que acontece aqui. Em linhas gerais, matrizes “relativamente
próximas” de matrizes não-invertíveis são as que geram erros numéricos importantes ao
se tentar resolver Ax = b. A boa notícia é que vamos definir um parâmetro, chamado de
número de condição de A que identifica tais matrizes. Essencialmente, o número de condição
será a expressão de uma “medida” da distância relativa de A até a matriz não-invertível “mais
próxima de A”.

Exemplo 3
Nosso objetivo, neste exemplo, é observar o que acontece com a solução de Ax = b, se
A está próxima de uma matriz que não é invertível. Para tanto, considere:
         
1 −1 0 0 1 −1 1 1
A= ; Aε = A + ε = ; b= e c=
1 −1 0 1 1 −1 + ε 2 1

É fácil ver que A não é invertível, enquanto Aε é invertível para todo ε ≠ 0. Veja ainda que
 
2
 1 +
ε 
Ax = b não tem solução, mas a solução de Aε x = b é xε =   2 , se ε ≠ 0.

 ε
2
2 2
Isso significa, em particular, que xε  = 1+ + 2/ε2 > → ∞, se ε → 0 .
ε ε
Gostaríamos de interpretar de duas maneiras diferentes:

1)  “o tamanho da solução de Aε x = b cresce indefinidamente, à medida que Aε se


aproxima da matriz não-invertível A”;

2)  “pequenas variações nas entradas de Aε podem causar enormes variações na solução”.

146 Aula 6  Cálculo Numérico


Comparando a variação ±x na solução com a variação ±A na matriz, uma diferença de
ε1 = 0.001 para ε2 = 0.0001 apenas na entrada A22 da matriz Aε causa uma variação
±x = x.0001 – x.001 . Na verdade, precisaríamos comparar a variação no “tamanho” de ±x com a
variação no “tamanho” de ±A. A medida usual do tamanho de ±x é sua norma

||±x || = ||x0.0001 – x.001 || ≈ 25500

Já uma medida no “tamanho” de uma matriz fica difícil sem o conceito de norma de
matriz (aproveitamos para fazer uma chamada ao complemento C1 desta aula, no qual
discutiremos este importante conceito). Neste caso, vamos tomar a variação em A como
sendo a variação na sua entrada A22, o que é razoável, neste caso, por que todas as entradas
de Aε são aproximadamente iguais a 1, em módulo. Resulta |±ε|=|ε2 – ε1| = 0.0009. daí que
||±x|| / |±ε| ≈ 25500/0.0009 ≈ 28*106. Ou seja, há uma amplificação da ordem de 28*106
na variação da solução, correspondente a uma variação de ±ε = 0.0009 numa das entradas
de A0.001

Limites para ||Ax||


No exemplo 1, vimos naquele caso particular que, se ||x || = 1, então, ¾2 ≤ ||Ax|| ≤¾1.
Esse fato se generaliza para o caso de qualquer A = Amn e terá um papel determinante no
que se segue. Em particular, gostaríamos de incentivá-lo a ver, no complemento 1 desta aula,
que ¾1 corresponde à mais “popular” das medidas de “tamanho” da matriz A e ¾n poderá
ser interpretado como a mais “popular” das medidas de “distância” entre A e o conjunto das
matrizes que não são invertíveis. Em especial, o quociente ¾n /¾1 representa uma medida da
distância relativa de A ao conjunto das matrizes não invertíveis. Na atividade 2, você teve a
possibilidade de vislumbrar isso através de experimentos numéricos em matrizes 22. Como
veremos ainda nesta aula, ¾n /¾1 ≈ 0 indica forte possibilidade de distorção de resultados
na resolução de Ax = b. Essa amplificação nos erros de arredondamento é mesmo uma
característica da proximidade relativa a matrizes não invertíveis. Vamos então aos resultados
que nos interessam:

¾1 é o maior valor obtido por ||Ax || na esfera C = {x ∈ ℜn | || x || = 1} e


¾n o menor.

Aula 6  Cálculo Numérico 147


Prova
Observe que isso decorre do fato de que tanto {V(1), ..., V(n)} como {U(1), ..., U(n)} são
conjuntos ortonormais e que ¾1≥ ¾2 ≥ ... ≥ ¾n , pois, neste caso:

Ax2 = σ1 x1 U (1) + · · · + σn xn U (n) 2 = 


= σ1 x1 + · · · + σn xn ≤
2 2 2 2 ⇒ Ax ≤ σ1 x



≤ σ12 (x21 + · · · + x2n ) = σ12 x2 = σ12 x2 

De forma inteiramente análoga, obtemos ¾ n||x || ≤ ||Ax ||. Ou seja, chegamos à


importante relação:
¾ n|| x|| ≤|| Ax || ≤ ¾ 1|| x||,   para todo x ∈ ℜn.

Ao fazermos ||x|| = 1 na relação imediatamente anterior, obtemos o que queríamos provar.

Atividade 5
Detalhe um pouco mais as contas que nos garantiram ||Ax || ≤ ¾1|| x||,
1 logo acima. Em especial, use o item e) da atividade 3, da aula 4, para
explicar por que, neste caso, pudemos usar x = V T x = x.

Uma perguntinha importante para o que se segue:


2 Por que podemos supor ¾ n > 0, se A = Ann é invertível?

Número de condição de uma matriz


De forma a melhor introduzir tal conceito, vamos perturbar o sistema Ax = b um
pouco e ver o que acontece. Ou seja, suponhamos uma perturbação b + ±b no termo
independente do sistema. Como estamos supondo A invertível, sejam x̃ e δx , tais que
Ax̃ = b e A(x̃ + δx) = b + δb . Segue-se A*±x = ±b e:
 
σn x̃ ≤ Ax̃ = b ≤ σ1 x̃ b/σ1 ≤ x̃

σn δx ≤ Aδx = δb ≤ σ1 δx δx ≤ δb/σn

δx δb/σn σ δb


⇒ ≤ = 1
x̃ b/σ1 σn b

148 Aula 6  Cálculo Numérico


Interpretamos a relação obtida:

δx σ δb
≤ 1
x̃ σn b


significando que o erro relativo na solução, δx x̃, tem uma limitação
proporcional ao erro relativo ||±b||/||b|| na perturbação.

Chamaremos de número de condição de A a esta constante de


proporcionalidade e o denotaremos por:

σ1
K2 (A) =
σn

Há dois pontos fundamentais a destacar no número de condição.

NC1 – A desigualdade destacada acima é estrita, ou seja, sempre há um pior caso



no qual vale a igualdade. Veja que x̃ = V (1) σ1 é solução de Ax = b =U (1) e que
±x = εV (n)/¾n satisfaz A±x = ±b = εU (n). Por linearidade, teremos ainda

A(x̃ + δx) = Ax̃ + Aδx = b + δb

 
Podemos interpretar a relação acima dizendo que x̃ = V (1) σ1 resolve Ax = b = U (1) e x̃ + δx, com δx = εV (n) σ

= b = U (1) e x̃ + δx, com δx = εV (n) σn , resolve o mesmo sistema com b perturbado, ou seja,
Ax = b+εU (n). Portanto:

δx ε 1 σ δb δb


= = 1 = K2 (A)
x̃ σn σ1 σn b b


Ou seja, este é um “pior caso” já que, neste caso, o erro relativo δx x̃ é uma
amplificação do erro relativo || ±b||/||b|| com um fator de amplificação exatamente igual ao
número de condição.

NC2 – Uma teoria sobre a relação entre número de condição e como os erros de arredondamento
se amplificam, por exemplo, na resolução de sistemas lineares por determinado método, estaria
bem além do que se faz numa disciplina introdutória de Cálculo Numérico. No complemento C3
desta aula, trabalhamos um pouco esta relação. Em resumo, no essencial, números de condição
muito grandes são bons indicadores de dificuldades numéricas na resolução de sistemas
lineares, enquanto números de condição relativamente próximos de 1 indicam estabilidade

Aula 6  Cálculo Numérico 149


numérica para resolver Ax = b. Uma matriz com número de condição “relativamente” alto
é, frequentemente, chamada de “mal condicionada”, enquanto com número de condição
“relativamente” próximo de 1 é considerada “bem condicionada”. No complemento C1 desta
aula, esclarecemos por que 1/K2(A) = ¾n/¾1 é uma boa medida da “distância relativa” de
A= Ann até a matriz não-invertível mais próxima de A.

Sistemas numericamente instáveis e


os comandos cond e rcond de Scilab
No Scilab, o comando ‘cond( )’ calcula o número de condição. Vamos testar o que
acontece nos dois casos problemáticos referidos anteriormente.

I – Matrizes de vandermonde do problema proposto 3 da aula 3.

Caso n = 5  cond(A) = 3785.8


ƒƒ 

Caso n = 15  cond(A) = 2.946*1011


ƒƒ 

No caso n = 5, apesar do número de condição não ser pequeno, não foi suficiente
para prejudicar a resolução do sistema Ax = b. No caso n = 15, foi alto demais, indicando
fortemente uma possível falsificação na solução de Ax = b, coisa que de fato ocorreu.

II – No caso do exemplo 2.

Caso n = 3  cond(U) = 3.255


ƒƒ 

Caso n = 100  cond(U) = 1.03*1012


ƒƒ 

Também aqui, no caso n = 3, linsolve conseguiu resolver satisfatoriamente Ux = b


e no caso n = 100, não. Se poderia pensar que a dificuldade numérica tem a ver com n,
já que o número de operações executadas para resolver Ax = b aumenta bastante com n,
portanto, também aumentam as possibilidades de amplificação dos erros de arredondamento.
Esse argumento até procede, em parte, porém a dificuldade numérica tem bem mais a ver
com o número de condição do que com n, como ilustra a atividade a seguir (vide ainda o
complemento C3, desta aula, no moodle).

150 Aula 6  Cálculo Numérico


Atividade 6
Verifique que tanto ‘x_lin = linsolve(A,–b)’ quanto ‘x_gauss = A\b’ resolvem
satisfatoriamente Ax = b, com A = rand(n,n) e b = rand(n,1), para n = 100.
Peça a Scilab que calcule cond(A) e compare com o ocorrido no exemplo 2,
onde linsolve(U,–b) devolveu uma solução errada para Ux = b, com n = 100
e cond(U) ≈ 1012 . Repita a comparação, testando várias vezes a resolução
de Ax = b e Ux = b, variando A = rand(n,n), U = triu(A)+0.1*eye(n,n) e
b = rand(n,1), com n =100, e veja o que acontece de diferente e o que há de comum
nos testes considerados, levando sempre cond(A) e cond(U) em consideração.

Observação 1 – No exemplo 3 da aula 3, ao pedir a Scilab que calculasse a solução de


Ax = b com o comando x = A\b, Scilab respondeu que a matriz pode estar próxima de uma
matriz não invertível, ao constatar que rcond é muito alto, dizendo:

Warning: matrix is close to singular or badly scaled. rcond = 1.5420D-18.

Na verdade, rcond(A) é uma avaliação alternativa de 1/cond(A), menos precisa, porém


computacionalmente muito mais barata. Scilab a usa com frequência para advertir que algum
resultado envolvendo a matriz A pode não ser confiável, sempre que identifica rcond(A)
muito pequeno.

Matrizes com número de condição baixo.


Ou ainda, como podem ser numericamente
traiçoeiros os determinantes!
Na outra ponta, se A = 0.1*Inn ao resolver Ax = b, pedindo x = A\b a Scilab, obtemos
x = 10*b, de forma estável, ou seja, praticamente sem nenhuma amplificação dos erros de
arredondamento, pois A é diagonal. Como neste caso ¾1= ¾2=.... = ¾n = 10, o número de
condição de A vale K2(A) = 1, que é o menor valor possível para o número de condição
de uma matriz. Já o determinante de A, neste caso, valerá det(A) = 1/10n. Para n = 100,
por exemplo, det(A) = 10–100 ≈ 0. Esta é uma maneira de justificar como o determinante
de A pode ser numericamente traiçoeiro, conforme afirmamos na aula 2 – Introdução

Aula 6  Cálculo Numérico 151


ao Scilab. Teoricamente, vale que Ax = b tem solução única sss det(A) ≠ 0. Na prática, é
muito comum det(A) ≈ 0 não significar que A deixe de ser invertível, ou sequer que esteja
“relativamente próxima” de uma matriz não-invertível. Já o número de condição K2(A), desde
que “relativamente próximo de 1”, como neste caso, será um bom indicador de que x = A\b
se obtém de forma numericamente estável, em problemas de médio porte, seja com ‘\’ ou
com ‘linsolve’.

Se A é uma matriz ortogonal, todos os seus valores singulares valem 1, pelo fato de que
||Ax|| = ||x||, para todo x ∈ ℜn, neste caso (vide atividade 3.e, da aula 4). Isso significa K2(A) =
1. Neste caso, a solução x = ATb de Ax = b se obtém de forma numericamente estável, inclusive
com linsolve ou com ‘\’, se quisermos. Não é difícil mostrar que as matrizes relacionadas à
interpolação trigonométrica, como a que usamos no exercício resolvido 2, da aula 3, terão
colunas ortogonais e de igual norma, depois de pequenos ajustes. Por exemplo, cheque que,

se naquele problema usarmos a fórmula q(x) = c1 / 10 + (c2 cos(w0 x) + c3 cos(w0 x)+
√
c4 sin(2w0 x) + c5 sin(2w0 x)) 5 , a matriz F ← F(1:5,:), obtida eliminando de F a sua
linha redundante, resulta ortogonal. Em particular, seu número de condição também vale,
com pequenos ajustes, K2(A) = 1. Isso se generaliza para interpolações trigonométricas
com qualquer valor de n, justificando por que a interpolação trigonométrica de dados é um
problema numericamente estável, mesmo com n bem grande, conforme apontamos na aula
3. Já uma interpolação polinomial, como a usada no referido exercício, sabemos que não é
numericamente estável, pelo fato da matriz de Vandermonde ser mal condicionada (K2(A)
muito grande), mesmo com n pequeno, da ordem de n = 15.

Olhando um pouco mais à frente

I
nfelizmente, o tempo de nossa aula está se esgotando. Se você preferir, pode até pular direto
para a autoavaliação. Contudo, gostaríamos de aproveitar esse finzinho de revisita à Álgebra
Linear para resumir alguns pontos importantes que tangenciamos, mas não conseguimos
ver direito durante esta aula. Faremos isso na forma de indicar correspondentes complementos
a esta aula, visando motivar mais o aluno. Resumidamente, nos complementos C1-C4 desta
aula, à sua disposição no Moodle, você encontrará o que segue.

C1 – Norma de matriz e uma interpretação convincente de K2(A).


Neste complemento C1, generalizamos o conceito de norma que você viu em AL1, de forma a
podermos falar em normas de matrizes, ou seja, visando dispormos de um conceito que traduza
a idéia de tamanho de uma matriz, de forma compatível com as operações usuais realizadas
com matrizes. Veremos que o maior valor singular ¾1(A) corresponde à mais popular das normas
de A e que 1/K2(A) = ¾n /¾1 mede, num sentido que tornaremos matematicamente preciso, a
distância relativa de A = Ann ao conjunto das matrizes não invertíveis.

152 Aula 6  Cálculo Numérico


C2 – O conceito de Posto(A) do ponto de vista do Cálculo Numérico.
Na observação 1 da aula 4, identificamos, num exemplo, que o posto de uma matriz pedia
uma interpretação própria em aritmética de ponto flutuante, distinta da interpretação dada em
aritmética exata e mais sutil. No fundo, é também disto que se trata quando queremos descobrir
se Ax = b tem solução ou não, pois essa questão nos remete a perguntar se o posto de A
é igual ao posto de [A b]. Ou seja, se a dimensão do espaço das colunas de A cresce ao lhe
adicionarmos o vetor b ou não. Do ponto de vista da aritmética exata, ou b está em Col(A),
ou não está. Do ponto de vista numérico, b dificilmente estará exatamente em Col(A), até
porque “exatamente” é uma palavra que não faz bem parte deste mundo da aritmética de
ponto flutuante. E é exatamente neste ponto que reside a maior confiabilidade da resolução de
Ax = b que discutimos nesta aula. Como vimos, ao medir a distância de b a Col(A), temos
como avaliar melhor se aceitamos b em Col(A) ou não. Entre outras coisas, em função da
precisão dos dados disponíveis. Mas, este é um tema que vale a pena discutir um pouco mais
e deixamos para fazê-lo no complemento C2, já indicando que a decomposição em valores
singulares é um referencial adequado para trabalhar tal conceito.

C3 – Uma limitação para o erro relativo no método de Gauss-Jordan


Citaremos e comentaremos ligeiramente um resultado que relaciona uma limitação do erro relativo
na resolução de Ax = b pelo método de Gauss-Jordan ao valor de n e ao número de condição...

C4 – Compactação de imagens com DVS


Uma fotografia digital em preto e branco, por exemplo, com 600400 pixels, pode ser guardada
como uma matriz com 600400 números que dão a gradação de cinza, digamos em 255
tons diferentes. Isso significa uma matriz com 600400 números, cada um deles ocupando
1 byte de memória, ou seja, uma foto de 240 kb. Contudo, nessa forma de se armazenar a
foto há muitas redundâncias. Por exemplo, um céu sem nuvens pode significar um bocado
de informações repetidas, sem necessidade de serem armazenadas. Uma maneira de se
compactar essa foto, pensando no seu envio pela Internet, por exemplo, é considerar a DVS
da foto, ou seja, da matriz A = A600400 que a representa. Nesse caso, A = U§VT. Contudo,
a contribuição dos vetores singulares correspondentes a valores singulares pequenos é, via
de regra, desprezível. Em muitas situações, a DVS reduzida com k << n é suficiente para uma
reprodução aceitável da foto. Queremos dizer com isso que, via de regra, basta armazenar as
k primeiras colunas de U e de V, bem como os k primeiros valores singulares, pois resulta
que A≈A(k) = U(: , 1:k)* §(k) * V(:,1:k)T, para algum k < n. A boa notícia é que o caso
k << n é bem significativo em muitas situações. Precisaremos guardar assim m*k números
de U, n*k números de V e k valores singulares. Ao todo (m+n+1)*k ≈1000*k, quando
m = 600 e n = 400. Se k < 50, isso significa menos de 50Kb, o que seria menos de 21% da
foto original. Neste complemento, trataremos de detalhar melhor isso e aplicá-lo. Ao final do
livro de Poole, abaixo referido, você encontra um pouco desta discussão.

Aula 6  Cálculo Numérico 153


Você não será cobrado pelo que está nos complementos nem o restante da disciplina
depende deles. Contudo, os recomendamos para aqueles que desejem amadurecer um pouco
melhor o entendimento de temas importantes da Álgebra Linear Numérica.

Resumo
Nesta aula, você usou a DVS para resolver sistemas lineares. Em especial, viu
um critério geométrico que usa DVS para resolver Ax = b e dizer se Ax = b tem
ou não solução. Viu como os valores singulares de A propiciam a definição do
número de condição da matriz A e que um número de condição de A = Ann
alto é uma boa indicação de distorções importantes nas soluções de Ax = b.

Autoavaliação
Suponha que A é 107, posto p = 5 e que sua DVS está dada através A = U§VT.
1 Escolha entre as colunas de U uma base para Col(A) e entre as colunas de V uma
base para N(A). Você ainda lembra que o complemento ortogonal de Col(A) em ℜn
é N(AT )? Caso não lembre, dê uma espiadinha no teorema 2 e no exercício resolvido
5 da aula 11 de AL1 – Geometria de espaços euclidianos – e use isso para encontrar
uma base de N(AT) entre as colunas de U e uma base para Col(AT) entre as colunas
de V. Cheque ainda para conferir se as dimensões de cada um desses SEVs bate com
o número de vetores que você achou em cada uma das bases que você encontrou.

Que vantagem você vê na SVD, com relação ao método de Gauss-Jordan, para decidir
2 se Ax = b tem ou não tem solução?

Como você justificaria que, se A = [1,2;3,4;5,6], então, o conjunto


3 T(C1) = {Ax : ||x|| =1} é uma elipse no plano Col(A) de semi-eixos iguais aos
valores singulares de A?

154 Aula 6  Cálculo Numérico


Se A = U§VT é a DVS de uma matriz A45, então, ¾5 = 0? Justifique sua resposta.
4
Você brincou com o número de condição fornecido pelo Scilab via ‘cond( )’? Em
5 particular, você trabalhou direitinho a atividade 6? Se não o fez, faça-o. Faça mais.
Por exemplo, varie o valor de n na atividade 6 de forma a obter, experimentalmente,
uma ordem de grandeza do valor de n abaixo do qual a resolução de Ux = b é
confiável, e a partir da qual começa a deixar de sê-lo.

6 Resolva os exercícios propostos a seguir.

Exercícios propostos
1)  Considere A = [1,1;–1,–1.0001] , c = rand(2,1) e b = c/norm(c).

i – Peça a Scilab que acha matrizes U, S eV tais que A = USVT.

ii – Peça a Scilab que calcule as soluções de x1, x2 e xb, respectivamente, de Ax = U(:,1),


Ax = U(:,2) e Ax = b.

iii – Observe que ||x1||  ||xb||  ||x2||. Explique por que não foi coincidência.
iv – Muito provavelmente, você obteve ||x1|| << ||xb||. Se isso não aconteceu,
teste mais 10 vezes. Explique por que ||x1|| << ||xb|| seria o mesmo de se esperar
com b escolhido de forma randômica (Sugestão – Defina b = U T b , de modo que
b = U b = b1 U (:, 1) + b2 U (:, 2) ⇒ xb = b1 /σ1 V (:, 1) + b2 /σ2 V (:, 2) e use os fatos que
¾1 >> ¾2, x1 = V(:,1)/¾1 e que, ao acaso, o mais provável é algo do tipo |b1 | ≈ |b2 | ≈ 0.7.
Conservadoramente, suponha |b2 | > 0.01 mesmo sem poder garanti-lo, sob o argumento que
|b2 | > 0.01 é algo “muito provável” de acontecer).

2)  Considere A = [1,2;2,3;3,–1] e b = [ 1;1; 2].

i – Ache U, S e V tais que A = USVT. Faça ainda Û = U(:,1:2) e b̂ = Û Û T b e diga por que
as colunas de Û definem uma base ortonormal de Col(A).

ii – Verifique, com a ajuda do Scilab, que b − b̂ é ortogonal a A(1) e a A(2). Em seguida, diga
por que isso não foi uma coincidência. Ou seja, diga por que ÛÛTz será a projeção ortogonal
de z em Col(A) para todo z∈ ℜ3.

iii – Por que norm(z – ÛÛ'z)/norm(z) ≈ 0 é um bom teste para ver que Ax = z tem solução?

Aula 6  Cálculo Numérico 155


Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

GOLUB, Gene; LOAN, Charles van. Matrix computations. 3th ed. Baltimore, Maryland: The
John Hopkins University Press, 1996.

LAY, D. C. Álgebra linear e suas aplicações. 2. ed. Rio de Janeiro: Livros Técnicos e Científicos,
1999.

LOPES, Jonas Gonçalves; PEREIRA, Marcelo Gomes. Álgebra Linear I. Natal: EDUFRN, 2006.

______. Álgebra Linear II. Natal: EDUFRN, 2007.

POOLE, David. Álgebra linear. São Paulo: Thompson, 2006.

Resumos de soluções dos exercícios propostos estão disponíveis no Moodle

156 Aula 6  Cálculo Numérico


Anotações

Aula 6  Cálculo Numérico 157


Anotações

158 Aula 6  Cálculo Numérico


Algoritmos e programação
com o Scilab – Parte I

Aula

7
Apresentação

N
esta aula, você verá uma ligeira introdução à programação com o Scilab. Trataremos
de algoritmos e programas simples que utilizem os comandos FOR, WHILE e IF do
Scilab. Em cada seção, o conteúdo será apresentado a você por meio de um algoritmo
que resolva um problema e da implementação desse algoritmo. Dessa forma, esperamos que
você teste as soluções no computador à medida em que elas vão aparecendo na aula.

O assunto é importante neste momento para que você possa compreender um pouco
melhor como matemáticos, engenheiros, economistas, biólogos e cientistas de muitas tribos
diferentes – que estavam tantos séculos a espera de fantásticas máquinas de fazer contas
– se comunicam com computadores hoje em dia para potencializar métodos matemáticos
poderosos. Em particular, esta aula e a próxima devem ajudar-lhe a compreender melhor
como se trabalha hoje em dia, concretamente, buscando soluções numéricas para algoritmos
e problemas, conforme apresentados nesta disciplina.

Objetivos
Seguir um algoritmo.
1
Entender o funcionamento dos laços FOR e WHILE.
2
3 Entender o funcionamento do condicional IF.

Aula 7  Cálculo Numérico 161


Algoritmos
Você sabe como encontrar a média aritmética entre dois números x e y? É fácil, não? Basta

fazer x + y . E se forem números complicados, com muitas casas decimais? Pode-se usar uma
2
calculadora, ou o Scilab, para fazer o cálculo e poupar tempo. Mas, se precisarmos calcular muitas
médias seguidas? A tarefa pode tornar-se enfadonha, mesmo com a ajuda do Scilab.

Um recurso valioso do Scilab é o de podermos combinar uma série de comandos de forma


a programar a execução de uma tarefa longa ou enfadonha. No caso das médias, podemos
apenas informar os números cujas médias devem ser calculadas e pedir ao Scilab que as
calcule, uma após a outra, fornecendo os resultados em seguida. No entanto, para que isso
aconteça, devemos antes informar exatamente quais são os passos que o Scilab deve executar,
numa linguagem que ele entenda.

Então, para executar uma determinada tarefa com a ajuda do Scilab, devemos passar por
duas etapas: especificar uma seqüência de passos a ser seguida e traduzir esses passos para
uma linguagem que o computador entenda. A primeira etapa é o que chamamos de construção
de um algoritmo e a segunda é a sua implementação (ou programação).

Por exemplo, para calcular a média entre dois números, o Scilab precisa receber os dois
números, encontrar sua soma e dividi-la por 2. Há outra maneira de escrever esse algoritmo,
que torna mais natural a sua implementação. Descrevemos os passos como se fossem
instruções para o computador (ou para o usuário).

Entre com o valor de x.

Entre com o valor de y.

Faça media = (x+y)/2.

Escreva media.

Sua implementação no Scilab, para calcular a média entre 3 e 5, tem o seguinte aspecto
(para ver o que acontece, digite exatamente o que se encontra nos prompts):

162 Aula 7  Cálculo Numérico


−−>x = 3;

−−>y = 5;

−−>media = (x+y)/2

media =

4.

Atividade 1
Sabendo que a fórmula de conversão da temperatura em grau Celsius (Tc)
para grau Fahrenheit (Tf ) é Tf = Tc 1,8 + 32, escreva um algoritmo para
essa conversão e outro para a conversão inversa (de Fahrenheit para Celsius).
Faça também as implementações no Scilab.

Laços
É claro que o algoritmo e a implementação apresentados para o caso da média não
resolvem o problema de calcular várias médias. Para isso, precisaremos entender a estrutura
de repetição chamada laço.

Um laço é um conjunto de instruções que devem ser repetidas várias vezes. Há duas
situações para seu uso: quando sabemos quantas vezes precisaremos repetir as instruções e
quando as repetições serão feitas até que alguma condição de parada seja satisfeita.

Por exemplo, se precisarmos calcular as médias entre 20 pares de números, precisaremos


repetir as instruções para esse cálculo 20 vezes. Por outro lado, pode ser útil determinar um
par de números de uma lista que resulte em uma média negativa. Assim, o cálculo seria feito
até que o resultado fosse negativo, não um número determinado de vezes.

Aula 7  Cálculo Numérico 163


Na primeira situação, em que sabemos quantas vezes repetiremos uma instrução, usamos
o laço do tipo para-faça, o qual se apresenta da seguinte forma:

Para (contador = <início> até <fim>) faça

{instruções}

Fim Para

Quando o laço é executado, a variável contador recebe o valor indicado em <início>. Esse
valor é comparado com o valor indicado em <fim>. Se contador for menor que ou igual a <fim>,
então as instruções são executadas na ordem em que aparecerem e contador tem seu valor
aumentado. Isso se repete até que contador tenha um valor maior do que <fim>.

Vejamos um exemplo. A seguir, temos o algoritmo para calcular a média entre uma
quantidade n, definida pelo usuário, de pares de números.

Entre com os vetores x e y.

Para (i = 1 até dimensão de x) faça

Faça media = (x(i)+y(i))/2.

Escreva media.

Fim Para

Nesse exemplo, entramos com os vetores x e y, cujas coordenadas são os números


que nos darão as médias. Definimos n como a dimensão dos vetores. Dado esse passo, faz-
se i = 1 e compara-se 1 com n. Se i for menor do que ou igual a n, os valores de x e y são
pedidos, calcula-se a média e escreve-se o resultado. No final dessas instruções, faz-se i = 2
e repete-se todo o procedimento. Quando tivermos um valor para i que seja maior do que n,
o laço não será mais executado.

A implementação desse algoritmo é mostrada a seguir.

164 Aula 7  Cálculo Numérico


−−>x=[2, 3, 4];

−−>y=[0, 1, 2];

−−>n=size(x,2);

−−>for i=1:n,

media=(x(i)+y(i))/2,

end

Observe que o valor de n é definido por você. Se quiser executar esse mesmo programa
uma outra quantidade de vezes, basta substituir os vetores das primeiras linhas. Os comandos
for e end são equivalentes a Para e Fim Para, respectivamente.

Atividade 2

Escreva o algoritmo para calcular n! (fatorial de n) e sua implementação no Scilab.

Outro tipo de laço é o que usa a estrutura de repetição enquanto. Nela, uma determinada
condição é testada. Se o resultado do teste for falso, então as instruções no seu interior não
serão executadas. Se a condição for verdadeira, as instruções serão executadas e ao seu
término retorna-se ao teste da condição. Assim, o processo anterior será repetido enquanto
a condição testada for verdadeira.

Esse tipo de laço é particularmente útil quando não sabemos quantas vezes repetiremos
uma instrução. A seguir, vemos o formato geral do laço do tipo enquanto.

Variável de controle = valor.


Enquanto (condição for verdadeira) faça
{instruções}
Atualizar variável de controle
Fim Enquanto

Aula 7  Cálculo Numérico 165


A condição que é verificada antes de cada execução do laço geralmente envolve a
comparação entre o valor da variável de controle e algum outro. Essa comparação pode ser
substituída por uma pergunta de forma que se a resposta for “sim”, as instruções do laço são
executadas. Se a resposta for “não”, nenhuma ação do laço é executada.

Por exemplo, chamando de v a variável de controle, a condição pode ser v > 0. Então, a
pergunta a ser feita é: v é maior do que zero? Enquanto a resposta for sim, as instruções que
estão dentro do laço serão executadas e v receberá novos valores.

Ilustremos as explicações com um exemplo. A seguir, temos o algoritmo para calcular a


média, enquanto esta for positiva, entre valores que decrescem.

x = 10;

y = 8;

Media = (x +y)/2.

Enquanto (Media > 0) faça

Faça x = x – 3.

Faça y = y – 2.

Faça Media = (x+y)/2.

Escreva Media.

Fim Enquanto

Aqui, a variável de controle é Media. Enquanto ela for maior do que zero, o algoritmo
substituirá x por seu valor anterior menos 3 e y por seu valor anterior menos 2. Depois, Media
é calculada. A seguir, temos a implementação com os resultados mostrados pelo Scilab. Note
que while é o comando para enquanto.

166 Aula 7  Cálculo Numérico


−−>x =10;

−−>y=8;

−−>Media=(x+y)/2  \\ variável de controle iniciada

Media =
 9.
−−>while Media > 0,

  x = x –3;
  y = y –2;
Media = (x+y)/2,
  end
Media =
 6.5
Media =
 4.
Media =
 1.5
Media =
– 1.

Veja que em cada passo os valores de x e y vão diminuindo. Como resultado,


Media também diminui. Até que o último valor para Media é –1. Assim, como a condição
Media > 0 deixou de ser atendida, as instruções do laço não são mais executadas.

Aula 7  Cálculo Numérico 167


Atividade 3

Use um laço do tipo enquanto para escrever o algoritmo para calcular n! (fatorial
de n) e sua implementação no Scilab.

Sugestão – Em vez de escrever o produto de 1 até n, escreva o produto dos


números n enquanto n > 0.

Outro exemplo do uso do enquanto pode ser visto no cálculo da precisão de uma máquina,
que é definida como sendo o menor número positivo em aritmética de ponto flutuante ε, tal
que 1+ ε >1. Segue um algoritmo para o cálculo de ε na máquina (ou computador) que você
estiver usando.

Faça A = 1.

Faça s = 2.

Enquanto (s > 1) faça

Faça A = A/2.

Faça s = 1 + A.

Fim Enquanto

Faça Prec = 2 A.

Escreva Prec.

Nesse algoritmo, Prec é o valor de ε que estávamos querendo. O Scilab proporciona esse
valor de uma maneira mais simples. Basta digitar o comando %eps para obtê-lo.

168 Aula 7  Cálculo Numérico


Variáveis lógicas

A
lgoritmos fazem avaliações de sentenças com muita frequência. No algoritmo da média,
que demos como exemplo para o comando while, se a sentença ‘media > 0’ for avaliada
como verdadeira, o algoritmo ordena que o laço continue. Caso seja falsa, ordena que
o laço pare. Os dados que você viu até agora no Scilab são armazenados, seja como variáveis
numéricas (letras às quais estão atribuídas números ou matrizes de números) seja como
constantes, do tipo %i, %eps e %pi. Essa necessidade de avaliar sentenças matemáticas
gerou as chamadas variáveis lógicas no Scilab.

No Scilab, ao se escrever ‘p = media > 0’, Scilab entende p como uma variável
lógica, desde que tenha como avaliá-la. Nesse caso, Scilab atribui o valor T ou
F a p, conforme o caso. T de True, se verdadeira; F de False, se falsa.

Exemplo 1
−−>x = 3; y = 5; media = (x+y)/2; // Atribui valores às variáveis numéricas x, y e media
−−>media > 5; // Pede para avaliar se media > 5
ans = F (Scilab avalia ‘media > 5’como falsa)
−−>p = media > 5 // p é a variável lógica ‘media > 5’ e scilab a avalia
p= F
−−>q = media > 3 // q é a variável lógica ‘media > 3’ e scilab a avalia
q =T

Se você pede a Scilab que avalie uma variável que não está definida, ou que ele avalie relações
que ele não sabe avaliar, ele reclama:
−−> medi > 2 // Scilab reclama; não tem como avaliar medi, pois nem a reconhece
−−>s = medi > 2 // s não é uma variável lógica, pois Scilab não reconhece medi
!--error 4 Undefined variable: medi
−−> z = 2 – 3*%i   // z é o número complexo 2 – 3i
z = 2. – 3.i
−−> t = z > 0 // t não é uma variável lógica, pois Scilab não sabe avaliar z > 0
!--error 144 Undefined operation for the given operands.

Aula 7  Cálculo Numérico 169


As sentenças matemáticas a serem avaliadas nos algoritmos são análogas às que você
está acostumado desde criancinha para comparar números. Usam os operadores relacionais,
sintetizados na tabela a seguir.

Tabela 1 – Operadores relacionais

Em “Scilabês” Em “Matematiquês” Significado


== = −−> x == y   // Pede que Scilab avalie se x igual a y
< < −−>x <y   //Pede que Scilab avalie se x < y
> > −−>x > y   //Pede que Scilab avalie se x > y
<= ≤ −−>x <=y   //Pede que Scilab avalie se x ≤y
>= ≥ −−>x >=y   //Pede que Scilab avalie se x ≥ y
<> ou = ≠ −−>x <> y   //Pede que Scilab avalie se x ≠ y

Atenção – No Scilab, os símbolos ‘=’ e ‘==’ são bem diferentes entre si. Veja que:
−−>x =3 ;  // Atribui a x o valor 3

−−>p = x ==3  // Atribui a p uma variável lógica que avalia se x vale 3

Há ainda os conectivos ‘e’, ‘ou’ e ‘não’, respectivamente representados, em “Scilabês”


como ‘&’,’ | ’ e ‘’. Conectam variáveis lógicas do mesmo jeito que conectam proposições
matemáticas. Por exemplo, teste como Scilab devolve os seguintes comandos:

−−> x = 1; y = 2 ; z = 3 // Armazena valores em x, y e z


−−> p = y > x; q = z > x; r = z > y; // Armazena variáveis lógicas em p,q e r
−−> s = p|q, t = s&(r) // Cria novas variáveis lógicas s e t, usando conectivos
s=T
t=F

Atividade 4

Peça a Scilab o valor de z = %eps ; p1 = 1 == 1+z; p2 = 1== 1+ z/2.


1
Você já tinha visto uma lógica como esta, que reconhece como
2 verdadeira uma sentença que diz que um certo número é igual a si
próprio mais um número positivo? Que sentido tem isso?

Sugestão – Cuidado, aqui tem um sofisma. O problema não está na lógica e sim no
fato que o conjunto de números considerado pelo Scilab é uma representação discreta
de ℜ, e não ℜ. Tente desenvolver um pouco mais esse argumento. Ele é importante.

170 Aula 7  Cálculo Numérico


Bem, isto é o essencial que você precisa saber de variáveis lógicas para podermos discutir
nossos algoritmos. Se quiser trabalhá-las um pouco melhor, recomendamos o complemento
C1 desta aula, no moodle. Nele, você encontrará uma discussão um pouco mais detalhada
do assunto, bem como um treino interessante em lógica.

Estrutura de decisão SE
Esta é outra estrutura de fluxo de instruções muito útil. Nela o caminho a ser seguido
depende do resultado da avaliação de uma condição. Quando o resultado é verdadeiro, um
conjunto de instruções é executado. Caso contrário, outro conjunto é executado.

A seguir, o formato geral do algoritmo que usa a estrutura SE.

Se (<condição>) então

{instruções1}

Se não

{instruções2}

Fim Se

O funcionamento do SE ocorre da seguinte forma: se o resultado da condição for


verdadeiro, as instruções 1 são executadas e passa-se diretamente para o Fim Se; caso o
resultado seja falso, as instruções 2 é que serão executadas, ignorando-se as instruções 1.

É possível encontrar algoritmos em que a parte “Se não” não apareça. Isso significa que
não há instrução específica para o caso em que o resultado da condição seja falso, passando-
se direto para o Fim Se.

Vejamos um exemplo do uso do Se: imaginemos a situação em que queremos construir


um algoritmo para saber se um aluno precisa ou não fazer a nossa terceira avaliação.

Aula 7  Cálculo Numérico 171


Entre com Nota1.

Entre com Nota2.

Faça Media = (Nota1+Nota2)/2.

Se (Media >= 5) então

Escreva “Não precisa fazer a terceira prova”

Se não

Escreva “Precisa fazer a terceira prova”

Fim Se

Nas duas primeiras linhas, temos a entrada das duas primeiras notas. Em seguida,
dizemos para o computador fazer a média e atribuir seu valor à variável Media. Então, iniciamos
o SE. Se o valor de Media for maior do que ou igual a 5, o computador dirá que não é preciso
fazer a terceira prova. Caso o valor de Media seja menor do que 5, ele dirá que é preciso fazer
a terceira prova.

Segue a implementação desse algoritmo no Scilab. Nela, fizemos N1 = 3 e N2 = 8.


Você pode modificar essas notas para usar o programa de acordo com a sua conveniência.

−−>N1 = 3;

−−>N2 = 8;

−−>Media=(N1+N2)/2

−−>if Media >= 5 then disp (‘Não precisa fazer a terceira prova’); else
disp(‘Precisa fazer a terceira prova’); end

Observe que o código é muito parecido com o algoritmo que fizemos. Aqui, no lugar do
SE, utilizamos IF. Trocamos ENTÃO por THEN e FIM SE por END.

172 Aula 7  Cálculo Numérico


Atividade 5

Descubra o que faz este programa e faça um algoritmo para ele.

−−>disp(‘Tente adivinhar o número que estou pensando. Digite um número


de 0 a 10 e tecle enter’)

−−>a =int(rand()*10); if ans == a then disp(‘Acertou’), else, disp(‘Errou’),


end

Mais exemplos
Os laços e o SE foram apresentados separadamente por motivos didáticos. Nada impede
que eles apareçam misturados ou, repetidamente, em um programa. A seguir, veremos dois
exemplos de algoritmos mais elaborados em que essas situações acontecem.

Começaremos com um algoritmo para encontrar os divisores de um número natural n.

Entre com n.
Para (i = 1 até n) faça
{
Faça r = resto da divisão de n por i.
Se (r == 0) então
{
Escreva i.
}
Fim Se.
}
Fim Para.

Aula 7  Cálculo Numérico 173


Atividade 6

O comando que fornece o resto da divisão de n por i é modulo(n,i). Use-o para


fazer a implementação do algoritmo anterior no Scilab.

O próximo algoritmo é a resolução de uma equação do segundo grau a partir dos


coeficientes a, b e c. As novidades que aparecem nele são o alinhamento de condicionais e a
Operadores utilização de operadores booleanos.
booleanos

Operadores
booleanos são usados
para combinar expressões
lógicas. Levam esse Entre com a, b, c.
nome em homenagem
ao matemático e lógico Se (a == 0 e b ==0) então
George Boole. São
operadores booleanos: e {
(&), ou (|), não ().
Se (c == 0) então

Escreva “Todos os reais são soluções da equação”.

Se não

Escreva “Não existe solução”.

Fim Se.

Fim Se.

Se (a == 0 e b <> 0) então

174 Aula 7  Cálculo Numérico


Escreva “Raiz única”.

Faça x1 = – c/b.

Escreva x1.

Fim Se.

Se (a <> 0 e c <> 0) então

Faça disc = b2 – 4ac.

Se (disc >= 0) então

Faça x1 = (–b + sqrt(disc))/2 a.

Faça x2 = (–b – sqrt(disc))/2 a.

Escreva x1 e x2.

Se não

Faça pr = –b/2 a.

Faça pi = sqrt(abs(disc))/2 a.

Escreva “x1 = pr + i *pi”.

Escreva “x2 = pr – i *pi”.

Fim Se

Fim Se

Aula 7  Cálculo Numérico 175


Atividade 7

Implemente o algoritmo anterior no Scilab.

Resumo
Esta aula tratou de algoritmos e sua programação no Scilab. Foram vistas
as estruturas de controle fluxo chamadas laços e as condicionais, que são
representadas pelos comandos do Scilab FOR, WHILE e IF, respectivamente.

Autoavaliação
O que é um algoritmo?
1
Como funcionam os comandos FOR, WHILE e IF no Scilab?
2

Exercícios propostos
Escreva algoritmos e programas que resolvam os problemas a seguir.

1)  Leia um número natural e exiba seu sucessor.

2)  Calcule a área e o volume de um cilindro.

176 Aula 7  Cálculo Numérico


3)  Leia o primeiro termo, o último e a razão de uma progressão aritmética e informe a soma
dos seus termos.

4)  Calcule a média final de um aluno desta disciplina e exiba o resultado “aprovado”
ou “reprovado”.

5)  Calcule o mdc entre dois números.

6)  Leia um número e decida se ele é ou não um número primo.

7)  A sequência de Fibonacci tem os 2 primeiros termos iguais a 1 e a partir daí, os demais
são formados seguindo uma certa regra. Os primeiros termos da sequência de Fibonacci
podem ser vistos a seguir: 1 1 2 3 5 8 13 21... Descubra a regra que gera a sequência
de Fibonacci e escreva um algoritmo que gere seus n (solicitados pelo usuário) primeiros
termos calcule e escreva a soma desses termos.

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 na página da nossa disciplina). 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 7  Cálculo Numérico 177


Anotações

178 Aula 7  Cálculo Numérico


Algoritmos e programação
com o Scilab – Parte II

Aula

8
Apresentação

E
sta é uma continuação da nossa introdução à programação. Usaremos laços e
condicionais da mesma forma que você aprendeu na aula passada. A novidade é que
aprenderemos a lidar com arquivos, tanto para guardar os programas escritos quanto
para guardar os dados obtidos por eles. Isso nos permitirá ampliar a gama de problemas que
poderemos resolver.

Objetivos
Criar scripts.
1
2 Criar funções.

3 Ler e escrever arquivos de dados.

Aula 8  Cálculo Numérico 181


Scripts
Na aula anterior, você viu alguns algoritmos e suas implementações no Scilab. Por toda
a aula pedimos que você digitasse as linhas de códigos diretamente no prompt. Por exemplo,
no caso do programa para fornecer o resultado de um aluno do nosso curso, você deve
ter digitado:

−−>N1 = 3;
−−>N2 = 8;
−−>Media =(N1+N2)/2
−−>if Media >= 5 then disp('Não precisa fazer a terceira prova'); else
disp('Precisa fazer a terceira prova'); end

Esse foi um procedimento didático, mas pouco prático. Se você precisasse digitar o
programa todo cada vez que ele fosse usado, o uso do computador se tornaria demasiado
lento. Em muitos casos, seria melhor usar lápis e papel.

Felizmente, não é necessário digitar todo o programa em cada uso. Podemos guardar
os comandos em arquivos e executá-los sempre que quisermos. Uma maneira de fazer isso
é por meio dos arquivos scripts. Um script é um arquivo de texto que contém uma sequência
de comandos que seriam digitados no prompt.

Para criar um script, é necessário abrir um editor de texto. O Scilab tem um chamado
SciPad. Você pode abri-lo clicando no ícone (launch SciPad) ou no menu Applications,
clicando em Editor. Uma vez iniciado o editor, você deve ver uma janela parecida com essa:

182 Aula 8  Cálculo Numérico


No SciPad, você pode digitar o programa das médias dos alunos do mesmo jeito
que digitaria no prompt. Depois de haver digitado os comandos, salve o arquivo. Para
isso, tecle Ctrl + s, ou use o menu File  Save. O SciPad pedirá um nome para o arquivo.
Digite “MediaEaD.sce”. Não esqueça a extensão “.sce”. Ela identifica o arquivo como sendo
do tipo script.

Depois de salvar o arquivo, você poderá usá-lo sempre que quiser. Basta dar o comando
exec(‘MediaEaD.sce’). Aliás, isso vale também em geral. Quando tiver um script que deseje
executar, basta usar o comando com o nome do arquivo no lugar de “MediaEaD.sce”.

Atividade 1

Escreva scripts para as implementações das conversões de Celsius para


Farenheit e vice-versa que você fez na Atividade 1 da aula passada, Algoritmos e
programação com o Scilab – Parte I.

Aula 8  Cálculo Numérico 183


Funções

O
utra maneira de gravar comandos para execução posterior é usar funções. A ideia básica
é a mesma dos scripts: um arquivo de texto com uma sequência de comandos. O que
muda agora é que você precisa fornecer argumentos de entrada, que serão processados
pelos códigos que foram escritos na função. Em seguida, serão fornecidos argumentos de
saída, ou seja, o programa feito fornece uma resposta.

A estrutura de uma função é a seguinte:

function [y1, y2, ..., yn ] = nome_fun(x1, x2, ..., xm)


Instrução 1
Instrução 2
...
Instrução k
endfunction

O arquivo da função deve começar com o comando function. Ele diz ao Scilab que o
arquivo é uma função. A seguir, entre colchetes, vemos os argumentos de saída. A resposta
que você vai receber será armazenada, durante a execução da função, nas variáveis
y1, y2, ..., yn. Onde está escrito “nome_fun” deve ser colocado o nome da sua função, seguido
dos parâmetros de entrada x1, x2, ..., xm entre parênteses.

Nas linhas seguintes aparecem as instruções, que é o programa propriamente dito. Nesse
lugar, você dirá ao Scilab o que fazer com os dados que foram fornecidos.

A função termina com o comando endfuntion e deve ser salva num arquivo de extensão
“.sci” (note a diferença entre as extensões de scripts e funções). Para que o Scilab carregue
uma função, é necessário o uso do comando getf(“nome do arquivo.sci”).

O exemplo a seguir ilustra o procedimento.

function [y] = soma(x1,x2)


y =x1+x2
endfunction

184 Aula 8  Cálculo Numérico


A função desse exemplo simplesmente fornece como resposta a soma de x1 e x2. Assim,
se executarmos o comando soma(3,4), teremos 7.

Atividade 2

Abra o SciPad e digite os códigos da função soma apresentada no


1 exemplo anterior.

2 Salve o arquivo com o nome “soma.sci”.

Execute o comando getf(“soma.sci”).


3
Digite soma(2,3) e pressione Enter.
4

Uma diferença importante entre scripts e funções é que as variáveis definidas nas funções
não permanecem disponíveis após sua execução, enquanto que as variáveis definidas dentro
de um script podem ser usadas depois da execução. Por exemplo, dentro da função soma
fizemos y = 7, que é a resposta fornecida. Entretanto, se quisermos usar y novamente, o
Scilab apresentará a mensagem error 4 Undefined variable: y, que significa que a variável y não
foi reconhecida. Se quisermos remediar isso, devemos dizer ao Scilab que queremos colocar
em y o valor resultado da soma, fazendo y = soma(3,4).

Funções do Scilab
As funções são muito comuns no Scilab. Muitos dos comandos encontrados no help são,
na verdade, funções que já estão gravadas junto com o Scilab. Por exemplo, para calcular o
logaritmo de 25 na base 10, o comando é log10(25). Pois bem, log10 é o nome de uma função.
Na atividade a seguir, você poderá ver sua estrutura.

Aula 8  Cálculo Numérico 185


Atividade 3

Faça uma busca em seu computador pelo arquivo log10.sci.


1
Abra o arquivo e observe como é feito o cálculo do logaritmo na base
2 10. Tome cuidado para não alterar o arquivo.

3 Explique como o Scilab calcula logaritmo na base 10.

Aplicações
Daremos aqui alguns exemplos de funções para você ter como base para seus
programas futuros.

MDC
Encontrar o máximo divisor comum entre dois números é uma tarefa que segue um
algoritmo bem definido. Para determinar o mdc entre x e y, dividimos o maior pelo menor,
digamos x por y. Verificamos se o resto dessa divisão, R1, é zero. Se for, o mdc entre x e y
é y. Se não, dividimos y por R1 e repetimos o procedimento com o resto R2 dessa divisão.
Caso R2 seja zero, R1 é o mdc entre x e y. Caso contrário, repete-se o procedimento até
obter um resto zero.

Esse é um algoritmo bem adequado para a construção de uma função. Podemos dar os
números x e y como parâmetros de entrada. A saída é o último resto diferente de zero do
processo, o máximo divisor comum entre x e y.

186 Aula 8  Cálculo Numérico


A seguir, a implementação desse algoritmo.

// Função para cálculo do mdc entre dois números.

function [d] = mdc(x,y)

R = modulo(x,y);

while R <> 0

x = y;

y = R;

R = modulo(x,y);

end

d = y;

endfunction

O Scilab já tem uma função para o cálculo do mdc: é a gcd(). Seu parâmetro de entrada gcd()
é um vetor de coordenadas inteiras. Para obter tal vetor, você precisa transformar suas Do inglês greatest
coordenadas de ponto flutuante para números inteiros por meio do comando int(vetor). Por common divisor, que
significa maior
exemplo, para calcular o mdc entre 12 e 9, digitamos:
divisor comum.

−−>v =int8([12,9])

v = 12 9

−−>gcd(v)

ans = 3

Aula 8  Cálculo Numérico 187


Atividade 4

A função de máximo divisor comum do Scilab tem uma vantagem sobre a que criamos
– ela calcula o mdc entre vários inteiros. Responda: que modificações precisam ser
feitas no nosso programa para que ele calcule o mdc entre três números?

Eliminação de Gauss-Jordan
Na Aula 3, Sistemas de equações lineares, você aprendeu a resolver tais sistemas fazendo uso
do Scilab. Lá foi visto que usar o comando ‘ \ ’ é, na verdade, fazer a eliminação de Gauss-Jordan.

Aqui, veremos como implementar a eliminação de Gauss-Jordan para o caso particular no


qual a matriz dos coeficientes é quadrada e invertível. O programa será dividido em duas partes:
a primeira resolve sistemas cujas matrizes de coeficientes sejam triangulares superiores, sem
zeros na diagonal principal; a segunda faz o escalonamento de matrizes ampliadas.

Sistemas O algoritmo para resolução de sistemas triangulares é bem simples. Resolvemos a última
triangulares equação encontrando xn. Depois, substituímos o valor encontrado na equação anterior para
Sistemas triangulares
são aqueles que têm encontrar x n–1 e saímos substituindo os valores encontrados nas equações anteriores até que
matrizes de coeficientes todos tenham sido encontrados. A função a seguir implementa esse algoritmo.
triangulares.

function  x = TriaSup(U,b)
// TriaSup pega uma matriz triangular superior, sem zeros na diagonal, um vetor b
// e devolve em x a solução de Ux = b
n = size(U,1) //Armazena em n o número de linhas de U
x = zeros(n,1) // Inicializa a solução x como um vetor de zeros
x(n) = b(n)/U(n,n) // Calcula x(n) na última equação do sistema.
// Executa o loop em P2 do algoritmo Triasup
for i=n–1:–1:1
x(i) = (b(i)–U(i,i+1:n)*x(i +1:n))/U(i,i) // Calcula x(i)
end
endfunction

188 Aula 8  Cálculo Numérico


Atividade 5

Gere uma matriz U = U44 triangular superior U, sem zeros na diagonal, e


b = b41, ambas com entradas aleatórias entre 0 e 1. Observe o que Scilab faz, ao rodar
x = TriaSup(U,b), de duas maneiras:

a)  Escrevendo TriaSup como um script;

b)  usando o debug.

c)  Teste também se x resolve, de fato, U *x = b

Atividade 6
   
1 0 0 2
  b= 0 
Considere a matriz triangular inferior L =  2 4 0  e  .
1 Resolva o sistema Lx = b. 1 3 2 4

Observando o algoritmo TriaSup e o que você fez no item 1 acima para


2 resolver Lx = b, escreva um algoritmo TriaInf análogo a TriaSup que
permita resolver um sistema triangular inferior sem zeros na diagonal.

Escreva uma função TriaInf que execute esse algoritmo no Scilab e


3 teste essa TriaInf com o exemplo de item 1.

Aula 8  Cálculo Numérico 189


A próxima função faz o escalonamento, que começa com Uamp= [U  bb] = [A b].
Iremos atualizando Uamp = [U  bb] sucessivamente, até transformar a matriz inicial
U = A numa matriz triangular superior. Para simplificar a exposição, além de estarmos supondo
que a matriz A é quadrada e invertível, trataremos do caso no qual não é necessário trocar linhas
da matriz Uamp durante o escalonamento. Ou seja, o caso no qual supomos encontrar um pivô
aceitável Uampii ≠ 0 em todas as iterações do escalonamento, sem necessidade de trocar de
linhas. Nesse caso, operaremos uma Eliminação de Gauss sem pivoteamento.

function [U,bb] = ElimGauss_spivot(A,b)

// [U bb] será matriz triangular superior e linha equivalente à matriz ampliada [A  b].

eps = 10∧(–8) // Tolerância para o pivô


n = size(A,1) // Número de linhas de A
Uamp = [A b]; // Inicialização
for j =1:n –1 do // Loop externo: Acha a linha j da matriz escalonada
pivo = Uamp(j,j);
if abs(pivo) < eps // Testando para ver se o pivô vai funcionar
disp(‘O algoritmo fracassou ao encontrar Ujj muito pequeno’)
return
else
for i=j +1:n do // Loop interno: Zera abaixo da diagonal na coluna j
mult = Uamp(i,j)/pivo; // Escolhe o multiplicador da linha j na iteração i
Uamp(i, : )= Uamp(i, : ) – mult*Uamp(j, : ); // Aplica O1 para zerar U(i,j)
end
end
end
U = Uamp(:,1:n);
bb = Uamp(:,n+1)
endfunction

190 Aula 8  Cálculo Numérico


Atividade 7

Considere o sistema linear a seguir:





 x1 + 2x2 + x3 + 2x4 = 8

 −x
1 − 2x3 − 4x4 = −7


 2x1 + 2x2 + 9x4 = 15

 x
1 + x3 + 3x4 = 5

a)  Escreva a matriz ampliada Amp = [A b] do sistema acima e aplique o


algoritmo ElimGauss_spivot de modo a obter Uamp = [U bb].

b)  Resolva o sistema linear Ux = bb usando TriaSup.

c)  Teste a solução obtida.

Potência
Na Atividade 7 da Aula 5 (Autovalores e valores singulares), pedimos que você rodasse
o algoritmo da potência destinado a obter um autovetor associado ao maior autovalor de uma
matriz. Confira lá na Atividade que, na prática, o que lhe pedimos foi que dada uma matriz
inicial A e um vetor inicial aleatório x0 = rand(3,1), você começasse com xc =x 0/norm(x0)
e digitasse repetidamente o comando

−−> xc = A*xc ; xc = xc/norm(xc);

até que xc parasse de mudar. Na prática, você deve ter teclado  repetidamente, olhando para
a tela, até ver que xc não mudava mais.

Com o comando while, ..., end, podemos fazê-lo de forma automática no Scilab. Cheque,
só para ver:

Aula 8  Cálculo Numérico 191


−−> A = [1,2,3;2,3,4;3,4,0]; x 0 = rand(3,1); xc = xc/norm(xc) ;  // Dados de entrada.

−−> x_ant = xc/2 // x_ant poderia ser qualquer valor para o qual norm(xc_x_ant)
> 10^(–7).

−−> while norm(xc –x_ant) > 10^(–7) //Testa a condição de parada.

x_ant = xc;  // xc armazena o valor anterior de xc, para usar no teste de parada.

xc = A*xc ; xc = xc/norm(xc); // Iteração do algoritmo

−−>end

Atividade 8

Nesse último exemplo, você deve ter percebido que não se trata de uma função.
Modifique o código de maneira a torná-lo uma função que possa ser usada com
matrizes e vetores de qualquer tamanho.

Atividade 9

Brinque com o algoritmo da potência, nas seguintes condições:

a)  Faça um teste com matrizes randômicas e simétricas, tipo A = rand(n,n) e


B = ATA, começando com diferentes valores de x0 e diferentes valores de
n, e veja se o algoritmo converge.

b)  Faça um teste com a matriz A = rand(4,4) + 20*%i *eye(4,4) e limite


o número de iterações, porque esse aí não vai convergir. Observe que não
converge mesmo. Por que sabíamos que não iria convergir?

192 Aula 8  Cálculo Numérico


Método Monte Carlo para cálculo de áreas
O que você acha da seguinte ideia para encontrar, experimentalmente, a área sob o gráfico
de uma função positiva dada por y = f(x) e com a ≤ x ≤ b ?

Chute
ƒƒ  vários pontos, digamos N ,
absolutamente ao acaso. Porém,
todos dentro do retângulo dado por
0 ≤ x(1) ≤ a e 0 ≤ x(2) ≤ b .

Conte o número dos que caem


ƒƒ  abaixo de
y = f(x), digamos k.

Se N for suficientemente grande, avalie


ƒƒ 
a área sob o gráfico como sendo

Af = (k/N )∗ Área do retângulo = (k/N )∗ a∗ b .

A ideia é que, ao acaso, a probabilidade de você acertar dentro da figura procurada


é muito fácil de calcular aproximadamente, pois poderia ser medida por k/N. E como os

pontos são obtidos ao acaso, sem nenhum viés, no retângulo considerado, k/N seria
também
 o quociente entre a área dessa figura e a do retângulo. Vamos testar esta ideia com
y = 1 − x2 , 0 ≤ x ≤ 1 e 0 ≤ y ≤ 1 .

Aula 8  Cálculo Numérico 193


Atividade 10

−−> a = 1;b = 1  // a e b definem as dimensões do retângulo.


1
−−> k = 0;  // k = 0 é o início da contagem

−−> N = 200  // N é o número de experimentos.

−−>for i = 1:N,
2 x = rand(2,1); // x é um ponto aleatório no retângulo [0,a]x[0,b].

if x(2) <= sqrt(1–x(1)∧2)),   //Testando para ver se x(2) ≤ f(x(1))

k = k+1;  //Se o teste der positivo, o número k de testes positivos aumenta de 1

end
3

end

A = k/N*a*b  //Área medida = (frequência k/N de testes positivos)*Área do


retângulo

Use o mesmo método para encontrar a área sob o gráfico de y = f(x),


no caso em que f (x) = x∗ | sin(K ∗ x)|1/2 , com 0 ≤ x ≤ 3 e K = 4.
Note que 0 ≤ f (x) ≤ 3 .

Adapte o algoritmo para parar na iteração M quando achar a área


procurada sob o gráfico de f(x) com t casas decimais exatas e veja
o valor de M para t = 6, nos casos do círculo e da figura acima, para
K = 4 e para K = 500.

Escreva uma function para o método de Monte Carlo.

194 Aula 8  Cálculo Numérico


Utilizando arquivos
Uma coisa deve ter sido chata até agora: escrever as matrizes das últimas atividades.
Imagine então que, por algum motivo, você precise repetir as atividades. Isso significaria
escrever novamente as matrizes, o que tornaria ainda mais desagradável o trabalho.

Felizmente, assim como acontece com os comandos gravados em scripts ou funções,


também podemos usar arquivos como meio para guardar dados de entrada e saída. Assim,
poderemos utilizá-los sempre que necessário.

Por exemplo, os comandos a seguir criam uma matriz 1010 e guardam-na no arquivo
“teste.txt”.

Atividade 11

−−>A=rand(10,10);  //Gera uma matriz 1010 aleatória e não mostra seus


elementos

Atividade 12
−−>write('teste.txt',A)  //Escreve a matriz A no arquivo teste.txt

Aula 8  Cálculo Numérico 195


Verifique, em sua área de trabalho, que o arquivo “teste.txt” deve ter sido criado. Abra-o
e veja os elementos da matriz A.

Para fazer uso dos dados em um arquivo, usamos o comando read(nome_do_


arquivo,número_de_linhas,número_de_colunas). Quando não sabemos quantas linhas o
arquivo tem, usamos a opção “–1”.

No exemplo a seguir, colocamos a matriz que está em “teste.txt” na matriz de nome x.

−−>[x ]=read('teste.txt',10,10);  //A matriz x é a mesma que a matriz A

Resumo
Brinque com os comandos read e write. Faça operações com as matrizes A e x
dos exemplos anteriores e guarde os resultados em novos arquivos.

196 Aula 8  Cálculo Numérico


Modifique o programa de TriaSup para que ele escreva a matriz triangular em
um arquivo.

x2 x4 x6
cos x = 1 − + − + ...
2! 4! 6!

Variáveis tipo string


No Scilab, precisamos usar com frequência letras ou palavras que não são variáveis
numéricas ou lógicas, mas sim textos, pura e simplesmente. Por exemplo:

No
ƒƒ  programa que escrevemos acima
para dar ao aluno o resultado, ao
ler disp(‘Não precisa fazer a terceira
prova’), o Scilab avalia “Não precisa
fazer a terceira prova” como um texto
exatamente com as palavras que estão
entre aspas e imprime-o. Se você retirar
as aspas, o Scilab tentará avaliar o
texto em questão, ou seja, “Não precisa

Aula 8  Cálculo Numérico 197


fazer a terceira prova” como se fosse
uma variável numérica, e fracassará.

Ao
ƒƒ  digitar write('teste.txt',A),
pretendíamos que Scilab escrevesse
a matriz A no arquivo teste.txt.
Contudo, ele só o fará se for induzido
a reconhecer ‘teste.txt’ como texto,
e não como variável numérica.

Um “string” realiza exatamente isso, ou seja, é um tipo de variável cujo valor é exatamente
o texto que se encontra entre aspas. Por exemplo,

198 Aula 8  Cálculo Numérico


Anotações

Aula 8  Cálculo Numérico 199


Anotações

200 Aula 8  Cálculo Numérico


Zeros de funções

Aula

9
Apresentação

E
sta aula trata de métodos numéricos para resolução de equações de uma incógnita.
Nesses métodos, o objetivo não é encontrar uma solução exata, mas encontrar soluções
aproximadas com a precisão que desejarmos, ou seja, soluções que estejam tão próximas
da solução exata quanto quisermos.

Objetivos
Localizar raízes de equações.
1
Utilizar os métodos numéricos apresentados para
2 encontrar aproximações das raízes.

Aula 9  Cálculo Numérico 203


Introdução
Vamos observar o problema que segue.

Um marceneiro construiu duas caixas de madeira. Uma em forma de cubo e outra


com base retangular. Medindo as duas caixas, ele verificou que a retangular tem
largura 1cm maior e comprimento 2cm menor que a cúbica e que seu volume é
8cm 2. Qual é o volume da caixa cúbica?

Seja x o tamanho de uma aresta da caixa cúbica. Então, o volume da caixa retangular é
x (x + 1)(x – 2) = 8.
Efetuando o produto, vemos que para encontrar o volume da caixa em forma de cubo
devemos então resolver a equação:

x3 − x2 − 2x − 8 = 0 .

Surge um problema dentro do problema. Como resolver essa equação? Existe um


procedimento que usa a chamada Fórmula de Cardano para resolver equações cúbicas. É um
procedimento geral, mas muito trabalhoso. Já equações polinomiais de grau maior ou igual a cinco
não dispõem de nenhuma fórmula equivalente a de Cardano, que as resolva em matemática exata.

Atualmente, é possível encontrar rapidamente aproximações tão boas quanto queiramos


das raízes de equações polinomiais de grau até bem mais elevado que 3, assim como de
equações bem mais complicadas, com o uso de calculadoras ou computadores. Esta aula trata
sobre alguns métodos usados nessas máquinas.

204 Aula 9  Cálculo Numérico


Localizando raízes

M
uitas vezes, é simplesmente impossível determinar soluções exatas para as equações.
Felizmente não somos tão exigentes a ponto de só nos contentarmos com valores
exatos. Frequentemente nos damos por satisfeitos com resultados que tenham uma
determinada precisão.

Os métodos desta aula requerem que você forneça uma aproximação inicial, ou seja,
um número que esteja próximo da solução e uma precisão com a qual fique satisfeito. Dada
a aproximação inicial, o método escolhido vai refiná-la até obter uma nova solução dentro da
precisão determinada.

Então, o primeiro passo para se encontrar as raízes de uma equação do tipo f (x) = 0 é
encontrar uma boa aproximação inicial. Para isso, devemos localizar intervalos que contenham
as raízes, fazendo uso do resultado a seguir.

Teorema 1
Seja f (x) uma função contínua num intervalo [a, b]. Se f (a)f (b) < 0 , então,
existe pelo menos um valor x0 no intervalo tal que f (x0 ) = 0 .

Na prática, como é que se usa esse resultado? Voltemos ao exemplo do início da aula.
a equação era x3 − x2 − 2x − 8 = 0 . Fazendo f (x) = x − x − 2x − 8 , temos
3 2
Nele,
 
3
f = −9, 875 e f (3) = 4. O que nosso resultado nos diz é que entre 3/2 e 3 existe
2
algum número x0 que satisfaz f (x0 ) = x30 − x20 − 2x0 − 8 = 0 . Ou seja, existe alguma raiz
da nossa equação no intervalo [3/2,3].

A seguir, outro resultado bastante útil para localizar raízes.

Teorema 2
Sob as hipóteses do Teorema 1, se f  (x) existir e preservar sinal no intervalo
aberto (a, b), então, esse intervalo contém uma única raiz da equação f (x) = 0.

Vamos continuar o estudo do caso em que f (x) = x3 − x2 − 2x − 8 . Descobrimos


que existe alguma raiz da equação f (x) = 0 no intervalo [3/2,3]. Como podemos saber

Aula 9  Cálculo Numérico 205


se há uma ou mais raízes nesse intervalo? A resposta é dada pelo Teorema 2. Veja que
f  (x) = 3x2 − 2x − 2 , cujo gráfico é

f 4

1
0
–4.5 –4 –3.5 –3 –2.5 –2 –1.5 –1 –0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
–1

–2

–3

–4

Figura 1 – Gráfico de f  (x) = 3x2 − 2x − 2

Observe que o gráfico nos mostra que, no intervalo (3/2,3), f  (x) é sempre positiva
(preserva o sinal). Logo, há somente uma raiz nesse intervalo.

Exercício resolvido 1
Use os resultados vistos até agora para localizar alguma raiz de 8x3 + 20x2 − 6x − 9 = 0.

Solução
Façamos f (x) = 8x3 + 20x2 − 6x−– 99 e vamos construir a tabela:
+ 6x
Tabela 1 – Valores de x e f (x)

x –2 –1 0 1
f (x) –5 –3 –9 +25

Sabendo que f é uma função polinomial (portanto, contínua) e observando a


variação de sinais no intervalo [0,1], podemos afirmar que pelo menos uma das
raízes está entre 0 e 1. Vamos descobrir se há mais de uma raiz nesse intervalo.
Para isso, derivamos f (x) e encontramos f  (x) = 24x2 + 40x + 6. Agora vamos
verificar se o sinal da derivada f  (x) permanece o mesmo em (0,1).

Você lembra como se faz o estudo do sinal de uma função quadrática?

206 Aula 9  Cálculo Numérico


Primeiro, encontramos as raízes. No nosso caso, resolvemos a equação
24x2 + 40x + 6 = 0 , o que nos dá
1 3
x1 = − e x2 = − .
6 2
Depois, esboçamos a parábola y = 24x2 + 40x + 6 que corta o eixo x em x1 e x2.
Como o coeficiente de x 2 é positivo, nosso esboço deve ficar parecido com este:

(–1.5,0) (–0.17,0)

Figura 2 – Esboço do gráfico de y = 24x2 + 40x + 6

Observe que só temos y negativo para aqueles valores de x que estão no intervalo
 
3 1
− , − . No intervalo que nos interessa, (0, 1), y = 24x + 40x + 6 é
2
2 6
sempre positivo. Logo, podemos afirmar que o intervalo (0,1) contém somente

uma raiz da equação 8x3 + 20x2 + 6x − 9 = 0.

Atividade 1
Agora é a sua vez! Localize as raízes de x3 − 9x + 3 = 0 . Siga estes passos:

a)  use uma calculadora e construa uma tabela com valores de x, variando de
–5 até 5, e f (x) = x − 9x + 3 ;
3

b)  identifique intervalos em que há mudança de sinal de f (x);

c)  calcule f  (x)


e avalie se há mudança de sinal de f  (x) nos intervalos
encontrados no passo (b).

Aula 9  Cálculo Numérico 207


Atividade 2
Vamos repetir a atividade 1 usando outro método para construir a tabela. Dessa
vez, faça uso de uma planilha eletrônica (Excel, BROffice). Siga estes passos:

a)  na célula A1 coloque –5;

b)  na célula B1 digite a nossa função (=A1^3 –9*A1+3), lembre de digitar


“=” antes da função;

c)  na célula A2 faça “=A1+1”;

d)  arraste o canto inferior direito da célula A2 até a célula A11;

e)  repita a ação com a célula B1.

Atividade 3
Repita as atividades 1 e 2, agora usando o Scilab. Digite as linhas de comando

−−>for i = 1:11

−−>x(i) = –6+i

−−>end

Em seguida, as linhas

−−>for I = 1:11

−−>fx(i) = x(i)^3 –9*x(i)+3

−−>end

Com os vetores x e fx você tem a tabela da atividade 1.

208 Aula 9  Cálculo Numérico


Método da bisseção
Vamos mais uma vez recordar o problema do início da aula. Estávamos tentando encontrar
as dimensões de uma caixa e isso nos levou à equação

x3 − x2 − 2x − 8 = 0 .

Na seção passada, descobrimos que há uma única raiz dessa equação no intervalo
(3/2,3). Em relação ao nosso problema, isso significa que a altura da caixa está entre 1,5 cm
e 3 cm. Podemos ser mais específicos?

A fim de respondermos a essa pergunta, vamos usar o chamado método iterativo para
conseguir uma solução aproximada para o nosso problema. Um método iterativo é um conjunto
de instruções que são executadas passo a passo. Algumas dessas instruções são repetidas
até que estejamos satisfeitos. Cada repetição é o que chamamos de iteração.

Nesta aula, mostraremos dois métodos iterativos para encontrar raízes: o método da
bisseção, nesta seção, e o método de Newton, na seção seguinte.

Vamos ao método da bisseção. Considere uma função f (x) contínua num intervalo [a,b],
com f (a)f (b) < 0 e que a equação f (x) = 0 tenha somente uma raiz no intervalo (a,b).
O objetivo é encontrar um novo intervalo que contenha essa raiz e que tenha um comprimento
menor do que a precisão que especificarmos. Veja que se f (a)*f (b) < 0 e M = (a+b)/2
é o ponto médio do segmento [a,b], então, uma das três coisas a seguir acontece.

1)  f (M ) = 0; neste caso, M é a raiz procurada.

2)  f (a)*f (M) < 0; neste caso, basta procurar a raiz entre a e M.

3)  f(b)*f (M) < 0; neste caso, basta procurar a raiz entre M e b.

Para isso, usaremos o algoritmo seguinte.

Algoritmo da Bisseção

Seja f (x) contínua num intervalo [a,b] e tal que f (a)f (b) < 0 .

1)  Defina os seguintes dados iniciais: intervalo [a,b] e precisão ε .


2)  Se b – a < ε , então, qualquer número pertencente ao intervalo já é uma
aproximação da raiz com uma precisão ε . Pode parar.

Se não, faça k = 1 , a0 = a e b0 = b .

Aula 9  Cálculo Numérico 209


ak−1 + bk−1
3)  Faça c = 2
.

4)  Se f (a k−1
) e f (c) têm o mesmo sinal, faça ak = c e bk = bk−1 .

Se não, faça ak = ak−1 e bk = c .

5)  Se b − ak < ε , então, qualquer número pertencente ao intervalo [ak , bk ]


k

já é uma aproximação da raiz com uma precisão ε . Podemos parar.

Se não, faça k = k + 1 e volte para o passo 3.

Vamos seguir os passos e ver como funciona o algoritmo com a equação


x − x2 − 2x − 8 = 0 .
3

1)  Nesse caso, temos a = 1, 5 e b = 3 , porque já sabemos que a equação tem uma única
raiz no intervalo determinado por esses números. Vamos usar a precisão 0,1.

2)  b − a = 3 − 1, 5 = 1, 5 não é menor que nossa precisão.

k = 1, a0 = 1, 5 e b0 = 3.

a0 + b0 1, 5 + 3
3)  c = 2
=
2
= 2, 25.

4)  f (a ) = f (1, 5) = −9, 875 ,


0 f (b0 ) = f (3) = 4 e f (c) = f (2, 25) = −6, 171875 .

a1 = 2, 25 e b1 = 3 .

5)  b 1 − a1 = 0, 75 não é menor que a precisão 0,1. Fazemos k = 2 e voltamos ao passo 3.

a1 + b1 2, 25 + 3
3)  c= = = 2, 625 .
2 2

4)  f (a 1 ) = f (2, 25) = −6, 171875 , f (b1 ) = f (3) = 4 e


f (c) = f (2, 625) = −2, 052734375.
a2 = 2, 625 e b2 = 3.

5)  b 2 − a2 = 0, 375 não é menor que a precisão 0,1. Fazemos k = 3 e voltamos ao passo 3.

+ b2 2, 625 + 3
3)  c = a 2

2
=
2
= 2, 8125 .

4)  f (a ) = f (2, 625) = −2, 052734375, f (b2 ) = f (3) = 4 e


2

f (c) = f (2, 8125) = 0, 712158.

210 Aula 9  Cálculo Numérico


a3 = 2, 625 e b3 = 2, 8125 .

5)  b 3 − a3 = 0, 1875 não é menor que a precisão 0,1. Fazemos k = 4 e voltamos ao passo 3.

+ b3 2, 625 + 2, 8125
3)  c = a 3
= = 2, 71875 .
2 2

4)  f (a 3 ) = f (2, 625) = −2, 052734375 , f (b3 ) = f (2, 8125) = 0, 712158 e


f (c) = f (2, 71875) = −0, 73318.
a4 = 2, 71875 e b4 = 2, 8125.

5)  b 4 − a4 = 0, 09375 é menor que a precisão 0,1. Podemos parar.

A figura a seguir mostra a evolução dos intervalos.

(0.45,7.34)

a a1 a2 b

0.5 1 1.5 2 2.5 b3 3 3.5

(3.66,–14.54)

Figura 3 – Evolução dos intervalos obtidos com o método

Nesse exemplo, usamos o método iterativo da bisseção. Observe que os passos de 3 a


5 foram repetidos 4 vezes, o que significa que fizemos 4 iterações. Resta agora saber qual é
a raiz encontrada.

Na verdade, não encontramos uma raiz exata da equação x3 − x2 − 2x − 8 = 0 .


Qualquer número que esteja entre a4 = 2, 71875 e b4 = 2, 81625, inclusive esses, é uma raiz
aproximada para o nosso problema. Quando decidimos procurar raízes com aproximação de
0,1, decidimos que estávamos dispostos a abrir mão da solução exata e que qualquer número
que estivesse a uma distância menor que 0,1 da raiz nos serviria.

Essas considerações estão de acordo com o nosso problema original. Lembre que a
situação que imaginamos era vivida por um marceneiro. Esse profissional usa uma escala
para medir seus trabalhos que chega, no mínimo, a um milímetro. A solução encontrada está
entre 2cm e 7mm e 2cm e 8mm. Não é uma diferença muito relevante para um marceneiro.

Aula 9  Cálculo Numérico 211


Atividade 4

Siga o algoritmo da bisseção para encontrar as raízes de x3 − 9x + 3 = 0. Você


deve fazê-lo a partir de cada uma das formas a seguir.

a)  Com uma calculadora, faça as iterações até obter uma aproximação com
0,05 de precisão.

b)  Use o script a seguir para implementar o algoritmo da bisseção no Scilab.


Qual é o último intervalo conseguido? Pode-se modificar o script para que
ele faça quantas iterações forem necessárias até atingir a precisão 0,00001?

// script: método da bisseção


// f(x)=x ^3–9*x +3
a =–4;
b =–3; //extremos do intervalo inicial
if b –a < 0.05 then
printf (‘a = %f’,a)
printf(‘b = %f’,b)
else
while b–a >= 0.05
c = (a+b)/2;
if (a^3 –9*a+3)*(c^3–9*c+3) > 0 then
a = c;
else
b = c;
end
end
printf (‘a = %f’,a)
printf (‘b = %f’,b)
end

212 Aula 9  Cálculo Numérico


Método de Newton
Este é outro método iterativo para se encontrar raízes aproximadas. É baseado na seguinte
idéia: dado um ponto (xk , f (xk )), traçamos a reta tangente ao gráfico de f (x) nesse ponto.

(0.45,7.34)

xk + 1
xk

0.5 1 1.5 2 2.5 3 3.5

(3.66,–14.54)

Figura 4 – Reta tangente ao gráfico de f (x) no ponto (xk , f (xk ))

f (x )
Encontrando o zero da reta, encontramos xk+1 = xk −  k , uma nova aproximação
f (xk )
para a raiz.

Algoritmo de Newton

Seja f (x) contínua, com primeira e segunda derivadas contínuas num intervalo
que contenha uma raiz.

1)  Defina os seguintes dados iniciais: aproximação inicial x 0 e precisões ε1 e ε2 .

2)  Se |f (x0 )| < ε1 , então, x


já é uma boa aproximação da raiz. Pode parar.
0

f (x )
Se não, faça k = 1 e xk = xk−1 −  k−1 .
f (xk−1 )

3)  Se |f (x)| < ε1 ou se |xk − xk−1 | < ε2 , então, xk é a aproximação que


k

procuramos. Pode parar.

Se não, faça k = k +1 e voltamos ao passo 2.

Aula 9  Cálculo Numérico 213


Vejamos como funciona o algoritmo. Vamos voltar à equação x3 − x2 − 2x − 8 = 0 .
Já sabemos que existe uma raiz no intervalo [1,5,3]. Então, no passo 1, vamos fazer x0 = 2 e
usaremos ε1 e ε2 iguais a 0,1.
f (x0 )
2)  |f (x )| = 8 não é menor do que 0,1. Fazemos x
0 1 = x0 −
f  (x0 )
= 3, 333 . . .

3)  |f (x )| = 11, 25926 e |x


1 1 − x0 | = 1, 33333 não são menores do que 0,1. Fazemos k = 2
e voltamos ao passo 2.

f (x1 )
2)  x 2 = x1 −
f  (x1 )
= 2, 876877.

3)  |f (x )| = 1, 78 e |x2 − x1 | = 0, 4564563 não são menores do que 0,1. Fazemos k = 3


2

e voltamos ao passo 2.

f (x2 )
2)  x = x2 − = 2, 77263
3
f  (x2 )

3)  |f (x )| = 0, 081792 é menor do que 0,1. Podemos parar. 2,777263 é a raiz aproximada
3

que procuramos.

Observação – Como o próprio nome indica, algoritmos iterativos geram sequências de pontos
xn . Se colocarmos como condição de parada a precisão ideal ε = 0 , ou seja, se só aceitarmos
que o algoritmo pare caso encontre a solução matematicamente exata da equação f (x) = 0 ,
via de regra, o algoritmo iterativo gerará uma sequência infinita de pontos xn . A exceção seria
naquelas raras situações nas quais o algoritmo encontre uma raiz exata de f (x) = 0 e que
estejamos trabalhando com números exatos em vez de floats. Dois aspectos, descritos a seguir,
são fundamentais na análise matemática de algoritmos iterativos.

I – Convergência do algoritmo

Diz-se que um algoritmo converge, se a sequência xn for convergente, digamos xn → x .

i – Pode-se demonstrar que o método da bisseção converge sempre para uma solução x∗,
sempre que f (x) for contínua e f (a)f (b) < 0 .

ii – O método de Newton converge sempre que começamos com um ponto inicial x0 ,


“suficientemente” perto de uma solução x∗, na qual se tenha ainda f  (x0 ) = 0 .

II – Velocidade de convergência do algoritmo

Frequentemente, não basta saber que um determinado algoritmo tem condições de


convergência garantida. É também fundamental saber se ele o fará num tempo razoável.

Na tabela a seguir, registramos um estudo comparativo entre os métodos da bisseção e


2
de Newton. Usamos a função f (x) = e−x − cos(x) e precisão ε = 10−4 .

214 Aula 9  Cálculo Numérico


2
Tabela 2 – Comparação entre os métodos da bisseção e de Newton para f (x) = e−x − cos(x)
e precisão ε = 10−4.

Bisseção Newton
Dados iniciais [1,2] x0 = 1,5

Aproximação encontrada x 1,44741821 1,44752471

f (x) 2,1921×10 –5 1,3205×10 –6

Erro em x 6,1035×10 –5 1,7072×10 –3


Número de iterações 14 2

Isso indica que o método de Newton converge bem mais rapidamente que o método da
bisseção, neste caso. É mais ou menos o que acontecerá quase sempre que os dois algoritmos
convergirem. A exceção fica por conta de convergirem a um ponto x *, no qual não apenas
f (x *) = 0, mas também f’ (x *) = 0.

Atividade 5
Agora, use o algoritmo de Newton para encontrar as raízes de x3 − 9x + 3 = 0 .
O script do Scilab está listado a seguir.

// script: metodo de Newton


// f (x) = x ^3 – 9*x + 3
N = 10; // Numero maximo de iteracoes
x0 = 0.5; // Aproximacao inicial
eps1 = 0.001;
eps2 = 0.001;
xn = x0;
if abs(xn^3 – 9*xn + 3) < eps1 then
print f (‘%f ja e uma boa aproximacao’, xn)
end
for n=1:N
xn1 = xn – (xn^3 – 9*xn + 3)/(3*xn^2 – 9);
a = xn1^3 – 9*xn1 + 3;
if (abs(a) < eps1) or (abs(xn1 – xn) < eps2);
printf(‘Valor da raiz = %f ’, xn1)
return
else
xn = xn1;
end
end

Aula 9  Cálculo Numérico 215


Resumo
Nesta aula, você aprendeu dois métodos iterativos para encontrar soluções
aproximadas de equações: o método da bisseção e o método de Newton.

Autoavaliação
Faça resumos dos métodos vistos nesta aula.
1
Compare as soluções encontradas pelos dois métodos nas atividades. São as
2 mesmas? Se forem diferentes, a diferença é relevante? Qual método você achou
mais fácil de usar?

Exercícios propostos
1)  Localize as raízes das seguintes funções:

a)  f (x) = x − 5e−x ;

b)  f (x) = x log x − 1 ;

c)  f (x) = 2x − 3x .

2)  O método da bisseção pode ser aplicado sempre que f (a)f (b) < 0. O que acontece se
a função tiver mais de um zero em (a,b)? É possível determinar qual raiz será obtida por
esse método?

3)  O valor de π pode ser obtido por meio da equação sen(x) = 0. Use o método da bisseção
com precisão 0,0001 para conseguir uma aproximação de π .

216 Aula 9  Cálculo Numérico


4)  Aplique o método de Newton para encontrar as raízes das funções da questão 1
deste exercício.

5)  Se usarmos o método de Newton para encontrar uma raiz de f (x) = x3 − x − 1 com
x0 = 0 e precisão ε = 10−6 , precisaremos de 21 iterações. O que poderia justificar esse
número elevado de iterações?

6)  Uma loja de eletrodomésticos oferece dois planos de financiamento para um produto cujo
preço à vista é R$162,00.

Plano A: entrada de R$22,00 + 9 prestações iguais de R$26,50.

Plano B: entrada de R$22,00 + 12 prestações de R$21,50.

Qual dos dois planos apresenta a menor taxa de juros, sendo, portanto, melhor para
o consumidor?

Observação – Sabe-se que a equação que relaciona os juros J e o prazo P com o valor
financiado (VF = preço à vista – entrada) e a prestação mensal PM é dada por:

1 − (1 + J)−P VF .
=
J PM

VF
a)  Fazendo x = 1 + J e k=
PM
, verifique que a equação acima se transforma em

f (x) = kxP +1 − (k + 1)xP + 1 = 0 .

b)  Encontre a equação para este problema proposto e resolva-o.

Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

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 9  Cálculo Numérico 217


Respostas dos exercícios propostos
1) 
a)  [1,2]
b)  [2,3]
c)  [0,1]

2)  Faça gráficos de funções com mais de um zero em determinado intervalo.


Procure avaliar como o algoritmo da bisseção vai ser usado nesses casos.

3)  3,1415...

4)  e 6) Verifique nas equações se os valores encontrados estão próximos das


soluções.

5)  O valor inicial está distante da solução. Além disso, a primeira iteração está
próxima de um zero da derivada da função.

218 Aula 9  Cálculo Numérico


Anotações

Aula 9  Cálculo Numérico 219


Anotações

220 Aula 9  Cálculo Numérico


Interpolação polinomial

Aula

10
Apresentação
Nesta aula será utilizada a forma de Lagrange para encontrar o polinômio p tal que
p(x1 ) = y1 , p(x2 ) = y2 , p(x3 ) = y3 . . . , p(xn ) = yn dados os valores
x1 , x2 , x3 . . . , xn e y1 , y2 , y3 . . . , yn

Objetivos
Entender o conceito de interpolação.
1
Utilizar a forma de Lagrange para encontrar um polinômio
2 interpolador.

Aula 10  Cálculo Numérico 223


Introdução

I
magine a situação de um agricultor que descobriu algum minério, digamos ferro, em suas
terras. Antes de largar sua atividade de agricultura e se dedicar à mineração, ele deve
decidir se essa mudança de rumos valerá a pena. Um dos fatores que o ajudará a tomar
essa decisão é saber se a quantidade de ferro extraído será suficiente para cobrir os gastos
com a mineração e se dará mais lucros do que a agricultura. Ou seja, ele precisa ter uma idéia
de quanto minério há embaixo da terra antes de escavar toda a sua propriedade.

Uma tentativa de resolver esse problema é tirar pequenas amostras do terreno, medir
a concentração de minério nelas e estimar a quantidade de ferro no restante da propriedade.
Vamos imaginar que o agricultor separou uma faixa de terra de 1km, ao longo da qual
foram retiradas amostras a cada 250m. Os resultados das medições foram anotados na
seguinte tabela:
Tabela 1 – Valores das concentrações de minério encontradas em cada amostra.

Número da amostra Concentração encontrada (kg/m3)


0 0,5
1 0,8
2 0,3
3 1
4 0,7

A pergunta a ser respondida agora é: o que acontece com as concentrações de minério nos
250 metros que separam cada amostra? A interpolação nos ajuda a responder essa pergunta.

Interpolar uma função f (x) é encontrar uma aproximação sua por outra função g (x).
Uma vez encontrada essa aproximação, ela é usada no lugar de f (x).

No exemplo dado, das concentrações de minério de ferro, f (x) é a função que relaciona
distância (ou o número da amostra) e quantidade de minério. O problema é que para conhecer
o comportamento dessa função em todo o domínio, precisaríamos medir as concentrações de
minério por todo o quilômetro de terra que estamos estudando. Então, uma atitude razoável é
tentar descobrir uma aproximação para esse comportamento que nos ajude a tomar decisões
sobre os investimentos na extração do minério. Esta aula trata de algumas maneiras de
encontrar funções g (x) que aproximam f (x).

224 Aula 10  Cálculo Numérico


Primeiras aproximações
Até agora temos a seguinte situação: conhecemos alguns pontos do gráfico de f (x) e
queremos encontrar uma forma de preencher o restante do gráfico.

D
1

B
0.8
E

0.6
A

0.4
C

0.2

0
0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 1 – Os pontos A, B, C, D e E têm como coordenadas o número de cada amostra e o valor da concentração
de minério encontrado nela.

Cada aproximação feita leva em consideração algumas suposições sobre o comportamento


de f (x). A mais simples é supor que os valores não mudam entre uma amostra e outra. Nesse
caso, nossa aproximação g (x) tem o seguinte gráfico:

D
1

B
0.8
E

0.6
A

0.4
C

0.2

0
0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 2 – Gráfico da aproximação de f, constante por partes.

Aula 10 Cálculo Numérico 225


Outra aproximação pode ser obtida supondo-se que os valores das concentrações de
minério crescem ou decrescem de forma linear. Assim, temos o gráfico:

D
1

B
0.8
E

0.6

A
0.4

C
0.2

0
0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 3 – Gráfico da aproximação de f linear por partes.

Atividade 1

1 Expresse matematicamente as funções descritas nessa seção.

A concentração total de minério é a soma de todos os valores das


2 concentrações em cada local. Para encontrar uma aproximação desse
valor, devemos integrar uma função aproximação g (x). Calcule as
integrais das funções dessa seção e a diferença entre os valores obtidos.

226 Aula 10 Cálculo Numérico


Forma de Lagrange

A
s suposições feitas até agora têm as seguintes características: tornam as funções g (x)
descontínuas ou com derivadas descontínuas. Isso significa que estamos admitindo
que a concentração de minério de ferro, ou sua variação, pode variar bruscamente em
determinados locais.

E se supusermos que essa concentração varie de forma contínua e suave?

Você viu na Aula 10 (Funções Polinomiais) da disciplina Pré-Cálculo a resolução do


seguinte problema:

Sejam x1 , x2 . . . , xn+1 ∈ R, n + 1 pontos distintos de R, isto é,


xi = xj se i = j . Dados n+1 valores reais y1 , y2 . . . , yn+1 .
Obtenha um polinômio g de grau menor ou igual a n, satisfazendo
g (xi ) = yi , i = 1,
1, 2, . . . , n + 1 .

Nessa resolução foi demonstrado que o único polinômio g possível é dado por
y1 y2 yn+1
g(x) = p1 (x) + p2 (x) + . . . + p (x) , onde cada p é definido
p1 (x1 ) p2 (x2 ) pn+1 (xn+1 ) n+1 i

por pi (x) = (x − x1 )(x − x2 ) · · · (x − xi−1 )(x − xi+1 ) · · · (x − xn+1 ) . Essa maneira de

encontrar o polinômio g é chamada de forma de Lagrange para o polinômio interpolador.

Esses resultados podem ser usados para conseguir uma interpolação polinomial para o
caso da estimativa de concentração de minério. A vantagem em usá-los é conseguirmos uma
aproximação por uma função contínua com derivada contínua com um método fácil.

Vamos exemplificá-lo passo a passo:

Passo 1
No nosso caso faremos
x1 = 0, g(x1 ) = 0, 5; x2 = 1, g(x2 ) = 0, 8; x3 = 2, g(x3 ) = 0, 3;

x4 = 3, g(x4 ) = 1; x5 = 4, g(x5 ) = 0, 7.

Então temos n+1 = 5, o que nos diz que o polinômio g terá grau no máximo 4.

Passo 2
Precisamos encontrar os polinômios pi :
p1 (x) = (x − x2 )(x − x3 )(x − x4 )(x − x5 ) = (x − 1)(x − 2)(x − 3)(x − 4)
= 24 − 50x + 35x2 − 10x3 + x4 ;

Aula 10 Cálculo Numérico 227


p2 (x) = (x − x1 )(x − x3 )(x − x4 )(x − x5 ) = (x − 0)(x − 2)(x − 3)(x − 4)
= −24x + 26x2 − 9x3 + x4 ;

p3 (x) = (x − x1 )(x − x2 )(x − x4 )(x − x5 ) = (x − 0)(x − 1)(x − 3)(x − 4)


= −12x + 19x2 − 8x3 + x4 ;

p4 (x) = (x − x1 )(x − x2 )(x − x3 )(x − x5 ) = (x − 0)(x − 1)(x − 2)(x − 4)


= −8x + 14x2 − 7x3 + x4 ;

p5 (x) = (x − x1 )(x − x2 )(x − x3 )(x − x4 ) = (x − 0)(x − 1)(x − 2)(x − 3)


= −6x + 11x2 − 6x3 + x4 ;

Passo 3
Agora avaliamos cada polinômio em seu respectivo xi :
p1 (x1 ) = p1 (0) = 24;
p2 (x2 ) = p2 (1) = −6;

p3 (x3 ) = p3 (2) = 4;
p4 (x4 ) = p4 (3) = −6;

p5 (x5 ) = p5 (4) = 24.

Passo 4
Montamos o polinômio e fazemos as contas:
y1 y2 y3 y4 y5
g(x) = p1 (x) + p2 (x) + p3 (x) + p4 (x) + p (x)
p1 (x1 ) p2 (x2 ) p3 (x3 ) p4 (x4 ) p5 (x5 ) 5
0, 5  
= 24 − 50x + 35x2 − 10x3 + x4
24
0, 8  
+ −24x + 26x2 − 9x3 + x4
−6
0, 3  
+ −12x + 19x2 − 8x3 + x4
4
1  
+ −8x + 14x2 − 7x3 + x4
−6
0, 7  
+ −6x + 11x2 − 6x3 + x4
24


= 0, 5 + 2, 4166667x − 3, 325x2 + 1, 3833333x3 − 0, 175x4

228 Aula 10  Cálculo Numérico


Pronto! Conseguimos o nosso polinômio interpolador, cujo gráfico vemos a seguir.

2.4
2.2
2
1.8
1.6
1.4
1.2
D
1
A B
0.8 E
0.6
0.4 C
0.2
0
0 1 2 3 4
-0.2
-0.4
f

Figura 4 – Gráfico da aproximação polinomial de f.

Atividade 2
Calcule a integral de 0 a 4 da nova aproximação e compare com os
1 valores obtidos na Atividade 1.

Use a forma de Lagrange para encontrar o polinômio interpolador para


2 os pontos (0,1), (1,3), (2,5) e (3,7). Que fato geométrico pode ser
deduzido a partir do polinômio encontrado?

Use a forma de Lagrange para encontrar o polinômio interpolador para


3 os pontos (0,1), (1,1) e (3,10).

Aula 10 Cálculo Numérico 229


1.

2.

3.

230 Aula 10  Cálculo Numérico


Encontrando o polinômio
interpolador com o Scilab
Na Aula 03 (Sistemas de equações lineares) você aprendeu a usar o Scilab para encontrar
um polinômio interpolador. Repetiremos o procedimento descrito lá para resolver o seguinte
exercício:

Exercício resolvido
Encontre um polinômio do terceiro grau, digamos p(x) = c1 + c2x + c3x2+ c4x3
1 e tal que p(–2) = 5; p(2) = 3; p(5) = –1; p(7) = –3.

 sboce um gráfico do polinômio, de forma a incluir os pontos dados explicitados


E
2 com alguma marca que o identifique.

F aça o mesmo no caso onde o polinômio p(x) = c1 + c2x + ··· + c10x9, de forma
3 a garantir p(1)=b1, ·····, p(15)=b15 , onde b = rand(15,1).

 epita o item anterior para interpolar 30 dados com um polinômio p(x), de forma
R
4 que p(1) = b1, ··· ,p(30) = b30, onde b = rand(30,1).

Solução

Veja que, nesse caso, ao impormos a condição dada para p(x), obtemos
1 o sistema linear abaixo



 c1 − 2c2 + 22 c3 − 23 c4 =5

 c + 2c
1 2 + 22 c3 + 23 c4 =3


 c1 + 5c2 + 52 c3 + 53 c4 = −1

 c + 7c + 72 c3 + 73 c4 = −3
1 2
, ou seja,
    
1 −2 4 −8 c1 5
    
 1 2 4 8  c2   3 
Ac = 



=
 


 1 5 25 125  c3   −1 
1 7 49 343 c4 −3 .

Aula 10  Cálculo Numérico 231


Com o comando linsolve (A,–b), obtemos os coeficientes do polinômio c:
− −> c = linsolve(A, –b)
c = 4.8888889
- 0.5825397
- 0.2222222
0.0206349

A expressão simbólica do polinômio pode ser obtida com


− −> p = poly (c,”x”,”coeff ”)
p = 4.8888889 – 0.5825397x – 0.2222222x2 + 0.0206349x3
Para obter o gráfico desejado, digitamos no prompt do Scilab:
− −> tt = -2:.01:7; // Vetor de abscissas discretizadas entre -2 e 7
− −> pp = c(1) + c(2)*tt + c(3)*tt.^2 + c(4)*tt.^3; // Correspondentes
valores em p(x)
− −> plot(tt,pp, –2,5,'*',2,3,'*',5,-1,'*',7,-3,'*') // Gráfico correspondente

-1

-2

-3 -2 -1 0 1 2 3 4 5 6 7

Pediremos ao Scilab b = rand(15,1). Analogamente ao que fizemos


3 antes, nossa incógnita é o vetor c ∈ℜ , formada pelos coeficientes
15

de p(x) = c1 + c2x +·······+ c15x14 e cada um dos 15 dados p(i) =


b(i), do problema gerará uma equação do tipo

c1 + c2k +·······+ c15k14 = b(k)

232 Aula 10 Cálculo Numérico


Portanto, a matriz do sistema será a invertível matriz de Vandermonde
(como foi visto na Aula 03):
 
1 1 12 ··· 113 114
 
 1 2 22 ··· 213 214 
 
 1 3 32 ··· 313 314 
 
V ander(x) =  . . .. .. .. .. 
 .. .. . . . . 
 
 
 1 14 142 · · · 1413 1414 
1 15 152 · · · 1513 1514

Certifique-se que você pode obter o polinômio p(x) com os seguintes


comandos:

--> n =15; b = rand(n,1); x=(1:n)’; // Obtendo b e x


--> a=[ones(6,1), x, x.^2, x.^3, x.^4, x.^5, x.^6, x.^7, x.^8, x.^9, x.^10,
x.^11, x.^12, x.^13, x.^14, x.^15 ]; // Achando a matriz de Vandermonde
--> c = linsolve(a, –b); // Resolvendo a*c=b para obter os coefs. de p(x)
--> teste=norm (a*c-b) // Testando a solução de a*c=b
Deu teste = 0.00000026, o que é aceitável. Uma outra maneira de checar a
solução, nesse caso, é conferindo o gráfico de p(x), junto com os pontos dados
para serem interpolados, o que igualmente nos confirmaria o bom resultado, pois:

10

-10

-20

-30

-40

-50

-60

-70 0 2 4 6 8 10 12 14 16

Figura 5 – Gráfico de p(x)

Contudo, note que p(x) chega a valer menos de -50 em vários pontos entre
1 e 2. Se nosso objetivo principal for obter uma função que interpola os valores
prescritos em x = 1,···,15, para os demais números reais entre 1 e 15, essa
interpolação polinomial p(x) não seria uma opção razoável, uma vez que os
valores prescritos p(i) = b(i) , em cada x(i), estão todos entre 0 e 1.

Aula 10 Cálculo Numérico 233


Já ao fazer o mesmo para n = 30, obtivemos teste = 241351.8, o que
4 nos indica fracasso na obtenção do polinômio interpolador. O gráfico
de p(t), para t entre 0 e 30, nesse caso, nos dá:

6 e + 005

5 e + 005

4 e + 005

3 e + 005

2 e + 005

1 e + 005

0 e + 005

-1 e + 005

-2 e + 005

-3 e + 005 0 5 10 15 20 25 30

Figura 6 – Gráfico de p(x).

Veja que essa tentativa de obter p(x) para o qual p(i) = b(i), não funcionou
nesse caso. Por exemplo, obtivemos p(20) < –100, enquanto b20 = 0.4798 e
p(30) = –196992, enquanto b30 = 0.5949.

Observação 1 – Podemos encarar de dois ângulos a instabilidade numérica observada:

De um lado, veja que apesar da matriz A = Vander(x) ser invertível e a resolução do sistema
não ter fracassado, o teste realizado nos indicou que o sistema A*c = b deu um resultado
falso, o que pode ser associado a erros de arredondamento e truncamento.

Olhando de um outro ponto de vista, podemos pensar que polinômios de grau alto não são
bons interpoladores, numericamente falando. Veja que no item 3, obtivemos um polinômio que
atendia razoavelmente às condições para ele prescritas, mas que era um “mal interpolador”
em alguns pontos do domínio.

Se no caso 4 tivéssemos usado 50 dígitos significativos, em vez de 16, teríamos conseguido


um polinômio que satisfizesse com excelente aproximação as condições dadas, nos pontos
1,···,30. Em particular, veja a seguir o gráfico para t entre 27 e 30, obtido no Maple, com 50
dígitos significativos, de um tal polinômio interpolador, dado b = rand(30,1).

234 Aula 10 Cálculo Numérico


27 27.5 28 28.5 29 29.5 30
0

-100000

-200000

-300000

-400000

-500000

-600000

-700000

Figura 7 – Gráfico de p(x).

Em especial, entre 29 e 30, há valores onde p(x) < – 70000, e que estariam interpolando
valores que prescrevemos satisfazendo 0 < p(i) < 1, para i = 1,···,30. Isso não é nem um
pouco razoável.

Estudo do erro na interpolação

A
lgo que deve ficar bem claro é que, como foi dito na definição, interpolar uma função
f(x) é encontrar uma aproximação sua por outra função g(x). Ou seja, quando
encontramos o polinômio interpolador, estamos aproximando uma função, que muitas
vezes desconhecemos, por uma função polinomial. Nesse processo, o aparecimento do erro
é natural e deve sempre ser levado em consideração.

O teorema a seguir trata dessa questão.

Teorema
Sejam x0 < x1 < x2 < . . . < xn , (n + 1) pontos.
Seja f(x) com derivadas até ordem (n+1) para todo x pertencente ao intervalo
[x0, xn].
Seja Pn (x) o polinômio interpolador de f(x) nos pontos x0 , x1 , x2 , . . . , xn .
Então, em qualquer ponto x pertencente ao intervalo [x0, xn], o erro é dado por
f (n+1) (ξx )
En (x) = f (x) − pn (x) = (x − x0 )(x − x1 )(x − x2 ) · · · (x − xn ) ,
(n + 1)!
onde ξx ∈ (x0 , xn ).

Aula 10 Cálculo Numérico 235


Demonstração
Para sermos didáticos, faremos a demonstração para o caso n=2. O caso geral
segue o mesmo raciocínio.

Como f (xi ) = p2 (xi ) , segue que E2 (xi ) = 0 . Então a fórmula do erro é válida
para xi = 0, 1, 2.

Para cada x ∈ (x0 , x2 ), x = xi, definimos, no intervalo [x0, x 2] a função auxiliar


H(t) = E2 (x)G(t) − E2 (t)G(x) , onde G(x) = (x − x0 )(x − x1 )(x − x2 ) .
Note que estamos fixando x e a variável da função agora é t.

Por hipótese, f(t) é derivável até a terceira ordem. O polinômio de grau 2 P2(t)
também é diferençável até a terceira ordem. Então E2 (t) = f (t) − p2 (t) possui
derivadas até ordem 3.

Também é diferençável até a terceira ordem a função G(t), que é um polinômio


de grau 3.

Logo, H(t) = E2 (x)G(t) − E2 (t)G(x) possui derivadas até ordem 3.

Agora, se fizermos t= xi, então

H(xi ) = E2 (x)G(xi ) − E2 (xi )G(x) = E2 × 0 − 0 × G(x) . Isso significa que


x0 , x1 , x2 são zeros de H(t).

Da mesma forma, t=x também é um zero de H(t), pois

H(x) = E2 (x)G(x) − E2 (x)G(x) = 0 .


Assim, H(t) possui pelo menos quatro zeros no intervalo [x0, x 2]. Então, sua
primeira derivada, H'(t), possui pelo menos três zeros no intervalo (x0, x2), o
que implica em H''(t) possuir pelo menos dois e H'''(t) possuir pelo menos
um zero no intervalo (x0, x 2).

Calculando a terceira derivada de H(t), obtemos


H  (t) = E2 (x)G(t) − E2 (t)G(x) .

Mas, G(t) é um polinômio de grau 3, então sua terceira derivada é G'''(t)=3!.


Além disso, E2 (t) = f  (t) − p
2
(t) = f  (t), pois como p2(t) é um polinômio
de grau 2, sua terceira derivada é zero.
Desse modo,
H  (t) = 3!E2 (x) − f  (t)G(x)
.
Sendo x um zero da terceira derivada de H(t), segue que
ξ
H  (ξx ) = 3!E2 (x) − f  (ξx )G(x) = 0
f  (ξx )G(x)
⇒ E2 (x) =
3!

236 Aula 10  Cálculo Numérico


A fórmula para o erro dada pelo Teorema tem uso limitado na prática. As situações em
que conheceremos informações sobre f (n+1) (x) serão raras. Apesar disso, o Teorema tem
importância teórica e é usado para estimativas do erro.

Atividade 3

Seja f (x) = ex + x − 1 na tabela a seguir. Obtenha f (0,7) por interpolação linear e faça
uma análise do erro cometido.
Tabela 1 – Valores de x e f (x) = ex + x − 1 .

x 0 0,5 1 1,5 2

f(x) 0 1,1487 2,7183 4,9811 8,3890

Autoavaliação
Escreva com suas palavras o que é interpolação e descreva os métodos vistos
na aula para efetuar a interpolação polinomial.

Aula 10  Cálculo Numérico 237


Resumo
Nesta aula você aprendeu a encontrar polinômios interpoladores usando a forma
de Lagrange.

Exercícios propostos

1)  Use a forma de Lagrange para encontrar o polinômio de grau menor do que ou igual a 2
que interpola os dados da tabela:

X -1 0 2

f(x) 4 1 -1

2)  Dada a tabela a seguir, encontre x tal que f (x) = 2 .

x 0,5 0,6 0,7 0,8 0,9 1,0

f(x) 1,65 1,82 2,01 2,23 2,46 2,72

3)  Encontre o polinômio interpolador dos dados da tabela:

x 1 1,01 1,02 1,03 1,04 1,05

f(x) 1 1,005 1,01 1,0149 1,0198 1,0247



4)  Observe que os valores dados são de f (x) = x . Use o polinômio encontrado para
calcular f (1,025) e analise o erro cometido.

Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

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.

238 Aula 10  Cálculo Numérico


Respostas dos exercícios propostos
2 2 7
1)  3
x − x+1
3

2)  0,6947368

3) 
28.490, 681 − 183.800, 68x + 270.465, 17x2 − 263.487, 5x3 + 128.333, 33x4 − 25.000x5

Aula 10  Cálculo Numérico 239


Anotações

240 Aula 10  Cálculo Numérico


Integração numérica

Aula

11
Apresentação
Nesta aula trabalharemos métodos numéricos para calcular uma boa aproximação
numérica da integral definida de uma função. Ou seja, calcular uma aproximação para
 b
f (x)dx, de forma a poder avaliar a precisão da aproximação, sob hipóteses pouco
a
restritivas para a função f.

Objetivos
Estabelecer métodos que produzam boas aproximações
1  b
de f (x)dx.
a

2 Calcular estimativas de erro numérico dos métodos


apresentados.

3 Implementar cada um dos métodos estudados no Scilab.

4 Aplicar os métodos estudados a problemas.

Aula 11  Cálculo Numérico 243


Introdução e revisão
de somas de Riemann

C
omo vocês viram nas disciplinas de Cálculo e de Física que cursaram até agora, a integral
definida de uma função pode modelar fenômenos tão diversos quanto calcular áreas,
volumes, comprimentos de curvas, o trabalho realizado por uma força ao longo de uma
dada curva, etc. Em especial, nesta aula, vamos aplicar métodos numéricos de integração ao
problema de calcular áreas de mapas de pequenas regiões, nas quais considerar a Terra como
sendo plana não conduz a erros significativos de cálculo. Começamos relembrando dois fatos
básicos de Cálculo I:

A – Na disciplina de Cálculo I, você viu que uma primitiva F(x) de uma função f (x), num certo
intervalo [a,b], é uma função derivável F(x), tal que F’(x) = f (x), para todo x ∈ [a,b]. Um
dos resultados mais fundamentais de toda a Matemática aparece lá no Cálculo I e pode ser
sintetizado da seguinte forma:

Toda função contínua f : [a,b] →ℜ, admite uma primitiva F(x). Além disso,
 b
f (x)dx = F (b) − F (a)
a

Em particular, isso nos permite calcular a integral definida de funções contínuas cujas
primitivas sejam conhecidas. Infelizmente, isso não nos ajuda muito, em boa parte das
aplicações mais importantes. Por duas boas razões:

244 Aula 11  Cálculo Numérico


em boa parte delas, não se tem sequer uma fórmula para f (x). Que dirá para a sua
ƒƒ 
primitiva F(x). Muitas vezes, tudo o que se tem é uma discretização de f(x). O Exemplo 1
e o Problema 1 são casos típicos em que esse tipo de situação ocorre;

mesmo que se tenha uma expressão matemática para f(x), calcular sua primitiva é muitas
ƒƒ 
vezes impossível ou trabalhoso demais. A saída mais usual é calcular aproximações
numéricas da integral definida.

B – As somas de Riemann, que você estudou nas aulas 9 e 10 de Cálculo I, como aproximações
da integral definida, já nos dão uma primeira maneira de calcular uma aproximação numérica
 b
para f (x)dx , com algum controle sobre o erro cometido, conforme veremos mais adiante.
a

Atividade 1
Faça uma revisão da ideia de integral de Riemann, na aula 9 de Cálculo I.
1
Considere f :ℜ →ℜ dada por f(x) = x 3. Calcule somas de Riemann
2 de f (x), no intervalo [0,1], para partições de [0,1] em N intervalos de
igual comprimento, com N = 4, 8 e 16.

Compare os resultados obtidos no item 2 com o valor verdadeiro de


3  1
x3 dx , obtido através do teorema fundamental do cálculo.
0

Estudo de caso: somas de Riemann


de f(x) = e x, para x entre 0 e 1
De forma a complementar sua revisão da teoria de somas de Riemann proposta na
atividade 1, vamos trabalhar com somas de Riemann da função f(x) = e 4x, para x entre 0 e 1.

Vamos observar o que acontece com somas de Riemann, à medida que consideramos
partições cada vez mais finas de [0,1], comparando-as com o valor exato S da integral, que
conhecemos pelo teorema fundamental do cálculo. Ou seja:
 1
e4 − 1
S= e4x dx = ≈ 13.399538
0 4

Aula 11  Cálculo Numérico 245


Dividimos, inicialmente, o intervalo [0,1] em cinco partes de igual comprimento h = 0.2.
Correspondentemente, teremos uma partição P = [x0 = 0, x1 = 0.2, x 2 = 0.4, x 3 = 0.6, x4 = 0.8,
x5 = 1]. Em cada subintervalo [xi , xi +1] da partição P, considere os pontos:

z i = xi – ponto de mínimo de f (x) no subintervalo [xi , x i +1], pois f (x) é crescente;


ƒƒ 
z i = xi+1 – ponto de máximo de f (x) em [x i , xi +1], pela mesma razão;
ƒƒ 
xi + xi+1
ƒƒ zi = – ponto médio de [x i , xi +1].
2
Com isso, podemos formar as somas de Riemann inferior S 5 = Σ(f, P ) e superior
S 5 = Σ(f, P ). Podemos, ainda, considerar a soma de Riemann S5 = Σ(f, P, z), correspondente
às escolhas dos pontos médios em cada subintervalo, ou seja, z = [0.1, 0.3, 0.5, 0.7, 0.9]. Como
f (z i ) ≤ f (zi ) ≤ f (z i ), resultará naturalmente que S ≤ S5 ≤ S 5 . De fato,
5
4
S 5 = Σ(f, P ) = i=0 f (z i )h = (e0 + e0,8 + e1,6 + e2,4 + e3,2 )∗ 0.2 = 8.746856

S5 = Σ(f, P, z) = 4i=0 f (zi )h = (e0,4 + e1,2 + e2,0 + e2,8 + e3,6 )∗ 0.2 = 13.0487758
4
S 5 = Σ(f, P ) = i=0 f (z i )h = (e0,8 + e1,6 + e2,4 + e3,2 + e4 )∗ 0.2 = 19.466486

O erro de cada uma destas somas, relativamente ao valor verdadeiro de S, considerando


apenas 7 decimais de S, será:
E 5 = S 5 − S = 8.746856 − 13.399538 = −4.6526815

E5 = S5 – S = 13.0487758 - 13.399538 = – 0.3507617

E 5 = S 5 − S = 19.466486 − 13.399538 = 6.0669485

Visualmente, isso corresponde a entender que estamos aproximando a área compreendida


sob o gráfico de f(x) = e 4x , entre 0 e 1, pelas somas das áreas de cinco retângulos de base
x + xi+1
h = 0.2 e alturas f(xi ), f ( i ) e f(x i+1), respectivamente, conforme a Figura 1.
2

Somas inferiores para N = 5 Somas com ponto médio para N = 5 Somas superiores para N = 5

.5e2 .5e2 .5e2

.4e2 .4e2 .4e2


.3e2 .3e2 .3e2

.2e2 .2e2 .2e2


.1e2 .1e2 .1e2
0 x 0 x 0 x
0 .2 .4 .6 .8 1.0 0 .2 .4 .6 .8 1.0 0 .2 .4 .6 .8 1.0
−.1e2 −.1e2 −.1e2
Área: 8.746855986 Área: 13.04877579 Área: 19.46648600

Figura 1 – Somas de Riemann: inferior, com ponto médio e superior de e 4 x

246 Aula 11  Cálculo Numérico


Atividade 2
Nos gráficos anteriores (Figura 1), desenhe em azul uma região de
1 área E 5  e de vermelho uma região de área −E 5. No gráfico do meio,
desenhe em azul a área da região R1, que fica acima dos retângulos
e abaixo do gráfico; e em vermelho a da região R2, que fica acima
do gráfico e abaixo dos retângulos. Qual é a relação que existe entre
integral, E5 e as áreas das regiões R1 e R2?

Veja que o erro na soma de Riemann relativa ao ponto médio, em valor


2 absoluto, |E5| é bem menor, que os correspondentes erros |E 5 | e |E 5 |,
nas somas inferior e superior. Que argumento geométrico você daria, baseado
nos gráficos da Figura 1, para dizer que isso não foi mera coincidência?

Se fizermos a mesma coisa, usando uma partição de [0,1] em dez intervalos de igual
comprimento h = 0.1, obteremos:
9
S 10 = Σ(f, P ) = i=0 f (ξ i )h = (e0 + e0,4 + e0,8 + e1,2 + . . . + e3,6 )∗ 0.1 = 10.8978159
9
S10 = Σ(f, P, ξ) = i=0 f (ξi )h = (e0,2 + e0,6 + e1,0 + . . . + e3,8 )∗ 0.1 = 13.3106224
9
S 10 = Σ(f, P ) = i=0 f (ξ i )h = (e0,4 + e0,8 + e1,2 + . . . + e4 )∗ 0.1 = 16.2576309

Os correspondentes erros cometidos valerão E 10 = (S 10 − S) = −2.5017216 ,


E10 = (S10 − S) = 0, 088915 e E 10 = (S 10 − S) = 2.8580934 . Como era de se esperar,
estarão diminuindo, em valor absoluto, com este aumento de N.

Aula 11 Cálculo Numérico 247


Atividade 3
Na Figura 2, estão representadas as somas inferior e superior correspondentes à
função f(x) = e 4x e x ∈ [0,1], para N = 5 e N = 10. Desenhe, em azul, na Figura
2, as áreas correspondentes a S 10 − S 5 , e em vermelho as correspondentes a
S 10 − S 5

50

40

30

20

10

0
0.2 0.4 0.6 0.8 1
f(x) = eˆ(4f)

Figura 2 – Gráfico representando somas de Riemann superior e inferior para N = 5 e 10

Implementação no Scilab das somas de Riemann


Vamos considerar apenas partições P com igual espaçamento h = 1/N. Dada f :[a,b]→ℜ,
para calcular uma soma de Riemann Σ(f, P, z), você deve dispor do número de subintervalos N
e de um vetor de pontos z, tal que z(i) esteja no i -ésimo subintervalo da partição. A discretização
fz é calculada em z, ou seja, fz(i) = f (z(i )). Frequentemente, nas aplicações, fz são dados
experimentais. Na aula 2 (Introdução ao Scilab), vimos que o comando sum é útil para somar
coordenadas de vetores. Este é o nosso caso. Pode-se obter Riem_fPz = Σ(f, P, z), usando
o comando sum:

Riem_fPz = h*(sum(fz))

Usando esse comando, podemos calcular a soma de Riemann inferior de f (x) = e 4x, no
intervalo [0,1], para N = 20, digitando:

−−>  N = 20; h = 1/N; z = 0:h :1; zinf =z(1:N); fzinf = exp(4*zinf); Sinf = h*sum(fzinf)

Sinf = 12,1042191

248 Aula 11  Cálculo Numérico


Atividade 4
Mostre que, para partições com igual espaçamento h = 1/N, cada
1 soma de Riemann Σ(f, P, z) pode ser calculada como a média
aritmética de sua discretização fz = [f(z 1), f (z 2 ) , ...., f(z n )].

b
Como você interpreta f (x)dx, à luz do item anterior?
2 a

Peça ao Scilab para calcular Σ(f, P, z), no mesmo exemplo acima, no


3 qual obtivemos Sinf = 12.1042191, só que agora usando o comando
mean do scilab.

4 Use o Scilab para calcular S 20 e S 20 .

Dessa forma, podemos construir uma tabela, com somas de Riemann de f(x) = e 4x,
relativas a partições PN do domínio [0,1], de forma a ir dobrando N sucessivamente. Na Tabela 1,
registramos as correspondentes somas de Riemann S N = Σ(f, P ), superior S N = Σ(f, P ),
bem como SN = Σ(f, P, z), onde zi = (xi+xi+1)/2. Reproduzimos ainda os correspondentes
erros E N , EN , E N :

Tabela 1 – Somas de Riemann e erros cometidos em função de N

Somas de Riemann Erros cometidos em relação a S = 13.3995


N SN SN SN EN = SN − S EN = SN – S E N = S N − S = 13.3995
5 8.7468 13.0487 19.4664 -4.6526 -0.3507 6.0669
10 10.8978 13.3106 16.2576 -2.5017 -0.0889 2.8580
20 12.1042 13.3772 14.7841 -1.2953 -0.0223 1.3845
40 12.7407 13.3939 14.0806 -0.6588 -0.0055 0.6811
80 13.0673 13.3981 13.7373 -0.3320 -0.0013 0.3377
160 13.2327 13.3991 13.5677 -0.1667 -0.0003 0.1681

A Tabela 1 está nos dizendo que as somas de Riemann inferiores S N estão crescendo
e as superiores S N estão decrescendo, ambas aproximando-se cada vez mais do valor
S = 13.3995. Teoricamente, isso nos é garantido para todas as somas de Riemann, inclusive
SN , pois a função f (x) é contínua. Contudo, veja que SN aparenta se aproximar muito mais
rapidamente de S do que de S N e S N , à medida que N cresce. Por exemplo, para uma partição
de [0,1] em 160 intervalos iguais, o erro em valor absoluto, |E160|, é bem menor que os erros

correspondentes |E 160 | e |E 160 |. Observe ainda a Tabela 2, obtida com os valores de |E N | hN,

|E N | hN , bem como a de |EN |/hN2, onde hN = 1/N.

Aula 11  Cálculo Numérico 249


Tabela 2 - Comparando S N e S N contra hN e SN contra hN2

 
N |E N | hN |EN|/h N2 |E N | hN
5 23.2634 8.7690 30.3347
10 25.0172 8.8915 28.5809
20 25.9064 8.9226 27.6918
40 26.3525 8.9304 27.2457
80 26.5758 8.9324 27.0224
160 26.6874 8.9329 26.9107

Observe que |E N | ≈ 26.5∗ hN , |E N | ≈ 27∗ hN e |EN|  9 *hN2. Se algo semelhante


a isso acontecer para todo N, poderíamos dizer que os erros |E N | e |E N | são da mesma
ordem que hN = 1/N, enquanto que |EN | é da ordem de hN2. Veja que erros da ordem de
hN2 vão ficando menores, à medida que N cresce, muito mais rapidamente que erros da
ordem de hN . Dito de outra maneira, se as relações acima prevalecerem para todo N, isso
indica que, ao dividimos por 2 cada subintervalo da partição, o erro nas somas superiores
 
cai aproximadamente à metade, visto que |e2N | |eN | ≈ h2N hN = 12 , como você pode
 
confirmar na Tabela 2. Já na soma SN , se prevalecer a relação |e2N | |eN | ≈ (h2N hN )2 = 14,
isso indica que a cada refinamento como o que fizemos, o erro e 2N cai aproximadamente para
a quarta parte do valor de eN .

Na nossa análise de erros, a seguir, vamos mostrar que, de fato, os erros nas somas de
Riemann superior e inferior são da ordem de hN, enquanto que o erro na soma de Riemann com
ponto médio |EN| é da ordem de hN2, num sentido que definiremos mais precisamente dentro em
breve. Isso nos sugere, ainda, o desafio de procurarmos métodos de integração mais eficientes.
É isso que perseguimos com os métodos de Newton-Cottes que apresentaremos a seguir.

Métodos de Newton-Cottes

S
ão métodos nos quais particionamos [a,b] em N subintervalos de igual comprimento
h = (b–a)/N e nos quais dispomos de uma discretização fP da função, calculada em
P = [x0=a, a+h, a+2h,..., a +Nh =b]. Ou seja, fP(j) = f (a +jh), para j = 1,..,N+1.
Como integral de polinômio é fácil de calcular, a ideia é aproximar a função dada por polinômios
interpoladores de grau m para grupos de m +1 pontos sucessivos de P começando em x 0 , xm ,
x 2m ,.... O primeiro grupo interpola f (x) em x0 = a,x 1 = a+h,..., xm = a + mh. O segundo
interpola f(x) nos pontos xm ,...,x 2m , e assim por diante. Na verdade, só vamos cuidar dos
casos m = 1, também conhecido como regra do trapézio; e do caso m = 2, conhecido como
regra de Simpson. Os casos para m > 2 obtêm-se de maneira análoga e serão omitidos para
simplificar a exposição.

250 Aula 11 Cálculo Numérico


Caso m = 1, também conhecido
como regra do trapézio
Vamos começar com o caso no qual aproximamos cada subintervalo da partição por
um polinômio do 10 grau. Para facilitar a exposição, pense que f(x) ≥ 0 em [a,b]. A ideia é
aproximar a área Si , sob o gráfico de f em cada subintervalo [xi , x i+1 ] pela área sob o gráfico
do segmento de reta que liga (xi , f (xi)) a (xi +1, f(xi+1)), que será, portanto, a área de um
trapézio. A Figura 3 ilustra isso, no caso da função e –x , no intervalo [–2,2], particionado em
2

N = 8 subtintervalos. A área S8tr da aproximação trapezoidal será, portanto, a soma das áreas
de 8 trapézios retângulos cujas bases são os subintervalos [–2,–1.5], [–1.5,–1],...[1.5,2].

Aprox. da integral de f(x) = exp (−xˆ2), em [−2,2]


usando a regra do trapézio com N = 8
1

0.8
0.6
0.4
0.2

−2 −1 0 0 1 2
−0.2 x
Área: 1.761837268

f(x)

Figura 3 – Área S8tr = 1.761237268(soma das áreas de 8 trapézios)

Temos então, em cada subintervalo, um trapézio retângulo cuja base inferior é o segmento
ligando (xi ,0) a (xi +1,0) e a superior liga (xi , f(xi )) e (xi +1,f (xi+1)), conforme fica claro na Figura 3.
A área de cada um desses trapézios seria h*(f(xi) + f (xi+1), para I = 0,1,...,N. De modo que,
a soma SNtr , das áreas dos N trapézios é:
b N
a f (x)dx ≈ SN
tr =
i=0 h(f (xi ) + f (xi+1 ))/2
= h/2(f (x0 ) + 2[f (x1 ) + f (x2 ) + . . . + f (xN )] + f (xN +1 ))/2

Por exemplo, para N = 5 e N = 10, obtemos, para a função f(x) = e 4x

4
i=0 h(f (xi ) + f (xi+1 ))/2 = 0, 1(e0 + 2(e0,8 + e1,6 + . . . + e3,2 ) + e1 ) = 14.106671

9
i=0 h(f (xi ) + f (xi+1 ))/2 = 0, 05∗ (e0 + 2(e0,4 + e0,8 + . . . + e3,6 ) + e1 ) = 13.577723

Aula 11 Cálculo Numérico 251


Atividade 5
Verifique que se pi (x) é o polinômio do 10 grau que interpola f(x) em xi e
x
xi+1 = xi + h, então xii+1 pi (x)dx = h(f (xi ) + f (xi+1 ))/2 .

Cuidado! Neste caso, f (x) pode deixar de ser positiva e o argumento acima não
vale mais.

252 Aula 11  Cálculo Numérico


Implementação no Scilab da regra do trapézio
Note que a discretização fP = [f(x 0), f(x1), ...., f(xN)] tem N+1 elementos. Tudo que
precisamos fazer para calcular SNtr , no Scilab, é calcular 2*sum(fP(2:N)), adicionar-lhe fP(1)
e fP(N+1) e multiplicar tudo por h/2. Por exemplo, para calcular Str = SNtr , com N = 20,
neste nosso caso, onde f(x) = e4x, basta digitar no prompt do Scilab:

−−> N = 20; h = 1/N ; P = 0:h:1; fP = exp(4*P);

−−> Str = (2*sum(fP(2:N)) + fP(1)+fP(N+1))*h/2

Str = 13.4441729

Exemplo 1 – Cálculo de área num mapa


A seguir, reproduzimos um trecho do centro de Natal, retirado do mapa 11 da Listel/2008.
Nosso objetivo é estimar a área da região R, compreendida entre as avenidas Rio Branco,
Governador Juvenal Lamartine, do contorno (Alfredo Gurgel) e Juvino Barreto.

Figura 4 – Região do centro de Natal


Fonte: Listel (2008)

Para podermos aplicar técnicas de integração, precisamos descrever a região considerada


como gráfico de função ou então como uma união de regiões disjuntas entre si, cada uma
das quais possa ser descrita como gráfico de função. No nosso caso, colocamos a avenida
Rio Branco como eixo dos x, com a origem no lado esquerdo do cruzamento das avenidas
Rio Branco e Governador Juvenal Lamartine e dividimos a região R em duas regiões, R1
e R2. A região R 1 corresponde à parte do mapa de abscissas 0 ≤ x ≤ A1 = 11,5, onde

Aula 11 Cálculo Numérico 253


A = (11.5,0) é o ponto de encontro da Av. Rio Branco com a Av. Juvino Barreto. R2 corresponde
à região de nosso interesse que fica à direita deste ponto A. Veja que R1 pode ser pensada como
o gráfico de uma função fB (x), digitalizada em 47 pontos B1, ..., B47 . Suas abscissas estão
espaçadas em 46 subintervalos de comprimento h = 0.25 e suas 47 ordenadas compõem
o vetor f BP. Usamos o Geogebra (você viu este software na disciplina Instrumentação para
o Ensino de Matemática I) para operar com este mapa e obter os dados que necessitamos.
Na escala do mapa, obtemos:

fBP = B(:,2) = [ 0.00, 3.29, 3.75, 3.99, 4.17, 4.23, 4.29, 4.35, 4.47, 4.59, 4.69, 4.79,
4.89, 5.03, 5.11, 5.19, 5.27, 5.35, 5.41, 5.45, 5.47, 5.47, 5.45, 5.44, 5.43, 5.41, 5.39,
5.36, 5.33, 5.29, 5.25, 5.15, 5.07, 4.99, 4.89, 4.79, 4.71, 4.59, 4.47, 4.33, 4.21, 4.05,
3.87, 3.71, 3.55, 3.35, 3.13]’.

Confira que sua área, calculada pela regra do trapézio, valerá, na escala do mapa:

−−>S 1=0.25*(sum(fBP(1:46))+sum(fBP(2:47)))/2
S1 = 53.7463

Já a outra região pode ser pensada como o gráfico de uma função x = f (y), com
y variando de 0 a 3.13. Vamos subdividi-la em duas sub-regiões: R2a, acima da Câmara
Cascudo (y > 1.59), e R2b, abaixo dela. A região R2a está pensada como o gráfico de uma
função f L: (1.59,3.13) → R definida na reta vertical x = 11.5. Ela está digitalizada no gráfico
através dos pontos L1 = B47 = (11.5,3.13), L2,...,L7 = (11.96,1.59). Resultou N = 6 e
h = (3.13 –1.59)/6 = 0.257. Desse modo,

−−>f LP = [L7(1)–11.5,...,L1(1)–11.5)]
fLP = [0.46 , 0.793 , 0.86 , 0.84 , 0.647 , 0.327 , 0].

Segue que:

−−>S 21 = 0.257*(sum(fLP(1:6))+sum(fLP(2:7)))/2
S 21 = 0.9501

Já R2b é um trapézio retângulo, cuja aresta à direita tem vértices H = (11.81,0) e


L7= (11.96,1.59), na Juvino Barreto, e a aresta à esquerda está na reta vertical x = A(1) = 11.5.
Com esses dados, sua área pode ser calculada exatamente. Confira que valerá
S 22 = 1.59*(0.31+0.46)/2 = 0.6122 na escala do mapa. Na escala do mapa,
S = (S1 + S 21 + S22). Como cada unidade do mapa vale 85 m = 0.85 hm, a área real da
região R será, em hectares:

Sreal = (S1+S 21 + S22)*0.85^2 = 39.36 ha.

254 Aula 11  Cálculo Numérico


Atividade 6
b
1 Construa uma tabela com aproximações de a f (x)dx , calculadas pela
regra do trapézio com N = 10, 50, 250 e 1250 para f (x) = e –x 2, nos
casos a seguir:

a)  a = –1000 e b = 1; b)  a = –1000 e b = –20;


c)  a = –20 e b = 1; d)  a = –20 e b = –3;
e)  a = –3 e b = 1.

2 1
Verifique que, ao calcular −1000 f (x)dx no item a, com
a regra do trapézio, não funcionou, mas que usando
1  −20 1
−1000 f (x)dx = −1000 f (x)dx + −20 f (x)dx
, obteve-se um
resultado com precisão de 3 casas decimais em 250 iterações.

3
Verifique que
1  −20  −3 1
−1000 f (x)dx = −1000 f (x)dx + −20 f (x)dx + −3 f (x)dx

já resolve com 3 casas decimais de precisão em 50 iterações de cada fator.

4 1
Por que calcular 1000 f (x)dx é complicado de uma maneira, mas foi
possível no item 2 e melhor no item 3?

Caso m = 2, também conhecida


como regra de Simpson 1/3
Comecemos com uma partição de [a,b ] em apenas 2 subintervalos. Ou seja,
P = [a, a + h, a + 2h = b] e seja p2(x) o polinômio interpolador de f (x) nos pontos
x 0 = a, x 1 = x 0 + h, x 2­ = x 0 + 2h. Pela fórmula de Lagrange (vide aula 9 - Zeros de funções):

p2(x) = L0 (x)f (x 0) + L 1 (x)f (x 1) + L 2 (x) f (x 2), onde

(x − x1 )(x − x2 ) (x − x1 )(x − x2 )
L0 (x) = =
(x0 − x1 )(x0 − x2 ) 2h2

Aula 11  Cálculo Numérico 255


(x − x0 )(x − x2 ) (x − x0 )(x − x2 )
L1 (x) = =
(x1 − x0 )(x1 − x2 ) h2

(x − x0 )(x − x1 ) (x − x0 )(x − x1 )
L2 (x) = = .
(x2 − x0 )(x2 − x1 ) 2h2

De sorte que, neste caso,


 x2  x2  x2  x2
x0 p2 (x)dx = x0 L0 (x)f (x0 )dx + x0 L1 (x)f (x1 )dx + x0 L2 (x)f (x2 )dx

= A0 f (x0 ) + A1 f (x1 ) + A2 f (x2 ),

 x2  x2 (x − x1 )(x − x2 )
 x2
onde Ai = Li (x)dx. Para obter A0 = L0 (x)dx = dx, façamos
x0 x0 x0 2h2
a transformação de variáveis x = x 0 + th. Veja que t = 0, se x = x 0 ; e t = 2, se x = x 2; dx = hdt e que :
(x – x 1)(x – x 2)dx = (x0 + th –x1) (x0 + th – x 2) h dt = h 3 (t –1)(t –2)dt.

 x2 (x − x1 )(x − x2 ) 2
Portanto, A0 = dx = 0 h(t − 1)(t − 2)dt = h/3
.
x0 2h2

Da mesma maneira, obtemos A1 = 4h/3 e A2 = h/3. Assim, teremos, neste caso, de


particionar [x 0 , x 2] em dois subintervalos apenas:
 x2  x2
x0 f (x)dx ≈ x0 p2 (x)dx = h/3 ∗ (f (x0 ) + 4f (x1 ) + f (x2 ))

No caso de uma partição de [a,b] em N = 2Ñ intervalos de igual tamanho, podemos


aplicar repetidamente a regra obtida logo acima a cada um dos intervalos [x 0,x2], [x 2 ,x4],...,
[x 2N–2,x 2N ], obtendo:
b  x2  2Ñ
a f (x)dx = x0 f (x)dx + · · · + f (x)dx ≈
2Ñ −2

 x2  x2Ñ Ñ
 −1
h
≈ p2 (x)dx + · · · +
(1)
p2 (Ñ )
(x)dx = (f (x2k ) + 4f (x2k+1 ) + f (x2k+2 ))
x0 x2Ñ −2 3
k=0

Veja que, no somatório acima, cada termo de abscissa impar x 2 k +1 é multiplicado por 4 e
cada termo par x 2k , exceto o primeiro e o último, aparece duas vezes na soma: um associado
à parcela k –1 e outro à parcela k. O que nos dá:
b h  −1 Ñ −1
f (x)dx ≈ SNSimp = (f (x0 ) + 2 Ñ
k=1 f (x2k ) + 4 k=0 f (x2k+1 ))
a 3
1
Aplicando a fórmula acima a 0 e4x dx, com N = 10, obtemos:

1 Simp = 0, 1 0
e4x dx ≈ S10 (e + e4 + 2(e0,8 + . . . + e3,2 ) + 4∗ (e0,4 + . . . + e3,6 )) = 13.4014
0 3

256 Aula 11  Cálculo Numérico


Implementação no Scilab
da regra de Simpson 1/3
Olhando para a fórmula de SNSimp, precisaremos calcular a soma associada às abscissas
pares da discretização fP, bem como às ímpares. Na aula 2 (Introdução ao Scilab), vimos
que fP(J ) = [fP(J (1)), fP(J (2)), .... , fP(J(N ))]. Como x 0 = P(1), P(J ) será o vetor de
abscissas pares x0 , x2 , ... , x2N , se J = [1,3,5,...,N+1] = 1:2:N+1 e P(K), será o vetor de
abscissas ímpares x 1, x 3 ,..., x 2N –1, se K = [2, 4, 6, ... , N ] = 2:2:N. Cuidado ! A abscissa
par x 2k vira coordenada ímpar de P(x 2k = P (2k –1))
Ñ −1 Ñ −1
2∗ k=1 f (x2k ) = 2f P (3 : 2 : N − 1) e 4 k=0 f (x2k+1 ) = 4f P (2 : 2 : N )

Dito isso, para calcular a aproximação Simp da integral, com N = 20, de f(x)= e 4x, em
[0,1], basta digitar no Scilab:

−−>N = 20; h = 1/N ; P = 0:h:1; fP = exp(4*P);

−−>S 2 = h/3*(fP(1) + fP(N+1) + 4*sum(fP(2:2:N)) + 2*sum(fP(3:2:N –1)));

S2 = 13.399656

Exemplo 2
Na Tabela 3, organizamos os resultados que o Scilab nos devolveu ao calcular
aproximações para a integral de f (x) = e 4x, x ∈ [0,1], calculando a soma de Riemann SN ,
com escolha no ponto médio, a soma do Trapézio SNtr e a soma de Simpson S NSimp. Usamos N
par, já que a regra de Simpson o exige:

Tabela 3 – Somas SN , SNtr, SNSimp e respectivos erros relativamente a N

SN S Ntr S NSimp |EN | = |SN – S| |E Ntr | = |S Ntr – S| |E NSimp| =|SNSimp – S|


6 13.15457729 13.89217901 13.41349879 0.24496022 0.49264150 0.01396128
12 13.33770306 13.52337815 13.40044453 0.06183444 0.12384064 0.00090702
24 13.38404134 13.43054061 13.39959476 0.01549617 0.03100310 0.00005725
48 13.39566111 13.40729097 13.39954110 0.00387640 0.00775347 0.00000359
96 13.39856826 13.40147604 13.39953773 0.00096925 0.00193853 0.00000022

Observe que a aproximação pela regra de Simpson é bem mais precisa, neste nosso
caso. Por exemplo, observe na Tabela 3 que |E2N /EN| e |E 2N
tr
| valem aproximadamente 4, no
caso das regras de Riemann com ponto médio e do trapézio. Já na de Simpson, observe que
Simp
|E2N /E NSimp| ≈ 16. Veja ainda que:

Aula 11  Cálculo Numérico 257


Tabela 4 – Ordem de grandeza dos erros EN , E Ntr e E NSimp

N |EN |/h N2 |ENtr |/hN2 |ENSimp|/hN4


6 8.8186 17.7351 18.0938
12 8.9042 17.8331 18.8079
24 8.9258 17.8578 18.9943
48 8.9312 17.8640 19.0414
96 8.9326 17.8655 19.0532

ou seja, pela Tabela 4, EN e ENtr aparentam ser da ordem de hN2 , enquanto E NSimp parece ser da
ordem de hN4 . Nossa análise de erros, logo a seguir, confirmará que isso não é mera coincidência.

Atividade 7
O objetivo desta atividade é pedir-lhe que trabalhe um pouco mais o Exemplo 1. Considere
uma região G1 ligeiramente maior que a região R1, no mapa da Figura 4, de modo que sua
discretização contenha dois pontos a mais, B48 = (11.75, 2.99) e B49 = (12, 2.77), situados
na avenida do contorno. Aumentamos dois pontos na região para podermos comparar as
aproximações da área de G1, com partições PN , em N = 6, 12, 24, 36 e 48 subintervalos. Na
Tabela 4, registramos as aproximações SNtr e SNSimp, da área de G1, na escala do mapa, segundo as
regras do trapézio de Simpson e das somas de Riemann SeN e SdN , com escolhas ze = PN (1:N )
e zd = PN(2:N+1) (zek = xk , à esquerda de [xk , xk +1] e zdk = xk +1, à direita de [xk , xk +1]).

Tabela 5 - Valores das aproximações da área de G1 na escala do mapa

N SeN SdN SNtr SNSimp


6 48.900 54.440 51.670 53.260
12 52.570 55.340 53.955 54.717
24 54.155 55.540 54.848 55.145
36 54.650 55.573 55.112 55.299
48 54.885 55.578 55.231 55.359

SdN não deveria estar diminuindo com N?


1
Por que SeN e SdN não correspondem, neste caso, às somas de Riemann Inferior e
2 superior associadas a N ?

Esta pergunta admite uma dose importante de subjetividade, mas muitas vezes os
3 dados disponíveis exigem avaliações com alguma dose de incerteza. Você se sentiria
confortável para chutar um valor de 55.3 para a área da região, com um intervalo
de mais ou menos 1% deste valor como intervalo possível para a área ou você acha
que esta escolha é excessivamente cautelosa? Justifique sua resposta.

258 Aula 11  Cálculo Numérico


Observação 1 – Complexidade computacional

Dada uma partição PN de [a,b] em N subintervalos com hN = 1/N e uma discretização fP


associada, o custo computacional de calcular cada uma das aproximações é, essencialmente,
o de somar N números. Computacionalmente, isto é, quase sempre, muito mais barato do
que avaliar fP. Cada avaliação de fP corresponde a realizar N avaliações de f (x). Isto é, via
de regra, é muito mais caro que somar N números.

Análise de erros
b
Começamos analisando os erros E N = a f (x)dx − Σ(f, P ) cometidos ao
aproximarmos a integral definida de uma função derivável f (x), por uma soma de Riemann
superior, com uma partição P, de [a,b], em N subintervalos de igual tamanho h.

b N
|E N | = | a f (x)dx − k=0 f (zk )h| ≤ M (b − a)hN , onde M é uma cota
superior para |f’ (x)| em [a ,b].

Demonstração – Veja que o erro E N é uma soma de erros ek, cometidos em cada um dos
subintervalos [x k ,xk +1], já que:
 xk+1 
b N N 
a f (x)dx − k=0 f (zk )h = i=0 f (x)dx − f (zk )h = N
i=0 ek .
xk
  
ek

Como f é contínua, os teoremas do valor médio do Cálculo I nos garantem a existência de ck e


dk entre xk e xk +1, de tal modo que:
x
ek = xkk+1 f (x)dx−f (xk )h = f (ck )h−f (xk )h = (f (ck )−f (xk ))h = f  (dk )(ck −xk )h.

Mas então, se M é uma cota superior para |f’ (x)| em [a,b], isso significa que |ek |≤Mh 2,
implicando:
N
|E N | = |e1 +e2 +. . .+eN | = | k=0 f
 (d
k
)(ck −dk )h| ≤ N M h2 = M ∗ N h∗ h = M (b−a)h.

Observação 2 – Podemos interpretar o resultado destacado acima, dizendo que o erro E N é da


ordem de hN, se f(x) tem derivada limitada em [a,b ]. O mesmo vale, com idênticos argumentos,
para o erro E N , relativamente às somas inferiores. Note que a análise acima apenas prova que
|EN | ≤ M hN , onde M é uma cota superior para |f’(x)|. Neste nosso caso, obtemos apenas
|EN | ≤ 4*e 4hN . No entanto, os dados da Tabela 2 indicavam algo bem melhor, ou seja, que

Aula 11  Cálculo Numérico 259


E N ≈ 26.8hN , apontando com isso, a convergência de E N /hN , para N→∞. Isso de fato
acontece, se f’(x) é contínua. Aprofundaremos esse ponto nos complementos desta aula,
visando os alunos mais motivados, onde mostraremos, entre outras coisas, que:
lim E N /hN = lim E N /hN = (f (b) − f (a))/2
N →∞ N →∞

Observe que para f (x) = e 4x, (f (1) – f (0))/2 = (e 4 – 1)/2 = 26.79905

Definição
De maneira mais geral, diremos que um erro é da ordem de hm = (1/N)m, caso
exista uma constante k, de tal forma que |EN| ≤ k |1/N |m. Dizemos ainda que
EN = O(1/N m), neste caso.

Por exemplo, a Tabela 4 indica que os erros E NTr, ao se empregar a regra do trapézio,
bem como ao se usar somas de Riemann, com o ponto médio do intervalo, pareciam ser da
ordem de (1/N)2, enquanto que E NSimp parecia ser da ordem de (1/N)4. Essas três indicações
se confirmam teoricamente, desde que a função tenha derivadas suficientes em [a,b]. Por uma
questão de falta de espaço, vamos tratar apenas os erros cometidos com os usos das regras
do trapézio e da regra de Simpson.
 b
Seja EN(m) = ab f (x)dx − SN(m) o erro cometido ao aproximar a f (x)dx pelo método
de Newton-Cottes de ordem m = 1 ou 2, com partição de [a,b ] em N subintervalos de
comprimento h = 1/N. Então,

b−a 2
|EN(1) | ≤ h M2 , onde M 2 é uma cota superior para |f ’’(x)|, em [a,b];
12
b−a 4
|EN(2) | ≤ h M4 , onde M 4 é uma cota superior para |f (iv) (x)|, em [a,b].
180

Vamos analisar com cuidado o caso m = 1 e, em seguida, tentar dar uma ideia do que
acontece no caso m = 2.

Avaliação do erro no caso


m = 1 (fórmula do trapézio)
Veja que, em cada intervalo [xk , xk +1 ], o erro e k cometido vale:
 xk+1  xk+1  xk+1
ek = xk f (x)dx − xk p(k)
1
(x)dx = xk (f (x) − p(k)
1
(x))dx

No final da aula 10 (Interpolação polinomial), você viu que, se p 1(x) é um polinômio que
interpola f(x) entre a e b, então, para todo x ∈ [a,b], teremos:

260 Aula 11  Cálculo Numérico


f  (z)
f (x) − p(x) = (x − a)(x − b) , onde z ∈ [a, b].
2!
Dessa forma, para algum zk entre xk e xk +1,
 xk+1 f  (zk )  xk+1
ek = (f (x) − p(k) (x))dx = (x − xk )(x − xk+1 )dx .
xk 1
2 xk

 xk+1
Para calcular (x − xk )(x − xk+1 )dx , faremos a mesma substituição
xk

x = xk + th que já fizemos mais acima, para calcular A0 = xx02 L0 (x)dx.

Veja que t = 0, se x = xk e t = 1, se x = xk +1.

Veja ainda que (x – x k)(x – kx +1) = h 2t (t –1) e que dx = h*dt. Portanto,


 xk+1 1 h3
(x − xk )(x − xk+1 )dx = h3 t(t − 1)dt = − .
xk 0 6

Se M for uma cota superior para f’’(x) em [a,b], ou seja, |f’’(x)| M, para todo x ∈ [a,b],
isso significa que, para todo k = 1,..., N:
 f  (ξk ) h3  3
|ek | =  ≤Mh .
2 6 12
Veja que o erro E N(1) cometido é a soma dos erros cometidos em cada subintervalo
[xk , x k +1]. Em valor absoluto, teremos:
b
|EN(1) | = | a f (x)dx − S (1) | = |e1 + e2 + . . . + eN | ≤ |e1 | + |e2 | + . . . + |eN |

h3 h2 h2
≤N ∗M = MNh = M (b − a) .
12 12 12

Fórmula do erro no caso m = 2


Neste caso, o erro ek , no intervalo [xk , xk +2], atende pela fórmula:
 xk+2  xk+2  xk+2
ek = xk f (x)dx − xk p(k)
2
(x)dx = xk (f (x) − p(k)
2
(x))dx .

Com o mesmo resultado da aula de interpolação usado acima, chegamos a:


 xk+2 f  (ξk )  xk+2
ek = (f (x) − p(2) (x))dx = (x − xk )(x − xk+1 )(x − xk+2 )dx.
xk 1
2 xk

A integral do polinômio à esquerda se faz pela mesma substituição x = x 0 + th e deixamos


como exercício para você a verificação que vale 0. É isso que faz a aproximação de ordem 2,
de Newton-Cottes, ser da ordem de h 4, em vez de apenas O(h 3). A estimativa para o erro
b−a 4
|EN(2) | ≤ h M4 , onde M4 é uma cota superior para |f (iv) (x)|, em [a,b], neste caso,
180
resulta ser um resultado um pouco mais fino (FRANCO, 2006).

Aula 11  Cálculo Numérico 261


Autoavaliação
Você entendeu bem as aproximações da integral definida, usando somas de
1 Riemann? Se não entendeu, insista até entender direito. Se entendeu, conseguiu
usar o Scilab para calcular somas de Riemann? Brincou com o método usando outras
funções? Percebeu como as somas de Riemann inferiores aumentam quando se
dobra N, as inferiores diminuem quando se dobra N e a do ponto médio é sempre
bem mais precisa que as outras duas? Se não brincou com essas coisas no Scilab,
volte e faça-o! Se tiver dificuldade em fazê-lo, não hesite em nos contatar...

O que significa dizer que um dado método que utilize uma partição do intervalo [a, b ]
2 em N subintervalos de comprimento hN = 1/N é da ordem de (hN ) m (O(hNm))?

Dada uma partição de [a, b] em N subintervalos iguais, em que sentido pode-se


3 dizer que “o método do trapézio é um mais rápido que a regra de Simpson 1/3, mas
em compensação o resultado obtido pela regra de Simpson 1/3 é mais confiável”?

Em que sentido pode-se dizer que a integral definida de uma função em [a, b] pode
4 ser bem aproximada por médias aritméticas de digitalizações de f(x ), medidas em
partições igualmente espaçadas de [a,b]?

Resumo
Nesta aula, você viu diferentes maneiras de calcular aproximações numéricas
da integral definida. Em particular, reviu o método das somas de Riemann e lhe
foram apresentadas as regras do trapézio e de Simpson 1/3, bem como aprendeu
a calculá-las usando o Scilab. Viu também uma análise dos erros cometidos por
cada uma das regras, em função do tamanho da partição hN = 1/N.

262 Aula 11  Cálculo Numérico


Problemas propostos
1)  Um foguete foi bem sucedido no seu lançamento vertical, a partir do chão. Sabe-se que
sua aceleração variou continuamente e sua velocidade, calculada de 5 em 5 segundos, no Problemas
primeiro minuto, está registrada na Tabela 6. Use as fórmulas do trapézio e de Simpson, propostos
para calcular aproximações para a altura do foguete 1 minuto após seu lançamento, com Resumos de soluções
N = 6 e N = 12. Você apostaria que o erro na avaliação do espaço percorrido não deve dos problemas
propostos estão
ser superior a 0.5 %?
disponíveis no Moodle.

Tabela 6 – Velocidade do foguete no primeiro minuto após seu lançamento

T (seg) 0 5 10 15 20 25 30 35 49 45 50 55 60
V(m/s) 0 51 155 284 418 502 569 602 584 580 573 560 555


2)  Considere f : [–1,1] → ℜ, dada por f (x) = 0.5∗ 1 − x2

a)  Mostre que seu gráfico é a parte superior de uma elipse.


 1/2 1
b)  Calcule aproximações de −1/2
f (x)dx e de −1
f (x)dx, usando as regras do trapézio e
de Simpson, e partições com N = 12, 24, 48 e 96.

c)  Calcule uma aproximação para a área interior à elipse, definida por x 2 + 4y 2 ≤ 1, com
dois algarismos significativos. É possível obter, sem fazer mais contas, 4 algarismos
significativos desta área?

 1/2
d)  Verifique que as aproximações obtidas para −1/2
f (x)dx parecem ser muito boas, à
medida que N cresce, do jeito que nossa teoria de erros prevê, enquanto que o mesmo
1
parece não acontecer com −1 f (x)dx. Como você explica isso? (Sugestão – Veja que

f(x) tem derivadas limitadas em [–1/2,1/2], mas não em [–1,1]).

Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

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 11  Cálculo Numérico 263


Anotações

264 Aula 11  Cálculo Numérico


Introdução Numérica às
Equações Diferenciais
Ordinárias

Aula

12
Apresentação

I
saac Newton, no final do século XVII, enunciou sua segunda lei da mecânica, segundo
a qual mx''(t) = F(t,x(t)), onde x(t) representa o movimento de uma partícula de
massa m e F(t,x(t)) é a resultante das forças aplicadas em x(t), no instante t. Ao fazê-lo
Newton alçou as equações diferenciais à condição de ferramenta matemática essencial para
a compreensão dos fenômenos físicos. De fato, a física como um todo se escreve através
de leis que expressam relações entre funções e suas derivadas. Não só fenômenos físicos,
mas muitos outros fenômenos também podem ser descritos por Equações Diferenciais, vale
dizer, por funções implicitamente descritas através de relações conhecidas entre ela mesma
e algumas de suas derivadas. Infelizmente, poucas equações diferenciais admitem soluções
analíticas fáceis de encontrar e métodos numéricos são amplamente utilizados para atacá-las.
Em particular, julgamos que soluções numéricas de Equações Diferenciais Ordinárias (EDO)
seja um assunto obrigatório em qualquer curso de cálculo numérico. Uma dificuldade, nesse
aspecto, é que, em geral, alunos de licenciatura não estudam equações diferenciais para valer,
num curso destinado só a esse tema. Nossa abordagem aqui será tentar fazê-lo lembrar de
algumas situações nas quais você se deparou com uma EDO, situar alguns resultados básicos
sobre EDO e trabalhar alguns poucos métodos numéricos, de forma a dar-lhe uma primeira
ideia desse importante tema.

Objetivos
1 Entender o que é uma EDO através de exemplos.

Introduzir um resultado importante sobre a existência


2 e unicidade de soluções do Problema do Valor Inicial
– PVI, de uma EDO.

Trabalhar numericamente com os métodos de Euler e


3 Euler Aperfeiçoado.

Aula 12  Cálculos Numéricos 267


Exemplos de fenômenos modelados
por equações diferenciais
O objetivo aqui é trabalharmos o tema a partir de alguns exemplos que possam ser
familiares a você de alguma forma.

Exemplo 1
Considere que a população de uma dada espécie de inseto num certo município encontra
uma boa condição para se proliferar, de tal forma que a taxa de concentração demográfica y(t)
dessa espécie, no município considerado, esteja variando proporcionalmente a y(t), segundo
a equação:
y'(t) = 0.03y(t)

com o tempo medido em dias. Supondo que sua taxa inicial em t = 0 era de y0 = 0.02 insetos/m2,
quanto será essa taxa depois de 90 dias?

Solução
É fácil checar que y(t) = y0 e0.03t resolve a equação dada, já que, nesse caso y(0) = y0
e que:
y(t)' = (y0 e0.03t )' = 0.03y0 e0.03t = 0.03 y(t)

Em 90 dias a taxa valerá y(90) = y0e0.03*90= 14.88 y0 ≈ 0.2976 insetos/m2

O crescimento foi cerca de 10 vezes em 90 dias. Nosso próximo exemplo tratará de um


modelo para a evolução da população de insetos, contudo na presença de predadores de
sua espécie.

Exemplo 2
No modelo do Exemplo 1 considere também uma população de sapos, que se alimenta dos
insetos e considere a equação que modela o fenômeno como a equação logística definida por:

y'(t) = 0.03*y(t)*(1 – 10*y(t)) e tal que

y(0) = y0 = 0.02 insetos/m2

268 Aula 12  Cálculos Numéricos


Solução
Essa equação ainda é relativamente fácil de resolver analiticamente, ou seja, encontrar
uma fórmula para sua solução. Derive

y(t) =
y0 .
10y0 + (1 − 10y0 )e−0.03t

verifique que y(0) = y0 e que y(t) satisfaz à equação dada (vide Figura 1).

Portanto, y(90) = 3.941*y0 = 0.07881. Nesse caso, como seria de se esperar de um


modelo minimamente adequado ao fenômeno estudado, a taxa de crescimento é bem menor
que no exemplo anterior, sem o sapo que se alimenta de insetos.

A seguir os gráficos das soluções obtidas nos Exemplos 1 e 2:

y=0.1 Sol. exemplo 1 Sol. exemplo 2

0.25

0.20

0.15

0.10

0.05

0 10 20 30 40 50 60 70 80 90

Figura 1 – Gráficos das soluções obtidas nos exemplos 1 e 2.

Atividade 1

Tente explicar na Figura 1 como o comportamento das duas soluções


1 se corresponde com os respectivos modelos.

Ache a solução da equação do Exemplo 2 com condição inicial


2 y(0) = 0.1. Diga qual o papel da reta y = 0.1 desenhada na Figura 1. Se
tiver dificuldade nesse item, faça primeiro a Atividade 4 e depois volte a ele.

Aula 12 Cálculos Numéricos 269


No Exemplo 3, vamos agora considerar um fenômeno físico que você estudou pela
primeira vez ainda no segundo grau, muito embora sem falar em derivadas.

Exemplo 3
Considere uma pedra que é jogada para cima, a partir do chão, com uma velocidade inicial
de 20 m/s, e segue uma trajetória vertical, até voltar ao solo. Considera-se a resistência do
ar como desprezível neste fenômeno. Se y(t) for a expressão de uma função que descreve
o movimento, com o eixo dos y apontando para cima, como não há resistência do ar, e a
gravidade pode ser considerada constante já que a pedra não terá como subir muito, a equação
que rege o fenômeno é dada pela segunda lei de Newton, na forma:

my''(t) = F = –mg ⇒  y''(t) = – g

com condições iniciais y(0) = y0 = 0 e y'(0) = v0 = 20

Solução
Como você bem sabe, da física, o polinômio y(t) = –gt 2/2 + v0t + y0 ≈ –4.9t 2 + 20t
representa a trajetória de nossa pedra. É muito fácil checar isso diretamente derivando duas
vezes o polinômio e vendo que sua segunda derivada é a constante –g.. O domínio de y é [0,tf ],
onde tf é o tempo que a pedra leva até voltar ao solo, ou seja:

y(tf ) = –4.9tf2 + 20t = 0 ⇒ tf ≈ 20/4.9 = 4.08

O gráfico de y: [0,tf ]  ℜ é uma parábola e a altura máxima atingida pela pedra é


y(2.04) = 20.41m

Exemplo 4
Vamos considerar o mesmo exemplo de antes, levando em consideração também a
resistência do ar, na forma de uma força de atrito dinâmico FR(v) = –®v, com ® = 1, ou
seja, de uma força proporcional à velocidade do objeto e em direção contrária ao movimento.
Vamos supor ainda que a massa do corpo valha m = 0.5, ou seja, proporcional à velocidade
do objeto e em direção contrária ao movimento. Nesse caso a segunda lei de Newton nos dá:

my''(t) = F = –mg – ®y'(t) ⇒  y''(t) + ®/m y'(t) = – g,

com condições iniciais y(0) = y0 = 0 e y'(0) = v0 = 20

270 Aula 12  Cálculos Numéricos


Solução
Portanto, aqui também procuramos uma função y(t) que satisfaz a uma equação
envolvendo suas derivadas, bem como a condições iniciais prescritas. Se supusermos
z(t) = y'(t), a equação ficará

z'(t) + ®/m z(t) = y''(t) + 2 y'(t) = – 9.8,

A solução da equação acima em z(t) pode ser facilmente constatada como sendo

z(t) = – 4.9 + Ce –2t = – 4.9 + Ce –2t

onde C é uma constante. Ao impor a condição inicial z(0) = y'(0) = 20, obtemos:

20 = –4.9 + C   ⇒  C = 24.9 ⇒ z(t) = –4.9 + 24.9 e –2t

Com o teorema fundamental do cálculo, obtemos:


 t
e−2t t
y(t) = y0 + z(τ )dτ = −4.9t + 24.9 
0 −2 0
= −4.9t + 12.45(1 − e−2t )

Veja que, nesse caso, a pedra sobe bem menos que no exemplo anterior,
devido a considerarmos a resistência do ar. Seu ponto mais alto será dado por
y'(t) = z(t) = –4.9 + 24.9e –2t = 0 ⇒ t = 0.813. Portanto, o ponto mais alto será atingido
bem antes, será bem mais baixo que no exemplo anterior e valerá y(0.813) = 6.017m.

Atividade 2

Esboce, num mesmo eixo, os gráficos do movimento das duas pedras nos
Exemplos 3 e 4, observe no que diferem e relacione essas diferenças com as
respectivas equações que os definiram.

Aula 12  Cálculos Numéricos 271


Exemplo 5
Vamos sofisticar o modelo anterior e, em vez de lançar uma pedra ao ar, vamos supor que
um foguete foi lançado da terra na direção vertical. Continuamos a considerar a resistência do
ar, mas agora temos que considerá-la variável já que a atmosfera terrestre vai se rarefazendo
à medida que o foguete sobe, assim como também a gravidade varia com a altura. Nesse
caso, também a massa m(t) do foguete está variando com a altura, pois ele está queimando
combustível, que está sendo expelido a uma dada taxa m'(t). Nossa lei de Newton para o
movimento nos dirá que a derivada da quantidade de movimento vale a força que age sobre
o foguete. Ou seja, neste caso:

GM m(t)
(m(t)v(t)) = (m(t)y  (t)) = m(t)y  (t) + m (t)y  (t) = − − α(t, y)y  (t)
   (R + y(t))2   
Quantidade de
   Resistência do ar
movimento Atração gravitacional
do foguete da terra sobre
o foguete

onde G é a constante gravitacional, M a massa da terra, R o raio da terra e ®(t,y(t))y'(t) a


função que a cada t, y(t) e y'(t) avalia a força de resistência do ar sobre o foguete.

Vamos supor ainda que nosso modelo valha a partir de y(t0) = y0 e que, nesse momento
a velocidade do foguete seja y'(t0) = v0. Veja que nosso modelo pressupõe dadas as funções
m'(t) e ®(t,y), para todo t ≥ t0 e todo y ≥ y0. Isto significa que a trajetória do foguete, a partir
de t = t0 satisfará:


    GM m(t)
 m(t)y (t) + m (t)y (t) + α t, y(t) y (t) + R + y(t)2 = 0
   


 y(t0 ) = y0


y  (t0 ) = v0

Ela também terá solução, como veremos no teorema que anunciamos abaixo, contudo a
representação da solução não será mais possível de se expressar de forma tão simples quanto
as dos Exemplos 1-4.

272 Aula 12  Cálculos Numéricos


Equações Diferenciais Ordinárias
Todos os 5 exemplos anteriores correspondem a problemas nos quais a solução
procurada resulta ser uma função y(t) satisfazendo uma relação prescrita entre t, y(t) e
derivadas de primeira e/ou segunda ordens de y(t). Podemos expressá-las na forma de
equações F(t,y(t),y'(t),y''(t)) = 0, onde F é dada, em cada caso, pela segunda coluna da
Tabela 1, com condições iniciais prescritas num dado instante t0, conforme está na última
coluna da Tabela 1 a seguir.
Tabela 1 – Formas implícita e explícita das EDOs dos Exemplos 1-5

Ex. Forma implícita Forma explícita Condições


F(t,y,y',y'') = 0 y'= f(t,y) ou y'' = f(t,y,y') Iniciais
1 F(t,y,y') = y' – 0.03y y' = f(t,y) = 0.03y y(0) = 0.02
2 F(t,y,y’) = y’– 0.03(y–10) y'= f(t,y) = 0.03(y–10) y(0) = 0.02
3 y(0) = 0
F(t,y,y',y'') = y''+ g y'' = f (t,y,y'') = – g
y'(0) = 20
4 y(0) = 0
F(t,y,y',y'') = y''+®/m y + g y''= f(t,y,y'') = – ®y' – g
y'(0) = 20
5 GM m m + α  GM y(t0) = y0
F (t, y, y  , y  ) = my  + (m + α)y  +  2 y  = − y −
R + y(t) m (R + y)2 y'(t0) = v0

Todos os cinco exemplos discutidos até aqui correspondem a soluções de uma Equação
Diferencial Ordinária (EDO), com condições iniciais prescritas. Um tal problema, por vezes, é
referido como Problema de Valor Inicial - PVI. Na sua forma mais geral, uma EDO de ordem
n, nada mais é do que uma relação funcional implícita entre t, y e as derivadas de y(t), até a
ordem n, que pode ser colocada na forma F(t,y,y',....,y (n)) = 0. Uma solução de tal EDO é
uma função y: (a,b)  ℜ, tal que, para todo valor de t ∈(a,b), tenhamos
F(t,y(t),y'(t),....,y (n)(t)) = 0
Na grande maioria dos casos de interesse, como foi o nosso nos Exemplos 1-5, é possível
explicitar, a partir da função F, a derivada de maior ordem de y, em função das de menor
ordem. Na Tabela 1 escrevemos cada uma das equações nas duas formas. Na coluna 2, ela
está dada na sua forma implícita F(y,y,y',y'')= 0. Já na coluna 3, temos a mesma equação
na forma explícita, dada como y'= f(t,y), nos Exemplos 1 e 2 e como y''= f(t,y,y') nos
Exemplos 3,4 e 5.

Nos quatro primeiros exemplos temos métodos conhecidos para chegar a soluções
analíticas. Além disso, é fácil checar diretamente que as soluções descritas são de fato soluções
das equações. Já no quinto exemplo, não é tão simples descrever uma solução por meio de
fórmulas. Na verdade, é impossível descrever soluções para a trajetória do projétil do Exemplo
5, mesmo no caso mais simples no qual m'(t) e ®(t,y) são constantes, através de combinações
lineares finitas de funções como aquelas com as quais você trabalhou em Cálculo I.

Aula 12  Cálculos Numéricos 273


Contudo, felizmente, é possível garantir existência e unicidade de soluções para uma
classe muito relevante de EDOs descritas na forma explícita. Inclusive para a trajetória do
projétil do problema 5, desde que as funções m'(t) e α(t,y) sejam “suficientemente bem
comportadas”. Em linhas gerais, sem entrar em detalhes mais técnicos, temos o seguinte
teorema para EDOs de ordem 1:

Considere f :U ⊂ ℜ2 ℜ, definida num conjunto aberto U ⊂ ℜ2 ( ou seja, U é


uma união de discos sem fronteiras), com todas as derivadas parciais contínuas
em U, e que (t0,y0) ∈ U. Então o PVI

y'= f(t,y), tal que y(t0) = y0

tem solução única y: (a,b) ℜ, definida num intervalo (a,b) contendo t0

Algo inteiramente análogo funciona para equações de segunda ordem. A única diferença
é que para equações da forma y''=f(t,y,y'), não basta apenas o valor inicial da posição
y(t0), mas precisamos também da velocidade inicial y'(t0). Em particular, era fácil verificar
que os Exemplos 1-4 tinham uma solução. Mas não tínhamos garantido ainda que a solução
apresentada seja única, em cada caso. O resultado acima garante que sim, aquelas soluções
obtidas são únicas.

Observação 1 – Domínio da solução y(t)


Nos nossos Exemplos 1-4, as soluções apresentadas valiam para todo intervalo de tempo. Isto
nem sempre acontece. Às vezes a solução y(t), de uma EDO só tem validade num domínio
restrito. Na atividade a seguir, pedimos que você verifique isso num caso particular.

Atividade 3
Considere o PVI y' = y 2, tal que y(0) = 1.

a)  Verifique que ele tem solução y: (–∞,1) ℜ, dada por y(t) = –1/(t–1) e
peça ao Scilab seu gráfico.

b)  Mostre que ele não tem solução y: (–∞,b) ℜ, se b > 1. Ou seja, o maior
intervalo, contendo t0 = 0, no qual uma solução do PVI pode estar definida
é (–∞,1).

274 Aula 12  Cálculos Numéricos


Interpretação geométrica e cinemática da EDO
y'=f(t,y)
Se y: (a,b)  ℜ é uma solução da equação y'=f(t,y), geometricamente, isso significa
dizer que a inclinação da reta tangente ao gráfico de y e que passa pelo ponto (t,y(t)) é
f(t,y(t)). Podemos pensar também que para cada ponto (t,y) do domínio U de f, temos uma
direção f(t,y), que será tangente aos gráficos das soluções da equação nos pontos (t,y(t)).
Graficamente, podemos pensar que estas retas passando por (t,y(t)) e com coeficiente angular
f(t,y) definem um campo de direções tangentes às soluções da equação.

Figura 2 – Campos de direções tangentes às soluções de EDOs (Exemplos 1 e 2)

O sentido das setinhas é secundário aí. Elas apenas indicam a direção crescente de t.
O fundamental é que temos definido uma única direção em cada ponto, vale dizer, um campo
de direções, para o qual nosso teorema logo acima garante que em cada ponto dessa região
passa uma e apenas uma curva tangente a esse campo de direções. O bom dessa representação
gráfica da equação é que ela permite ter uma primeira ideia qualitativa de como devem ser as
soluções dos diferentes PVIs da EDO na região considerada (vide Atividade 4).

Aula 12  Cálculos Numéricos 275


Atividade 4

Trace, na Figura 2, gráficos das soluções correspondentes aos


1 Exemplos 1 e 2. Vale dizer, curvas tais que y(0) = 0.02 e que, na
medida do possível, pareçam tangentes às direções dadas na Figura
2, no ponto inicial de cada segmento.

Veja que y(t) = 0.1 é a solução do PVI, y'= 0.03y(1–10y), com


2 y(0) = 0.1 e trace seu gráfico na correspondente Figura 2, à esquerda.

Use os campos de direções para descrever qualitativamente o


3 comportamento de y(t) começando com 0 < y(0) < 0.3, em cada
um dos casos. O que diferencia esses comportamentos e como você
relaciona essas diferenças com os diferentes modelos que originaram
cada uma das duas equações nos Exemplos 1 e 2? Tente visualizar, na
Figura 2, o papel que a solução y(t) = 0.1 de y'= 0.03*y(1–10y) tem
para entender o comportamento dos demais PVIs dessa EDO.

Observação 2 – Interpretação cinemática de y'=f(t,y)


Uma interpretação cinemática da equação y'(t) = f(t,y), corresponde a pensar que queremos
reconstituir um movimento retilíneo y(t), cuja velocidade é dada em cada instante de tempo
t por f(t,y(t)).

Representações da solução de uma EDO


Há várias formas de representar a solução de uma EDO. Nos Exemplos 1-4 obtivemos
representações analíticas das soluções, pelo fato que soluções y: (a,b)  ℜ lá eram descritas
por fórmulas relacionando y e t. Há, também, muitas maneiras de se representar analiticamente
uma solução. Por exemplo, na forma de série de potências, ou seja, encontrando solução na forma


y(t) = y0 + y1 t + y2 t2 + . . . = y n tn
n=0

276 Aula 12  Cálculos Numéricos


No nosso caso, estamos interessados em representações numéricas das soluções. Vale
dizer, soluções discretizadas numa malha suficientemente fina. No caso de termos a solução
analítica à disposição, recaímos no que foi discutido no final da Aula 2 (Introdução ao Scilab).
Por exemplo, a solução y(t) = 0.02 e 0.03t, obtida no Exemplo 1, pode ser discretizada no
intervalo [0,1], numa partição em 10 subintervalos iguais, usando o Scilab, pelos comandos:

−−> t=0:0.1:1;

−−> y = 0.02*exp(0.03*t)

0 . 0 2   0 . 0 2 0 0 6 0 1   0 . 0 2 0 1 2 0 4   0 . 0 2 0 1 8 0 8   0 . 0 2 0 2 4 1 4   0 . 0 2 0 3 0 2 3 
0.0203633 0.0204244 0.0204858 0.0205474 0.0206091

Essa não é uma forma prática de se chegar a uma solução discreta de uma EDO, pelo
fato de que obter soluções analíticas é, em geral, bem mais difícil do que encontrar boas
aproximações de soluções discretizadas. Nosso principal objetivo, nesta aula, é obter uma
“boa” aproximação das soluções de um dado PVI, de um ponto de vista numérico. Vale dizer,
numa representação discreta “bem” aproximada de sua solução verdadeira. Felizmente, o
teorema que nos assegura existência e unicidade às soluções de uma EDO, sob condições
dadas, nos garante falar em “solução verdadeira”, em boa parte dos casos de interesse prático.

Representação numérica
de soluções de uma EDO
Considere o PVI: y' = f(t,y), de tal modo que y(t0)= y0

A ideia aqui é representar uma solução y:[t0,tf ]  ℜ de forma discretizada. Para tanto,
consideremos uma partição de [t0,tf ] em N intervalos de comprimentos iguais a h = 1/N. Ou
seja, a partição do domínio [t0, tf ] da solução y(t) procurada será:

P = {t0, t1= t0+ h, t2 = t0 + 2h, ...., tf = t0 + Nh}

Correspondentemente, procuramos valores aproximados para y(ti), nos pontos da partição


P. Os designaremos por y0, y1, ...., yN . Nossa expectativa é que cada yi aproxime, de uma maneira
aceitável, o valor exato da solução y, no ponto ti. Em outras palavras, queremos que

yi ≈ y(ti), para i = 1,2,...,N

Aula 12  Cálculos Numéricos 277


Método de Euler
O fundamental, em qualquer método numérico para EDO, reside na maneira como
discretizamos a própria equação diferencial. Uma chave possível nos é dada pela definição de
derivada. Veja que, se h é suficientemente pequeno;

y(ti+1 ) − y(ti ) y(ti + h) − y(ti )


= ≈ y  (ti ) = f (ti , y(ti ))
h h

Ou seja, se h é suficientemente pequeno, podemos esperar que:


y(ti+1 ) ≈ y(ti ) + h∗ f (ti , y(ti ))

Como queremos que yi seja, para cada i ≥ 0, uma boa aproximação de y(ti), é natural
tentarmos obter a discretização yi de modo a satisfazer, para cada i ≥ 0:

yi+1 = yi + h∗ f (t0 + i ∗ h, yi) = yi + h∗ yi  , para i = 1, . . . , N + 1


  
yi': Discretização da
derivada de y(t)

Podemos interpretar essa expressão, como uma versão discretizada da equação


diferencial, na qual cada y i+1 é obtido iterativamente, a partir de yi , pela fórmula acima.
Geometricamente, na Figura 2, significa dar, em cada (ti,yi) , um pequeno passo na direção
da setinha, cujo tamanho depende de h. Essa forma de obter uma solução discretizada leva o
nome de Método de Euler.

Atividade 5

Obtenha, na Figura 2, graficamente, aproximações das soluções de cada uma das


duas EDOs para as quais y(30) = 0.2, pelo método de Euler, com h = 5. A ideia
é que, em cada iterado (tk ,yk ) você dê passos (h,∆yk ) na reta cuja direção é a
do campo de direções, começando no ponto (30, 0.2),

278 Aula 12  Cálculos Numéricos


Exemplo 6
Neste exemplo vamos obter uma solução discretizada do PVI do Exemplo 1, no mesmo
intervalo de 90 dias e com diferentes valores de N, de modo a formarmos uma ideia do que
acontece à medida que o tamanho h de cada subintervalo vai diminuindo. Neste nosso caso
f(t,y) = 0.03 y e y0 = 0.02

i – Caso N = 5 e h = 90/5 = 18

y1 = y0 + 0.03*h*y0 = 0.02 + 0.03*18*0.03 = 0.0308


ƒƒ 

y2 = y1 + 0.03*h*y1 = 0.0308 + 0.03*18*0.0308 = 0.0474


ƒƒ 

y3 = y2 + 0.03*h*y2 = 0.0474 + 0.03*18*0.0474 = 0.0730


ƒƒ 

y4 = y3 + 0.03*h*y3 = 0.0730 + 0.03*18*0.0730 = 0.1125


ƒƒ 

y5 = y4 + 0.03*h*y4 = 0.1125 + 0.03*18*0.1125 = 0.1732


ƒƒ 

Na verdade, obtivemos esse y com o Scilab, mediante os comandos:

−−>N=5; tf =90; h=tf/N; // N é o número de subintervalos e h o tamanho de cada um


−−>y=0.02; // Posição inicial
−−> for i = 1:N, // Laço que calcula y pela fórmula do método de Euler
y(i +1)=y(i)+h*y(i)*0.03;
end;
−−>y // y resultante, no ℜ6, com y(1) = y0
0.0200 0.0308 0.0474 0.0730 0.1125 0.1732
y5 = 0.1732 seria uma aproximação para o valor y(90) = 0.29759463. Bem grosseira,
por sinal, como seria de se esperar tomando uma partição do domínio [0,90] em apenas 5
partes. Verifique no Scilab que, se nos comandos acima alterarmos o valor de N para 25, 125,
625, 3125, 15625, obteremos, como aproximação para y(90), em cada caso:

Tabela 2 – Aproximações de y(90), obtidas pelo método de Euler, com partições do domínio em N subintervalos

N 5 25 125 625 3125 15625

yN+1 0.173234 0.259731 0.289162 0.295869 0.297248 0.297525

Erro em t = 90:
1.24E–01 3.78E–02 8.43E–03 1.73E–03 3.47E–04 6.94E–05
|yN+1 – y(90)|

Como você pode ver, à medida que N cresce, as soluções numéricas vão aproximando
cada vez melhor o valor y(90) = 0.297595, calculado na solução exata do PVI. Com uma
partição em 5 intervalos, a aproximação é grosseira. Porém com N = 15625, o erro relativo na

Aula 12  Cálculos Numéricos 279


aproximação é da ordem de 0.01%. Abaixo colocamos os gráficos de cada uma das soluções
discretizadas. Observe que, a partir de N = 625, não conseguimos mais distinguir as soluções
numéricas da exata:

0.35

0.3 Solução aprox. para N = 5


Solução aprox. para N = 25
0.25 Solução aprox. para N = 125
Solução aprox. para N = 625
0.2 Solução aprox. para N = 3125
Solução exata
0.15

0.1

0.05

0
0 10 20 30 40 50 60 70 80 90

Figura 3 – Soluções exata e numéricas do Exemplo 1, obtidas pelo método de Euler

Atividade 6

Aplique o método de Euler ao Exemplo 2, de modo a obter soluções


1 aproximadas daquele problema, particionando o intervalo [0,90]
também em N = 5k subintervalos iguais, com k = 1,...6.

Calcule as aproximações de y(90), relativas a cada uma das soluções


2 numéricas e compare-as com o valor exato obtido no Exemplo 2.

Obtenha os erros relativos cometidos ao considerar y(90) como


3 sendo o correspondente valor calculado em yN+1 , em cada uma das 6
aproximações numéricas.

Esboce um gráfico com as soluções numéricas e aproximadas, análogo


4 ao da Figura 3.

280 Aula 12  Cálculos Numéricos


Método de Euler aperfeiçoado
O método de Euler até que funciona, mas pode precisar de muitas iterações para se obter
um resultado aceitável. Isto é, no Exemplo 6, com mais de 3000 iterações ainda não havíamos
encontrado a quarta casa decimal na solução, em y(90). Aperfeiçoaremos o método de modo
a torná-lo mais eficiente. A ideia é continuar a obter a sequência y0, y1, ..., yN por um método
iterativo do tipo:

yk+1 = yk + h*y'k

O ponto chave aqui reside na definição de y'k e a ideia básica desse e de muitos outros
métodos é bem simples. Trata-se de pensar que estamos no ponto (tk,yk), supondo que
yk = y(tk), onde tk = k*h e que queremos mirar na direção de inclinação y'k , de modo a acertar
no ponto (tk+1,yk+1) que esteja o mais perto possível da solução verdadeira em tk+1. No método
de Euler, tomamos y'k = f(tk ,yk ). A ideia, nesse método aperfeiçoado, é melhorar a avaliação de
y'k , de maneira a levar em conta o valor da inclinação da derivada de y(t) também em tk+1. Uma
maneira de fazê-lo seria tomar y'k como uma média entre f (tk ,yk) e f(tk+1,yk+1), ou seja, fazer:

y'k = (f(tk,yk) + f(tk+1,yk+1))/2

yk+1 = yk + h*y'k = yk + h*(f(tk,yk) + f(tk+1,yk+1))/2

Nesse caso, como yk +1 aparece nos dois lados da expressão acima, ele ficaria definido
implicitamente pela expressão. Daí a classificação de implícito dada ao método. Teríamos o
método de Euler aperfeiçoado implícito. Por exemplo, na equação do Exemplo 1, teríamos
f(t,y) = 0.03y e resultaria:

yk+1 = yk + h*y'k = yk + h*0.03(yk + yk+1)/2

⇒ (2–h*0.03) yk+1 = (2+0.03*h) yk ⇒ yk+1 = (2+0.03*h)/(2– 0.03*h) yk

Poderíamos rodar o método de Euler aperfeiçoado implícito com:

−−>N=5; tf=90; h=tf/N; // N é o número de subintervalos e h o tamanho de cada um

−−>y=0.03; // Posição inicial

−−> for k = 1:N, // Laço que calcula y pela fórmula do método de Euler

yk+1 = (2+0.03*h)/(2–0.03*h) yk

end;

−−>y

0.03 0.043170731 0.062123735 0.089397571 0.12864528 0.18512370

Verifique no Scilab que, se nos comandos acima alterarmos o valor de N para 25, 125 e
625, 3125, obteremos, como aproximação para y(90), em cada caso:

Aula 12  Cálculos Numéricos 281


Tabela 3 – Aproximações numéricas de y(90), com Euler aperfeiçoado implícito

N 5 25 125 625 3125 15625

yN+1 0.318738 0.298378 0.297626 0.297596 0.297595 0.297595

|yN+1 – y(90)| 2.11E–02 7.83E–04 3.12E–05 1.25E–06 4.55E–08 4.50E–09

Comparando com a Tabela 2, a superioridade, neste caso, é evidente. Por exemplo, para
uma partição em N = 125 subintervalos, atingimos, com o novo método, soluções com uma
precisão da ordem obtida anteriormente com N = 15625. Na Figura 4, os pontos identificados
com ‘+’ são os pontos calculados pela discretização com N = 5. Os calculados com
N = 25 estão como ‘*’, enquanto que a linha cheia representa o gráfico da solução verdadeira
y = 0.03*e 0.02t.

0.35

0.3 Solução numérica para N = 5


Solução numérica para N = 25
0.25 Solução exata de y = 0.03*y

0.2

0.15

0.1

0.05

0
0 10 20 30 40 50 60 70 80 90

Figura 4 – Gráfico comparando soluções exata e aproximadas para N = 5 e N = 25, obtidas com o método de Euler aperfeiçoado implícito

Observe que não dá para distinguir visualmente entre os pontos do gráfico da solução
exata e os da solução numérica (‘*’), obtidos com N = 25, diferentemente do que ocorria
na Figura 3. Até mesmo as aproximações com N = 5 (‘+’) parecem aceitáveis, enquanto no
caso anterior estavam bem longe da solução exata.

Contudo há uma dificuldade importante no método de Euler implícito. É que em


cada iteração temos que resolver uma equação para explicitar yk +1 em função de y k.
No caso da função linear f(t,y) = 0.03*y foi fácil fazê–lo analiticamente. Em geral, não é
assim. Uma maneira de contornar esse problema é aproximar yk +1, na fórmula de y'k , por
y *k +1 = yk + h*f (tk ,yk ). Ou seja, tomar y *k+1 com o passo de Euler original. Esta é uma

282 Aula 12 Cálculos Numéricos


aproximação inteligente de yk +1, que evita ter que calculá-lo explicitamente e funciona direitinho,
como você poderá ver na sequência. Por exemplo, no caso do Exemplo 1, isso nos daria:

y'k = (f(tk ,yk) + f(tk+1,y*k+1))/2 =

= 0.03*(yk +y*k+1)/2 = 0.03*(yk + yk + h*0.03yk)/2 = 0.015(2 + 0.03*h)yk

⇒ yk+1 = yk + h*y'k = (1+ 0.03h + 0.00045h2)yk

A tabela análoga às Tabelas 2 e 3 ficaria desta forma:

Tabela 4 – Aproximações numéricas de y(90), obtidas com Euler aperf. explícito

N 5 25 125 625 3125

yN+1 0.272307 0.296157 0.297533 0.297592 0.297594

Erro |yN+1–y(90)| 2.53E–02 1.44E–03 6.15E–05 2.49E–06 1.04E–07

Observe que o método de Euler aperfeiçoado explícito, na figura, “perde” para o implícito,
porém perde por bem pouco. O método de Euler aperfeiçoado explícito acabou se tornando bem
mais “popular” que o implícito, pois nele se obtêm aproximações mais ou menos equivalentes,
para uma dada partição, porém sem a necessidade de resolver uma equação em yk+1 a cada passo.

Atividade 7

Repita a Atividade 6 para o método de Euler aperfeiçoado implícito.


1
Repita a Atividade 6 para o método de Euler aperfeiçoado explícito.
2
Compare os resultados obtidos aqui, com os obtidos no método
3 de Euler.

Aula 12  Cálculos Numéricos 283


Precisão na solução versus hN = (tf–t0)/N
Uma coisa importante nos métodos numéricos é saber avaliar a dependência entre erro na
solução e a discretização. Ou seja, conhecer alguma limitação entre o erro cometido na solução
e o tamanho hN = (tf –t0)/N de cada subintervalo da partição. Nossa abordagem aqui será bem
introdutória ao tema e empírica. Ou seja, sempre trabalhando a partir da equação do Exemplo
1, vamos iniciar vendo que relação se pode estabelecer entre o erro EN = |y(N+1)–y(90)| e
hN p, para p = 1 ou 2.

Tabela 5 – Relação entre erro EN = |yN+1 – y(90)| e o tamanho da partição hN = 90/N

N 5 25 125 625 3125 15625

hN = 90/N 18 3.6 0.72 0.144 0.0288 0.00576

Euler 6.91E–03 1.05E–02 1.17E–02 1.20E–02 1.20E–02 1.20E–02

Euler Ap.
Relação Erro/hN = 1.17E–03 2.18E–04 4.34E–05 8.68E–06 1.74E–06 3.47E–07
Implícito
|yN+1 – y(90)|/h
Euler Ap.
1.40E–03 3.99E–04 8.54E–05 1.73E–05 3.47E–06 6.94E–07
Explícito

Aqui, uma aposta razoável seria que, no método de Euler, |yN+1 – y(90)|/hN vai ficando
próximo a 0.012, à medida que o número de partições N cresce. Ou seja, que o erro
EN = |yN+1 – y(90)| ≈ 0.012 hN , para N grande, no método de Euler, mas que isso não
aconteceria nos outros dois métodos.

Tabela 6 – Relação entre o erro |yN+1 – y(90)| e hN2

N 5 25 125 625 3125 15625

h = 90/N 18 3.6 0.72 0.144 0.0288 0.00576

Euler 3.84E–04 2.92E–03 1.63E–02 8.32E–02 4.18E–01 2.09E+00


Euler Aperf.
Relação Erro/hN2 6.53E–05 6.04E–05 6.03E–05 6.03E–05 6.03E–05 6.03E–05
Implícito
|yN+1 – y(90)| /hN 2
Euler Aperf.
7.80E–05 1.11E–04 1.19E–04 1.20E–04 1.20E–04 1.21E–04
Expliícito

A aposta razoável aí é que o erro EN =|yN+1 – y(90)| fique aproximadamente proporcional


a h = (90/N)2 nos dois métodos de Euler aperfeiçoado.
N
2

Na linguagem da Aula 11 (Integração numérica) isso significa dizer que podemos esperar:

EN = | yN –y(90) | = O(hN ) , no método de Euler


ƒƒ 

EN = | yN –y(90) | = O(hN2) , nos 2 métodos de Euler Aperfeiçoado


ƒƒ 

284 Aula 12  Cálculos Numéricos


Pode–se provar que, se f for “suficientemente diferenciável” num retângulo
U e o gráfico da solução y: [t0, tf ] ℜ, de y' = f (t ,y), permanecer neste
retângulo U, então os erros de discretização EN = |yN+1 – y(tf )| satisfazem, para
hN = (tf – t0)/N :

EN = | yN –y(tf) | = O(hN) , no método de Euler


ƒƒ 

EN = | yN –y(tf) | = O(hN 2) , no método de Euler aperfeiçoado explícito.


ƒƒ 

(SPERÂNDIO; MENDES; SILVA, 2003)

Uma primeira consequência é a garantia da convergência numérica dos métodos de


Euler e de Euler aperfeiçoado explícito, sob determinadas condições, à medida que fazemos
N ∞. É isto que explica também a superioridade do método de Euler Aperfeiçoado sobre
o método de Euler original. Se focalizamos apenas nos erros de discretização e esquecemos
os de arredondamento, o método de Euler aperfeiçoado tende a induzir erros da ordem de
hN2 = (tf–t0) /N 2, enquanto que no de Euler original só se pode garantir erros bem maiores,
da ordem de hN = (tf–t0)/N, para N grande.

Atividade 8

Reproduza as Tabelas 5 e 6 no caso da equação do Exemplo 2 e constate que o


comportamento do erro numérico EN = |yN+1 – y(90)| segue o padrão anunciado
no destaque logo acima, nos 3 métodos trabalhados até aqui.

Aula 12  Cálculos Numéricos 285


Para quem deseja saber um pouco mais...
No Moodle teremos um complemento desta aula, à disposição do aluno que gosta de
olhar um pouco mais à frente. Nele focalizamos nos métodos de Runge-Kutta, que generalizam
os métodos de Euler e Euler aperfeiçoado para resolver y'= f(t,y). Trata-se de métodos
que também usam iterações do tipo yk +1 = yk + y'k h e podem tornar-se muito eficientes,
a depender da escolha da fórmula que define y'k. Em geral, toda a teoria para estes tipos de
métodos, baseia-se no desenvolvimento do polinômio de Taylor da solução y(t), de algum
grau p e calculada em torno da solução da EDO que satisfaz y(tk) = yk, para cada k. A ideia
do complemento é apresentá-los, bem como situar minimamente a discussão dos erros de
discretização e arredondamento desse tipo de métodos.

Autoavaliação
Verifique que o PVI y'= y 1/3, tal que y(0) = 0 tem a solução y(t) = 0, mas tem
1 também a solução y(t) = 3/4*t 4/3. Isto não está em contradição com o resultado
de existência e unicidade de soluções que enunciamos na aula?

Verifique que o PVI abaixo não tem solução num intervalo que contenha (–1,1).
2 y'= 2ty 2, tal que y(0) = 1

(Sugestão: Verifique, inicialmente, que y(t) = 1/(1–t2) satisfaz a relação y'= 2ty.)

3 Considere o PVI do item anterior, ou seja, y'= 2ty, tal que y(0) = 1.

3.1)  Usando os métodos de Euler e de Euler aperfeiçoado explícito, obtenha soluções


numéricas no intervalo [0, 1– ε], para ε = 0.1, 0.01 e 0.001 e ache o erro para
uma partição de [0,1–ε] em 2k subintervalos iguais, para k = 1,2,...15. Descubra
o menor valor do número natural k, em cada caso, para se obter uma solução com
um erro relativo inferior a 0.1%, numa partição com N = 1/2k subintervalos iguais.

3.2)  Para cada um dos 3 valores de ε, no item 3.1, verifique se o erro aparenta
se comportar como O(1/N) no método de Euler e como O(1/N 2) no Euler
aperfeiçoado.

Qual a vantagem do método de Euler aperfeiçoado explícito sobre o de Euler e qual


4 a vantagem do método de Euler sobre o de Euler aperfeiçoado explícito?

286 Aula 12  Cálculos Numéricos


Resumo
Nesta aula você viu exemplos de fenômenos descritos por equações diferenciais,
com condições iniciais prescritas. Se deteve mais nos PVIs oriundos das
equações diferenciais de primeira ordem y'= f(t,y), com y(t0) = y0 e viu também
que, sob condições razoáveis de diferenciação de f, tais problemas admitem
sempre solução única em algum intervalo. Deteve–se em métodos numéricos
para resolver EDOs discretizadas. Em especial estudou os métodos de Euler
e de Euler aperfeiçoado e viu, através de exemplos, que o método de Euler
aperfeiçoado parece mesmo, em alguns exemplos, convergir mais rapidamente
que o método de Euler original. Isso pode ser confirmado teoricamente, sob
condições determinadas.

Problemas propostos
1)  Considere a equação diferencial y'= – 0.5*y*(1–2y) e pense que, como no Exemplo 2,
ela modela a evolução da densidade demográfica y(t) de uma dada população, no intervalo
de tempo [0, tf ].

1.1)  Ache soluções numéricas confiáveis, para tf = 10, dos PVIs dados por:

y(0) = 0; y(0) = 0.00001; y(0) = 0.25, y(0) = 0.49999; y(0) = 0.5; y(0) = 0.50001;
y(0) = 0.75; y(0) = 0.99999, y(0) = 1, y(0) = 1.00001 e y(0) = 10;

1.2)  Calcule y(tf) para cada uma das soluções dos 11 PVIs e esboce num mesmo gráfico
todas estas soluções, tomando o cuidado de delimitar o valor de y(t), nas soluções
para as quais y(t)  ∞.

1.3)  Repita 1.1 e 1.2, com tf = 100

1.4)  Veja que y(0) = 0 e y(0) = 0.5 dão origem a populações constantes no tempo. Interprete,
com a ajuda dos gráficos obtidos, o que acontece com as evoluções demográficas, a
depender da condição inicial y(0) ≥ 0.

Aula 12  Cálculos Numéricos 287


2)  Siga os mesmo passos do Exercício 1 e faça tudo o que fez lá, só que, desta vez com a
com a EDO y'= – 0.1*y*(1–2y)*(1–y). Constate que y(t) = 1 é outra possibilidade de
população constante no tempo, nesse caso. Qual a diferença importante que você vê nas
evoluções populacionais em cada um dos PVIs correspondentes nas duas EDOs? A que
você atribui as diferenças de comportamento nas correspondentes evoluções demográficas
geradas, pelas duas EDOS, nas mesmas condições iniciais?

Referências
FRANCO, Neide Bertoldi. Cálculo numérico. São Paulo: Pearson Prentice Hall, 2006.

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.

SPERÂNDIO, Décio; MENDES, João T.; SILVA, Luiz H. M. Cálculo numérico. São Paulo:
Pearson Prentice Hall, 2003.

288 Aula 12  Cálculos Numéricos


Anotações

Aula 12  Cálculos Numéricos 289


Anotações

290 Aula 12  Cálculos Numéricos


Anotações

Cálculo Numérico 291


Anotações

292 Cálculo Numérico


Esta edição foi produzida em setembro de 2014 no Rio Grande do Norte, pela Secretaria
de Educação a Distância da Universidade Federal do Rio Grande do Norte (SEDIS/UFRN),
sobre papel offset 90 g/m2.

SEDIS Secretaria de Educação a Distância – UFRN  |  Campus Universitário


Praça Cívica | Natal/RN | CEP 59.078-970 | sedis@sedis.ufrn.br | www.sedis.ufrn.br
Matemática
Matemática

Cálculo Numérico

Cálculo Numérico
Marcelo Gomes Pereira
Roberto Hugo Bielschowsky

Roberto Hugo Bielschowsky


Marcelo Gomes Pereira

Cal_Num_capa_aberta.indd 1 30/06/15 09:10

Você também pode gostar