Escolar Documentos
Profissional Documentos
Cultura Documentos
Cal Num LIVRO WEB Corrigido
Cal Num LIVRO WEB Corrigido
Cálculo Numérico
Matemática
Cálculo Numérico
2ª Edição
Vice-Presidente da República
Michel Miguel Elias Temer Lulia
Ministro da Educação
Henrique Paim
Vice-Reitora
Maria de Fátima Freire Melo Ximenes
FICHA TÉCNICA
COORDENAÇÃO DE PRODUÇÃO DE MATERIAIS DIDÁTICOS
Marcos Aurélio Felipe
ISBN 978-85-425-0362-3
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
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.
5
Aritmética de ponto flutuante
e erros numéricos
Aula
1
Apresentação
Bem-vindo à disciplina Cálculo Numérico!
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”.
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.
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.
Que sentido tem representar com vinte casas decimais resultados operados a partir de
medidas feitas com precisão de quatro casas apenas?
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”.
x
10
10
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.
À 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.
|EA| 0, 00000001 ∼
|ER| = < = 0, 0000000007 = 7 × 10−10 .
|x| 14, 142135623730951
,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.
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:
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.
Observe que após o último 9, somente zeros aparecem, como se π fosse racional. O
que aconteceu aqui?
Nesse último exemplo foi usado o truncamento, que é simplesmente ignorar o restante
das casas decimais. O número π foi “cortado” na 14ª casa decimal.
Quem disse que temos que usar 10 como base? Poderíamos usar outra? Como
ficaria cento e vinte e três na base 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.
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.
123 = 1 20 + 1 21 + 0 22 + 1 23 + 1 24 + 1 25 + 1 26.
Atividade 3
Converta (11111)2 para a base 10 e (11)10 para a base 2.
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?
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.
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.
Exemplo 1
Considere x = 2617/45871 e y = 2618/45872.
√ √ √ √
1) Calcule x − y e x + y usando uma máquina de calcular comum.
3) Avalie os erros relativos das duas contas feitas no item anterior.
∆sAbs 0,477766912 – 0,47776 = 0, 6912*10–6;
∆dAbs 0,000043027 – 0,00004 = 0,3027*10–6.
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:
Autoavaliação
1) Responda às questões a seguir:
c) Como encontrar a representação de um número em uma base diferente da base 10?
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.
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:
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.
c) a + b = 0.4245 105;
d) S = 0.4245 105.
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.
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.
Manipular polinômios.
2
4 Desenhar gráficos.
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.
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”;
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
−−>%pi = 2
!−− error 13
√
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.
−−>a = 3;
−−>B = 2;
−−>a + B
ans = 5.
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.
−−> a = 2 + 3*%i
a = 2. + 3.i
−−> b = 1 – 4*%i
b = 1. – 4.i
ans = 3. – i
ans = 1. + 7.i
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.
ans = 1.
ans = 0.5403023058681397650105
ans = 0.
ans = 243.
ans = 2.i
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
.
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.
A = 1. 2. 1.
3. 2. 1.
B = – 1. 1. 0.
1. – 2. 4.
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.
D = 1. 100. 3. 4.
5. 6. 7. 8.
I = 1. 3.
J = 1. 3 .4.
E = 1. 3. 4.
9. 11. 12.
5. 6. 7. 8.
0. 10. 0. 0.
F = 0. 100. 0. 0. 1.
5. 6. 7. 8. 1.
0. 10. 0. 0. 1.
D = 0. 100. 0. 0. 15. 16.
5. 6. 7. 8. 17. 18.
0. 10. 0. 0. 19. 20.
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.
Atividade 2
Verifique se os vetores v = (sen(π / 6), π), e w = (e, ln 2) são
1 ortogonais.
Matriz transposta de A AT A’
Potência de A An Aˆn
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.
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?
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 = 2 –3x + x2
r = 6 – 7x + x3
−−> roots(r)
ans = 1.
2.
– 3.
−−>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.
q = 2 + x3
ans = 4 – 3x + x2 + x3
ans = – 3x + x2 – x3
Q = 3 +x
r = – 4 + 7x
ans = 1.
2.
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.
a) = x – 1; b) = x – 2; c) = x – 3.
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.
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:
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.
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.
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
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:
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.
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...
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
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.
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
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
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.
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.
b = 8.
–7.
15.
5.
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
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
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
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
1.
1.
1.
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.
Exemplo 3
Tentando calcular a solução de um sistema Ax = b, que não tem solução.
−−> x =A\b
x = – 0.6666667
0.
0.5
teste = 0.4082483
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.
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 nn é invertível se existir matriz X que com ela comute e
tal que A*X = X*A = I nn. 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 = Ann, 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 = Ann , se
X = Xnn 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
−−> n = 3
−−> Y = rand(n,n) // Matriz nn, cujas entradas são nos aleatórios entre 0 e 1
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.
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.
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)
Resolvendo Ax =b com
linsolve(A,– b)
A atividade logo a seguir revisita sistemas nos quais temos mais de uma solução.
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.
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 nk, l é k1, 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.
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!”
−−> [xp,S]=linsolve(A,b)
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}.
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?
Solução
1) Designando o vetor de matérias primas por m = m 61 e por p = p 61, o vetor dos
compostos produzidos, cada linha da Tabela 1, nos dirá que:
0.232m1 + 0.144 m2 + 0.154m3 + 0.246m4 + 0.124m5 + 0.24m6 = 2.2
2) Com a alteração de p(2) = 1.4 para p(2) = 1.5, repetindo a conta acima, obteríamos,
neste novo caso:
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).
c1 + 5c2 + c3 52 + c4 53 + c5 54 + c6 55 = 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.
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.
–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
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= F65, 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 55, com as
mesmas soluções. Resolvendo com linsolve:
−−> c = linsolve(F,b)
c = 1.6
– 0.6944272
1.0944272
– 1.1967707
– 2.3168383
−−> plot(x,y,'k–',X,b,'k*')
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
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
−−> A=[1 1 1 1; 1 –2 3 1; –5 –1 –1 0] ;
P = 0. 0. 1.
0. 1. 0.
1. 0. 0.
L = 1. 0. 0.
– 0.2 1. 0.
– 0.2 – 0.3636364 1.
–5. – 1. – 1. 0.
1. – 2. 3. 1.
1. 1. 1. 1.
– 5. – 1. – 1. 0.
1. – 2. 3. 1..
1. 1. 1. 1.
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.
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?
Exercícios propostos
1) Verifique no help do scilab o que faz o comando diag
b) Usando o comando diag, armazene em A = A66 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.
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.
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 = Ann ,
C =Cnn e b = bn1 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.
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
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.
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.
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.
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).
S= 0.1905589 0.5135049
0.1286655 −0.8267074
−0.8290076 0.1129001
0.5097832 0.2003024
Q = −0.1408767 0.8247144
−0.3439463 0.4262639
−0.5470159 0.0278135
−0.7500855 −0.3706369
Atividade 2
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 ).
Y (i) e Y (j) sejam ortogonais sempre que i ≠ j. Vale dizer que Y (i)T Y (j) ≠ 0,
se i ≠ j.
Veja que d) Mostre que, se m n e Y TY = In ×n , então YYT ≠ Im×m. (Sugestão: dê uma
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 ;
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.
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
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.
Tempo (s) 0 5 7 10
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á
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
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
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.
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
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:
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.
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
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:
n
m–1
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 ‘ \‘.
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.
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
6.0 15.1 x1 522.33 33.67
AT Ax = = AT pexp = ⇒x=
15.1 56.01 x2 1696.57 21.21
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
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
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.
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
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
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% .
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?
Exemplo 4
A quantidade de bactérias produzida num meio de cultura, medida a cada 6 horas, foi
registrada como sendo:
T (horas) 6 12 20 28 40 48 60
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
2.52.5
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
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.
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
20
15
-5
0 5 10 15 20 25 30 35
−−> c = lsq(A, b)
– 0.1125 0.1337 –0.2633 0.9602 0.5835
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
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.
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.
ii - Conclua que A = QR, onde QTQ =I3x3 e R são triangulares superiores, sem
zero na diagonal.
LOPES, Jonas Gonçalves; PEREIRA, Marcelo Gomes. Álgebra Linear I. Natal: EDUFRN, 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
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.
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.
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.
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)
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.
−−> 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;
−−> 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.
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.
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.
x = Sx = x1 S (1) + . . . + xn S (n)
λ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 β
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:
−−> x_bar = c_bar./d; //Dividindo cada c_bar(i) por D(i,i), de forma a obter x_bar(i)
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...
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:
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
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.
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 ).
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
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:
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
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:
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.
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:
Definição
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
Uma das propriedades mais relevantes dos vetores singulares à direita reside em:
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:
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)
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).
Na verdade, veja que, para cada 1 ≤ k ≤ p, podemos falar numa “DVS k -reduzida”:
σ1 · · · 0
AV = U Σ(k) = U ... . . . ... ,
0 · · · σk
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.
−−> 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
−−> 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
−−> 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 Σ
AV = U Σ ⇒ A = A I = A V V T = UΣ V T
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
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
Como σ3 ≈ 0, na versão reduzida de DVS definida acima, só temos dois vetores singulares
à esquerda. Podemos calculá-los com
−−> U = [A∗ V (:, 1)/sig(1), A∗ V (:, 2)/sig(2)] // Vetores singulares à esquerda, em Col(A)
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
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).
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.
�
V = Vn ×n é uma matriz ortogonal, cujas colunas são autovetores de ATA.
� 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.
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!
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.
É 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.
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.
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)
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.
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.
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).
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).
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:
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
x=[x]α [x]α
σp xp
Descrição de Ax na base ¯r de
0
Col(A)
[Ax]β
com p<m
x = x1 V (1) + · · · + xn V (n) = V x ⇔ x = V
T
V x = V T x
In×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:
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
−−> x_bar = b_bar./sig; // Acha x_bar = [x]®, resolvendo SIG*x_bar = b_bar
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
-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
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.
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.
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.
Para começar, considere a matriz A = Amn 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
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?).
−−>[x,K] = linsolve(A,–b).
II – Se b = b (ou seja, b − b b > 0 ), então, Ax = b não tem solução.
Atividade 4
iii – Suponha dados com apenas 3 casas decimais de precisão. Você diria que,
neste caso, Ax = cε tem solução com ε = 10 –3 ?
De forma a simplificar a exposição, daqui até o final da aula vamos supor que
A = Ann seja uma matriz invertível, além de quadrada. Portanto, seus valores
singulares são todos não-nulos, digamos ¾1≥ ¾2≥ ... ≥ ¾n > 0.
Exemplo 2
Vamos usar o Scilab para resolver dois sistemas triangulares Ux =b, nos quais:
correspondentemente, b = rand(n,1).
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:
2) “pequenas variações nas entradas de Aε podem causar enormes variações na solução”.
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
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.
δ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.
σ1
K2 (A) =
σn
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:
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
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.
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.
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.
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 = Ann
alto é uma boa indicação de distorções importantes nas soluções de Ax = b.
Autoavaliação
Suponha que A é 107, 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?
Exercícios propostos
1) Considere A = [1,1;–1,–1.0001] , c = rand(2,1) e b = c/norm(c).
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).
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?
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.
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.
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.
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).
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):
−−>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.
{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.
Escreva media.
Fim Para
−−>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
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.
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.
x = 10;
y = 8;
Media = (x +y)/2.
Faça x = x – 3.
Faça y = 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.
−−>y=8;
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.
Use um laço do tipo enquanto para escrever o algoritmo para calcular n! (fatorial
de n) e sua implementação no Scilab.
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.
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.
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.
Atenção – No Scilab, os símbolos ‘=’ e ‘==’ são bem diferentes entre si. Veja que:
−−>x =3 ; // Atribui a x o valor 3
Atividade 4
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.
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.
Se (<condição>) então
{instruções1}
Se não
{instruções2}
Fim Se
É 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.
Se não
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.
−−>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.
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.
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.
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
Se não
Fim Se.
Fim Se.
Se (a == 0 e b <> 0) então
Faça x1 = – c/b.
Escreva x1.
Fim Se.
Escreva x1 e x2.
Se não
Faça pr = –b/2 a.
Faça pi = sqrt(abs(disc))/2 a.
Fim Se
Fim Se
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.
4) Calcule a média final de um aluno desta disciplina e exiba o resultado “aprovado”
ou “reprovado”.
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
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.
−−>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:
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
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.
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”).
Atividade 2
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.
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.
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
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.
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
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
function [U,bb] = ElimGauss_spivot(A,b)
// [U bb] será matriz triangular superior e linha equivalente à matriz ampliada [A b].
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
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:
−−> x_ant = xc/2 // x_ant poderia ser qualquer valor para o qual norm(xc_x_ant)
> 10^(–7).
x_ant = xc; // xc armazena o valor anterior de xc, para usar no teste de parada.
−−>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
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 .
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 .
−−>for i = 1:N,
2 x = rand(2,1); // x é um ponto aleatório no retângulo [0,a]x[0,b].
end
3
end
Por exemplo, os comandos a seguir criam uma matriz 1010 e guardam-na no arquivo
“teste.txt”.
Atividade 11
Atividade 12
−−>write('teste.txt',A) //Escreve a matriz A no arquivo teste.txt
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.
x2 x4 x6
cos x = 1 − + − + ...
2! 4! 6!
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
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,
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.
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 .
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].
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.
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
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
(–1.5,0) (–0.17,0)
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
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
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
−−>end
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.
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.
Algoritmo da Bisseção
Seja f (x) contínua num intervalo [a,b] e tal que f (a)f (b) < 0 .
Se não, faça k = 1 , a0 = a e b0 = b .
4) Se f (a k−1
) e f (c) têm o mesmo sinal, faça ak = c e bk = bk−1 .
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.
k = 1, a0 = 1, 5 e b0 = 3.
a0 + b0 1, 5 + 3
3) c = 2
=
2
= 2, 25.
a1 = 2, 25 e b1 = 3 .
a1 + b1 2, 25 + 3
3) c= = = 2, 625 .
2 2
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 .
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
(0.45,7.34)
a a1 a2 b
(3.66,–14.54)
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.
a) Com uma calculadora, faça as iterações até obter uma aproximação com
0,05 de precisão.
(0.45,7.34)
xk + 1
xk
(3.66,–14.54)
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.
f (x )
Se não, faça k = 1 e xk = xk−1 − k−1 .
f (xk−1 )
f (x1 )
2) x 2 = x1 −
f (x1 )
= 2, 876877.
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 .
Bisseção Newton
Dados iniciais [1,2] x0 = 1,5
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.
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 ;
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 π .
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.
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
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.
3) 3,1415...
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.
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.
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.
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).
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.
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
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
Atividade 1
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.
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
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.
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 ;
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;
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
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
Atividade 2
Calcule a integral de 0 a 4 da nova aproximação e compare com os
1 valores obtidos na Atividade 1.
2.
3.
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.
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 .
-1
-2
-3 -2 -1 0 1 2 3 4 5 6 7
10
-10
-20
-30
-40
-50
-60
-70 0 2 4 6 8 10 12 14 16
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.
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
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.
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.
-100000
-200000
-300000
-400000
-500000
-600000
-700000
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.
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.
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 ).
Como f (xi ) = p2 (xi ) , segue que E2 (xi ) = 0 . Então a fórmula do erro é válida
para xi = 0, 1, 2.
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.
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
Autoavaliação
Escreva com suas palavras o que é interpolação e descreva os métodos vistos
na aula para efetuar a interpolação polinomial.
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
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.
2) 0,6947368
3)
28.490, 681 − 183.800, 68x + 270.465, 17x2 − 263.487, 5x3 + 128.333, 33x4 − 25.000x5
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
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:
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.
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
Somas inferiores para N = 5 Somas com ponto médio para N = 5 Somas superiores para N = 5
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
50
40
30
20
10
0
0.2 0.4 0.6 0.8 1
f(x) = eˆ(4f)
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
b
Como você interpreta f (x)dx, à luz do item anterior?
2 a
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 :
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.
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
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.
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].
0.8
0.6
0.4
0.2
−2 −1 0 0 1 2
−0.2 x
Área: 1.761837268
f(x)
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
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
Cuidado! Neste caso, f (x) pode deixar de ser positiva e o argumento acima não
vale mais.
Str = 13.4441729
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
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
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?
(x − x1 )(x − x2 ) (x − x1 )(x − x2 )
L0 (x) = =
(x0 − x1 )(x0 − x2 ) 2h2
(x − x0 )(x − x1 ) (x − x0 )(x − x1 )
L2 (x) = = .
(x2 − x0 )(x2 − x1 ) 2h2
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
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
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:
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:
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:
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]).
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.
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
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.
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.
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:
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.
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
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))?
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.
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
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
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
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.
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)
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) =
y0 .
10y0 + (1 − 10y0 )e−0.03t
verifique que y(0) = y0 e que y(t) satisfaz à equação dada (vide Figura 1).
0.25
0.20
0.15
0.10
0.05
0 10 20 30 40 50 60 70 80 90
Atividade 1
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:
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:
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á:
A solução da equação acima em z(t) pode ser facilmente constatada como sendo
onde C é uma constante. Ao impor a condição inicial z(0) = y'(0) = 20, obtemos:
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.
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
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.
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.
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.
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).
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).
−−> 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á:
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:
Atividade 5
i – Caso N = 5 e h = 90/5 = 18
Tabela 2 – Aproximações de y(90), obtidas pelo método de Euler, com partições do domínio em N subintervalos
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
0.35
0.1
0.05
0
0 10 20 30 40 50 60 70 80 90
Atividade 6
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:
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:
−−> 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:
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.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.
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
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.
Na linguagem da Aula 11 (Integração numérica) isso significa dizer que podemos esperar:
Atividade 8
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.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.
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.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.
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.
Cálculo Numérico
Cálculo Numérico
Marcelo Gomes Pereira
Roberto Hugo Bielschowsky