Livro Python
Livro Python
Published by Publisher
ISBN 000-00-00-00000-0
[Link]
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this
file except in compliance with the License. You may obtain a copy of the License at
[Link] Unless required by applicable law or
agreed to in writing, software distributed under the License is distributed on an “AS IS”
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing permissions and limitations
under the License.
3 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1 Apresentando as Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Como Declarar uma Variável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3 Melhorando a Legibilidade do Seu Programa . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4 Usando Nomes Representativos para as Variáveis . . . . . . . . . . . . . . . . . . . . 26
3.5 Compreendendo as Palavras Reservadas em Python . . . . . . . . . . . . . . . . . . 27
3.6 Tipos de Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.6.1 Compreendendo as Variáveis do Tipo INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.6.2 Compreendendo as Variáveis do Tipo FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.6.3 Compreendendo os Problemas e Limitações do FLOAT . . . . . . . . . . . . . . . . . . . . . . . 30
3.6.4 Compreendendo as Variáveis do tipo STR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6.5 Compreendendo as Variáveis do tipo BOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.6.6 Compreendendo as Variáveis do tipo COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.6.7 Compreendendo as Variáveis do tipo LIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.8 Compreendendo as Variáveis do tipo TUPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.7 Como Identificar o Tipo de Variável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.8 Conversão entre Tipos de Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.9 Operadores Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6 Controle de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.1 Compreendendo o Teste Condicional IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2 Efetuando Testes Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3 Testando a Igualdade e Diferença . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.4 Conectivos Lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.5 Conectivo de Conjunção E (and) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.6 Conectivo de Disjunção OU (or) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.7 Estrutura condicional if-elif-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7 Estruturas de Repetição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.1 Compreendendo as Estruturas de Repetição . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.2 Estrutura de Repetição: o laço for com uso do range . . . . . . . . . . . . . . . . 68
7.3 Decrementando Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.4 Controlando o Incremento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.5 Laços for Aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.6 Somatórios e sua Relação com Laços for . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.7 Laço for Aninhado e Somatórios Duplos . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.8 Repetindo Comandos Usando o Laço while . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.9 Compreendendo o Comando continue do Python . . . . . . . . . . . . . . . . . . . . 74
7.10 Compreendendo o Comando break do Python . . . . . . . . . . . . . . . . . . . . . . . 75
8 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.1 Sintaxe de uma Função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.2 Criando uma Função sem Parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.3 Criando uma Função com Um Parâmetro . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.4 Criando uma Função com Dois ou Mais Parâmetros . . . . . . . . . . . . . . . . . . 82
8.5 Criando uma Função Retornando Algum Valor . . . . . . . . . . . . . . . . . . . . . . . 83
13 Otimização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
13.1 Fundamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
13.2 Busca da Razão Áurea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
13.3 Interpolação Quadrática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
14 Interpolação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
14.1 Fundamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
14.2 Operador de Diferenças Divididas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
14.3 Operador de Diferenças Divididas de Ordem 1 (ODD-1) . . . . . . . . . . . . . . 174
14.4 Operador de Diferenças Divididas de Ordem 2 (ODD-2) . . . . . . . . . . . . . . 176
14.5 Operador de Diferenças Divididas de Ordem 3 (ODD-3) . . . . . . . . . . . . . . 177
14.6 Forma Geral da Diferença Dividida (ODD-m) . . . . . . . . . . . . . . . . . . . . . . . 178
14.7 Implementação da Diferença Dividida (Ordem m) . . . . . . . . . . . . . . . . . . . 179
14.8 Interpolação de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
14.9 Interpolação de Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
18 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Lista de Figuras
10.1 O método plot() é utilizado para criar gráficos de linhas. No gráfico gerado, os meses são
representados na parte horizontal, correspondendo ao eixo X, enquanto os valores são posicionados na
parte vertical, representando o eixo Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2 O método title(), xlabel() e ylabel() tornam o gráfico mais informativo. . . . . . . . . . . . . . 107
10.3 Comando text() com diversos parâmetros opcionais. . . . . . . . . . . . . . . . . . . . . . . . . . 109
10.4 oi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
10.5 Exemplos de personalização de gráficos com Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . 113
10.6 Duas imagens empilhadas em uma única coluna. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
10.7 Imagem produzida pelo programa [Link]. . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.8 Geração das matrizes X e Y com a função [Link](), a partir de vetores unidimensionais de
entrada. A matriz X contém, em cada linha, cópias do vetor de entrada x, enquanto a matriz Y contém,
em cada coluna, cópias do vetor de entrada y. Essas matrizes representam a malha de coordenadas no
plano XY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
p
10.9 Gráfico de superfície da função z = sin x2 + y 2 , gerado pela função plot_surface() e
mapa de cores "jet". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
12.1 Método da bisseção. São mostrados os pontos do intervalo [xa ,xb ] (vermelho) e o ponto médio
xc (azul). O intervalo é atualizado até uma aproximação suficiente da raiz. . . . . . . . . . . . . . . . 145
12.2 Método da Falsa Posição. São mostrados os pontos do intervalo [xa ,xb ] (vermelho) e o ponto
xr , que intercepta o eixo x (azul). O intervalo é atualizado até uma aproximação suficiente da raiz. 148
12.3 Aplicação do método da Secante à função x2 − 3x − 2 ao longo de 6 iterações . . . . . . . . 150
13.1 Representação gráfica do método da Razão Áurea em uma função unidimensional. . . . . . 161
13.2 Figura principal com três subfiguras organizadas em 3 linhas e 1 coluna. . . . . . . . . . . . . . 164
13.3 Evolução do erro absoluto ao longo de 20 iterações. As subfiguras (a) e (b) ilustram a aplicação
do método para localização do mínimo (Figura 13.2c), enquanto as subfiguras (c) e (d) mostram
sua aplicação para a localização do máximo (Figura 13.2c). Observe que o método da interpolação
quadrática pode apresentar instabilidades ao longo das iterações. . . . . . . . . . . . . . . . . . . . . . . 166
14.1 Representação geométrica das diferenças divididas de ordem zero e primeira. O ponto (x0 , f (x0 ))
representa a avaliação da função (ordem zero), enquanto a reta secante entre (x0 , f (x0 )) e (x1 , f (x1 ))
representa a diferença dividida de ordem um, dada por f [x0 , x1 ]. . . . . . . . . . . . . . . . . . . . . . . 175
14.2 Representação Geométrica da Diferença Dividida de Segunda Ordem . . . . . . . . . . . . . . . 177
14.3 Representação Geométrica da Diferença Dividida de Terceira Ordem . . . . . . . . . . . . . . . 178
sin(5x)
14.4 Comparação entre a função original f (x) = 1+25x 2 (linha azul), os pontos discretos utilizados
na interpolação de Newton (marcadores vermelhos) e a função interpolada resultante (linha vermelha
tracejada). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
sin(5x)
14.5 Gráfico da função original f (x) = 1+25x 2 (linha azul), com os pontos discretos usados na
interpolação (pontos vermelhos) e a curva do erro absoluto (linha laranja tracejada). . . . . . . . . 182
Python foi criada em 1990 por Guido Van Rossum no Centro de Matemática Stichting
(CWI) na Holanda como uma sucessora da linguagem ABC [2]. O nome Python vem do
inglês, que significa pitão ou pítion. Pítons são serpentes conhecidas principalmente pelo
seu grande tamanho. No entanto, a verdadeira história por trás do nome da linguagem
Python é um pouco diferente. Na década de 1970, a BBC tinha um programa de TV
popular do qual Guido Van Rossum era um grande fã chamado Fly Circus de Monty
Python [11]. Assim, quando desenvolveu a linguagem, Guido Van Rossum pensou que
precisava de um nome que fosse curto, único e um pouco misterioso, e por algum motivo
que só ele conhecia, decidiu chamar o projeto de Python. O Python cresceu e se tornou
uma linguagem de programação popular, particularmente no meio da Internet.
1.3 Preparando no Ambiente Windows 19
CotoNet@linux:
>> python -V
Python 3.11.3
>>
[Link]
1 print("Bem-vindo ao curso de Python!")
CotoNet@linux:
Bem-vindo ao curso de Python!
>>
[Link]
1 print("Bem-vindo ao curso de Python!)
Quando você executar este programa, o Python exibirá uma mensagem de erro de
sintaxe ao encontrar a linha 1. No caso do Python 3.11 sua tela exibirá as seguintes
mensagens:
CotoNet@linux:
File "<stdin>", line 1
print("Bem-vindo ao curso de Python!)
^
SyntaxError: unterminated string literal (detected at line 1)
Em alguns casos, um erro pode provocar uma série de erros em cascata dentro do
Python. Assim, um único erro pode exibir mais de uma mensagem de erro. No caso do
arquivo [Link], edite o arquivo e acrescente a aspa simples que faltava.
[Link]
1 # Isto eh um comentario.
2 # Nao sera processado pelo Python.
3 # Pode usar para fazer anotacoes.
Quando o Python encontra o caractere de cerquilha, ele ignora o texto que segue até o
final da linha atual. O programa a seguir, [Link], ilustra o uso de comentários:
22 Capítulo 1. Uma Introdução à Programação
[Link]
1 #----------------------------------------------------
2 # Curso de Python
3 # UFCG - Campina grande
4 #----------------------------------------------------
5 # Programa: [Link]
6 # Aluno: Rei Arthur
7 # Data de criacao: 25-09-2018
8 # Proposito: Ilustrar o uso de comentarios no Python
9
10 print("Ola, mundo!")
[Link]
1 nota1 = 5.5
2 nota2 = 8.3
3 nota3 = 9.7
4 media = (nota1+nota2+nota3)/3
[Link]
1 ASgg_g = 5.5
2
3
4 NP2_dia = 8.3
5
6
7 as2323D = 9.7
8
9
10 MAASE = ( ASgg_g+ NP2_dia+as2323D)/3
11
12
Embora este programa esteja correto e exiba a mensagem desejada, sua leitura é
bastante difícil -para dizer o mínimo. Um bom programa não deve apenas funcionar, mas
também ser fácil de entender e manter. A chave para criar códigos legíveis está em utilizar
nomes de variáveis intuitivos, adicionar comentários que expliquem o funcionamento do
programa e empregar linhas em branco para organizar visualmente o código. Em seções
futuras, você aprenderá também sobre o papel fundamental da indentação na estruturação
de programas bem organizados e fáceis de ler.
Cada variável declarada deve possuir um nome único dentro do programa. Em Python,
os nomes válidos são compostos por uma sequência de letras e/ou números, iniciando
sempre com uma letra. Apenas letras comuns (sem acentuação) são permitidas. Não é
permitido ou recomendado o uso de acentos, cedilha, espaços ou caracteres especiais como
$, #, @, entre outros.
Regras para nomes de variáveis:
• O nome deve iniciar, obrigatoriamente, com uma letra (a–z ou A–Z), podendo conter
letras e números nos demais caracteres.
• Python é uma linguagem case-sensitive: diferencia letras maiúsculas de minúsculas.
• Devem ser utilizados nomes significativos e coerentes com o contexto do programa.
• Nomes de variáveis não podem coincidir com comandos ou palavras reservadas da
linguagem (por exemplo: if, while, def, entre outros).
Embora seja tecnicamente possível iniciar o nome de uma variável com _, essa prática
não é recomendada, salvo em situações específicas, como convenções internas ou casos de
uso especial.
Em Python, o tipo int é utilizado para representar valores inteiros, ou seja, números
sem parte decimal - tanto positivos quanto negativos. Diferentemente de muitas outras
linguagens de programação, que limitam o tamanho de inteiros com base na arquitetura
(como 32 ou 64 bits), o Python 3 permite que inteiros cresçam dinamicamente conforme
necessário. O único limite prático para o tamanho de um inteiro é a quantidade de memória
disponível no sistema.
Vale destacar uma diferença importante entre versões da linguagem: No Python 3.x,
existe apenas um tipo int, capaz de representar tanto inteiros pequenos quanto valores
muito grandes, com precisão ilimitada. Já no Python 2.7, havia dois tipos distintos para
inteiros: o tipo int, normalmente implementado com 32 bits (com limites finitos), e o tipo
long, usado para representar inteiros maiores, com tamanho variável - equivalente ao int
do Python 3.
3.6 Tipos de Variáveis 29
[Link]
1 idade = 19
2 valor = -100
3
4 x = 1000**100
5 print(x)
6
7 y = 10000**10000
8 print(y)
O trecho de código acima, [Link], apresenta como o Python lida com operações
envolvendo inteiros de tamanhos extremamente grandes. Na linha 4, o programa calcula o
valor de 1000100 e armazena o resultado na variável x. Esse valor, embora grande, ainda é
possível de ser representado e impresso corretamente. Em seguida, na linha 7, o programa
tenta calcular o valor de 1000010000 , armazenando o resultado na variável y. No entanto,
esse valor é tão grande que o Python pode não conseguir alocar memória suficiente ou
pode atingir limites internos de tempo ou recursos computacionais.
CotoNet@linux:
100000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
[Link]
1 # exemplo de variavel do tipo float
2
3 peso = 75.54 # peso em kg
4 altura = 1.75 # altura em metros
5 imc = peso / (altura ** 2)
6
do índice de massa corporal (IMC), que envolve divisão de números em ponto flutuante. Ao
executar esse programa, o interpretador Python realizará as operações de ponto flutuante
e exibirá o resultado com a devida precisão.
Sendo 0.0001100110011001100 com uma dízima periódica 0011 que se repete infini-
tamente. Portanto, por conta da dízima periódica, o valor não pode ser representado
precisamente (não existe memória infinita para representar uma dízima que se repete
infinitamente). Assim, quando convertemos 0.00011001100110011012 novamente para a
base 10, temos:
[Link]
1 nome_1 = "Lucas Ribeiro"
2 nome_2 = 'Princesa Leia'
3 nome_1 = "Lucas Ribeiro de Almeida"
4 mensagem = """Ola,
5 Mundo!?"""
6
7 print(nome_1)
8 print(nome_2)
9 print(mensagem)
CotoNet@linux:
Lucas Ribeiro de Almeida
Princesa Leia
Ola,
Mundo!
[Link]
1 doadorSangue = True
2 doadorOrgaos = False
[Link]
1 # Forma direta,
2 a = 5+2j
3 b = 20+6j
4
5 # Usando a funcao complex()
6 z3 = complex(2, 5)
7
8 print(z1)
9 print(z2)
10 print(z3)
32 Capítulo 3. Variáveis
O Python utiliza o tipo list para representar uma coleção de elementos ordenados e
mutáveis. Isso significa que os elementos da lista mantêm uma ordem definida e podem ser
alterados após a criação é possível modificar, inserir, remover ou reordenar itens conforme
necessário.
Uma lista pode armazenar múltiplos valores em uma única variável, inclusive valores de
tipos diferentes. Por exemplo: números inteiros (int), números decimais (float), textos
(str), valores lógicos (bool), e até mesmo outras listas, permitindo a criação de listas
aninhadas. As listas são delimitadas por colchetes [], e seus elementos são separados por
vírgulas. Veja um exemplo:
[Link]
1 alunos = ["Amanda", "Ana", "Bruno", "Carlos"]
2 notas = [10, 8.5, 3.8, 8.0]
3 aprovado = [True, True, False, True ]
4
5 print(alunos)
6 print(notas)
7 print(aprovado)
Além da criação, o Python oferece diversas formas de manipular listas, como a mo-
dificação de elementos, inserção de novos itens, remoção de valores e reorganização do
conteúdo. Essas operações tornam as listas uma estrutura de dados bastante poderosa
e flexível. Mais adiante, abordaremos com mais detalhes a manipulação de listas em
estruturas bidimensionais, conhecidas como matrizes.
O Python utiliza o tipo tuple (tupla) para representar estruturas de dados capazes de
armazenar múltiplos valores em uma única variável, de forma semelhante às listas. A
principal diferença é que, ao contrário das listas, as tuplas são imutáveis: uma vez
criadas, seus elementos não podem ser modificados.
Podemos criar uma tupla utilizando parênteses (). Embora o uso dos parênteses seja
a forma mais comum, também é possível definir uma tupla apenas com vírgulas, sem os
parênteses. É importante destacar que, no caso de uma tupla com apenas um elemento,
a vírgula é obrigatória para que o Python a reconheça como tupla, e não como um valor
isolado. Veja o exemplo no programa [Link].
3.6 Tipos de Variáveis 33
[Link]
1 tupla1 = ("uva", "banana", "laranja")
2 tupla2 = "uva", "banana", "laranja"
3 tupla3 = (5,)
4 nao_tupla = (5)
5 print("Tipo de %s: %s" % (tupla1, type(tupla1)))
6 print("Tipo de %s: %s" % (tupla2, type(tupla2)))
7 print("Tipo de %s: %s" % (tupla3, type(tupla3)))
8 print("Tipo de %s: %s" % (nao_tupla, type(nao_tupla)))
CotoNet@linux:
Tipo de ('uva', 'banana', 'laranja'): <class 'tuple'>
Tipo de ('uva', 'banana', 'laranja'): <class 'tuple'>
Tipo de (5,): <class 'tuple'>
Tipo de 5: <class 'int'>
[Link]
1 # Lista (mutavel)
2 lista = [10, 20, 30]
3 lista[1] = 99
4 print("Lista modificada:", lista)
5
6 # Tupla (imutavel)
7 tupla = (10, 20, 30)
8 # Tentativa de modificacao (vai gerar erro!)
9 tupla[1] = 99 # TypeError
CotoNet@linux:
Lista modificada: [10, 99, 30]
----> 9 tupla[1] = 99 # TypeError
TypeError: 'tuple' object does not support item assignment
O uso de tuplas é bastante comum em Python para retornar múltiplos valores de uma
função. Como as tuplas são imutáveis e organizadas, elas permitem agrupar os dados de
forma prática e segura. Também é possível desempacotar o resultado da tupla diretamente
em duas variáveis. O programa [Link] testa esses conceitos.
[Link]
1 # O resultado da tupla diretamente em uma variavel:
2 resultado = divmod(10, 3)
3 print(resultado)
4 print("Quociente:", resultado[0])
5 print("Resto:", resultado[1])
6 # O resultado da tupla diretamente em duas variaveis:
7 q, r = divmod(17, 5)
8 print("Quociente:", q)
9 print("Resto:", r)
34 Capítulo 3. Variáveis
[Link]
1 # Declaracao de variaveis:
2 idade = 23 # int
3 altura = 1.75 # float
4 nome = "Lucas Ribeiro" # str
5 doador_sangue = True # bool
6 numero_complexo = complex(2, 5) # complex
7 notas = [8.5, 7.8, 9.0] # list
8 resultado = divmod(10, 3) # tupla
9 # Imprime o tipo de cada variavel
10 Tipo de idade___________: <class 'int'>
11 Tipo de altura__________: <class 'float'>
12 Tipo de nome____________: <class 'str'>
13 Tipo de doador_sangue___: <class 'bool'>
14 Tipo de numero_complexo_: <class 'complex'>
15 Tipo de notas___________: <class 'list'>
16 Tipo de resultado_______: <class 'tuple'>
CotoNet@linux:
Tipo de idade___________: <class 'int'>
Tipo de altura__________: <class 'float'>
Tipo de nome____________: <class 'str'>
Tipo de doador_sangue___: <class 'bool'>
Tipo de numero_complexo_: <class 'complex'>
Tipo de notas___________: <class 'list'>
Tipo de resultado_______: <class 'tuple'>
Python oferece funções nativas para realizá-las de forma simples. As principais funções
para conversão de tipos são:
[Link]
1 ex_int = 5
2 ex_float = 8.9
3 ex_str = "Lucas"
4
5 ex_int2 = float(ex_int) # converte int para float
6 ex_float2 = int(ex_float) # converte float para int
7 ex_float3 = str(ex_float) # converte float para string
8
9 print(ex_int2, type(ex_int2))
10 print(ex_float2, type(ex_float2))
11 print(ex_float3, type(ex_float3))
[Link]
1 # Tipo: Numerico (int e float)
2 a = 5
3 b = 3
4 c = a + b # soma de dois numeros
5 d = a - b # subtracao de dois numeros
6 e = a * b # multiplicacao de dois numeros
7 f = a / b # divisao de dois numeros
8 g = a % b # modulo de dois numeros
9 h = a ** b # exponenciacao de dois numeros
10 print(c)
11 print(d)
12 print(e)
13 print(f)
14 print(g)
15 print(h)
16 # Tipo: String (str)
17 msg = "Oi"
18 nome = "Lucas"
19 print(msg + " " + nome)
20 print(msg * 3)
CotoNet@linux:
8
2
15
1.6666666666666667
2
125
Oi Lucas
OiOiOi
[Link]
1 print("Bem-vindo ao curso de Python!")
CotoNet@linux:
Bem-vindo ao curso de Python!
[Link]
1 print("\"Bem-vindo ao McDonald\'s!\"")
38 Capítulo 4. Entrada e Saída de Dados
CotoNet@linux:
"Bem-vindo ao McDonald's!"
[Link]
1 print("Bem-vindo ao curso de Python!")
2 print()
3 print("Voce pode usar aspas simples")
4 print()
5 print("ou pode usar aspas duplas")
CotoNet@linux:
Bem-vindo ao curso de Python!
Dessa forma até teríamos o resultado pretendido, mas outra forma simples e correta,
com apenas uma chamada de função seria utilizando uma quebra de linha usando o scape
\n.
[Link]
1 print('Bem-vindo ao \n curso de Python!')
CotoNet@linux:
Bem-vindo ao
curso de Python!
[Link]
1 nome = "Lucas Ribeiro"
2 idade = 21
3 altura = 1.75
4 print(nome)
5 print(idade)
6 print(altura)
CotoNet@linux:
Lucas Ribeiro
21
1.75
[Link]
1 idade = 23
2 altura = 1.75
3 nome = "Lucas Ribeiro"
4 doadorSangue = True
5
6 print(type(idade))
7 print(type(altura))
8 print(type(nome))
9 print(type(doadorSangue))
CotoNet@linux:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
[Link]
1 nome = "Lucas Ribeiro"
2 curso = "Engenharia"
3 print(nome, "cursa", curso)
40 Capítulo 4. Entrada e Saída de Dados
CotoNet@linux:
Lucas Ribeiro cursa Engenharia
[Link]
1 print("Ola")
2 print("Mundo!")
CotoNet@linux:
Ola
Mundo!
[Link]
1 print("Ola", end = " ")
2 print("Mundo!")
CotoNet@linux:
Ola Mundo!
[Link]
1 nome = "Lucas"
2 print("Ola %s, tudo bem?" % nome )
Esquema: print()
[Link]
1 nome = "Lucas"
2 idade = 21
3 print("Ola %s, tudo bem? Voce tem %d anos!" % (nome, idade))
CotoNet@linux:
Ola Lucas, tudo bem? Voce tem 21 anos!
d, i Inteiro (int).
f Ponto Flutuante (float).
e Ponto Flutuante (float) em notação científica. Letra e para
a letra e para indicar o expoente.
%.2f Ponto Flutuante (float) com 2 casas decimais.
s String (str), ou qualquer tipo do Python que possa ser
convertido para string usando a função.
% Inserir um caractere.
[Link]
1 idade = 25
2 print("A idade do aluno eh %d anos \n" % (idade))
CotoNet@linux:
A idade do aluno eh 25 anos
[Link]
1 nome = "Ana"
2 print("Ola %s, tudo bem? Quantos anos voce tem? \n" % (nome))
CotoNet@linux:
Ola Ana, tudo bem? Quantos anos voce tem?
[Link]
1 preco = 45.95
2 imposto = 0.06
3 imposto_venda = preco * imposto
4 print("O imposto sobre a venda eh de %f reais" % (imposto_venda))
CotoNet@linux:
O imposto sobre a venda do item eh de 2.757000 reais
4.12 Lendo uma Entrada de Dados com o Comando input() 43
Esquema: print()
O texto passado como argumento da função será exibido no terminal, e o valor digitado
pelo usuário será armazenado na variável especificada. Por padrão, a função input()
retorna sempre uma string (ou seja, um texto). Para utilizar os dados em cálculos
numéricos, é necessário fazer a conversão para o tipo adequado usando int() (para
números inteiros) ou float() (para números decimais), conforme discutido na Seção 3.7.
O programa a seguir, [Link], solicita ao usuário seu nome, idade, peso e altura, e em
seguida calcula e exibe seu IMC:
[Link]
1 nome = input("qual o seu nome? ")
2 idade = int(input("qual a sua idade? "))
3 peso = float(input("qual o seu peso? (em kg) "))
4 altura = float(input("qual a sua altura? (em metros) "))
5 imc = peso/(altura*altura)
6 print("Ola %s, seu IMC eh %.2f" % (nome, imc))
Observe que usamos a função float() para converter os dados de peso e altura, e a
função int() para a idade. Isso permite realizar cálculos numéricos corretamente. Além
disso, o valor do IMC foi formatado para exibir apenas duas casas decimais usando o
marcador %.2f.
44 Capítulo 4. Entrada e Saída de Dados
1. Escreva um programa em Python que exiba seu nome com- 7. Escreva um programa em Python que leia o salário de um
pleto na tela. Utilize o comando print para mostrar seu funcionário e calcule o valor de seu novo salário, conside-
nome em uma única linha. rando um aumento de 25%. O programa deve apresentar o
seguinte comportamento:
2. Escreva um programa em Python que solicite ao usuário
um número real utilizando o comando input(), e em se- 8. O valor de um prêmio será dividido entre três ganhadores
guida exiba o quadrado desse número utilizando o comando de um concurso. A distribuição será feita da seguinte forma:
print(). O programa deve apresentar o seguinte comporta- (i) O primeiro ganhador receberá 46% do valor total; (ii)
mento esperado: O segundo ganhador receberá 32% do valor total; e (iii) O
terceiro ganhador ficará com o restante do prêmio. Escreva
3. Escreva um programa em Python que solicite ao usuário um programa em Python que solicite o valor total do prêmio
uma temperatura em graus Celsius e a converta para graus e calcule quanto cada ganhador deverá receber. O programa
Fahrenheit. A fórmula de conversão é dada pela Equação 4.2, deve apresentar o seguinte comportamento:
onde F representa a temperatura em Fahrenheit e C a tem-
peratura em Celsius. O programa deve apresentar o seguinte 9. Escreva um programa em Python que auxilie vendedores.
comportamento no terminal: A partir do valor total de uma venda, o programa deve
! calcular e imprimir: (i) O total a pagar com desconto de
9.0 10%; (ii) O valor de cada parcela, considerando o parcela-
F =C∗ + 32 (4.2)
5.0 mento em 3× sem juros (baseado no valor com desconto);
e (iii) A comissão do vendedor, considerando 5% sobre o
valor com desconto. O programa deve apresentar o seguinte
4. Escreva um programa em Python que leia o valor de um
comportamento:
produto e calcule seu valor com desconto, considerando um
desconto de 12% sobre o valor original. O programa deve
10. Escreva um programa em Python que receba o salário-base
apresentar o seguinte comportamento no terminal:
de um funcionário. O programa deve calcular e imprimir:
(i) O valor da gratificação, que corresponde a 5% do salário-
5. Escreva um programa em Python que leia uma temperatura
base; (ii) O valor do imposto de renda, que corresponde a
em graus Kelvin e a converta para graus Celsius. Utilize a
7% do salário-base; e (iii) O salário final a receber, dado pela
Equação 4.3 de conversão, onde C representa a temperatura
soma do salário-base com a gratificação, subtraído o imposto.
em Celsius e K a temperatura em Kelvin. O programa deve
O programa deve apresentar o seguinte comportamento:
apresentar o seguinte comportamento:
C = K − 273.15 (4.3) 11. Escreva um programa em Python para calcular o volume de
um cilindro circular. O volume V é calculado pela Equa-
6. Escreva um programa em Python que leia uma temperatura ção 4.5. Considere r é o raio da base do cilindro; a é a altura
em graus Fahrenheit e a converta para graus Celsius. A do cilindro; e π ≈ 3.1416.
Equação 4.4 apresenta a fórmula de conversão, onde C re-
V = π · r2 · a (4.5)
presenta a temperatura em Celsius e F a temperatura em
Fahrenheit:
F − 32
C= (4.4)
1.8
4.12 Lendo uma Entrada de Dados com o Comando input() 45
1. Escreva um programa em Python que leia a largura e o 12. Escreva um programa em Python que leia um tempo em
comprimento de um terreno e calcule sua área. Exiba o minutos e exiba-o formatado como "xh ym".
resultado na tela.
13. Escreva um programa que calcule a força resultante sobre
2. Escreva um programa em Python que leia um valor em um corpo, usando a segunda lei de Newton:
minutos e converta para horas e minutos.
F = m·a
3. Escreva um programa em Python que solicite ao usuário
a idade de uma pessoa em anos e calcule quantos dias ela 14. Calcule a pressão de um gás usando:
viveu (aproximadamente).
nRT
P=
4. Escreva um programa em Python que leia o peso (kg) e V
a altura (m) de uma pessoa e calcule seu IMC usando a Onde R = 8.314
fórmula. Exiba o valor do IMC com duas casas decimais
peso 15. Calcule a energia cinética de um corpo em movimento:
IMC =
altura2
1
Ec = mv 2
2
5. Escreva um programa em Python leia um tempo em segun-
dos e converta para o formato hh:mm:ss.
16. Calcule a energia potencial gravitacional:
6. Escreva um programa em Python que leia dois números in- Ep = m · g · h
teiros e mostre (i) O resultado da divisão inteira; e (ii) O
resto da divisão.
17. Calcule a tensão elétrica de um circuito usando a Lei de
7. Escreva um programa em Python que leia as coordenadas Ohm:
(x1 , y1 ) e (x2 , y2 ) de dois pontos no plano e calcule a distân-
cia entre eles usando a Equação 4.8 V = R·I
p
d= (x2 − x1 )2 + (y2 − y1 )2 (4.6)
18. Calcule a carga elétrica acumulada em um capacitor:
Q = C ·V
8. Escreva um programa em Python que leia o valor de um
capital, a taxa de juros (ao mês) e o tempo de aplicação (em
meses). Calcule o valor final usando juros simples: 19. Calcule a frequência de uma onda a partir da sua velocidade
e comprimento de onda:
M = C(1 + i · t)
v
f=
λ
9. Escreva um programa em Python que receba um número
inteiro positivo qualquer e calcule a soma de todos os seus
20. Calcule a potência dissipada em um resistor:
dígitos.
P = V ·I
10. Escreva um programa em Python para ler as coordenadas
de dois vetores no plano e calcule o produto escalar entre
eles: 21. Calcule a velocidade média de um objeto:
v1 · v2 = x1 x2 + y1 y2 ∆s
v=
∆t
1. Escreva um programa em Python que leia a largura e o 12. Escreva um programa em Python que leia um tempo em
comprimento de um terreno e calcule sua área. Exiba o minutos e exiba-o formatado como "xh ym".
resultado na tela.
13. Escreva um programa que calcule a força resultante sobre
2. Escreva um programa em Python que leia um valor em um corpo, usando a segunda lei de Newton:
minutos e converta para horas e minutos.
F = m·a
3. Escreva um programa em Python que solicite ao usuário
a idade de uma pessoa em anos e calcule quantos dias ela 14. Calcule a pressão de um gás usando:
viveu (aproximadamente).
nRT
P=
4. Escreva um programa em Python que leia o peso (kg) e V
a altura (m) de uma pessoa e calcule seu IMC usando a Onde R = 8.314
fórmula. Exiba o valor do IMC com duas casas decimais
15. Calcule a energia cinética de um corpo em movimento:
peso
IMC = (4.7) 1
altura2 Ec = mv 2
2
5. Escreva um programa em Python leia um tempo em segun-
dos e converta para o formato hh:mm:ss. 16. Calcule a energia potencial gravitacional:
Nesse caso, todas as funções do módulo math ficam disponíveis, mas é necessário utilizar
o nome do módulo como prefixo: Exemplo: print([Link](4)).
48 Capítulo 5. Matemática Com Python
[Link]
1 from math import sqrt
2 print(sqrt(4))
Nesse caso, apenas a função sqrt() foi importada do módulo math. Note que, ao
importar diretamente a função, não é necessário utilizar o nome do módulo como prefixo
ao chamá-la. Exemplo: print(sqrt(4)).
A importação seletiva (from ... import ...) pode tornar o código mais limpo e
direto, especialmente quando poucas funções de um módulo são utilizadas. No entanto,
deve-se ter cuidado com possíveis conflitos de nomes, principalmente ao importar funções
de diferentes módulos com o mesmo nome. Se bibliotecas diferentes possuem funções com
mesmo nome, mas com comportamento distintos, haverá conflito (nessa situação, ficaria
valendo a função da última importação feita). Em projetos maiores, recomenda-se utilizar
import modulo para manter a clareza e evitar ambiguidades.
[Link]
1 a = 5
2 b = 2
3 soma = a + b
4 subtracao = a - b
5 multiplicacao = a * b
6 divisao = a / b
7 print("Resultado entre a e b")
8 print("a + b = %f " % soma)
9 print("a - b = %f " % subtracao)
10 print("a * b = %f " % multiplicacao)
11 print("a / b = %f " % divisao)
CotoNet@linux:
Resultado entre a e b
a + b = 7.000000
a - b = 3.000000
a * b = 10.000000
a / b = 2.500000
5.4 Potenciação
Em Python, a operação de potenciação pode ser realizada de forma direta, sem a necessidade
de importar bibliotecas adicionais. O operador utilizado é **. Para elevar um valor a a
uma potência b, basta utilizar a expressão a**b. Veja o exemplo a seguir:
5.5 Radiciação 49
[Link]
1 Massa = 2
2 VelocidadeLuz = 300000
3 Energia = Massa * (VelocidadeLuz**2)
4 print("Energia = %f " % Energia)
[Link]
1 # Importa a funcao pow() da biblioteca math
2 from math import pow
3 Massa = 2
4 VelocidadeLuz = 300000
5 Energia = Massa * pow(VelocidadeLuz,2)
6 print("Energia = %f " % Energia)
[Link]
1 import math
2 test_int = 4
3 test_neg_int = -3
4 test_float = 0.00
5 print ([Link](test_int))
6 print ([Link](test_neg_int))
7 print ([Link](test_float))
5.5 Radiciação
A operação de radiciação em Python pode ser realizada por meio da própria operação
de potenciação. Para calcular a raiz quadrada de um valor, basta elevá-lo à potência 12 ,
utilizando o operador **. Outra forma prática de calcular raízes é por meio da função
sqrt(), disponível na biblioteca math, que retorna diretamente a raiz quadrada de um
número positivo.
[Link]
1 import math
2 print("usando a operacao de potenciacao")
3 print(4**(1/2))
4 print("usando a funcao sqrt() da biblioteca math")
5 print([Link](4))
50 Capítulo 5. Matemática Com Python
CotoNet@linux:
usando a operacao de potenciacao
2.0
usando a funcao sqrt da biblioteca math
2.0
[Link]
1 import math
2 a = 3.1456
3
4 print([Link](a))
5 print([Link](a))
6 print(round(a))
7 print(round(a,2))
8 print(round(a,3))
CotoNet@linux:
3
4
3
3.15
3.146
2 + 3 × 45 ÷ 6 − 2 (5.1)
[Link]
1 print(2+3*4**5/6-2)
52 Capítulo 5. Matemática Com Python
45
2+3× −2 =
6
1024
2+3× −2 =
6
3072
2+ −2 =
6
2 + 512 − 2 =
514 − 2 = 512
[Link]
1 import math
2
3 print([Link])
4 print(math.e)
5 print([Link])
6 print([Link])
7 print([Link])
5.9 Funções Trigonométricas 53
CotoNet@linux:
3.141592653589793
2.718281828459045
6.283185307179586
inf
nan
[Link]
1 import math
2 angulo_graus = 30
3 angulo_radianos = [Link](angulo_graus)
4 print([Link](angulo_radianos))
5 print([Link](angulo_radianos))
6 print([Link](angulo_radianos))
CotoNet@linux:
0.49999999999999994
0.8660254037844387
0.5773502691896257
[Link]
1 import math
2 valor = 2.5
3 a = [Link](valor) # log natural
4 b = [Link](valor,2) # log base 2
5 c = [Link](valor,10) # log base 10
Embora a função log(x, base) seja bastante versátil, a biblioteca math também oferece
funções específicas para logaritmos em base 2 e base 10, que podem fornecer resultados
mais precisos e eficientes:
• math.log2(x) - Retorna o logaritmo de x na base 2.
• math.log10(x) - Retorna o logaritmo de x na base 10.
5.11 Valor Absoluto
A função abs() retorna o valor absoluto de um número, ou seja, sua distância em relação
ao zero na reta numérica, independentemente do sinal. Em termos simples, o valor absoluto
corresponde ao próprio número se ele for positivo, ou ao seu oposto se for negativo. Essa
função é nativa da linguagem Python, e pode ser aplicada tanto a números inteiros
quanto a números de ponto flutuante.
Além da função abs(), a biblioteca math oferece a função [Link](), que também
retorna o valor absoluto de um número. A diferença principal é que fabs() sempre retorna
um número do tipo float, mesmo quando a entrada é um inteiro. Veja o exemplo a
seguir, que utiliza a função abs() para obter o valor absoluto de um número negativo. Em
seguida, mostramos o uso da função [Link](), que também retorna o valor absoluto,
mas garante que o resultado seja do tipo float:
[Link]
1 import math
2
3 x = -12.23
4
5 # Usando a funcao abs() nativa do Python
6 sol_abs = abs(x)
7 print("Usando abs(): o valor absoluto de %f eh: %f" % (x, sol_abs))
8
9 # Usando a funcao fabs() da biblioteca math
10 sol_fabs = [Link](x)
11 print("Usando [Link](): o valor absoluto de %f eh: %f" % (x, sol_fabs))
5.12 Fatorial
A operação de fatorial é bastante comum em problemas envolvendo combinatória, análise
matemática, estatística e algoritmos de recursão. Em Python, podemos calcular o fatorial
de um número inteiro não-negativo utilizando a função factorial(), que pertence à
biblioteca math. O fatorial de um número natural n, denotado por n!, é definido como o
produto de todos os inteiros positivos menores ou iguais a n:
n! = n × (n − 1) × (n − 2) × · · · × 2 × 1 (5.2)
5.12 Fatorial 55
1. A velocidade final vf de um corpo em queda livre, a partir do 9. O ângulo em radianos correspondente a um valor em graus
repouso, após cair de uma altura h é dada pela Equação 5.3, pode ser obtido conforme a Equação 5.11. Escreva um
onde g = 9.8 m/s2 . Escreva um programa em Python usando programa que leia um ângulo em graus e exiba o valor
a biblioteca math que leia o valor de h e calcule a velocidade correspondente em radianos, além dos valores de seu seno,
final. cosseno e tangente.
p
vf = 2gh (5.3)
θ = [Link](x) (5.11)
2. A área de um círculo é dada pela Equação 5.4. Escreva um
programa em Python que leia o raio de um círculo e calcule 10. O tempo necessário para que um material radioativo atinja
sua área utilizando [Link]. uma fração f da massa inicial M0 é dado pela Equação 5.12,
A = πr2 (5.4) onde λ é a taxa de decaimento por período. Escreva um
programa em Python que leia f e λ e calcule o tempo t.
3. A energia potencial elástica de uma mola é dada pela Equa-
ln(f )
ção 5.5 , onde k é a constante elástica e x a deformação. t= (5.12)
ln(1 − λ)
Escreva um programa que calcule a energia armazenada em
uma mola.
1 11. O módulo de um número complexo z = a + bj pode ser ob-
E = kx2 (5.5)
2 tido pela Equação 5.13. Escreva um programa que leia os
valores reais a e b, calcule o módulo de z e exiba o resultado
4. O índice de refração n de um meio pode ser obtido pela Lei com duas casas decimais.
de Snell, conforme a Equação 5.6, onde os ângulos estão em
graus. Escreva um programa que leia θ1 e θ2 e calcule n.
p
|z| = a2 + b2 (5.13)
sin(θ1 )
n= (5.6)
sin(θ2 )
12. Na relatividade especial, o fator de Lorentz descreve o efeito
5. O tempo de queda t de um objeto lançado verticalmente da velocidade em várias propriedades físicas quando ela
para cima com velocidade v0 é dado pela Equação 5.7, onde se aproxima da velocidade da luz. Esse fator é dado pela
g = 9,8 m/s2 . Escreva um programa em Python que leia v0 Equação 5.14. Use c = 3 × 108 m/s para a velocidade da luz.
e calcule o tempo até o ponto mais alto da trajetória. Escreva um programa que leia a velocidade v e compute o
v fator de Lorentz.
t= 0 (5.7)
g 1
γ=q (5.14)
2 2
6. A raiz de uma equação do segundo grau ax + bx + c = 0 1 − vc2
pode ser calculada pela Equação 5.8. Escreva um programa
que leia os coeficientes a, b e c, e calcule as raízes reais, se
existirem. 13. A energia cinética relativística de uma partícula é dada pela
√ Equação 5.15, onde γ é o fator de Lorentz e c = 3.0 × 108 m/s.
−b ± b2 − 4ac
x= (5.8) Escreva um programa que leia v (velocidade) e m (massa),
2a e calcule a energia relativística.
7. A distância entre dois pontos (x1 , y1 ) e (x2 , y2 ) no plano é
1
dada pela Equação 5.9. Escreva um programa em Python E = (γ − 1)mc2 , com γ=q (5.15)
que calcule a distância entre dois pontos. 2
1 − vc2
p
d= (x2 − x1 )2 + (y2 − y1 )2 (5.9)
14. Um pêndulo simples tem seu período aproximado dado pela
8. O volume V de uma esfera é calculado pela Equação 5.10. Equação 5.16, onde L é o comprimento do fio e g = 9.8 m/s2 .
Escreva um programa em Python que leia o raio de uma Escreva um programa que calcule o período T para diferentes
esfera e calcule seu volume. valores de L.
4
V = πr3 (5.10)
3
r
L
T = 2π (5.16)
g
5.12 Fatorial 57
1. A amplitude de um sinal senoidal com frequência f e tempo Python que leia os valores de m e h e calcule a energia
t pode ser modelada pela Equação 5.33. Escreva um pro- potencial.
grama que leia A0 , f e t, e calcule a amplitude instantânea
A(t) do sinal. Ep = mgh (5.23)
1. A amplitude de um sinal senoidal com frequência f e tempo Python que leia os valores de m e h e calcule a energia
t pode ser modelada pela Equação 5.33. Escreva um pro- potencial.
grama que leia A0 , f e t, e calcule a amplitude instantânea
A(t) do sinal. Ep = mgh (5.39)
À medida que seus programas tornarem-se mais complexos, eles frequentemente executarão
um conjunto de comandos quando a condição for verdadeira, e outro conjunto de comandos
quando a condição for falsa. Ou seja, o programa pode ou não executar um conjunto de
instruções com base de um resultado de uma condição testada. Para atender a esse tipo de
situação, podemos utilizar instruções especiais denominadas estruturas condicionais.
Esquema: if()
if condição:
comando(s)
A condição que o comando if avalia é formado por uma proposição lógica, na qual
podemos atribuir um valor lógico verdadeiro ou falso. Caso a condição seja verdadeira, o
Python executará o(s) comando(s) que estiver "dentro dela"(com a indentação, espaçamento
que temos abaixo do if para mostrar que as informações fazem parte dele).
Como um exemplo, o comando if a seguir testa se a variável idade é maior que 20. Se
a condição for verdadeira, o programa executará os comandos que fazem parte do bloco if.
Caso contrário, o programa não executa o bloco e continuará sua execução normalmente.
60 Capítulo 6. Controle de Fluxo
Esquema: if()
minha_idade = 21
Operador Descrição
Relacional
> maior que
>= maior ou igual
< menor que
<= menor ou igual
== igual a
!= diferente
[Link]
1 idade = 21
2
3 if idade == 21:
4 print("A condicao eh verdadeira!")
5 print("A idade eh igual a 21")
O Python usa o sinal de igual duplo (==) nos testes de igualdade. Quando você escrever
testes de igualdade, use o sinal de igual duplo (==) e não o sinal de igual (=) que o Python
usa para uma atribuição. Assim como algumas vezes seus programas precisam testar se
um valor é igual a outro, o Python usa o símbolo != para testar a diferença. O exemplo a
seguir testa se a variável idade não é igual a 21.
6.4 Conectivos Lógicos 61
[Link]
1 idade = 20
2
3 if idade != 21:
4 print("A condicao eh verdadeira!")
5 print("A idade eh diferente de 21")
[Link]
1 idade = 23
2 altura = 1.75
3
4 if (idade >= 21) and (altura > 1.5):
5 print("A idade eh maior igual a 21 anos")
6 print("A altura eh maior a 1.5 metros")
O exemplo a seguir testa se a variável idade é menor que 18 OU peso menor que 45
quilos. É recomendado o uso de parênteses para facilitar o entendimento e organização das
proposições compostas.
[Link]
1 idade = 12
2 peso = 46
3
4 if (idade < 18) or (peso < 45):
5 print("A idade eh menor que 18 anos OU peso menor que 45 quilos")
proposição p proposição q p or q
V V V
V F V
F V V
F F F
1. Elabore um programa em Python que leia dois números e 19. Elabore um programa em Python que leia um número in-
utilize o comando if para verificar se o primeiro é maior teiro e utilize o comando if para verificar se ele é divisível
que o dobro do segundo. por 2 e por 3 ao mesmo tempo.
2. Escreva um programa em Python que leia um número inteiro 20. Crie um programa em Python que leia dois números e utilize
e verifique se ele é positivo utilizando o comando if. o comando if para informar se ambos são diferentes de zero.
3. Faça um programa em Python que leia dois números e utilize 21. Faça um programa que leia a idade de uma pessoa e utilize
o comando if para imprimir o maior deles. o comando if para imprimir "Adolescente"se a idade estiver
entre 13 e 17 anos (inclusive).
4. Escreva um programa que peça ao usuário um número in-
teiro e, usando o comando if, imprima "Par"se o número 22. Escreva um programa em Python que leia o preço de um
for par. produto e utilize o comando if para aplicar um desconto
de 5% caso o preço seja maior que 100.
5. Elabore um programa em Python que leia a idade de uma
pessoa e utilize o comando if para verificar se ela é maior 23. Elabore um programa em Python que leia um número e uti-
de idade (18 anos ou mais). lize o comando if para verificar se ele está fora do intervalo
de 0 a 100.
6. Faça um programa em Python que leia uma letra do teclado
e utilize o comando if para verificar se é uma vogal. 24. Escreva um programa em Python que leia três notas de um
aluno e utilize o comando if para informar se todas são
7. Escreva um programa em Python que receba três núme-
acima de 6.
ros inteiros e utilize o comando if para determinar se pelo
menos um deles é negativo. 25. Faça um programa em Python que leia um número inteiro
e utilize o comando if para exibir uma mensagem caso o
8. Desenvolva um programa que leia dois números inteiros e
número seja múltiplo de 10.
utilize o comando if para verificar se ambos são iguais.
26. Faça um programa em Python que leia os lados de um tri-
9. Faça um programa que leia a temperatura em graus Celsius
ângulo (a, b e c) e utilize o comando if para verificar se eles
e utilize o comando if para avisar se está abaixo de zero.
formam um triângulo válido (a soma de dois lados sempre
10. Escreva um programa em Python que leia um número e maior que o terceiro).
utilize o comando if para verificar se ele está entre 10 e 20
27. Elabore um programa em Python que leia três números
(inclusive).
inteiros e, utilizando o comando if, verifique se eles podem
11. Escreva um programa que leia a nota de um aluno e utilize representar os lados de um triângulo retângulo (ou seja, se
o comando if para informar se ele foi aprovado (nota maior satisfazem o Teorema de Pitágoras).
ou igual a 7).
28. Escreva um programa em Python que leia o valor de x e
12. Elabore um programa que leia um número real e utilize o calcule o valor da função f (x) = x2 − 4x + 3. Use o comando
comando if para verificar se ele é igual a zero. if para imprimir se o valor de f (x) é positivo, negativo ou
zero.
13. Faça um programa que leia dois números e utilize o comando
if para verificar se a soma deles é maior que 100. 29. Faça um programa que leia as coordenadas de dois pontos
(x1 , y1 ) e (x2 , y2 ), calcule a distância entre eles e, utilizando
14. Escreva um programa em Python que leia a idade de uma
o comando if, informe se a distância é maior que 10.
pessoa e utilize o comando if para verificar se ela tem di-
reito à meia-entrada (idade menor ou igual a 12 ou maior 30. Elabore um programa em Python que leia um valor para n
ou igual a 60). e, utilizando o comando if, determine se n é um quadrado
perfeito.
15. Escreva um programa em Python que leia dois números
inteiros e utilize o comando if para verificar se pelo menos 31. Escreva um programa em Python que leia um número real
um deles é par. x e, usando o comando if, avalie a seguinte função definida
por partes:
16. Faça um programa que leia um número inteiro e utilize o
comando if para imprimir "Negativo"se o número for menor
que zero. f (x) = x2 , se x < 0 (6.1)
1. Escreva um programa em Python que leia as coordena- podem doar se já tiverem doado sangue alguma vez antes
das (x, y) de um ponto no plano e indique em qual qua- dessa idade. Pesar no mínimo 60kg se for do sexo masculino
drante [primeiro (+, +), segundo (−, +), terceiro (−, −) ou e 50kg se for do sexo feminino. Não podem doar sangue:
quarto (+, −)] esse ponto se encontra. O programa deve quem estiver com febre no dia da doação, quem estiver grá-
aceitar apenas números diferentes de zero. Caso o usuá- vida, e quem estiver amamentando (a menos que o parto
rio digite zero para x ou y, o programa deve imprimir: tenha ocorrido há mais de 12 meses). Crie um programa que
erro, X e/ou Y nao pode ser zero. receba os dados necessários e informe se a pessoa pode ou
não doar sangue, detalhando os motivos caso a doação não
2. Faça um programa em Python que leia o salário de seja possível. Para respostas booleanas, use como entrada
um trabalhador e o valor da prestação de um emprés- os valores sim ou nao. Para o sexo do doador, utilize F para
timo. Se a prestação for maior que 20% do salário, im- feminino e M para masculino.
prima: Empréstimo não concedido. Caso contrário, im-
prima: Empréstimo concedido. 10. Crie um programa em Python que leia dois números (n1 e
n2) e imprima o quadrado do menor número e a raiz qua-
3. Escreva um programa em Python que leia um número in- drada do maior número. Caso os dois números sejam iguais,
teiro entre 1 e 12 e imprima o mês correspondente a esse o programa deve apenas informar: dois numeros iguais.
número (janeiro se 1, fevereiro se 2, e assim por diante). Caso
o usuário digite um número fora do intervalo, o programa 11. Crie um programa em Python que leia a matrícula, as
deve imprimir: Erro, mês inválido. três notas e a frequência de um aluno (em percentual). O
programa deve calcular a média aritmética das notas e, utili-
4. Faça um programa em Python que receba três números e zando as seguintes regras, informar a situação do aluno: Se a
os mostre em ordem crescente. média for maior ou igual a 7.0 e a frequência for pelo menos
5. Escreva um programa em Python que leia um ano e deter- 75%, o aluno está aprovado. Se a média for menor que 4.0
mine se ele é bissexto. Um ano é bissexto se for divisível ou a frequência for inferior a 75%, o aluno está reprovado.
por 400 ou se for divisível por 4 e não for divisível por 100. Caso contrário, o aluno está em recuperação. O programa
Por exemplo: 1988, 1992, 1996. deve exibir o resultado com a matrícula e as informações
calculadas.
6. Escreva um programa em Python que leia uma data e
verifique se ela é válida. O programa deve verificar se o mês 12. Elabore um programa em Python que leia o horário de
está entre 1 e 12, e se o dia existe naquele mês. Note que entrada e saída de um estacionamento (formato hh : mm) e
fevereiro tem 29 dias em anos bissextos e 28 dias em anos calcule o valor a ser pago, sabendo que: Até 1 hora: valor
não bissextos. fixo de R$ 5.00; De 1 até 2 horas: R$ 8.00; De 2 até 4 horas:
R$ 12.00; Acima de 4 horas: R$ 12.00 mais R$ 3.00 por
7. Escreva um programa em Python para avaliar uma função hora extra (ou fração). O programa deve considerar que o
f (x, y) para quaisquer dois valores x e y informados pelo período pode passar da meia-noite e deve mostrar o valor
usuário. A função f (x, y) é definida por: total arredondado para duas casas decimais.
x+y se x≥0 e y≥0 13. Escreva um programa em Python que leia três valores posi-
x+y 2
se x≥0 e y<0 tivos representando os lados de um triângulo e classifique-o
f (x, y) = quanto aos lados e quanto aos ângulos. Quanto aos lados, o
x2 + y se x<0 e y≥0
triângulo pode ser: equilátero (três lados iguais), isósceles
2 2
x +y se x<0 e y<0
(dois lados iguais) ou escaleno (todos os lados diferentes).
Quanto aos ângulos, o triângulo pode ser: retângulo (pos-
8. A velocidade de um foguete pode ser descrita pela equação sui um ângulo reto de 90◦ ), acutângulo (todos os ângulos
abaixo. Desenvolva um programa em Python para calcular menores que 90◦ ) ou obtusângulo (possui um ângulo maior
v como uma função do tempo t: que 90◦ ). O programa deve utilizar o Teorema de Pitágoras
e suas variações para determinar a classificação quanto aos
10t2 − 5t se 0 ≤ t < 8
ângulos. Ao final, informe todas as classificações possíveis
624 − 3t se 8 ≤ t < 16
para o triângulo.
v(t) = 36t + 12(t − 16)2 se 16 ≤ t < 26
14. Faça um programa em Python que simule um sistema de
2136 e−0.1(t−26) se t > 26
controle de acesso a um laboratório. O programa deve solici-
0 caso contrário
tar a matrícula e uma senha numérica do usuário. O sistema
possui até cinco usuários cadastrados (matrícula e senha).
9. Você foi contratado para desenvolver um programa de tri- O acesso só deve ser permitido se a matrícula existir e a
agem de doadores de sangue. Os requisitos para doação senha informada corresponder à matrícula. Caso contrário,
são: Ter entre 16 e 69 anos. Pessoas acima de 60 anos só o acesso é negado e uma mensagem deve ser exibida.
6.7 Estrutura condicional if-elif-else 65
Esquema: for()
for CONTADOR in range(VALOR_INICIAL, VALOR_PARADA, PASSO):
# Bloco de Código endentado
comando_1
comando_2
...
comando_n
Quando seu programa precisa repetir comandos um número específico de vezes, normal-
mente se utiliza uma variável chamada contador ou variável de controle, que registra o
número de vezes em que o bloco de código endentado do comando for foi executado.
O comando for apresenta três componentes principais:
1. Valor Inicial: atribui à variável de controle o valor inicial.
2. Valor Final: testa o valor da variável de controle para determinar se o programa
já executou o bloco o número desejado de vezes.
3. Passo: incrementa (ou decrementa) a variável de controle a cada iteração.
Durante a execução do laço, o(s) comando(s) especificado(s) serão repetidamente
executados enquanto a condição de parada não for atingida. Por isso, o comando for é
conhecido como laço for. Considere o exemplo a seguir, que exibe os números de 0 a 4:
[Link]
1 for conta in range(0,3,1):
2 print(conta)
CotoNet@linux:
0
1
2
[Link]
1 for conta in range(3,0,-1):
2 print(conta)
CotoNet@linux:
3
2
1
[Link]
1 for conta in range(0,20,6):
2 print(conta)
CotoNet@linux:
0
6
12
18
[Link]
1 for conta in range(134,-136,-94):
2 print(conta)
CotoNet@linux:
134
40
-54
[Link]
1 for x in range(0,3,1):
2 for y in range(10,13,1):
3 print("x: %d y: %d" %(x,y))
CotoNet@linux:
x: 0 y: 10
x: 0 y: 11
x: 0 y: 12
x: 1 y: 10
x: 1 y: 11
x: 1 y: 12
x: 2 y: 10
x: 2 y: 11
x: 2 y: 12
No exemplo acima, o laço externo controla o valor da variável x, enquanto o laço interno
controla o valor de y. Para cada valor de x, o laço interno percorre todos os valores possíveis
de y, imprimindo cada par ordenado (x, y). É importante notar que o laço interno sempre
executa por completo a cada nova iteração do laço externo. Esse padrão é fundamental
para varrer elementos em tabelas, linhas e colunas de matrizes, ou mesmo para gerar todos
os pares possíveis entre elementos de duas listas distintas.
7.6 Somatórios e sua Relação com Laços for 71
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
De modo geral, a notação bi=a f (i) indica a soma dos valores da expressão f (i) à medida
P
que o índice i varia de a até b, inclusive. Por exemplo, considere a função f (x) = 2x + 1.
Nesse caso, teremos o somatório:
4
X
f (i) = f (1) + f (2) + f (3) + f (4)
i=1
= (2 · 1 + 1) + (2 · 2 + 1) + (2 · 3 + 1) + (2 · 4 + 1)
= 3 + 5 + 7 + 9 = 24
Assim, a soma corresponde à soma dos valores obtidos pela aplicação da função f (x) = 2x+1
para cada valor de x entre 1 e 4.
Existe uma forte analogia entre a notação de somatório e o uso de laços for em
linguagens de programação. O laço for pode ser utilizado para calcular o valor de um
somatório, repetindo uma operação de soma para cada valor do índice. Por exemplo, para
calcular 10
P
i=1 i em Python, podemos usar:
[Link]
1 soma = 0
2 for i in range(1, 11):
3 soma += i
4 print(soma)
Neste exemplo, a variável i assume todos os valores de 1 até 10, e, a cada passo, o
valor de i é adicionado à variável acumuladora soma.
Como segundo exemplo, considere o cálculo do somatório 6k=1 k 2 , ou seja, a soma dos
P
quadrados dos seis primeiros números inteiros. Neste caso, a função é f (k) = k 2 , e a forma
72 Capítulo 7. Estruturas de Repetição
expandida fica:
6
X
k 2 = 12 + 22 + 32 + 42 + 52 + 62
k=1
= 1 + 4 + 9 + 16 + 25 + 36 = 91
Nesse exemplo, o laço for percorre todos os valores de k de 1 até 6, e a cada iteração
adiciona k 2 à variável acumuladora soma. Ao final, o valor impresso corresponde ao
resultado do somatório dos quadrados, isto é, 91.
Esse somatório indica que, para cada valor de i de 1 a 3, devemos somar os valores da
expressão (i + j) para cada valor de j de 1 a 2. O cálculo segue uma ordem aninhada: para
cada i, percorre-se todos os valores de j. Sua forma expandida é:
(1 + 1) + (1 + 2)
+ (2 + 1) + (2 + 2)
+ (3 + 1) + (3 + 2)
= 2 + 3 + 3 + 4 + 4 + 5 = 21
A ligação entre o somatório duplo e o uso de laços for aninhados em programação é direta:
cada índice do somatório é representado por um laço for, sendo o laço externo responsável
pelo primeiro índice e o laço interno responsável pelo segundo. Veja o exemplo em Python
para calcular o somatório acima:
[Link]
1 soma = 0
2 for i in range(1, 4):
3 for j in range(1, 3):
4 soma += i + j
5 print(soma)
7.8 Repetindo Comandos Usando o Laço while 73
CotoNet@linux:
2
5
8
12
16
21
21
Observe que a cada iteração do laço externo, o laço interno executa completamente
todos os seus ciclos. Para cada combinação de i e j, o valor i + j é adicionado à variável
acumuladora soma. O comando print(soma) exibe o valor acumulado a cada passo,
permitindo acompanhar o crescimento da soma ao longo das iterações.
Ao final da execução, o valor de soma corresponde exatamente ao resultado do somatório
duplo matemático expandido anteriormente. Esse padrão de laço aninhado pode ser
generalizado para mais de dois índices, permitindo calcular somatórios triplos e operações
em estruturas tridimensionais ou de ordem superior.
Esquema: print()
while (CONDIÇÃO):
# Bloco de Código Endentado
comando_1
comando_2
...
comando_n
[Link]
1 import random
2
3 resposta = "s"
4
5 while (resposta == "s" or resposta == "S"):
6 print("\n")
7 print("Simulando uma jogada de dado de seis faces:")
8 numero = int([Link]()*6)
9 print(numero)
10 resposta = input("Jogar novamente? Digite \'s\' para sim: ")
Nesse exemplo, o programa inicializa a variável resposta com a string "s". O laço
while verifica se resposta é igual a "s" ou "S". Se a condição for verdadeira, o bloco de
comandos dentro do laço é executado, simulando a jogada do dado e solicitando uma nova
resposta do usuário. O laço se repetirá enquanto o usuário continuar respondendo "s"
ou "S". Quando o usuário digitar qualquer outro valor, a condição será falsa, o laço será
encerrado e o programa continuará sua execução normalmente.
Como você já aprendeu, as estruturas de repetição for e while permitem que seus
programas executem um bloco de comandos repetidamente, de acordo com uma condição
lógica. Em determinadas situações, no entanto, pode ser desejável pular a execução de
uma iteração específica do laço, com base em uma segunda condição estabelecida no corpo
do laço. Nesses casos, utiliza-se o comando continue.
Dessa forma, o comando continue permite que determinadas situações dentro do laço
sejam tratadas de modo especial, fazendo com que o fluxo do programa ignore o restante
dos comandos da iteração atual e avance diretamente para a próxima.
[Link]
1 for i in range(1, 10):
2 if i % 3 == 0:
3 continue
4 print(i)
7.10 Compreendendo o Comando break do Python 75
CotoNet@linux:
1
2
4
5
7
8
Considere o caso em que o usuário informa três valores entre 0 e 5, e um laço for exibe
todos os números desse intervalo, exceto os digitados, utilizando o comando continue para
ignorá-los:
[Link]
1 exc1 = int(input("Digite o primeiro numero para excluir [0-5]: "))
2 exc2 = int(input("Digite o segundo numero para excluir [0-5]: "))
3 exc3 = int(input("Digite o terceiro numero para excluir [0-5]: "))
4
5 for n in range(0, 6):
6 if n == exc1 or n == exc2 or n == exc3:
7 continue
8 print(n)
CotoNet@linux:
Digite o primeiro numero para excluir [0-5]: 1
Digite o segundo numero para excluir [0-5]: 4
Digite o terceiro numero para excluir [0-5]: 5
0
2
3
O comando break é utilizado dentro de estruturas de repetição, como os laços for e while,
para interromper imediatamente a execução do laço em que ele se encontra, independente-
mente de a condição final do laço já ter sido atingida ou não. Quando o Python encontra o
comando break, ele encerra o laço atual e o fluxo de execução do programa continua a
partir da primeira linha de código após o laço.
Esse comando é útil quando, durante a execução do laço, ocorre uma condição especial
que exige a finalização antecipada da repetição. Por exemplo, ao buscar um elemento em
uma lista, o laço pode ser interrompido assim que o elemento desejado for encontrado,
evitando iterações desnecessárias. Como exemplo, considere um programa que lê valores
inteiros digitados pelo usuário e encerra o laço assim que o valor 0 for informado.
76 Capítulo 7. Estruturas de Repetição
[Link]
1 while True:
2 numero = int(input("Digite um numero (0 para sair): "))
3 if numero == 0:
4 print("Valor 0 encontrado! Encerrando o laco.")
5 break
6 print("Voce digitou:", numero)
CotoNet@linux:
Digite um numero (0 para sair): 7
Voce digitou: 7
Digite um numero (0 para sair): 0
Valor 0 encontrado! Encerrando o laco.
Neste exemplo, o laço while é infinito devido à condição True. Isso ocorre porque a
expressão True sempre será avaliada como verdadeira, fazendo com que o laço nunca seja
interrompido naturalmente. Dessa forma, o laço só será encerrado de maneira controlada,
quando algum comando especial, como o break, for executado dentro do bloco do laço.
Esse padrão é frequentemente utilizado quando não se sabe antecipadamente o número de
repetições necessárias e o término da repetição depende de uma condição interna definida.
Como mais um exemplo do uso do comando break, considere um programa simples que
solicita ao usuário uma senha para acessar um sistema. O programa permite um número
ilimitado de tentativas, mas encerra o laço assim que a senha correta for digitada:
[Link]
1 senha_correta = "python123"
2
3 while True:
4 senha = input("Digite a senha de acesso: ")
5 if senha == senha_correta:
6 print("Acesso liberado!")
7 break
8 print("Senha incorreta. Tente novamente.")
CotoNet@linux:
Digite a senha de acesso: abc
Senha incorreta. Tente novamente.
Digite a senha de acesso: python123
Acesso liberado!
7.10 Compreendendo o Comando break do Python 77
1. Escreva um programa em Python que solicite dez núme- Escreva um programa em Python capaz de simular uma
ros (n1 , n2 , n3 , . . . , n10 ) ao usuário e, em seguida, imprima o partida e calcular o número de tentativas necessárias para
quadrado de cada um desses números. Exemplo: acertar um determinado jogo pré-definido. O usuário deve
informar previamente a combinação sorteada.
2. Escreva um programa em Python que imprima, em ordem
decrescente, todos os números naturais de 100 até 0. Exem- 12. Escreva um programa em Python que, utilizando um laço
plo: for, solicite ao usuário 20 valores inteiros positivos. Ao final,
informe qual foi o maior valor, o menor valor e a média dos
3. Crie um programa em Python que imprima todos os nú-
números digitados.
meros naturais de 1 até 1000. Ao final, o programa deve
calcular e exibir a soma acumulada de todos os números de 13. Elabore um programa em Python que leia uma sequência de
1 até 1000. Exemplo: números inteiros positivos e conte quantos desses números
são múltiplos de 3 ou de 5. O programa deve parar a leitura
4. Crie um programa em Python que solicite um valor j, com
quando for digitado o número zero.
j ∈ N e j > 3. Em seguida, o programa deve solicitar j
números (n1 , n2 , n3 , . . . , nj ) e, ao final, imprimir a média 14. Escreva um programa em Python que leia vários números
aritmética desses valores. Exemplo: inteiros positivos e verifique quantos deles são primos. O
programa deve encerrar quando o valor −1 for informado.
5. Crie um programa em Python que solicite 10 números. Ao
final, o programa deve informar quantos números são pares 15. Escreva um programa em Python que simule um caixa ele-
e quantos são ímpares. Dica: Use o operador % para calcular trônico. O programa deve solicitar ao usuário um valor
o resto da divisão por 2. inteiro positivo e calcular a menor quantidade possível de
cédulas para compor esse valor, usando as notas de 100, 50,
6. Crie um programa em Python que solicite um número n
20, 10, 5 e 2 reais. O programa deve permitir que o usuário
(n ∈ N). O programa deve calcular e imprimir o fatorial de n.
faça novas consultas até digitar o valor zero.
Caso seja informado um valor inválido, o programa deve exi-
bir a mensagem: "erro, o valor deve ser inteiro e positivo!". 16. Crie um programa em Python que utilize um laço while
Utilize apenas a estrutura de repetição for para calcular o para ler notas de alunos e calcule a média. O programa
fatorial, sem usar a função factorial da biblioteca math. deve aceitar notas entre 0.0 e 10.0 e encerrar quando uma
nota fora desse intervalo for digitada. Em seguida, informe
7. A sequência de Fibonacci é definida como uma sequência
a média das notas válidas.
recursiva, onde os dois primeiros termos são x1 = 1 e x2 = 1.
Para n ≥ 3, os termos seguintes são calculados pela Equa- 17. Escreva um programa em Python que gere e exiba a tabu-
ção 7.1. Escreva um programa em Python que receba um ada de multiplicação de um número inteiro informado pelo
número n > 2 e exiba a sequência de Fibonacci até o n-ésimo usuário, para os valores de 1 a 10. O programa deve permitir
termo. Se o valor informado for inválido, o programa deve ao usuário informar novos valores até digitar o valor 0.
exibir uma mensagem de erro.
18. Elabore um programa em Python que leia um número inteiro
xn = xn−1 + xn−2 (7.1) positivo n e exiba todos os divisores de n. O programa deve
repetir o procedimento até o usuário digitar o valor 0.
8. Escreva um programa em Python usando o comando while
19. Crie um programa em Python que leia um número inteiro
que imprima todos os números da sequência −5, −4.5, . . . ,
positivo e verifique se ele é um número perfeito (ou seja, se a
−0.5, 0.5, . . . , 5, excluindo o zero.
soma de seus divisores próprios é igual ao próprio número).
9. Escreva um programa em Python que solicite repetidamente O programa deve repetir o processo até o usuário digitar
um número real n e imprima a raiz quadrada desse número. −1.
O laço deve ser encerrado quando for informado um número
20. Escreva um programa em Python que simule uma calcu-
n ≤ 0.
ladora simples. O programa deve apresentar um menu de
10. Escreva um programa em Python que leia vários núme- operações (adição, subtração, multiplicação e divisão) e so-
ros reais n no intervalo fechado [100, 200]. O programa licitar dois números para realizar a operação escolhida. O
deve terminar quando o valor zero for lido. Ao final, im- usuário pode realizar quantas operações desejar, até optar
prima quantos números dentro do intervalo foram digitados por sair do programa.
e quantos números fora do intervalo (exceto o zero) foram
21. Escreva um programa em Python que leia uma sequência
informados.
de números inteiros e conte quantos deles são positivos, ne-
11. Em um jogo de loteria, o apostador deve selecionar 3 (três) gativos ou zero. O programa encerra quando o valor −999
números distintos de uma lista de inteiros no intervalo for informado.
[0, 100], informando também a ordem dos números sorteados.
78 Capítulo 7. Estruturas de Repetição
1. Elabore um programa em Python que calcule a soma dos 9. Elabore um programa em Python que calcule o produto dos
termos da série harmônica descrita pela Equação 7.20, onde números ímpares conforme a Equação 7.30, onde o valor de
o valor de n deve ser informado pelo usuário. n deve ser informado pelo usuário.
n n
X 1 Y
S= (7.2) P= (2k − 1) (7.12)
k
k=1 k=1
2. Elabore um programa em Python que calcule a soma dos 10. Elabore um programa em Python que calcule uma aproxi-
termos quadrados conforme a Equação 7.21, onde o valor mação para o valor de π usando a Equação 7.31, onde o
de n deve ser informado pelo usuário. valor de n deve ser informado pelo usuário.
n
n
(−1)k
X
S= k2 (7.3)
X
π≈4 (7.13)
k=1 2k + 1
k=0
1. Elabore um programa em Python que calcule a soma dos 9. Elabore um programa em Python que calcule o produto dos
termos da série harmônica descrita pela Equação 7.20, onde números ímpares conforme a Equação 7.30, onde o valor de
o valor de n deve ser informado pelo usuário. n deve ser informado pelo usuário.
n n
X 1 Y
S= (7.20) P= (2k − 1) (7.30)
k
k=1 k=1
2. Elabore um programa em Python que calcule a soma dos 10. Elabore um programa em Python que calcule uma aproxi-
termos quadrados conforme a Equação 7.21, onde o valor mação para o valor de π usando a Equação 7.31, onde o
de n deve ser informado pelo usuário. valor de n deve ser informado pelo usuário.
n
n
(−1)k
X
S= k2 (7.21)
X
π≈4 (7.31)
k=1 2k + 1
k=0
Na programação, funções são blocos de código que apenas são executados quando são
chamados. O uso de funções é recomendado quando temos uma determinada tarefa que
normalmente precisam ser executadas diversas vezes dentro de uma aplicação. Quando
surge essa necessidade, para que várias instruções não precisem ser repetidas, elas são
agrupadas em uma função, à qual é dado um nome e que poderá ser chamada/executada
em diferentes partes do programa.
Esquema: print()
def nome_da_funcao(var1, var2, ..., varn):
# Bloco de Código endentado da função
comando_1
comando_2
...
comando_n
return vars
Sendo nome_da_funcao o nome que se deseja nomear à função (sem acentos e sem
espaço), var1, var2, varn suas variáveis independentes de entrada da função. A variável
vars representa a saída da função. Utilizamos a parava revervada return para estabelecer
qual será o valor que a função retornará.
Depois de definida a função, para usá-la basta que seu nome seja chamadao, colocando
entre parênteses o(s) valor(es) numérico(s) (dependendo do número de variáveis de entrada).
82 Capítulo 8. Funções
[Link]
1 # Criando a funcao ola()
2 def ola():
3 print("Ola Mundo!")
4
5 # Chamando a funcao criada:
6 ola()
CotoNet@linux:
Ola Mundo!
[Link]
1 def hello(meu_nome):
2 print("Ola %s " % meu_nome)
3
4 hello("Lucas Ribeiro")
Essa função, de nome hello(), tem como objetivo imprimir o nome que lhe é passado
por parâmetro (também chamado de argumento). A palavra reservada def, na primeira
linha, explicita a definição da função naquele ponto. Em seguida, entre parênteses, temos
o parâmetro meu_nome. Ainda na mesma linha, observe a utilização dos dois pontos (:),
que indicam que o código identado nas linhas abaixo faz parte da função que está sendo
criada. Aqui, é importante ressaltar que, para respeitar a sintaxe da linguagem, a linha 2
identado em relação à linha 1. Para executar a função, de forma semelhante ao que ocorre
em outras linguagens, devemos simplesmente chamar seu nome e passar os parâmetros
esperados entre parênteses, conforme a linha 4.
CotoNet@linux:
Ola Lucas Ribeiro
[Link]
1 def hello(meu_nome, idade):
2 print("Ola %s, sua idade eh: %d" % (meu_nome,idade))
3
4 hello("Lucas Ribeiro", 24)
Agora, ao invocar essa função, também é necessário informar o segundo parâmetro, que
representa a idade que será impressa após o nome:
CotoNet@linux:
Ola Lucas Ribeiro, sua idade eh: 24
[Link]
1 def calcular_pagamento(qtd_horas, valor_hora):
2 horas = float(qtd_horas)
3 taxa = float(valor_hora)
4 if horas <= 40:
5 salario=horas*taxa
6 else:
7 h_excd = horas - 40
8 salario = 40*taxa+(h_excd*(1.5*taxa))
9
10 return salario
11
12 str_horas= input('Digite as horas: ')
13 str_taxa=input('Digite a taxa: ')
14 total_salario = calcular_pagamento(str_horas,str_taxa)
15 print('O valor de seus rendimentos eh R$',total_salario)
84 Capítulo 8. Funções
CotoNet@linux:
Digite as horas: 40
Digite a taxa: 20
O valor de seus rendimentos e R$ 800.0
8.5 Criando uma Função Retornando Algum Valor 85
1. Implemente uma função em Python que calcule a energia 11. Implemente uma função que calcule o volume de uma esfera,
cinética de uma partícula, definida pela Equação 8.1. conforme a Equação 8.11.
1 4 3
Ec = mv 2 (8.1) V = πr (8.11)
2 3
2. Implemente uma função em Python que calcule a energia 12. Escreva uma função que calcule o centro de massa de um
potencial gravitacional de um corpo em função da altura h, sistema discreto de partículas, Equação 8.12.
conforme a Equação 8.2. mi xi
P
xcm = P (8.12)
Ep = mgh (8.2) mi
3. Crie uma função em Python que calcule a lei de resfria- 13. Crie uma função que calcule o deslocamento angular de um
mento de Newton, conforme a Equação 8.3, onde T (t) é a pêndulo simples para pequenos ângulos, Equação 8.13.
temperatura no tempo t. q
g
θ(t) = θ0 cos t (8.13)
L
T (t) = Ta + (T0 − Ta )e−kt (8.3)
14. Implemente uma função que calcule o número de Reynolds
4. Escreva uma função em Python que calcule a equação da de um escoamento, Equação 8.14.
onda harmônica unidimensional, Equação 8.4, para um dado
ρvD
x e t. Re = (8.14)
µ
y(x, t) = A sin(kx − ωt + ϕ) (8.4)
15. Crie uma função que calcule a potência elétrica dissipada
em um resistor, Equação 8.15.
5. Implemente uma função que calcule a força elástica de uma
mola segundo a Lei de Hooke, Equação 8.5. V2
P= (8.15)
R
F = −kx (8.5)
16. Escreva uma função que calcule a frequência natural de um
6. Escreva uma função que calcule a equação da descarga de sistema massa-mola, Equação 8.16.
um capacitor em um circuito RC, Equação 8.6. r
k
V (t) = V0 e
t
− RC
(8.6) ω0 = (8.16)
m
7. Implemente uma função que calcule a pressão exercida por 17. Desenvolva uma função que calcule a entalpia de um gás
um gás ideal, usando a Equação de Clapeyron (Equação 8.7). ideal, Equação 8.17.
8. Escreva uma função que calcule a altura máxima de um 18. Crie uma função que calcule a corrente em um circuito RL
projétil lançado verticalmente, Equação 8.8. em regime transitório, Equação 8.18.
v02 V
R
hmax = (8.8) i(t) = 1 − e− L t (8.18)
2g R
9. Desenvolva uma função que calcule o trabalho realizado por 19. Escreva uma função que calcule a equação logística do cres-
uma força constante, conforme Equação 8.9. cimento populacional, Equação 8.19.
K
W = F · d · cos(θ) (8.9) P (t) = K−P0
(8.19)
1+
P0 e−rt
10. Crie uma função que calcule a velocidade de um corpo em
20. Implemente uma função que calcule a velocidade de escape
queda livre após um tempo t, conforme Equação 8.10.
de um planeta, Equação 8.20.
v(t) = gt (8.10) r
2GM
ve = (8.20)
R
8.5 Criando uma Função Retornando Algum Valor 87
1. Escreva uma função que calcule a energia armazenada em 6. Implemente uma função que calcule o rendimento de uma
um capacitor, Equação 8.21. máquina térmica de Carnot, Equação 8.26.
1 η = 1−
Tc
(8.26)
E= CV 2 (8.21)
2 Tq
2. Crie uma função que calcule a intensidade do campo elétrico 7. Escreva uma função que calcule a velocidade média de um
gerado por uma carga puntiforme, Equação 8.22. móvel, Equação 8.27.
q ∆s
E = ke (8.22) vm = (8.27)
r2 ∆t
3. Implemente uma função que calcule a energia de uma onda 8. Desenvolva uma função que calcule a força centrípeta, Equa-
eletromagnética, Equação 8.23. ção 8.28.
E = hf (8.23) mv 2
Fc = (8.28)
r
4. Desenvolva uma função que calcule a equação do movimento
uniformemente variado (MUV), Equação 8.24. 9. Escreva uma função que calcule a equação da trajetória de
um projétil (movimento oblíquo), Equação 8.29.
1
s(t) = s0 + v0 t + at2 (8.24)
2 gx2
y(x) = x tan(θ) − (8.29)
2v02 cos2 (θ)
5. Escreva uma função que calcule o número de Mach de um
escoamento compressível, Equação 8.25.
10. Crie uma função que calcule a taxa de transmissão de calor
v por condução, Equação 8.30.
M= (8.25)
a
kA(T1 − T2 )
Q= (8.30)
L
9. Matrizes com NumPy
CotoNet@linux:
python -m pip install numpy
[Link]
1 import numpy as np
90 Capítulo 9. Matrizes com NumPy
[Link]
1 import numpy as np
2 A = [Link]([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
3 print(type(A))
4 print(A)
CotoNet@linux:
<class '[Link]'>
[[1 2 3]
[4 5 6]
[7 8 9]]>
[Link]
1 import numpy as np
2 M1 = [Link]((2,2))
3 M2 = [Link]((2,2))
4 M3 = [Link]((2,2), 9.5)
5 print("M1 = ", M1)
6 print("M2 = ", M2)
7 print("M3 = ", M3)
CotoNet@linux:
M1 = [[0. 0.]
[0. 0.]]
M2 = [[1. 1.]
[1. 1.]]
M3 = [[9.5 9.5]
[9.5 9.5]]
Esquema: linspace()
linspace(ini, fim, num)
# onde:
# ini - é o primeiro valor da sequência.
# fim - é o último valor da sequência.
# num - define a quantidade de valores a serem gerados.
Outra maneira de criar vetores com números uniforme é utilizando a função arange.
Essa função gera uma sequência de valores uniformemente espaçados dentro de um intervalo
especificado. Diferente do linspace, que define a quantidade de elementos no intervalo,
o arange permite especificar o incremento entre os valores gerados. A sintaxe básica do
arange é:
Esquema: arange()
arange(ini, fim, pas)
# onde:
# ini - é o primeiro valor da sequência.
# fim - é o último valor da sequência.
# num - determina o espaçamento entre os valores consecutivos.
Se não for especificado, o padrão é 1.
92 Capítulo 9. Matrizes com NumPy
[Link]
1 import numpy as np
2
3 vetor_linspace = [Link](2, 20, 8)
4 vetor_arrange = [Link](2,34,4)
5 print(vetor_linspace)
6 print(vetor_arrange)
CotoNet@linux:
[ 2. 4.571428 7.142857 9.714285 12.285714 14.857142 17.428571 20.]
[ 2 6 10 14 18 22 26 30]
[Link]
1 import numpy
2 M1 = [Link]((2,5))
3 print("M1 = ", M1)
4 print("Total de elementos: %d" % [Link](M1))
5 dim = [Link](M1)
6 print("Dimensao = ", dim)
7 print("M1 tem %d linhas X %d Colunas" % (dim[0], dim[1]))
8 # Outra maneira
9 [linhas,colunas] = [Link](M1)
10 print("M1 tem %d linhas X %d Colunas" % (linhas, colunas))
CotoNet@linux:
M1 = [[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
Total de elementos: 10
Dimensao = (2, 5)
[Link]
1 import numpy
2 M1 = [Link]([[1, 2, 3],[9, 8, 7]])
3 print("M1 = ", M1)
4 print("Elemento lin:0 col:0: ", M1[0,0])
5 print("Elemento lin:1 col:1: ", M1[1,1])
6 print("Elemento lin:1 col:2: ", M1[1,2])
CotoNet@linux:
M1 = [[1 2 3]
[9 8 7]]
Elemento lin:0 col:0: 1
Elemento lin:1 col:1: 8
Elemento lin:1 col:2: 7
[Link]
1 import numpy
2 V = [Link]([9,8,7,6,5,4,3,2,1])
3 print(V)
4 print(V[2:5])
5 print(V[2:])
6 print(V[:6])
94 Capítulo 9. Matrizes com NumPy
CotoNet@linux:
[9 8 7 6 5 4 3 2 1]
[7 6 5]
[7 6 5 4 3 2 1]
[9 8 7 6 5 4]
[Link]
1 import numpy
2 M = [Link]([[1, 2, 3, 4, 5],
3 [6, 7, 8, 9, 10],
4 [11, 12, 13, 14, 15]])
5
6 print('M = \n' , M)
7 print('M = \n' , M[1:3,2:5])
CotoNet@linux:
M =
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
M =
[[ 8 9 10]
[13 14 15]]
[Link]
1 import numpy
2 M = [Link]([[11, 2, 3 ],
3 [4, 5, 16 ],
4 [7, 81, 22],
5 [1, 2, 10 ]])
6
7 max_element = [Link](M)
8 min_element = [Link](M)
9 max_por_col = [Link](M,0)
10 max_por_lin = [Link](M,1)
11 max_fatia = [Link](M[:,2])
12 min_fatia = [Link](M[1,:])
13
14 print("Max Global_______: %d " % max_element)
15 print("Min Global_______: %d " % min_element)
16 print("Max por coluna___:", max_por_col)
17 print("Max por linha____:" , max_por_lin)
18 print("Max de uma fatia_:" , max_fatia)
19 print("Min de uma fatia_:" , min_fatia)
CotoNet@linux:
Max Global_______: 81
Min Global_______: 1
Max por coluna___: [11 81 22]
Max por linha____: [11 16 81 10]
Max de uma fatia_: 22
Min de uma fatia_: 4
[Link]
1 import numpy
2 M1 = [Link]([[1, 2, 3], [4, 5, 6]])
3 M2 = [Link]([[6, 5, 4], [3, 2, 1]])
4 print("M_soma = ", M1 + M2)
5 print("M_soma_10", M1 + 10)
6 print("M_sub = ", M1 - M2)
7 print("M_sub_10 = ", M1 - 10)
8 print("M_mult = ", M1 * M2)
9 print("M_div = ", M1 / M2)
10 print("M_div_int = ", M1 // M2)
11 print("M_resto_div = ", M1 % M2)
12 print("M_expo = ", M1 ** M2)
CotoNet@linux:
M_soma = [[ 7 7 7 ]
[ 7 7 7 ]]
M_soma_10 = [[ 11 12 13 ]
[ 14 15 16 ]]
M_sub = [[ -5 -3 -1 ]
[ 1 3 5 ]]
M_sub_10 = [[-9 -8 -7]
[-6 -5 -4]]
M_mult = [[ 6 10 12 ]
[ 12 10 6 ]]
M_div = [[ 0.16 0.4 0.75 ]
[ 1.33 2.5 6.00 ]]
M_div_int = [[0 0 0]
[1 2 6]]
M_resto_div = [[1 2 3]
[1 1 0]]
M_expo = [[ 1 32 81]
[64 25 6]]
[Link]
1 import numpy
2 M = [Link]([[1, 2, 3],
3 [4, 5, 6],
4 [7, 8, 9]])
5
6 soma_global = [Link](M)
7 soma_lin = [Link](M,1)
8 soma_col = [Link](M,0)
9 soma_fatia = [Link](M[:,2])
10
11 print("Soma Global____: %d" % soma_global)
12 print("Soma linha_____:", soma_lin)
13 print("Soma Coluna____:", soma_col)
14 print("Soma uma fatia_:", soma_fatia)
CotoNet@linux:
Soma Global____: 45
Soma linha_____: [ 6 15 24]
Soma Coluna____: [12 15 18]
Soma uma fatia_: 18
No NumPy, existem diversos operadores relacionais que podem ser utilizados para realizar
comparações entre matrizes ou arrays. Esses operadores permitem que você faça testes
lógicos entre os elementos das matrizes, facilitando a análise e a manipulação dos dados.
Os mesmos operadores relacionais apresentados na Tabela 6.1 do Capítulo 6, Seção 6.2,
que são utilizados em contextos mais gerais de programação, também podem ser aplicados
diretamente aos arrays no NumPy.
[Link]
1 import numpy
2 M1 = [Link]([[1, 5, 7], [1, 2, 6]])
3 M2 = [Link]([[6, 5, 4], [3, 2, 1]])
4 print("M1 == 1", M1 == 1)
5 print("M2 > 5", M2 > 5)
6 print("M1 != M2", M1 != M2)
98 Capítulo 9. Matrizes com NumPy
CotoNet@linux:
M1 == 1 [[ True False False]
[ True False False]]
M2 > 5 [[ True False False]
[ False False False]]
M1 != M2 [[ True False True]
[ True False True]]
[Link]
1 import numpy
2 M_uniforme_01 = [Link](2,2)
3 M_uniforme_is = [Link](-5,5,(2,2))
4 M_normal_01 = [Link](3,3)
5 M_normal_is = [Link](-5, 5, (2,2))
6 print(M_uniforme_01)
7 print(M_uniforme_is)
8 print(M_normal_01)
9 print(M_normal_is)
9.14 Percorrendo uma Matriz Bidimensional 99
CotoNet@linux:
M_uniforme_01 = [[0.27312792 0.49716951]
[0.48051376 0.57703322]]
60
15
50
40
10
30
20
5
10
0 0
.
[Link]
1 import numpy
2 M = [Link]([[1, 2], [4, 5], [7, 8]])
3
4 for i in range(0,3,1):
5 for j in range(0,2,1):
6 print("lin: %d: col: %d - var: %d " % (i,j,M[i,j]))
[Link]
1 import numpy
2 M = [Link]([[1, 2], [4, 5], [7, 8]])
3
4 for i in range(0,3,1):
5 for j in range(0,2,1):
6 print("lin: %d: col: %d - var: %d " % (i,j,M[i,j]))
CotoNet@linux:
lin: 0: col: 0 - var: 1
lin: 0: col: 1 - var: 2
lin: 1: col: 0 - var: 4
lin: 1: col: 1 - var: 5
lin: 2: col: 0 - var: 7
lin: 2: col: 1 - var: 8
Figura 9.2: Percurso em uma matriz bidimensional utilizando dois laços for aninhados.
As setas representam a ordem de varredura linha a linha, com índices iniciando em (0, 0).
.
9.14 Percorrendo uma Matriz Bidimensional 101
.
102 Capítulo 9. Matrizes com NumPy
1. Considere duas matrizes quadradas F [i, j] e G[i, j], onde 6. Calcule o Desvio Absoluto Médio (DAM), de ordem n × n.
i, j ∈ {1, 2, . . . , n}. Crie duas matrizes F e G de ordem n × n, O DAM é definido como a média das diferenças absolutas
preenchidas com números aleatórios gerados por uma distri- entre os elementos da matriz e sua média µ. Esse valor quan-
buição uniforme no intervalo [0, 1). Finalmente, escreva um tifica a dispersão dos dados em relação à média, conforme a
programa em Python para calcular o Erro Médio Abso- Equação 9.9:
luto (EMA) entre essas duas matrizes. O EMA é definido
n n
como a média das diferenças absolutas entre os elementos 1 XX
DAMF = |F [i, j] − µF | (9.8)
correspondentes de F e G, conforme a equação 9.2: n2
i=1 j=1
n n
1 XX n X n
EM A = |F [i, j] − G[i, j]| (9.2) 1 X
n2 DAMG = |G[i, j] − µG | (9.9)
i=1 j=1 n2
i=1 j=1
2. Calcule o Erro Médio Quadrático (EMQ) entre duas matri- Onde µ representa a média dos elementos da matriz.
zes F [i, j] e G[i, j] de ordem n × n. O EMQ é definido como
a média dos quadrados das diferenças entre os elementos 7. Calcule a variância dos elementos das matrizes F e G, am-
correspondentes das duas matrizes. A fórmula matemática bas de ordem n × n. A variância mede a dispersão dos
é apresentada na Equação 9.3: valores em relação à média de cada matriz. As variâncias
n n σF e σG correspondem, respectivamente, às matrizes F e
1 XX 2 G, sendo calculadas pelas Equações 9.10 e 9.11:
EM Q = 2
F [i, j] − G[i, j] (9.3)
n
i=1 j=1 n n
1 XX 2
σF = F [i, j] − µF (9.10)
n2
3. Calcule o Erro Médio Quadrático Normalizado (EMQN) en- i=1 j=1
tre duas matrizes F [i, j] e G[i, j] de ordem n × n. O EMQN n X n
1 X 2
é uma variação do Erro Médio Quadrático (EMQ), em que o σG = G[i, j] − µG (9.11)
n2
resultado é normalizado pelo quadrado dos valores da matriz i=1 j=1
de referência. Ele é calculado conforme a Equação 9.4:
Pn Pn 2
i=1 j=1 F [i, j] − G[i, j] 8. Calcule a covariância entre duas matrizes F e G de ordem
EM QN = (9.4)
Pn Pn
F [i, j]
2 n × n. A covariância σF G mede a relação conjunta entre
i=1 j=1 as variações dos elementos das matrizes F e G em relação
às suas respectivas médias. A fórmula para o cálculo da
4. Calcule o Erro Absoluto Médio Relativo (EMAR) entre duas covariância é dada pela Equação 9.12:
matrizes F [i, j] e G[i, j] de ordem n × n. O EMAR é definido
n n
como a média do valor absoluto do erro relativo entre os 1 XX
σF G = (F [i, j] − µF ) (G[i, j] − µG ) (9.12)
elementos correspondentes das duas matrizes. Sua fórmula n2
está expressa na Equação 9.5: i=1 j=1
n n
1 X X F [i, j] − G[i, j] Onde µF e µG representam as médias das matrizes F e G,
EM AR = (9.5) respectivamente.
n2 F [i, j]
i=1 j=1
9. Calcule o Coeficiente de Correlação entre duas matrizes F e
5. Calcule a média dos elementos das matrizes F e G, ambas de G de ordem n × n. O coeficiente de correlação r quantifica a
ordem n × n. As médias µF e µG correspondem, respectiva- intensidade e a direção da relação linear entre os elementos
mente, à média aritmética dos valores presentes nas matrizes das matrizes F e G. O valor de r varia entre −1 e 1, sendo
F e G. Essas médias são definidas pelas Equações 9.6 e 9.7: calculado conforme a Equação 9.13:
n n
1 XX Pn Pn
µF = F [i, j] (9.6) i=1 j=1 (F [i, j] − µF ) (G[i, j] − µG )
n2 r = qP
i=1 j=1 n Pn 2 Pn Pn 2
n X n i=1 j=1 (F [i, j] − µF ) · i=1 j=1 (G[i, j] − µG )
1 X
µG = G[i, j] (9.7) (9.13)
n2
i=1 j=1
Onde µF e µG representam, respectivamente, as médias das
matrizes F e G.
9.14 Percorrendo uma Matriz Bidimensional 103
1. Calcule o Erro Percentual Médio (EPM) entre duas 5. Implemente uma função que identifique, em uma matriz F
matrizes F [i, j] e G[i, j], de ordem n × n. O EPM é defi- de ordem n × m, o índice da linha ou coluna com a maior
nido como a média dos erros percentuais absolutos entre os variância populacional entre seus elementos. A variância é
elementos correspondentes, conforme a Equação 9.14: uma medida da dispersão dos dados em relação à média,
n n e neste caso deve ser calculada de forma populacional,
100 X X F [i, j] − G[i, j] conforme a equação abaixo:
EP M = (9.14)
n2 F [i, j]
i=1 j=1 N
2 1 X
σ = (xi − µ)2 (9.17)
2. Calcule o Coeficiente de Determinação R2 entre duas N
i=1
matrizes F [i, j] e G[i, j], ambas de ordem n × n. O valor de
R2 mede a proporção da variância em F explicada por G, onde:
conforme a Equação 9.15 • N é o número de elementos na linha ou coluna anali-
Pn Pn !2 sada,
2 i=1 j=1 (F [i, j] − µF )(G[i, j] − µG ) • xi representa cada elemento da linha ou coluna,
R = (9.15)
pP
(F [i, j] − µF )2 · (G[i, j] − µG )2
P • µ é a média aritmética dos elementos da linha ou co-
luna.
3. Um quadrado mágico é uma matriz quadrada formada 6. Considere duas matrizes quadradas F e G de ordem n × n.
de números inteiros onde a soma de qualquer coluna, linha, Calcule o traço (tr(M)) de cada uma dessas matrizes e
diagonal principal ou diagonal secundária é sempre o mesmo retorne qual das duas matrizes possui o maior traço (ou
valor. Escreva uma função em Python que receba uma ma- se são iguais). O traço de uma matriz é definido como a
triz quadrada M e determine se M é ou não um quadrado soma dos elementos da sua diagonal principal, expresso pela
mágico. Equação 9.18:
17 24 1 8 15
n
23 5 7 14 16 X
Traço(F) = F [i, i] (9.18)
4 6 13 20 22
i=1
10 12 19 21 3
11 18 25 2 9
7. Implemente uma função em Python que verifique se uma
matriz quadrada F é simétrica. Uma matriz é dita simétrica
4. Implemente uma função em Python para normalizar os va- quando é igual à sua transposta, ou seja, F = FT . Para isso,
lores de uma matriz F para o intervalo [0, 1], utilizando a sua função deve verificar se, para todo par de índices i e j,
técnica de normalização min-max. A normalização min-max a seguinte igualdade é satisfeita: F [i, j] = F [j, i].
garante que o menor valor da matriz seja transformado em 0
e o maior em 1, com todos os demais valores escalados pro- 8. Escreva uma função em Python que determine se uma ma-
porcionalmente dentro desse intervalo. A fórmula utilizada triz quadrada F é uma matriz estocástica por colunas. Uma
para a normalização de cada elemento F [i, j] está definida matriz F é dita estocástica se satisfaz duas condições fun-
na Equação 9.16: damentais: (i) Todos os seus elementos são não negativos:
F [i, j] − Fmin F [i, j] ≥ 0, e, (ii) A soma dos elementos de cada coluna é
Fnorm [i, j] = (9.16)
Fmax − Fmin igual a 1. Esse tipo de matriz é comumente utilizado para
representar cadeias de Markov, em que cada coluna pode
onde:
ser interpretada como uma distribuição de probabilidade
• Fmin representa o menor valor presente na matriz F; condicional. Exemplo de matriz estocástica válida:
• Fmax representa o maior valor presente na matriz F;
• Fnorm [i, j] é o valor normalizado na posição [i, j] da 0.5
"
0.3 0.2
#
nova matriz. F1 = 0.3 0.4 0.3 (9.19)
0.2 0.3 0.5
104 Capítulo 9. Matrizes com NumPy
1. Considere uma matriz F de dimensão n × n, contendo nú- Python para aplicar um filtro de mediana utilizando uma
meros reais, onde n ≥ 10. Essa matriz pode representar, por janela 3 × 3. Para cada posição válida (i, j), substitua o valor
exemplo, uma imagem, um mapa de calor ou uma superfície de F[i, j] pela mediana dos 9 elementos vizinhos (incluindo
de dados bidimensionais. O objetivo desta tarefa é suavizar o próprio). Retorne uma nova matriz suavizada Fm . A
os valores da matriz por meio de um filtro de média local função [Link]() calcula a mediana de um vetor.
utilizando uma janela deslizante de dimensão 3 × 3. Para
cada posição válida da janela (sem extrapolar os limites da 3. Crie um programa para aplicar um filtro gaussiano sim-
matriz), calcule a média aritmética dos 9 elementos da sub- plificado em uma matriz F com janela 3 × 3. Utilize o
matriz correspondente. Retorne uma nova matriz Fm com seguinte núcleo de pesos:
os valores suavizados. A matriz resultante terá dimensão
1 2 1
" #
(n − 2) × (n − 2), pois o filtro só pode ser aplicado onde a ja- 1
nela 3 × 3 se encaixa completamente. Exemplo: Considere G= 2 4 2
16
a matriz F de dimensão 10 × 10, preenchida com números 1 2 1
inteiros de 1 a 100:
A equação do filtro aplicado em (i, j) expandido na Equa-
1 2 3 4 5 6 7 8 9 10
ção 9.21
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 1
Fm [i, j] = · F [i − 1, j − 1] + 2F [i − 1, j]+
31 32 33 34 35 36 37 38 39 40 16
41 42 43 44 45 46 47 48 49 50 F [i − 1, j + 1] + 2F [i, j − 1]+
F=
51 52 53 54 55 56 57 58 59 60
4F [i, j] + 2F [i, j + 1]+
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
F [i + 1, j − 1] + 2F [i + 1, j]+
81 82 83 84 85 86 87 88 89 90
F [i + 1, j + 1] (9.21)
91 92 93 94 95 96 97 98 99 100
Escreva um programa em Python que aplique um filtro
de média utilizando uma janela de tamanho 3 × 3. Para 4. Escreva um programa em Python que percorra uma matriz
cada posição válida (i, j), com 1 ≤ i ≤ 8 e 1 ≤ j ≤ 8, o valor F e, para cada posição (i, j), calcule a diferença entre
resultante corresponde à média dos 9 elementos vizinhos o elemento central e a média dos vizinhos da janela
ao redor de F[i, j], incluindo o próprio elemento central. A 3 × 3. Armazene o valor absoluto dessa diferença na posição
Equação 9.20 descreve matematicamente o funcionamento correspondente da nova matriz Fd . A equação pode ser
do filtro de média com janela 3 × 3, aplicado à matriz F. expressa pela Equação 9.22.
1 1 1
Fm [i, j] = F [i − 1, j − 1] + F [i − 1, j]+ 1 X X
9 Fd [i, j] = F [i, j] − F [i + u, j + v] (9.22)
9
F [i − 1, j + 1] + F [i, j − 1]+ u=−1 v=−1
F [i, j] + F [i, j + 1]+
F [i + 1, j − 1] + F [i + 1, j]+ 5. Implemente um filtro que, para cada posição (i, j) de uma
F [i + 1, j + 1] (9.20) matriz F, substitua F[i, j] pela média dos elementos
diagonais da sua vizinhança 3 × 3. A equação do filtro é:
1
Fm [i, j] = · F [i − 1, j − 1] + F [i − 1, j + 1]+
2. Considere uma matriz F de dimensão n × n, com n ≥ 10, 4
preenchida com valores reais. Escreva um programa em F [i + 1, j − 1] + F [i + 1, j + 1] (9.23)
10. Gráficos com Python
CotoNet@linux:
python -m pip install matplotlib
[Link]
1 import matplotlib
2
3 meses = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun"]
4 valores = [54, 17, 56, 36, 59, 86]
5 [Link](meses, valores)
6 [Link]()
80
70
60
50
40
30
20
Jan Fev Mar Abr Mai Jun
Figura 10.1: O método plot() é utilizado para criar gráficos de linhas. No gráfico gerado,
os meses são representados na parte horizontal, correspondendo ao eixo X, enquanto os
valores são posicionados na parte vertical, representando o eixo Y .
[Link]
1 import matplotlib
2
3 meses = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun"]
4 valores = [54, 17, 56, 36, 59, 86]
5 [Link]("Faturamento de 2025")
6 [Link]("Meses")
7 [Link]("Faturamento em R$")
8 [Link](meses, valores)
9 [Link]()
Figura 10.2: O método title(), xlabel() e ylabel() tornam o gráfico mais informativo.
108 Capítulo 10. Gráficos com Python
[Link]
1 import [Link] as plt
2
3 x = [10, 20, 30, 40, 50]
4 y = [15, 25, 35, 30, 45]
5 [Link](x, y)
6 [Link]()
Figura 10.4: oi
Cores padrão
Cor Atalho Visualização
Preto "k"
Vermelho "r"
Verde "g"
Azul "b"
Ciano "c"
Magenta "m"
Amarelo "y"
Branco "w"
Laranja "tab:orange"
Cinza "0.5"
Estilos de linha
Visual Código Descrição
"-" Linha contínua
"--" Linha tracejada
":" Linha pontilhada
"-." Linha traço-ponto
" " Sem linha (somente marcador)
Parâmetros de personalização
Parâmetro Tipo Descrição
color ou c str Cor da linha ou pontos
linestyle ou ls str Estilo da linha
linewidth ou lw float Espessura da linha
marker str Tipo de marcador
markersize ou ms float Tamanho do marcador
markeredgecolor str Cor da borda do marcador
markerfacecolor str Cor de preenchimento do marcador
markeredgewidth float Espessura da borda
alpha float Transparência (0–1)
Marcadores (markers)
Símbolo Código Descrição
"o" Círculo preenchido
'x' Cruz diagonal
" Linha vertical
"_" Linha horizontal
"+" Cruz reta
"^" Triângulo para cima
"v" Triângulo para baixo
"o" Círculo vazio (markerfacecolor=’none’)
"s" Quadrado
"D" Losango
112 Capítulo 10. Gráficos com Python
[Link]
1 import [Link] as plt
2
3 # Dados base
4 x = [1, 2, 3, 4, 5]
5 y1 = [2, 3, 5, 7, 11]
6 y2 = [1, 4, 6, 8, 9]
7
8 # 1. Grafico de linha padrao
9 [Link]()
10 [Link](x, y1)
11 [Link]('Plot padrao')
12 [Link](True)
13 [Link]()
14
15 # 2. Linha com cor, estilo e marcador
16 [Link]()
17 [Link](x, y1, color="orange", linestyle="--", marker="o", linewidth=2)
18 [Link]('Cor, estilo e marcador')
19 [Link](True)
20 [Link]()
21
22 # 3. Linha com marcadores personalizados
23 [Link]()
24 [Link](x, y1, marker="s", markersize=10, markerfacecolor="blue", markeredgecolor="black")
25 [Link]('Marcador customizado')
26 [Link](True)
27 [Link]()
28
29 # 4. Grafico de dispersao (scatter) padrao
30 [Link]()
31 [Link](x, y2)
32 [Link]('Scatter padrao')
33 [Link](True)
34 [Link]()
35
36 # 5. Scatter com cores, tamanhos e transparencia
37 [Link]()
38 cores = ['red', 'green', 'blue', 'purple', 'orange']
39 tamanhos = [50, 100, 150, 200, 250]
40 [Link](x, y2, c=cores, s=tamanhos, alpha=0.7, edgecolor='black')
41 [Link]('Scatter colorido e transparente')
42 [Link](True)
43 [Link]()
44
45 # 6. Linha e scatter combinados
46 [Link]()
47 [Link](x, y1, linestyle="-.", color="gray", label="Linha")
48 [Link](x, y1, c='red', s=100, marker='D', label="Pontos")
49 [Link]('Plot + Scatter combinados')
50 [Link]()
51 [Link](True)
52 [Link]()
10.7 Personalização de Gráficos com [Link] 113
(a) Gráfico de linha padrão utilizando (b) Linha com cor laranja, estilo
cor azul e estilo de linha simples. tracejado e marcadores circulares.
(c) Linha com marcadores cor azul, (d) Gráfico de dispersão padrão
quadrado com bordas pretas. com pontos azulados.
(e) Gráfico de dispersão com cores variadas, (f) Linha cinza e pontos vermelhos em
tamanhos diferentes e transparência. formato de losango, com legenda.
[Link]
1 import numpy as np
2 import [Link] as plt
3 from [Link] import jn # Funcoes de Bessel
4
5 # Dados
6 x = [Link](0, 20, 500)
7 ordens = [0, 1, 2, 3, 4]
8 cores = ['navy', 'teal', 'orange', 'red', 'purple']
9
10 # Figura
11 [Link](figsize=(10, 8))
12
13 # Plot das Funcoes de Bessel de ordens 0 a 4
14 for n, cor in zip(ordens, cores):
15 y = jn(n, x)
16 [Link](x, y, label=rf"$J_{{{n}}}$", color=cor)
17
18 # Destaque para x = 4.9
19 x0 = 4.9
20 [Link](x0, color='gray', linestyle='--', linewidth=1)
21 [Link](x0, 0, marker=(4, 2, 0), color='black', markersize=10)
22 [Link](x0, -0.1, "4.9", fontsize=10,
23 bbox=dict(boxstyle="round,pad=0.3", facecolor='lightgray', edgecolor='black'))
24
25 # Anota valores especificos para cada curva em x = 4.9
26 for n, cor in zip(ordens, cores):
27 y_val = jn(n, x0)
28 [Link](x0, y_val, 'o', color=cor)
29 [Link](x0, y_val, f"{y_val:.5f}", color='white' if n in [0, 3, 4] else 'black',
30 fontsize=9, ha='center', va='center',
31 bbox=dict(boxstyle="round,pad=0.3", fc=cor, ec='black', lw=1))
32 [Link](x0 + 0.3, y_val, rf"${{J_{{{n}}}}}$", fontsize=11, va='center', color=cor)
33
34 # Rotulos dos eixos
35 [Link](r"$X$", fontsize=14)
36 [Link](r"$J_{\nu}(X)$", fontsize=14)
37
38 # Equacao diferencial no rodape
39 eq = r"$x^2 \frac{d^2y}{dx^2} + x \frac{dy}{dx} + (x^2 - \alpha^2)y = 0$"
40 [Link](10, -0.6, eq, fontsize=16, ha='center')
41
42 # Legenda
43 [Link](title="Funcoes de Bessel", fontsize=11, title_fontsize=12)
44
45 # Grade e layout
46 [Link](True)
47 plt.tight_layout()
48
49 [Link]()
116 Capítulo 10. Gráficos com Python
As Tabelas 10.2, 10.3 e 10.4 apresentam uma lista de símbolos especiais suportados.
Comando Comando Comando Comando
\alpha α \upsilon υ \supset ⊃ \lceil ⌈
\angle \phi \int \cdot
R
∠ ϕ ·
\ast ∗ \chi χ \rfloor ⌋ \neg ¬
\beta β \psi ψ \lfloor ⌊ \times ×
√
\gamma γ \omega ω \perp ⊥ \surd
\delta δ \heartsuit ♡ \wedge ∧ \varpi ϖ
\epsilon ϵ \zeta ζ \rceil ⌉ \rangle ⟩
\Gamma Γ \Theta Θ \vee ∨ \langle ⟨
\eta η \Lambda Λ \sim ∼ \leq ≤
\theta θ \Xi Ξ \copyright © \leq ≤
\vartheta ϑ \Pi Π \mid | \infty ∞
\iota ι \Sigma Σ \0 ∅ \clubsuit ♣
\kappa κ \Upsilon Υ \prime ′ \diamondsuit ♢
\lambda λ \Phi Φ \ldots ... \Delta ∆
\mu µ \Psi Ψ \nabla ∇ \spadesuit ♠
\nu ν \Omega Ω \o ø \leftrightarrow ↔
\xi ξ \forall ∀ \subset ⊂ \leftarrow ←
\pi π \exists ∃ \supseteq ⊇ \Leftarrow ⇐
\rho ρ \ni ∋ \oslash ⊘ \uparrow ↑
\sigma σ \cong ∼
= \wp ℘ \rightarrow →
\varsigma ς \approx ≈ \aleph ℵ \Rightarrow ⇒
\tau τ \Re ℜ \neq ̸ = \downarrow ↓
\equiv ≡ \oplus ⊕ \div ÷ \circ ◦
\Im ℑ \cup ∪ \bullet • \pm ±
\otimes ⊗ \subseteq ⊆ \bullet • \geq ≥
\cap ∩ \in ∈ \partial ∂ \propto ∝
\imath ı \ell ℓ \Re ℜ \Im ℑ
\aleph ℵ \wp ℘ \forall ∀ \exists ∃
\mho ℧ \partial ∂ \prime ′ \emptyset ∅
\nabla ∇ \infty ∞ \triangle △ \Box □
\Diamond ♢
√ \bot ⊥ \top ⊤ \angle ∠
\surd \heartsuit ♡ \clubsuit ♣ \diamondsuit ♢
\spadesuit ♠ \lnot ¬ \flat ♭ \natural ♮
.. ..
\dots ... \cdots ··· \vdots . \ddots .
[Link]
1 import [Link] as plt
2 import numpy as np
3
4 fig = [Link]()
5 ax = [Link](projection="3d")
6 [Link]()
[Link]
1 import [Link] as plt
2 import numpy as np
3
4 fig = [Link]()
5 ax = [Link](projection="3d")
6
7 vetor_x = [Link](0,25,100)
8 vetor_y = [Link](vetor_x)
9 vetor_z = [Link](vetor_x)
10
11 ax.plot3D(vetor_x, vetor_y, vetor_z, color = "g", label="Curva")
12 [Link]()
13 [Link]()
1 2 3 4 Vetor de Entrada X
5
Vetor de Entrada Y
5 5 5 5 1 2 3 4
6 6 6 6 1 2 3 4
7 7 7 7 1 2 3 4
8 8 8 8 1 2 3 4
Figura 10.8: Geração das matrizes X e Y com a função [Link](), a partir de vetores
unidimensionais de entrada. A matriz X contém, em cada linha, cópias do vetor de entrada
x, enquanto a matriz Y contém, em cada coluna, cópias do vetor de entrada y. Essas
matrizes representam a malha de coordenadas no plano XY .
122 Capítulo 10. Gráficos com Python
[Link]
1 import [Link] as plt
2 import numpy as np
3
4 fig = [Link]()
5 ax = [Link](projection="3d")
6
7 # Make data.
8 vetor_X = [Link](-5, 5, 0.25)
9 vetor_Y = [Link](-5, 5, 0.25)
10 [matriz_X, matriz_Y] = [Link](vetor_X, vetor_Y)
11 R = [Link](matriz_X**2 + matriz_Y**2)
12 matriz_Z = [Link](R)
13 ax.plot_surface(matriz_X, matriz_Y, matriz_Z, cmap="jet")
14
15 [Link]()
p
Figura 10.9: Gráfico de superfície da função z = sin x2 + y 2 ,
gerado pela função plot_surface() e mapa de cores "jet".
.
124 Capítulo 10. Gráficos com Python
1. Curvas helicoidais e espirais aparecem com frequência em 3. Construa um gráfico de superfície para a função:
aplicações de engenharia, física e visualização científica. Um
z = sin(x2 + y 2 )
exemplo clássico é a trajetória de partículas carregadas em
campos magnéticos. Implemente um programa em Python Utilize a função [Link]() e a função plot_surface()
que simule a trajetória de uma espiral tridimensional descrita para gerar a visualização.
pelas equações paramétricas 10.1:
4. A equação de uma hélice é dada por:
x(t) = t cos(t), y(t) = t sin(t), z(t) = t (10.1)
x(t) = r cos(t)
O programa deve solicitar ao usuário: (i) o valor inicial de
y(t) = r sin(t)
t; (ii) o valor final de t; e (iii) o número de pontos a serem
usados na simulação. Por fim, plote a trajetória da partícula z(t) = at
em um gráfico tridimensional conectando os pontos com
Com r e a fornecidos pelo usuário, plote uma hélice 3D
uma linha contínua.
usando ‘matplotlib‘.
2. Dada a função:
5. A equação de uma espiral logarítmica é dada por:
x = sin(t), y = cos(2t), z = sin(3t)
x(t) = eat cos(t)
Crie um programa que plote a curva em 3D no intervalo de
y(t) = eat sin(t)
tempo informado pelo usuário.
Com a fornecido pelo usuário, plote a espiral.
10.12 Plotagem de Superfície 3D 125
1. A posição de uma partícula em movimento em função do 9. Simule a propagação de uma onda bidimensional estacioná-
tempo é dada pela Equação 10.2. Crie um programa capaz ria:
de calcular a posição da partícula para um dado intervalo
de tempo t. O programa deve solicitar ao usuário (usando o z(x, y, t) = sin(x) cos(y) cos(t)
comando input) o intervalo de tempo e o tamanho do vetor.
Faça o gráfico de Dispersão 3D e o seu Traçando de Linha. Permita que o usuário selecione um valor de t e gere a
Em seguida, o programa deve calcular os vetores x, y e z superfície correspondente.
usando a Equação 10.2:
10. Gere a superfície de uma função onda modulada:
x = (4 − 0.1t)sen(0.8t) 2
+y 2 )
y = (4 − 0.1t)cos(0.8t) z(x, y) = e−0.1(x sin(5x) cos(5y)
3/2
z = 0.4t (10.2) Faça o gráfico 3D para x, y ∈ [−4, 4] com boa resolução de
pontos.
2. Faça um gráfico de superfície de z = sin(x) ∗ sin(y), com
x, y ∈ [−2, 2]. 11. Calcule a matriz de diferença absoluta entre duas matrizes
F e G de ordem n × n, e utilize essa matriz para gerar
3. Faça um gráfico de superfície de z = sin(x + sin(y)), com uma visualização gráfica dos erros por meio de um heatmap
x, y ∈ [−10, 10]. (mapa de calor). A matriz de diferença absoluta D[i, j] é
obtida conforme a Equação 10.3:
4. Faça um gráfico de superfície de z = (x2 ∗ y)/(x2 + y 2 ).
D[i, j] = |F [i, j] − G[i, j]| (10.3)
5. Considere uma matriz de altura H(x, y) = sin(x) sin(y) em
uma malha 2D. Gere o gráfico de contorno (níveis de alti- Após o cálculo da matriz D, utilize o seguinte comando para
tude) com rótulos de nível usando contourf e clabel. criar um mapa de calor: [Link](D, cmap="viridis")
e [Link](label="Intensidade").
6. Modele a dissipação de calor radial com:
2
+y 2 )
12. Em um universo paralelo bidimensional, considere a tra-
T (x, y) = T0 e−α(x jetória aleatória de um bêbado saindo do bar Cantinho
Peça ao usuário T0 e α e gere um gráfico com imshow e Universitário em direção à sua casa. A localização da casa
colorbar. será representada pelas coordenadas cartesianas de um re-
tângulo, informadas pelo usuário. O deslocamento aleatório
7. Plote a função: do bêbado a cada passo é descrito pela seguinte equação:
p
sin( x2 + y 2 ) xt+1 = xt + sx
f (x, y) = p
x2 + y 2 yt+1 = yt + sy
Utilize uma visualização 3D com plot_surface.
onde sx e sy são números aleatórios tais que −1 ≤ sx , sy ≤ 1.
Além disso, o usuário deve informar um segundo parâmetro:
8. Construa a trajetória de uma partícula sujeita a força cen-
o número máximo de passos que o bêbado pode realizar
trípeta:
antes de desmaiar e dormir na rua. Escreva um programa
x(t) = R cos(ωt) que simule esse processo e, ao final, informe se o bêbado
y(t) = R sin(ωt) conseguiu chegar em casa. Para representar graficamente a
z(t) = ht trajetória, produza dois gráficos:
21.
II
Parte Dois: Cálculo Numérico
11.1 Fundamentos
Arredondamentos e erros são aspectos inevitáveis e, ao mesmo tempo, essenciais na compu-
tação numérica. Infelizmente, nem todos os números podem ser representados de forma
exata pelos computadores, o que dá origem aos chamados erros de arredondamento. A
resolução de problemas numéricos com o uso de computadores está naturalmente sujeita a
esse tipo de erro.
Esses erros podem surgir de diferentes formas, como resultado de limitações na represen-
tação binária de números decimais, truncamentos, ou da própria forma como as operações
aritméticas são realizadas. Para compreender adequadamente os efeitos e a propagação
desses erros, é necessário estudar algumas definições fundamentais, tais como:
Para que um número possa ser representado na memória do computador, ele deve ser
convertido para a base binária, uma vez que os sistemas digitais operam com bits, que
assumem apenas os valores 0 e 1. No entanto, nem todos os números decimais possuem
uma representação binária exata e finita. Isso ocorre porque o sistema binário é baseado
em potências de dois, enquanto muitos números decimais requerem frações que não podem
ser expressas com precisão nesse formato.
Por exemplo, valores aparentemente simples como 0.1 ou 0.3 resultam em representações
binárias infinitas e periódicas, de maneira análoga a como a fração 1/3 corresponde a
0.33333 . . . no sistema decimal. Como os computadores utilizam um número limitado de bits
para armazenar essas representações, é necessário realizar um corte ou um arredondamento,
o que inevitavelmente introduz pequenas imprecisões. Essas aproximações são conhecidas
como erros de arredondamento. Por exemplo. A representação binários do número
decimal 0.1 será:
0.110 = 0.0001100110011001100 . . .2 (11.1)
Sendo 0.0001100110011001100 com uma dízima periódica 0011 que se repete infini-
tamente. Portanto, por conta da dízima periódica, o valor não pode ser representado
precisamente (não existe memória infinita para representar uma dízima que se repete
infinitamente). Assim, quando convertemos 0.00011001100110011012 novamente para a
base 10, temos:
0.00011001100110011012 ≈ 0.1000000000000000210 (11.2)
Ou seja, um erro da ordem de 0.00000000000000002 (2 × 10−17 ) foi introduzido. Esse
fenômeno é inerente à aritmética de ponto flutuante e pode se acumular em operações
sucessivas. Por isso, deve-se evitar comparar diretamente dois números float quanto à
igualdade, pois o resultado pode ser logicamente incorreto, mesmo que os valores aparentem
ser iguais. Para ilustrar esse comportamento, observe o seguinte programa:
[Link]
1 x = 1.2 - 1.0
2 print(x)
CotoNet@linux:
0.19999999999999996
• 1 bit de sinal (s): indica o sinal do número (0 para positivo, 1 para negativo);
• 11 bits de expoente (c): codifica o expoente com um viés (bias);
• 52 bits de fração (f ): representa a mantissa, ou parte fracionária da significando.
A representação de números reais no formato de ponto flutuante de 64 bits (precisão
dupla) permite armazenar uma ampla faixa de valores, aproximadamente entre:
[Link]
1 x = 1e308 # Um numero muitoooo grande!!
2 print("x =", x)
3
4 y = x * 2 # Multiplicando *2 para tentar causar o overflow
5 print("y =", y)
CotoNet@linux:
x = 1e+308
y = inf
Neste exemplo, a variável x é inicializada com o valor 1 × 10308 , que está próximo
do limite superior de representação para um número de ponto flutuante de 64 bits. Ao
multiplicar x por 10, o resultado esperado matematicamente seria 1 × 10309 . No entanto,
esse valor excede o maior número representável no formato float64 (double), e o Python,
ao seguir o padrão IEEE 754, representa o resultado como inf (infinito). Assim, a linha
print("y =", y) exibirá: y = inf.
[Link]
1 from mpmath import mp
2
3 # Definindo a precisao para 128 bits (34 digitos decimais)
4 [Link] = 34 # dps = decimal places
5
6 # Criando numeros de alta precisao
7 a = [Link]("1.2345678901234567890123456789012345")
8 b = [Link]("9.8765432109876543210987654321098765")
9
10 # Operacoes matematicas
11 soma = a + b
12 produto = a * b
13 raiz = [Link](a)
14
15 # Exibindo resultados
16 print(f"a = {a}")
17 print(f"b = {b}")
18 print(f"Soma = {soma}")
19 print(f"Produto = {produto}")
20 print(f"Raiz = {raiz}")
CotoNet@linux:
a = 1.234567890123456789012345678901235
b = 9.876543210987654321098765432109877
Soma = 11.11111110111111111011111111101111
Produto = 12.19326311370217952261850327338668
Raiz = 1.111111106111111099361111058186111
[Link]
1 def trunca_float(x,k):
2 sp = str(x).split(".")
3 return float(sp[0] + "." + (sp[1][:k]))
desejada (ou seja, o dn+1 ) determina se o último dígito mantido dn permanece o mesmo
ou é incrementado em uma unidade. Se dn+1 estiver entre 0 e 4, mantemos dn inalterado;
caso dn+1 esteja entre 5 e 9, adicionamos uma unidade a dn .Resumidamente, para se obter
uma aproximação com n algarismos, aplicamos a seguinte regra:
dn se 0 ≤ dn+1 ≤ 4
dn = (11.4)
dn + 1 se 5 ≤ dn+1 ≤ 9
[Link]
1 a = 3.145623
2 print(round(a,2))
3 print(round(a,3))
|x − x̄| EA(x)
ER(x) = = (11.6)
|x| |x|
O erro relativo, por ser uma razão entre o erro absoluto e o valor real, é uma medida
adimensional. Ele fornece uma noção da magnitude do erro em relação ao tamanho do
valor verdadeiro, sendo, portanto, uma métrica proporcional que facilita a comparação de
erros em diferentes escalas.
134 Capítulo 11. Erros Numéricos
Exemplo: 1
Seja x = 0.666888, Defina: (i) x̄1 : o valor obtido ao truncar x com 3 casas decimais e (ii) x̄2 : o
valor obtido ao arredondar x com 3 casas decimais. Calcule o erro relativo de x̄1 e x̄2 em relação
ao valor original x. Qual o arredondamento aproxima melhor o valor de x ?
Solução:
|x − x¯1 | 0.666888 − 0.666
ER(x̄1 ) = = = 0.0013315579227696 (11.7)
|x| 0.666888
r q
n−1/2
z2 = 2, zn+1 = 2 1− 1 − (41−n · zn2 ), n = 2, 3, . . . (11.9)
Essa sequência converge para π quando n tende ao infinito. Apesar de sua eficiência
teórica, a implementação numérica dessa sequência em computadores apresenta desafios
significativos de estabilidade numérica.
Vamos definir α = (41−n · zn2 ). Assim, podemos reescrever zn+1 como:
q √
zn+1 = 2n−1/2 1 − 1 − α
A instabilidade principal ocorre devido à presença de expressões do tipo 1 − α. À
medida que n aumenta, o α tende rapidamente a zero, o que faz com que o argumento da
11.7 A Importância de Considerar Erros Numéricos 135
[Link]
1 import math
2
3 max_int = 30
4 z = 2.0
5 alpha=1
6 for n in range(2, max_int):
7 erro_rel = abs([Link])/([Link])
8 print("n: %2.d, alpha: %.14f, z: %.8f, erro: %.14f" %(n,(alpha),z,erro_rel))
9 fator = 2.0**(n - 0.5)
10 alpha = 4.0**(1-n)*(z**2)
11 raiz = [Link](1.0-alpha)
12 z = fator * [Link](1.0-raiz)
CotoNet@linux:
n: 2, alpha: 1.00000000000000, z: 2.00000000, erro: 0.36338022763242
n: 3, alpha: 1.00000000000000, z: 2.82842712, erro: 0.09968368384289
n: 4, alpha: 0.50000000000000, z: 3.06146746, erro: 0.02550464159557
n: 5, alpha: 0.14644660940673, z: 3.12144515, erro: 0.00641314885579
n: 6, alpha: 0.03806023374436, z: 3.13654849, erro: 0.00160560696438
n: 7, alpha: 0.00960735979838, z: 3.14033116, erro: 0.00040154685033
n: 8, alpha: 0.00240763666390, z: 3.14127725, erro: 0.00010039578386
...
n: 23, alpha: 0.00000000000224, z: 3.14167427, erro: 0.00002597772562
n: 24, alpha: 0.00000000000056, z: 3.14182968, erro: 0.00007544845101
n: 25, alpha: 0.00000000000014, z: 3.14245127, erro: 0.00027330688572
n: 26, alpha: 0.00000000000004, z: 3.14245127, erro: 0.00027330688572
n: 27, alpha: 0.00000000000001, z: 3.16227766, erro: 0.00658424208974
n: 28, alpha: 0.00000000000000, z: 3.16227766, erro: 0.00658424208974
n: 29, alpha: 0.00000000000000, z: 3.46410162, erro: 0.10265779084358
136 Capítulo 11. Erros Numéricos
100
10−2
10−4
Erro
10−6
10−8
Erro Absoluto
Erro Relativo
10−10
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32
n
11.7 A Importância de Considerar Erros Numéricos 137
Laboratório Computacional: 1
O Sistema de Lorenz e o Caos Numérico
Em 1961, o meteorologista Edward Lorenz estava simulando modelos climáticos em
um computador Royal McBee LGP-30 quando, ao tentar repetir uma simulação para
economizar tempo, decidiu inserir os dados de uma execução anterior como condição
inicial; embora o computador processasse internamente os dados com 6 casas decimais
(0.506127), a impressão que Lorenz tinha em mãos exibia apenas 3 casas (0.506). Ao
assumir que essa diferença de menos de 0.1% seria irrelevante e retornar de uma pausa
para o café, Lorenz percebeu que as duas previsões haviam divergido drasticamente,
uma indicando tempo firme e a outra uma tempestade severa, demonstrando que,
em sistemas não lineares, pequenos erros de arredondamento ou truncamento não
permanecem pequenos, mas crescem exponencialmente, dando origem ao que hoje
conhecemos como Teoria do Caos.
O Sistema de Lorenz é um modelo matemático composto por três equações diferenciais
ordinárias (EDOs) não lineares e acopladas, proposto em 1963 para descrever de forma
simplificada a convecção atmosférica. Este sistema é o paradigma fundamental da
Teoria do Caos, demonstrando como leis determinísticas podem gerar comportamentos
imprevisíveis. O modelo descreve a evolução temporal de três variáveis (x, y, z):
dx dy dz
= σ(y − x), = x(ρ − z) − y, = xy − βz
dt dt dt
A propriedade mais notável deste sistema é a sua dependência sensível às condições iniciais. Incertezas infinitesimais,
como erros de arredondamento inerentes à representação de ponto flutuante (10−16 ) ou pequenas variações nos dados de
entrada, são amplificadas exponencialmente ao longo do tempo. Para ilustrar, considere duas simulações idênticas diferenciadas
apenas por um erro de 0.0001 em uma das variáveis. Embora as trajetórias permaneçam próximas por um curto intervalo, elas
divergem de forma irremediável após um tempo crítico. O sistema de Lorenz serve como um lembrete de que o determinismo
das equações não garante a previsibilidade do resultado computacional. O sistema é determinístico (as equações definem
exatamente o próximo passo), mas é imprevisível a longo prazo, pois precisaríamos de precisão infinita nas condições iniciais
para eliminar o erro.
Laboratório Computacional
Como o Sistema de Lorenz é dinâmico, o estado das variáveis (x, y, z) muda continuamente. Para simular esse comportamento
no computador, dividimos o tempo em pequenos intervalos ∆t = 0.01.
A partir de um ponto conhecido (xn , yn , zn ) no instante n, os valores no próximo instante n + 1 são calculados somando-se a
variação acumulada naquele pequeno intervalo. Utilize as seguintes equações de atualização:
Crie uma função em Python capaz de simular o sistema por 5000 iterações. Considere os parâmetros constantes: σ = 10,
ρ = 28 e β = 8/3. Em seguida, realize duas simulações numéricas distintas, A e B, que utilizam os mesmos parâmetros de
Lorenz, mas partem de condições iniciais ligeiramente diferentes:
• Configuração A (Referência): P0 ′= (1.0, 1.0, 1.0)
• Configuração B (Perturbada): P0 = (1.0 + ϵ, 1.0, 1.0), com ϵ = 10−3
Com base nas duas trajetórias A e B, calcule a distância euclidiana entre as trajetórias em cada instante t usando a equação:
p
E(t) = (xA − xB )2 + (yA − yB )2 + (zA − zB )2
1. Escreva um programa para calcular uma aproximação do 6. A função cosseno hiperbólico pode ser calculada por meio
valor de π utilizando a seguinte série infinita, representada de sua expansão em série infinita, conforme representado
na Equação 11.10. O programa deve solicitar ao usuário o na Equação 11.15. Desenvolva um programa que solicite ao
número de iterações desejadas. Para cada iteração, calcule usuário o número de iterações desejado. Para cada iteração,
o erro relativo em relação ao valor real de π. Ao final, gere calcule o erro relativo em relação ao valor real de cosh(x).
um gráfico ilustrando a evolução do erro relativo ao longo Ao final, gere um gráfico que mostre a evolução do erro
das iterações. relativo ao longo das iterações.
∞ ∞
Y (2n)2 x2n
π=2 (11.10)
X
cosh(x) = (11.15)
(2n − 1)(2n + 1) (2n)!
n=1 n=0
2. A expansão em série de Taylor da função f (x) = ex é repre- 7. A série BBP (Bailey–Borwein–Plouffe) é uma fórmula para
sentada pela Equação 11.11. Desenvolva um programa em calcular π diretamente em base hexadecimal (base 16), apre-
Python para calcular a aproximação de ex com base nessa sentada na Equação 11.16. Desenvolva um programa que
série, interrompendo as iterações quando for atingido um utilize essa série para calcular uma aproximação de π, utili-
erro absoluto mínimo pré-definido. Para melhor visualização zando um número de iterações fornecido pelo usuário. Em
do desempenho da aproximação, gere um gráfico que mostre cada iteração, calcule o erro relativo e, ao final, gere um grá-
a evolução do erro absoluto a cada iteração. fico que mostre a evolução desse erro ao longo das iterações.
∞
X xn ∞
ex = (11.11) X 1
4 2 1 1
n! π= − − − (11.16)
n=0 16n 8n + 1 8n + 4 8n + 5 8n + 6
n=0
3. A função seno pode ser aproximada por meio de sua expan-
são em série de Taylor, conforme mostrado na Equação 11.12. 8. A série infinita apresentada na Equação 11.17 converge para
4
Desenvolva um programa em Python para calcular essa apro- o valor λ = π90 quando n → ∞. Escreva um programa em
ximação até que um erro absoluto mínimo seja atingido. O Python para calcular a aproximação de f (n) com base em
programa deve solicitar ao usuário o valor de x e o erro um número de iterações fornecido pelo usuário. Para cada
absoluto mínimo desejado. Ao final, gere um gráfico que iteração, calcule o erro relativo em relação ao valor exato de
mostre a evolução do erro relativo ao longo das iterações. λ. Ao final, gere um gráfico que mostre a evolução do erro
∞ relativo ao longo das iterações.
X (−1)n x2n+1
sen(x) = (11.12) ∞
(2n + 1)! X 1
n=0 f (n) = (11.17)
n4
n=1
4. A função cosseno pode ser aproximada por meio de sua
expansão em série de Taylor, conforme expressa na Equa-
9. Escreva um programa em Python para estimar o valor de
ção 11.13. Desenvolva um programa em Python para calcu-
π utilizando o método de Monte Carlo, seguindo os passos
lar essa aproximação até que um erro absoluto mínimo seja
descritos abaixo:
atingido. O programa deve solicitar ao usuário o valor de
x e o valor desejado para o erro absoluto mínimo. Ao final, • O programa deve solicitar o número de pontos n a
serem gerados.
gere um gráfico que mostre a evolução do erro relativo ao
longo das iterações. • Utilize a função rand() para gerar n pares de pon-
tos aleatórios {xk , yk }, com k = 1, . . . , n, onde xk e yk
∞
X (−1)n x2n pertencem ao intervalo [0, 1].
cos(x) = (11.13) • Para cada par, calcule zk = x2k + yk2 .
(2n)!
n=0 • Conte o número de pontos m que satisfazem a condição
zk ≤ 1, ou seja, que estão dentro do quarto de círculo
5. Escreva um programa para calcular a função seno hiperbó- de raio 1.
lico, cuja expressão pode ser representada pela série infinita
mostrada na Equação 11.14. O programa deve solicitar ao
• Estime o valor de π usando a fórmula:
usuário o número de iterações desejado. Para cada iteração, 4m
πn =
calcule o erro relativo em relação ao valor real de sinh(x). n
Ao final, gere um gráfico que ilustre a evolução do erro
Ao final, o programa deve exibir na tela: (i) O número
relativo ao longo das iterações.
total de pontos gerados n; (ii) O número de pontos m que
∞
X x2n+1 satisfazem zk ≤ 1; (iii) O valor estimado de π com base
sinh(x) = (11.14) no método e (iv) Faça um gráfico de dispersão, no qual os
(2n + 1)!
n=0 pontos que satisfazem zk ≤ 1 devem ser plotados em azul, e
os que não satisfazem essa condição, em vermelho
11.7 A Importância de Considerar Erros Numéricos 139
1. A constante de Euler-Mascheroni, denotada por γ, aparece 6. A função ln(1 + x) pode ser aproximada pela série de Taylor
em diversas áreas da matemática, como análise e teoria dos apresentada na Equação 11.23. Desenvolva um programa
números. Seu valor aproximado é γ ≈ 0.577215664901532 e para calcular essa aproximação, solicitando ao usuário o
pode ser aproximada pela série na Equação 11.18. Escreva valor de x (para |x| < 1) e o erro relativo mínimo desejado.
um programa em Python que calcule essa aproximação para Interrompa as iterações quando o erro for atingido e gere
um número de iterações informado pelo usuário. Calcule um gráfico ilustrando a evolução do erro relativo a cada
o erro relativo em cada passo e, ao final, exiba um gráfico iteração.
com a evolução desse erro.
∞
∞ X (−1)n+1 xn
X ln(n)
n ln(1 + x) = (11.23)
γ= (−1) (11.18) n
n n=1
n=2
√
2. A série de Taylor (ou Maclaurin) para ln(1 + x), válida para 7. A aproximação de x pode ser feita usando a expansão em
|x| < 1, é apresentada na Equação 11.19. Escreva um pro- série de Taylor em torno de a = 1, dada na Equação 11.24.
√
grama em Python que utilize essa série para aproximar o Implemente um programa que calcule x para um x pró-
valor de ln(1 + x) para um dado valor de x, calculando o ximo de 1, utilizando um número de iterações fornecido
erro absoluto em cada iteração e exibindo esses erros em um pelo usuário. Calcule e gere um gráfico do erro relativo em
√
gráfico. relação ao valor real de x ao longo das iterações.
∞
xn ∞
X
(−1)n+1 X 1/2
ln(1 + x) = (11.19) √
n x= (x − 1)n (11.24)
n=1 n
n=0
P∞
1. O inverso do fatorial, e = n=0 n! 1
, é a série que define a 7. A série de Maclaurin para a função erro erf(x) é apresentada
constante de Euler. Escreva um programa para calcular na Equação 11.33. Desenvolva um programa para calcular a
uma aproximação de e, solicitando o erro absoluto mínimo aproximação de erf(x), solicitando x e o número de termos
desejado. O programa deve parar quando o erro for atin- N . Para cada iteração, calcule o erro relativo. Ao final,
gido. Calcule e visualize (em um gráfico) a evolução do erro plote o gráfico da evolução do erro relativo ao longo das
absoluto a cada iteração. iterações.
∞ ∞
X 1 2 X (−1)n x2n+1
e= (11.28) erf(x) = √ (11.33)
n! π n!(2n + 1)
n=0 n=0
√ P∞ xn
2. A série de Taylor para cosh( x) é dada por n=0 (2n)! . 8. A
√ expansão binomial de (1 + x)α para α = 1/3 (cálculo de
Desenvolva um programa que calcule a aproximação, solici- 3
1 + x) é dada√pela Equação 11.34. Escreva um programa
tando o valor de x e o número de termos N . Calcule o erro para calcular 3 1 + x para x próximo de 0, solicitando x e
relativo para cada iteração e gere um gráfico que mostre a o número de iterações N . Calcule o erro absoluto em cada
evolução do erro. iteração e gere um gráfico da evolução do erro absoluto.
X xn∞ ∞
√ 1/3
cosh( x) = (11.29)
X
(1 + x) 1/3
= xn (11.34)
(2n)! n
n=0 n=0
5. Implemente o método de Monte Carlo para calcular a área 11. Implemente a Quadratura de Gauss-Legendre de N pontos
sob a curva f (x) = sin(x) no intervalo [0, π]. O programa 2
para calcular a integral de f (x) = e−x no intervalo [−1, 1].
deve solicitar o número de pontos N . Estime a integral e
O programa deve solicitar N e exibir a aproximação. Cal-
calcule o erro relativo em relação ao valor exato da integral
Rπ cule o erro relativo para N = 2, 3, 4, 5 em relação ao valor
( 0 sin(x)dx = 2). Ao final, gere um gráfico da evolução do
exato (≈ 1.4936482656). Gere um gráfico do erro relativo
erro relativo à medida que o número de pontos aumenta.
em função do número de pontos N .
6. A série de Madhava-Leibniz para √ π
é dada pela Equa-
4 3 12. A expansão em série de Taylor de √1−x1
é dada pela Equa-
ção 11.32. Escreva um programa que calcule uma aproxima-
ção 11.37. Desenvolva um programa para calcular essa
ção de π com N termos (fornecido pelo usuário). Calcule e
aproximação, solicitando x (|x| < 1) e um erro relativo mí-
gere um gráfico que mostre a evolução do erro relativo em
nimo ϵ. O programa deve parar quando o erro for atingido
relação ao valor real de π a cada iteração.
e gerar um gráfico da evolução do erro relativo ao longo das
∞
π 1 1 1 X (−1)n iterações.
√ = 1− + − +··· = (11.32)
4 3 3·3 5·32 7·3 3 (2n + 1)3n ∞
X (2n)! n
n=0 1
√ = x (11.37)
1−x 4n (n!)2
n=0
12. Raizes de uma Função
12.1 Fundamentos
As equações é a parte central da modelagem matemática. Resolver equações é uma tarefa
fundamental, pois elas representam relações entre variáveis que descrevem fenômenos físicos,
químicos, biológicos, econômicos ou computacionais. Muitas vezes, compreender e resolver
uma equação significa entender o próprio problema que se está tentando modelar.
Uma equação de uma única variável, também chamada de equação escalar, pode ser
expressa genericamente na forma:
f (x) = 0
onde f (x) é uma função real (ou, em alguns casos, complexa) definida em um domínio de
interesse. Resolver a equação consiste em encontrar todos os valores de x que tornam f (x)
igual a zero.
A solução dessa equação, denominada raiz da função, é um um número (ou um
conjunto de números) que satisfaz à igualdade. Mais formalmente, um número x∗ é dito
uma raiz de f (x) se f (x∗ ) = 0. Dependendo da natureza de f (x), uma equação pode:
• Não tem uma solução real. Exemplo: x2 + 1 = 0, raiz: x = ±i.
• Tem uma única solução. Exemplo: 2x − 4 = 0, raiz: x = 2.
• Tem múltiplas soluções distintas. Exemplo: x2 − 1 = 0, raiz: x = ±1.
• Tem infinitas soluções. Exemplo: sin(x), raiz: x = . . . , −2π, −π, 0, π, 2π, . . ..
Quando a equação é relativamente simples, o valor de x pode ser determinado analiti-
camente. Isso ocorre quando se consegue isolar x explicitamente por meio de operações
matemáticas elementares, ou quando é possível aplicar uma fórmula conhecida, como a
fórmula de Bhaskara (Equação 12.1), para determinar exatamente as raízes de uma
equação do segundo grau. O método analítico é bastante eficiente para funções polinomiais
de grau baixo.
√
−b ± b2 − 4ac
x= (12.1)
2a
142 Capítulo 12. Raizes de uma Função
Embora a fórmula de Bhaskara seja bastante prática para encontrar as raízes de equações
quadráticas, existem muitas funções para as quais as raízes não podem ser determinadas tão
facilmente. À medida que a complexidade da função aumenta, por exemplo, em polinômios
de grau maior que quatro, ou em funções transcendentes como exponenciais, logaritmos,
trigonométricas ou combinações destas, pode não existir uma expressão analítica fechada
para as soluções.
Na verdade, em muitas situações é impossível determinar analiticamente as
raízes de uma equação. Por exemplo, mesmo uma função aparentemente simples como
f (x) = e−x − x não pode ser resolvida de forma exata por métodos analíticos, pois não há
uma fórmula conhecida que permita isolar x nessa equação.
Em casos como esse, a única alternativa é recorrer a métodos numéricos aproxi-
mados para obter soluções com a precisão desejada. Esses métodos iterativos permitem
encontrar aproximações sucessivas para as raízes, dentro de uma tolerância preestabelecida,
e são amplamente utilizados na prática para resolver problemas reais na ciência e na
engenharia.
Os métodos numéricos podem ser classificados em dois grupos: (i) métodos interva-
lares e (ii) métodos abertos. Cada um desses grupos apresenta características distintas
quanto à forma de aproximação da solução e às garantias de convergência.
Métodos intervalares baseiam-se em um intervalo [a, b] dentro do qual a solução
da equação está contida. Para isso, é necessário que a função mude de sinal, ou seja,
f (a) · f (b) < 0, o que, segundo o Teorema do valor intermediário, garante a existência de
ao menos uma raiz real no intervalo. O método aplica um processo iterativo que reduz
progressivamente o tamanho do intervalo, tornando o intervalo cada vez menor. A principal
vantagem dos métodos intervalares é a garantia de convergência para a solução.
Por outro lado, os métodos abertos não requerem que a solução esteja inicialmente
contida em um intervalo. Em vez disso, esses métodos partem de uma ou mais estimativas
iniciais para a solução, geralmente escolhidas com base de uma análise previa do problema.
Embora os métodos abertos sejam mais rápidos e eficientes em termos computacionais, eles
não oferecem garantia de convergência. Em certos casos, a aproximação pode divergir ou
oscilar indefinidamente se a estimativo inicial não for suficientemente próxima da raiz real.
12.2 Métodos Gráficos 143
f (x)
3
2
x
0.5 1.5 2
−2
f (x) = x3 + e−x − 2
f (0.5) = −1.2685
f (2.0) = 6.135
então existe pelo menos uma raiz real no intervalo [xa , xb ]. Em seguida, é criado um novo
ponto médio entre o intervalo (xa , xb ) chamado xc . Finalmente, atualizamos os valores do
intervalo (xa , xb ) da seguinte forma:
x b = x c se f (xa )f (xc ) < 0
(xa , xb ) = x =x
a c se f (xa )f (xc ) > 0
A raiz é x se f (xa )f (xc ) = 0
c
f (x)
x
0.2 0.4 0.6 0.8 1
−2
xa = (0.2, 1.2) xc = (0.6, −1) xb = (1.0, −1)
f (x)
x
0.2 0.4 0.6 0.8
−2
xa = (0.2, 1.2) xc = (0.4, 0.4256) xb = (0.6, −0.2704)
1
f (x)
x
0.4 0.5 0.6
−1
xa = (0.4, 0.4256) xc = (0.5, 0.0625) xb = (0.6, −0.2704)
1
f (x)
x
0.5 0.55 0.6
−1
xa = (0.5, 0.06250) xc = (0.55, −0.10849) xb = (0.6, −0.27040)
1
f (x)
x
0.5 0.51 0.52 0.53 0.54 0.55 0.56
−1
xa = (0.5, 0.06250) xc = (0.525, −0.02403) xb = (0.55, −0.10849)
Figura 12.1: Método da bisseção. São mostrados os pontos do intervalo [xa ,xb ] (vermelho)
e o ponto médio xc (azul). O intervalo é atualizado até uma aproximação suficiente da raiz.
146 Capítulo 12. Raizes de uma Função
Provas Anteriores: 1
[Prova 2024.1] - Utilize o Método da Bisseção para identificar a raiz da função f (x) =
x6 − 2x5 + 1. Considere o intervalo inicial [1.8, 2.1] e realize a aproximação até a quarta iteração.
Realize os calculos com pelo menos cinco casas decimais. Por fim, use o valor exato da raiz
(x ≈ 1.965948236645485) para estimar o erro absoluto e o erro relativo da aproximação obtida.
Primeira iteração (i=1) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
f (xb ) ≈ 5.08410
1.95 + 2.1
Calculando xc__: xc = = 2.02500
2
Calculando f(xc)__: f (xc ) ≈ 1.85127
f (xb ) ≈ 1.85127
1.95 + 2.02500
Calculando xc__: xc = = 1.98750
2
Calculando f(xc)__: f (xc ) ≈ 0.61234
f (xb )(xa − xb )
xr = xb − (12.3)
f (xa ) − f (xb )
Após o cálculo de xr , o método verifica o sinal do produto f (xa )f (xr ) para determinar
em qual subintervalo a raiz está localizada, tal como na bisseção. O novo intervalo é então
escolhido de forma a preservar a mudança de sinal entre os extremos, o que garante que a
raiz permaneça contida no intervalo. Esse processo é repetido iterativamente até que a
aproximação atinja a precisão desejada.
Apesar de sua eficiência superior em muitos casos, o método da Falsa Posição pode
apresentar lentidão na convergência se um dos extremos do intervalo permanecer fixo por
muitas iterações. Isso ocorre quando o valor de f (x) em um dos extremos é muito pequeno
em relação ao outro, o que faz com que a posição de xr não varie significativamente entre
as iterações.
Dessa forma, o Método da Falsa Posição preserva a robustez e a garantia de convergência
do Método da Bisseção, mas, por empregar uma estratégia de interpolação linear, tende a
exigir menos iterações para alcançar um determinado nível de precisão. Isso o torna, em
muitas situações práticas, uma alternativa mais eficiente e atrativa para a localização de
raízes.
148 Capítulo 12. Raizes de uma Função
f (x)
6
4
xb
2
xr
x
0.5 1 1.5 2 2.5 3 3.5 4
−2
−4
xa
f (x)
6
4
xb
2
xr
x
1 1.5 2 2.5 3 3.5
−2
xa
−4
f (x)
6
4
xb
2
xr
x
1.6 1.8 2 2.2 2.4 2.6 2.8 3 3.2 3.4 3.6
xa
Figura 12.2: Método da Falsa Posição. São mostrados os pontos do intervalo [xa ,xb ]
(vermelho) e o ponto xr , que intercepta o eixo x (azul). O intervalo é atualizado até uma
aproximação suficiente da raiz.
12.4 Método da Falsa Posição 149
Exemplo: 2
Utilize o Método da Falsa Posição para identificar a raiz da função f (x) = e−x − x. Considere
o intervalo inicial [0, 1] e realize a aproximação até a quarta iteração. Realize os calculos com pelo
menos cinco casas decimais. Por fim, use o valor exato da raiz (x ≈ 0.567143290409783) para
estimar o erro absoluto e o erro relativo da aproximação obtida.
Solução:
Resultado___________: x ≈ 0.567143
Iterações:
f (xi )(xi−1 − xi )
xi+1 = xi − (12.4)
f (xi−1 ) − f (xi )
Geometricamente, é como projetar a reta que une os pontos (xi−1 , f (xi−1 )) e (xi , f (xi ))
até cruzar o eixo x, utilizando esse ponto de interseção como uma nova estimativa da raiz.
Diferentemente de métodos como o da bisseção ou da falsa posição, o método da
secante não exige que a função mude de sinal no intervalo entre as estimativas iniciais.
Por esse motivo, não é classificado como um método intervalar. No entanto, exige duas
aproximações iniciais razoavelmente próximas da raiz e é sensível à escolha desses valores.
A Figura 12.3 ilustra graficamente o funcionamento do método da secante, mostrando
a reta construída entre dois pontos da função e sua interseção com o eixo x, que representa
a próxima estimativa da raiz.
f (x) f (x)
40 40 f (xi−1 )
f (xi )
30 30
20 20
f (xi−1 )
10 10
f (xi )
x x
2 xi+1 6 8 2 xi+1 6 8
−10 −10
f (x) f (x)
20 3
f (xi−1 )
2
10
1
f (xi−1 ) f (xi )
f (xi ) x
x
3.4 xi+1 3.8 4
2 3 xi+1 5 6
−5 −1
Provas Anteriores: 2
[Prova 2024.1] - Utilize o método da secante para identificar a raiz da função f (x) = x3 + x − 1.
Considere os pontos iniciais x0 = 4 e x1 = 1.5 e realize a aproximação até a terceira iteração.
Realize os calculos com pelo menos cinco casas decimais. Por fim, use o valor exato da raiz
(x ≈ 0.682327803828019) para estimar o erro absoluto e o erro relativo da aproximação obtida.
f (x1 ) · (x0 − x1 )
Calculando x2__: x2 = x1 −
f (x0 ) − f (x1 )
3.875 · (4 − 1.5)
x2 = 1.5 −
67 − 3.875
3.875 · 2.5
x2 = 1.5 −
63.125
f (x2 ) · (x1 − x2 )
Calculando x3__: x3 = x2 −
f (x1 ) − f (x2 )
2.78798 · (1.5 − 1.34653)
x3 = 1.34653 −
3.875 − 2.78798
x3 ≈ 0.95291
f (x3 ) · (x2 − x3 )
Calculando x4__: x4 = x3 −
f (x2 ) − f (x3 )
0.81819 · (1.34653 − 0.95291)
x4 = 0.95291 −
2.78798 − 0.81819
x4 ≈ 0.78941
Iterações:
Exemplo: 3
Use o método da Secante para identificar a raiz da função f (x) = x2 + 2x − 1 sendo x1 = 1 e x0 = 1.5.
Realize a aproximação do resultado com cinco casas decimais até a terceira iteração.
f (xi )(xi−1 − xi )
xi+1 = xi −
f (xi−1 ) − f (xi )
f (x1 ) = x2 + 2x − 1 = (12 ) + (2 × 1) − 1 = 2
logo, x3 = 0.43750.
Resultado: ≃ 0.41531
12.6 Método da Secante Modificado 153
Em vez de usar dois valores arbitrários (xi e xi−1 ), utiliza apenas xi . Realiza uma pequena
fração de pertubação (δ) da variável independente para fazer uma estimativa de xi+1 .
δxi f (xi )
xi+1 = xi −
f (xi + δxi ) − f (xi )
Exemplo: 4
Use o método da Secante Modificado para identificar a raiz da função f (x) = x2 + 2x − 1 sendo
x1 = 2 e δ = 0.1. Realize a aproximação do resultado com cinco casas decimais até a terceira
iteração.
δxi f (xi )
xi+1 = xi −
f (xi + δxi ) − f (xi )
i=1 (primeira iteração)
Sendo, x1 = 2 e δ = 0.1, calculamos f (x1 ), sendo:
Provas Anteriores: 3
[Prova 2024.2] - Use o método da Secante modificada para identificar a raiz da função f (x) =
x3 − 4x2 − 3. Considere o valor de x1 = 8 e δ = 0.1. Realize a aproximação do resultado com cinco
casas decimais e até a quinta iteração.
Primeira iteração (i=1) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Valores iniciais__: x1 = 8.0, δ = 0.1
Calculando xid__: xid = xi + (δ · xi ) = 8.8
Calculando f(x)__: f (x1 ) = 253
f (xi d) = 368.712
Calculando xi+1__: xi+1 = xi − f (xi δxi f (xi )
+δxi )−f (xi )
= 6.25083
Segunda iteração (i=2) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Valores iniciais__: x2 = 6.25083, δ = 0.1
Calculando xid__: xid = xi + (δ · xi ) = 6.87591
Calculando f(x)__: f (x2 ) = 84.94640
f (xi d) = 132.96793
Calculando xi+1__: xi+1 = xi − f (xi δxi f (xi )
+δxi )−f (xi )
= 5.14511
Terceira iteração (i=3) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Valores iniciais__: x3 = 5.14511, δ = 0.1
Calculando xid__: xid = xi + (δ · xi ) = 5.65962
Calculando f(x)__: f (x3 ) = 27.31353
f (xi d) = 50.15983
Calculando xi+1__: xi+1 = xi − f (xi δxi f (xi )
+δxi )−f (xi )
= 4.52999
Quarta iteração (i=4) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Valores iniciais__: x4 = 4.52999, δ = 0.1
Calculando xid__: xid = xi + (δ · xi ) = 4.98299
Calculando f(x)__: f (x4 ) = 7.87582
f (xi d) = 21.40779
Calculando xi+1__: xi+1 = xi − f (xi δxi f (xi )
+δxi )−f (xi )
= 4.26634
Quinta iteração (i=5) ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Valores iniciais__: x5 = 4.26634, δ = 0.1
Calculando xid__: xid = xi + (δ · xi ) = 4.69297
Calculando f(x)__: f (x5 ) = 1.84783
f (xi d) = 12.26206
Calculando xi+1__: xi+1 = xi − f (xi δxi f (xi )
+δxi )−f (xi )
= 4.19064
Iterações:
1. Use o método da bisseção para encontrar uma aproxima- obtidos pelo método da bisseção.
ção da raiz da equação f (x) = cos(x) − x no intervalo [0, 1].
15. Utilize o método da secante com x0 = 2 e x1 = 2.5 para
Realize cinco iterações e apresente os valores intermediários.
resolver f (x) = x ln(x) − 1. Faça até seis iterações ou até
2. Escreva um programa em Python para encontrar a raiz atingir erro inferior a 10−3 .
da função f (x) = x6 − 2x2 + 4x − 8 no intervalo [1, 2] usando √
16. Resolva numericamente a equação f (x) = x − cos(x) com
o método da falsa posição. Apresente o erro relativo em
o método da secante. Utilize aproximações iniciais x0 = 0.5
cada iteração e pare quando o erro for inferior a 1 × 10−4 .
e x1 = 1.
Utilize o valor x = 1.357407055077686 como referência para
calcular o erro relativo. 17. Encontre a raiz de f (x) = x2 − tan(x) usando o método da
secante modificada. Use aproximação inicial x0 = 1.2 e pare
3. A equação f (x) = e−x − x tem uma raiz próxima de
quando o erro for inferior a 0,001.
x = 0.5. Utilize o método da secante com aproximações ini-
ciais x0 = 0 e x1 = 1 para encontrar a raiz. Faça no máximo 18. Use o método da bisseção para encontrar uma raiz de
5 iterações. f (x) = x3 − x − 2 no intervalo [1, 2] com precisão de 10−4 .
Apresente o número de iterações necessário.
4. Utilize o método da secante modificada para resolver a
equação f (x) = x2 − 2 com uma aproximação inicial x0 = 2.1 19. A equação f (x) = ex − 3x possui uma raiz entre x = 0 e x = 2.
e δ = 0.1. Faça no máximo 5 iterações. Aplique o método da falsa posição por quatro iterações e
apresente os valores de xr , f (xr ) e o erro relativo.
5. Uma esfera de raio R = 2 m tem seu volume de água descrito
πh2 (3R−h) 20. Considere f (x) = sin(x) − x2 . Use o método da bisseção para
por V (h) = 6 . Encontre a profundidade h que ar-
mazena 10 m3 usando o método da falsa posição com três encontrar uma raiz no intervalo [1, 3]. Determine o número
iterações. Calcule o erro relativo em cada passo. de iterações para atingir εs = 0,01.
6. A função f (x) = ln(x) − sin(x) possui uma raiz entre x = 2 21. A equação f (x) = x3 − 4x + 1 possui uma raiz entre x = 0
e x = 3. Use o método da bisseção para localizá-la com e x = 2. Aplique o método da falsa posição até que o erro
precisão de 10−5 . Mostre os valores de a, b, xr e f (xr ) em relativo seja menor que 1%.
cada iteração. 22. Compare a taxa de convergência entre os métodos da bisse-
−x
7. A equação f (x) = xe − 0.1 descreve o modelo de um cir- ção e da falsa posição para f (x) = ex − x2 no intervalo [0, 2].
cuito elétrico. Utilize o método da secante com aproximações Faça cinco iterações de cada método.
iniciais x0 = 0.1 e x1 = 1 para encontrar a raiz. Realize até 23. Use o método da secante para encontrar a raiz da função
6 iterações e mostre o erro aproximado em cada uma. f (x) = ln(x) − x1 com aproximações x0 = 1 e x1 = 2. Faça
8. Utilize o método da falsa posição para encontrar a raiz de no máximo oito iterações.
f (x) = x3 − 6x2 + 11x − 6 no intervalo [1, 3.5]. Sabendo que 24. A equação f (x) = x1 − x tem uma raiz entre x = 0.5 e x = 2.
a raiz real é x = 1, calcule o erro verdadeiro ao final de cada Utilize o método da secante modificada e calcule até erro
iteração. menor que 10−4
9. Considere a equação f (x) = tan(x) − x. Use o método da 25. Uma equação de engenharia é dada por f (x) = x3 +x sin(x)−
secante modificada com aproximação inicial x0 = 4.5 para 1. Resolva-a usando o método da falsa posição entre x = 0 e
encontrar uma raiz no intervalo [4, 5]. Apresente os valores x = 1. Mostre as quatro primeiras iterações
obtidos nas 5 primeiras iterações.
26. Uma equação de engenharia é dada por f (x) = x3 +x sin(x)−
10. Uma viga com comportamento não linear é modelada por 1. Resolva-a usando o método da falsa posição entre x = 0 e
f (x) = x3 + 2x2 − 5x − 6. Use o método da bisseção e o x = 1. Mostre as quatro primeiras iterações
método da falsa posição para encontrar a raiz entre x = 2
e x = 3. Compare os resultados e discuta o número de 27. Use o método da falsa posição para resolver f (x) = cos(x)−x
iterações necessário para atingir εs < 1%. entre x = 0 e x = 1. Determine o número de iterações para
obter εs < 0,01.
11. Utilize o método da secante para encontrar a raiz da função
f (x) = x2 − 5 com aproximações iniciais x0 = 2 e x1 = 3. 28. Resolva f (x) = x3 −2x−5 com o método da bisseção. Utilize
Faça cinco iterações e apresente os resultados. o intervalo [2, 3] e calcule até obter erro inferior a 0,1%.
12. Resolva f (x) = cos(x) − x2 no intervalo [0, 1] com o método 29. Escreva um programa que aplique os métodos da bisseção,
da bisseção. Mostre os valores intermediários e pare quando falsa posição e secante para resolver f (x) = x2 − 3. Compare
o erro relativo for menor que 0,5%. o número de iterações para cada método.
13. A equação f (x) = ln(x2 + 1) − x tem uma raiz próxima de 30. A equação f (x) = x5 − 3x3 + 2x − 7 possui uma raiz real
x = 0.6. Use o método da secante modificada para encontrar positiva. Utilize o método da secante com aproximações
essa raiz com precisão de 10−5 . iniciais x0 = 1 e x1 = 2 para encontrar essa raiz com precisão
de 10−4 . Apresente os valores de x, f (x) e o erro relativo
14. Use o método da falsa posição para resolver f (x) = x3 + aproximado em cada iteração.
4x2 − 10 no intervalo [1, 2]. Compare os resultados com os
156 Capítulo 12. Raizes de uma Função
B
1. Use o método da bisseção para encontrar uma aproximação
da raiz da Equação 12.5 no intervalo [0, 1]. Realize cinco
iterações e apresente os valores intermediários.
f (x) = xe−x − 0.2 (12.5)
y
Ac
3m
2. Escreva um programa em Python para determinar a raiz
da Equação 12.6 no intervalo [0.5, 2], utilizando o método
da bisseção. Calcule até uma aproximação com precisão de 7. Você está desenvolvendo o projeto de um reservatório
10−5 e comente sobre o comportamento da convergência. esférico destinado ao abastecimento de água de uma pequena
comunidade. O volume de água armazenado no tanque pode
f (x) = ln(x) + x2 − 2 (12.6)
ser determinado pela seguinte equação:
3. Escreva um programa em Python para encontrar uma apro-
ximação da raiz da função Equação 12.7 usando o método πh2 (3R − h)
V (h) = (12.11)
da bisseção no intervalo [0, 1]. O programa deve imprimir 6
os valores de a, b, c e f (c) em cada passo.
em que V representa o volume de água em metros cúbicos
f (x) = e−x − sin(x) (12.7) (m3 ), h é a profundidade da água dentro do tanque em
metros (m), e R é o raio do tanque, também em metros (m).
4. A função da Equação 12.8 apresenta comportamento oscila- Sabendo que o raio do tanque é R = 3 m, determine qual
tório. Escreva um programa em Python usando o método deve ser a profundidade h para que o volume armazenado
da bisseção para localizar uma raiz no intervalo [1, 2]. Repe- seja de 30 m3 . Utilize o método gráfico e método da falsa
tir as iterações até que o erro absoluto entre aproximações posição para encontrar a resposta.
consecutivas seja menor que ε = 10−4 .
f (x) = e−x cos(2x) − 0.1 (12.8)
�
5. A velocidade v do pára-quedista em queda livre é dada
pela Equação 12.9, onde g = 9.8m/s2 . Para um pára-
quedista com um coeficiente de arrasto c = 15kg/s, calcule
a massa m para que a velocidade seja v = 35m/s em t = 9s. � �
Use o método da falsa posição para determinar m com 10
iterações.
gm
v= 1 − e−(c/m)t (12.9)
c
8. Encontre a raiz real positiva de f (x) = x4 − 8x3 − 35x2 +
450x − 1001 usando o método da falsa posição. Use aproxi-
6. Água está escoando em um canal trapezoidal a uma vazão
mações iniciais xa = 4.5 e xb = 6. Calcule os erros absoluto
de Q = 20m3 /s. A profundidade crítica y para tal canal
e relativo baseado no fato de que a raiz é 5.60979001912047.
deve satisfazer a Equação 12.10, onde g = 9.81 m/s2 , Ac é a
Use um gráfico para explicar seus resultados.
área da seção transversal (m2 ), e B é a largura do canal na
superfície (m).
9.
Q2
f (y) = 1 − B (12.10) 10.
gA3c
Nosso objetivo é encontar a profundidade crítica y tal que 11.
f (y) = 0. Para esse caso, a largura e a área transversal 12.
podem ser relacionadas à profundidade y por:
13.
y2
B = 3+y e Ac = 3y + 14.
2
Encontre a profundidade crítica usando (a) o método gráfico, 15.
(b) a bissecção e (c) a falsa posição. Para (b) e (c), use
16.
aproximações iniciais para a profundidade y com os valores
xa = 0.5 e xb = 2.5. 17.
12.6 Método da Secante Modificado 157
1. Use o método da bisseção para encontrar uma aproxima- obtidos pelo método da bisseção.
ção da raiz da equação f (x) = cos(x) − x no intervalo [0, 1].
15. Utilize o método da secante com x0 = 2 e x1 = 2.5 para
Realize cinco iterações e apresente os valores intermediários.
resolver f (x) = x ln(x) − 1. Faça até seis iterações ou até
2. Escreva um programa em Python para encontrar a raiz da atingir erro inferior a 10−3 .
função f (x) = x3 − 2x2 + 4x − 8 no intervalo [1, 3] usando o √
16. Resolva numericamente a equação f (x) = x − cos(x) com
método da falsa posição. Apresente o erro relativo em cada
o método da secante. Utilize aproximações iniciais x0 = 0.5
iteração e pare quando o erro for inferior a 1 × 10−6 . Utilize
e x1 = 1.
o valor x = 1.89882945773481 como referência para calcular
o erro relativo. 17. Encontre a raiz de f (x) = x2 − tan(x) usando o método da
secante modificada. Use aproximação inicial x0 = 1.2 e pare
3. A equação f (x) = e−x − x tem uma raiz próxima de
quando o erro for inferior a 0,001.
x = 0.5. Utilize o método da secante com aproximações ini-
ciais x0 = 0 e x1 = 1 para encontrar a raiz. Faça no máximo 18. Use o método da bisseção para encontrar uma raiz de
5 iterações. f (x) = x3 − x − 2 no intervalo [1, 2] com precisão de 10−4 .
Apresente o número de iterações necessário.
4. Utilize o método da secante modificada para resolver a equa-
ção f (x) = x2 − 2 com uma aproximação inicial x0 = 1.5. 19. A equação f (x) = ex − 3x possui uma raiz entre x = 0 e x = 2.
Calcule até que o erro relativo seja menor que 0,01%. Aplique o método da falsa posição por quatro iterações e
apresente os valores de xr , f (xr ) e o erro relativo.
5. Uma esfera de raio R = 2 m tem seu volume de água descrito
πh2 (3R−h) 20. Considere f (x) = sin(x) − x2 . Use o método da bisseção para
por V (h) = 6 . Encontre a profundidade h que ar-
mazena 10 m3 usando o método da falsa posição com três encontrar uma raiz no intervalo [1, 3]. Determine o número
iterações. Calcule o erro relativo em cada passo. de iterações para atingir εs = 0,01.
6. A função f (x) = ln(x) − sin(x) possui uma raiz entre x = 2 21. A equação f (x) = x3 − 4x + 1 possui uma raiz entre x = 0
e x = 3. Use o método da bisseção para localizá-la com e x = 2. Aplique o método da falsa posição até que o erro
precisão de 10−5 . Mostre os valores de a, b, xr e f (xr ) em relativo seja menor que 1%.
cada iteração. 22. Compare a taxa de convergência entre os métodos da bisse-
−x
7. A equação f (x) = xe − 0.1 descreve o modelo de um cir- ção e da falsa posição para f (x) = ex − x2 no intervalo [0, 2].
cuito elétrico. Utilize o método da secante com aproximações Faça cinco iterações de cada método.
iniciais x0 = 0.1 e x1 = 1 para encontrar a raiz. Realize até 23. Use o método da secante para encontrar a raiz da função
6 iterações e mostre o erro aproximado em cada uma. f (x) = ln(x) − x1 com aproximações x0 = 1 e x1 = 2. Faça
8. Utilize o método da falsa posição para encontrar a raiz de no máximo oito iterações.
f (x) = x3 − 6x2 + 11x − 6 no intervalo [1, 3.5]. Sabendo que 24. A equação f (x) = x1 − x tem uma raiz entre x = 0.5 e x = 2.
a raiz real é x = 1, calcule o erro verdadeiro ao final de cada Utilize o método da secante modificada e calcule até erro
iteração. menor que 10−4
9. Considere a equação f (x) = tan(x) − x. Use o método da 25. Uma equação de engenharia é dada por f (x) = x3 +x sin(x)−
secante modificada com aproximação inicial x0 = 4.5 para 1. Resolva-a usando o método da falsa posição entre x = 0 e
encontrar uma raiz no intervalo [4, 5]. Apresente os valores x = 1. Mostre as quatro primeiras iterações
obtidos nas 5 primeiras iterações.
26. Uma equação de engenharia é dada por f (x) = x3 +x sin(x)−
10. Uma viga com comportamento não linear é modelada por 1. Resolva-a usando o método da falsa posição entre x = 0 e
f (x) = x3 + 2x2 − 5x − 6. Use o método da bisseção e o x = 1. Mostre as quatro primeiras iterações
método da falsa posição para encontrar a raiz entre x = 2
e x = 3. Compare os resultados e discuta o número de 27. Use o método da falsa posição para resolver f (x) = cos(x)−x
iterações necessário para atingir εs < 1%. entre x = 0 e x = 1. Determine o número de iterações para
obter εs < 0,01.
11. Utilize o método da secante para encontrar a raiz da função
f (x) = x2 − 5 com aproximações iniciais x0 = 2 e x1 = 3. 28. Resolva f (x) = x3 −2x−5 com o método da bisseção. Utilize
Faça cinco iterações e apresente os resultados. o intervalo [2, 3] e calcule até obter erro inferior a 0,1%.
12. Resolva f (x) = cos(x) − x2 no intervalo [0, 1] com o método 29. Escreva um programa que aplique os métodos da bisseção,
da bisseção. Mostre os valores intermediários e pare quando falsa posição e secante para resolver f (x) = x2 − 3. Compare
o erro relativo for menor que 0,5%. o número de iterações para cada método.
13. A equação f (x) = ln(x2 + 1) − x tem uma raiz próxima de 30. A equação f (x) = x5 − 3x3 + 2x − 7 possui uma raiz real
x = 0.6. Use o método da secante modificada para encontrar positiva. Utilize o método da secante com aproximações
essa raiz com precisão de 10−5 . iniciais x0 = 1 e x1 = 2 para encontrar essa raiz com precisão
de 10−4 . Apresente os valores de x, f (x) e o erro relativo
14. Use o método da falsa posição para resolver f (x) = x3 + aproximado em cada iteração.
4x2 − 10 no intervalo [1, 2]. Compare os resultados com os
13. Otimização
13.1 Fundamentos
No sentido mais amplo, otimização é o processo de encontrar a melhor solução possível para
um determinado problema, dentro de um conjunto de restrições. Em termos práticos, isso
significa projetar sistemas ou processos de maneira que se obtenha o máximo desempenho
com o menor custo possível, seja ele energético, ambiental ou computacional. Essa busca
pelo melhor é central em diversas áreas do conhecimento, especialmente na engenharia,
onde profissionais precisam constantemente tomar decisões fundamentadas em critérios de
eficiência, viabilidade técnica e limitações físicas ou econômicas.
Engenheiros, por exemplo, enfrentam frequentemente problemas que exigem encontrar
as melhores dimensões para uma estrutura, minimizar o consumo de energia em um sistema,
ou maximizar a produtividade de um processo industrial. Esses desafios envolvem equilibrar
múltiplas variáveis e restrições, o que torna o uso de técnicas de otimização essencial para
a obtenção de soluções viáveis e eficazes.
Do ponto de vista matemático, a otimização está intimamente relacionada à localização
de raízes de funções (Capítulo 12), pois ambos os problemas envolvem a busca por valores
específicos associados ao comportamento de uma função. Enquanto a localização de raízes
se concentra em determinar os pontos onde a função se anula (ou seja, onde f (x) = 0), a
otimização busca identificar os pontos onde a função atinge valores extremos: os máximos
ou mínimos, locais ou globais.
A identificação desses extremos está diretamente relacionada à análise da derivada da
função. Por exemplo, os pontos críticos, onde a derivada primeira se anula (f ′ (x) = 0),
são candidatos naturais a serem máximos ou mínimos. Por isso, métodos numéricos para
otimização muitas vezes compartilham fundamentos com os métodos para localização de
raízes, aproveitando estratégias semelhantes, como aproximações sucessivas, iterações e
análise de convergência.
Embora em alguns casos seja possível obter soluções analíticas para problemas de
otimização,especialmente quando as funções envolvidas são simples ou possuem propriedades
específicas, a grande maioria dos problemas práticos é muito complexa para ser resolvida
de forma exata. Nesses casos, recorre-se a técnicas computacionais baseadas em métodos
numéricos.
160 Capítulo 13. Otimização
Após calcular a função nos pontos intermediários x1 e x2 , dois casos podem ocorrer: (i)
f (x1 ) > f (x2 ) ou (ii) f (x1 ) < f (x2 ). A atualização do intervalo depende do objetivo (mínimo
ou máximo), conforme resumido na Tabela 13.1. O processo é repetido iterativamente,
com redução progressiva do intervalo, até que a diferença entre xi e xf atenda ao critério
de convergência.
Se f (x1 ) > f (x2 )
- Busca do mínimo: O intervalo à direita, entre x1 e xf pode ser eliminado,
pois não contém o ponto mínimo. Assim, atualizamos xf = x1 e consideramos
x2 como a melhor aproximação até o momento.
- Busca do máximo: O intervalo à esquerda, entre xi e x2 , pode ser eliminado,
pois não contém o ponto máximo. Dessa forma, atualizamos xi = x2 e passamos
a considerar x1 como a melhor aproximação.
Se f (x1 ) < f (x2 )
- Busca do mínimo: O intervalo à esquerda, entre xi e x2 pode ser descartado,
pois não contém o ponto mínimo. Assim, atualizamos xi = x2 e definimo x1
como a melhor aproximação.
- Busca do máximo: O intervalo à direita, entre x1 e xf , pode ser eliminado,
pois não contém o ponto máximo. Com isso, atualizamos xf = x1 e adotamos
x2 como a melhor aproximação.
13.2 Busca da Razão Áurea 161
f (x)
d = 55.623
1.2 x1 xi = 130
xf = 220
1 d = 55.623
xf x2 = 164.37
0.8 x1 = 185.62
x2
0.6
0.4
0.2
xi
x
130 164.37 185.62 220
f (x) f (x)
f (x1 ) f (x1 )
f (xf ) f (xf )
f (x) f (x)
f (x1 ) f (x1 )
f (xf ) f (xf )
x x
Figura 13.1: Representação gráfica do método da Razão Áurea em uma função unidimensional.
162 Capítulo 13. Otimização
Exemplo: 5
Exemplo: Utilize o método da razão áurea para encontrar o máximo da Equação 13.2, considerando
os pontos iniciais xi = −2 e xf = 4. Realize os cálculos até a terceira iteração.
x2
f (x) = 2 ∗ sin(x) − (13.2)
10
0.5
x1 (270, 0.1)
x
240 250 260 270 280 290 300 310 320 330 340 350
−0.5
x0 (260, −0.6089) x2 (315, −0.57861)
−1
Função Original
−1.5 Função Quadrática
f (x)
1
x2 (280, 0.85031)
0.5
x0 (210, 0.13255)
x
170 180 190 200 210 220 230 240 250 260 270 280 290 300 310
xq = (238.6918, −0.72873)
−1
Função Original
−1.5 Função Quadrática
f (x) 2
Função: 2 sin(x) − x10
2 x1 = 1
x0 = −4.2 x0 = 0 x
−5 −3 −2 1 2 3 4 5 6
x2 = −0.5
x1 = −2.5 −2
x2 = 4
−4
Figura 13.2: Figura principal com três subfiguras organizadas em 3 linhas e 1 coluna.
13.3 Interpolação Quadrática 165
Exemplo: 6
Use a interpolação quadrática com aproximações iniciais x0 = 0, x1 = 1 e x2 = 4 para aproximar o
ponto de máximo da Equação 13.4.
x2
f (x) = 2 ∗ sin(x) − (13.4)
10
Solução: Os valores da função nas três aproximações são dados por:
x0 = 0 = f (x0 ) = 0
x1 = 1 = f (x1 ) = 1.5829
x2 = 4 = f (x2 ) = −3.1136
x0 = 1 = f (x0 ) = 1.5829
x1 = 1.5055 = f (x1 ) = 1.7691
x2 = 4 = f (x2 ) = −3.1136
o qual tem o valor da função de f (104903) = 1.7714. O processo pode ser repetido:
0.25
0.2
0.15
0.1
0.0008617289
i i
5 10 15 20 3 5 10 15 20
0.1
0.07244822123541
i i
5 10 15 20 3 5 10 15 20
Figura 13.3: Evolução do erro absoluto ao longo de 20 iterações. As subfiguras (a) e (b)
ilustram a aplicação do método para localização do mínimo (Figura 13.2c), enquanto as
subfiguras (c) e (d) mostram sua aplicação para a localização do máximo (Figura 13.2c).
Observe que o método da interpolação quadrática pode apresentar instabilidades ao longo
das iterações.
.
13.3 Interpolação Quadrática 167
Exemplo: 1
Métodos Numéricos para Engenharia, Chapra, 5th edição.
Questão 13.8: A trajetória de uma bola pode ser calculada pela Equação 13.5, onde y é a altura
(m), θ0 é o ângulo inicial (radianos), v0 é a velocidade inicial (m/s), g = 9.18 m/s2 é a aceleração
da gravidade e y0 é a altura inicial (m). Use a busca da razão áurea para determinar a altura
máxima, dados y0 = 1 m, v0 = 25 m/s e θ0 = 50o . Use a aproximação inicial de xi = 0 e xf = 60
metros.
g
y = (tan θ0 )x − x2 + y0 (13.5)
2v02 cos2 θ0
Solução:
No primeiro passo, escolha os pontos interiores como (xi + d) e (xf − d), onde:
√
5−1
d= (60 − 0) = 37.082.
2
x1 = xi + d = 0 + 37.082 = 37.082
x2 = xf − d = 60 − 37.082 = 22.918
50π 9.81
f (x) = tan x− x2 + 1
180 2 · 625 · cos2 50π
180 x
f (x1 ) = 19.074
f (x2 ) = 18.3361
Como (f (x1 ) > f (x2 )), definimos o limite inferior na próxima iteração como: xi = x2 . Lembrando:
Para converter um ângulo de graus para radianos, usamos a seguinte fórmula geral:
π
θrad = θgraus × (13.6)
180
Os resultados são fornecidos na tabela abaixo. Realize as iterações até que a precisão necessária
seja obtida.
Resultado:
Exemplo: 2
Métodos Numéricos para Engenharia, Chapra, 5th.
Questão 13.9: A deflexão de uma viga uniforme submetida a uma carga crescente e linearmente
distribuída pode ser escrita pela Equação 13.7, onde L = 600 cm, E = 50000 kN/cm2 , I = 30000
cm4 e w0 = 2.5 kN/cm. Calcule o ponto de máxima deflexão. Use a busca da razão áurea com
aproximações iniciais xi = 0 e xf = L.
w0
y= (−x5 + 2L2 x3 − L4 x) (13.7)
120EIL
Solução:
Podemos realizar uma análise gráfica da função e observar que a deflexão máxima ocorre no ponto
mínimo da Equação 13.7. Em seguida, aplicamos o método da razão áurea para determinar esse
mínimo.
−0.2
−0.4
√
5−1
d= (600 − 0) = 370.82.
2
x1 = xi + d = 0 + 37.082 = 370.82
x2 = xf − d = 60 − 37.082 = 229.18
2.5
f (x1 ) = · −x5 + 2 · 6002 · x3 − 6004 · x = −0.42492
120 · 50000 · 30000 · 600
2.5
f (x2 ) = · −x5 + 2 · 6002 · x3 − 6004 · x = −0.50155
120 · 50000 · 30000 · 600
Como (f (x2 ) < f (x1 )), defina o limite superior na próxima iteração como xu = x1 . Os resultados
são fornecidos na tabela abaixo.
Resultado:
1. Empregue os seguintes métodos para encontrar o máximo de 6. Empregue os seguintes métodos para encontrar o máximo de
f (x) = 1+x
x
2 . Considere como referência o ponto de máximo f (x) = −2(x − 1)2 + 5. Considere como referência o ponto
local em aproximadamente: (1, 0.5). de máximo local em aproximadamente: (1, 5).
a) Busca da razão áurea (xi = 0, xf = 3) até erro absoluto a) Busca da razão áurea (xi = −1, xf = 3) até erro abso-
inferior a 0.00001. luto inferior a 0.0001.
b) Interpolação quadrática (x0 = 0, x1 = 1, x2 = 2) até b) Interpolação quadrática (x0 = −1, x1 = 1, x2 = 3) até
erro absoluto inferior a 0.00001. erro absoluto inferior a 0.0001.
c) Gere um gráfico mostrando a evolução do erro abso- c) Gere um gráfico mostrando a evolução do erro abso-
luto ao longo das iterações e analise se os algoritmos luto ao longo das iterações e analise se os algoritmos
apresentaram alguma instabilidade. apresentaram alguma instabilidade.
2. Empregue os √ seguintes métodos para encontrar o máximo 7. Empregue os seguintes métodos para encontrar o máximo
de f (x) = x 4 − x2 . Considere como referência
√ o ponto
de de f (x) = 3x2 e−x . Considere como referência o ponto de
máximo local em aproximadamente: 2 ≈ 1.4142, 2 . máximo local em aproximadamente: (2, 1.624).
a) Busca da razão áurea (xi = 0.5, xf = 2) até erro abso- a) Busca da razão áurea (xi = 0, xf = 6) até erro absoluto
luto inferior a 0.000001. inferior a 0.00001.
b) Interpolação quadrática (x0 = 0.5, x1 = 1, x2 = 2) até b) Interpolação quadrática (x0 = 1, x1 = 2, x2 = 4) até
erro absoluto inferior a 0.000001. erro absoluto inferior a 0.00001.
c) Gere um gráfico mostrando a evolução do erro abso- c) Gere um gráfico mostrando a evolução do erro abso-
luto ao longo das iterações e analise se os algoritmos luto ao longo das iterações e analise se os algoritmos
apresentaram alguma instabilidade. apresentaram alguma instabilidade.
3. Empregue os seguintes métodos para encontrar o máximo de 8. Empregue os seguintes métodos para encontrar o máximo
f (x) = −(x − 2)4 + 16. Considere como referência o ponto de f (x) = x4 e−x . Considere como referência o ponto de
de máximo local em aproximadamente: (2, 16). máximo local em aproximadamente: (4, 4.692).
a) Busca da razão áurea (xi = 0, xf = 4) até erro absoluto a) Busca da razão áurea (xi = 0, xf = 8) até erro absoluto
inferior a 0.0001. inferior a 0.00001.
b) Interpolação quadrática (x0 = 0, x1 = 2, x2 = 4) até b) Interpolação quadrática (x0 = 2, x1 = 4, x2 = 6) até
erro absoluto inferior a 0.0001. erro absoluto inferior a 0.00001.
c) Gere um gráfico mostrando a evolução do erro abso- c) Gere um gráfico mostrando a evolução do erro abso-
luto ao longo das iterações e analise se os algoritmos luto ao longo das iterações e analise se os algoritmos
apresentaram alguma instabilidade. apresentaram alguma instabilidade.
4. Empregue os seguintes métodos para encontrar o máximo de 9. Empregue os seguintes métodos para encontrar o máximo
f (x) = −3x2 + 12x − 5. Considere como referência o ponto de f (x) = sin(x) − 0.1 x. Considere como referência o ponto
de máximo local em aproximadamente: (2, 7). de máximo local em aproximadamente: (1.4706, 0.848).
a) Busca da razão áurea (xi = 0, xf = 5) até erro absoluto a) Busca da razão áurea (xi = 0, xf = 3.14) até erro ab-
inferior a 0.00001. soluto inferior a 0.00001.
b) Interpolação quadrática (x0 = 0, x1 = 2, x2 = 5) até b) Interpolação quadrática (x0 = 0, x1 = 1.5, x2 = 3) até
erro absoluto inferior a 0.00001. erro absoluto inferior a 0.00001.
c) Gere um gráfico mostrando a evolução do erro abso- c) Gere um gráfico mostrando a evolução do erro abso-
luto ao longo das iterações e analise se os algoritmos luto ao longo das iterações e analise se os algoritmos
apresentaram alguma instabilidade. apresentaram alguma instabilidade.
5. Empregue os seguintes métodos para encontrar o máximo 10. Empregue os seguintes métodos para encontrar o máximo
de f (x) = −x2 + 8x − 10. Considere como referência o ponto de f (x) = −x3 + 6x2 − 9x + 5. Considere como referência o
de máximo local em aproximadamente: (4, 6). ponto de máximo local em aproximadamente: (3, 5).
a) Busca da razão áurea (xi = 0, xf = 8) até erro absoluto a) Busca da razão áurea (xi = 0, xf = 5) até erro absoluto
inferior a 0.00001. inferior a 0.00001.
b) Interpolação quadrática (x0 = 0, x1 = 4, x2 = 8) até b) Interpolação quadrática (x0 = 0, x1 = 3, x2 = 5) até
erro absoluto inferior a 0.0001. erro absoluto inferior a 0.00001.
c) Gere um gráfico mostrando a evolução do erro abso- c) Gere um gráfico mostrando a evolução do erro abso-
luto ao longo das iterações e analise se os algoritmos luto ao longo das iterações e analise se os algoritmos
apresentaram alguma instabilidade. apresentaram alguma instabilidade.
13.3 Interpolação Quadrática 171
1. A potência entregue por um gerador fotovoltaico em função 8. A relação sinal-ruído de um circuito pode ser modelada pela
da irradiância G (W/m2 ) pode ser aproximada pela Equa- Equação 13.15, onde d (dB) é o nível de atenuação. Use a
ção 13.8. Use a busca da razão áurea com aproximações busca da razão áurea com aproximações iniciais di = 0 dB e
iniciais Gi = 0 e Gf = 2000 para determinar o valor de G df = 50 dB para determinar d que maximiza S(d).
que maximiza P (G).
S(d) = d e−0.1 d (13.15)
−0.002 G
P (G) = G e (13.8)
9. A eficiência aerodinâmica de um perfil em função do coefici-
2. A eficiência volumétrica de uma bomba centrífuga em fun- ente de curvatura x pode ser aproximada pela Equação 13.16.
ção da velocidade angular ω (rad/s) pode ser estimada pela Use a busca da razão áurea com aproximações iniciais xi = 0
Equação 13.9. Use a busca da razão áurea com aproximações e xf = 5 para determinar x que maximiza f (x).
iniciais ωi = 0 e ωf = 10 para determinar ω que maximiza x
f (x) = (13.16)
η(ω). 1 + x2
ω
η(ω) = (13.9) 10. O consumo de combustível por distância v (m/s) pode ser
1 + ω2
aproximado pela Equação 13.17. Use a busca da razão áurea
3. A potência dissipada num resistor de carga R ligado a com aproximações iniciais vi = 0.1 m/s e vf = 50 m/s para
uma fonte de tensão V = 100 V com resistência interna determinar v que minimiza D(v).
Rint = 50 Ω é dada pela Equação 13.10. Use a busca da 10
razão áurea com aproximações iniciais Ri = 0 Ω e Rf = 200 D(v) = 0.1 v 2 + (13.17)
v
Ω para determinar o valor de R que maximiza P (R).
11. A amplitude de ressonância de um sistema massa-mola-
1002 R amortecedor, em função da frequência ω, é dada pela Equa-
P (R) = (13.10)
ção 13.18. Use a busca da razão áurea com aproximações
2
R + 50
iniciais ωi = 0 rad/s e ωf = 3 rad/s para determinar ω que
maximiza A(ω).
4. O custo total (em unidades monetárias) de uma tubulação
de diâmetro D (cm) pode ser modelado pela Equação 13.11. 1
A(ω) = p (13.18)
Use a busca da razão áurea com aproximações iniciais Di = 1 (1 − ω 2 )2 + (0.2 ω)2
cm e Df = 50 cm para determinar o valor de D que minimiza
C(D). 12. A função de ganho de um amplificador em função do fator
10000 x é dada pela Equação 13.19. Use a busca da razão áurea
C(D) = 200 D + (13.11) com aproximações iniciais xi = 1 e xf = 10 para determinar
D2
x que maximiza G(x).
5. O rendimento de uma reação química em função da tempe- x
ratura T (°C) pode ser aproximado pela Equação 13.12. Use G(x) = ln(x) − (13.19)
5
a busca da razão áurea com aproximações iniciais Ti = 0 °C
e Tf = 50 °C para determinar T que maximiza Y (T ). 13. A taxa de produção de um sistema em função do tempo t
(h) pode ser aproximada pela Equação 13.20. Use a busca
Y (T ) = T 2 e−T /10 (13.12) da razão áurea com aproximações iniciais ti = 0 h e tf = 50
h para determinar t que maximiza R(t).
6. A transferência de calor por convecção em um trocador
R(t) = t3 e−t/5 (13.20)
de calor de comprimento L (m) pode ser modelada pela
Equação 13.13. Use a busca da razão áurea com aproxima-
ções iniciais Li = 0 m e Lf = 30 m para determinar L que 14. A eficiência térmica de uma placa em função da espessura
maximiza Q(L). x (mm) pode ser modelada pela Equação 13.21. Use a
busca da razão áurea com aproximações iniciais xi = 0 mm
Q(L) = L e−L/5 (13.13) e xf = 100 mm para determinar x que maximiza H(x).
√
H(x) = x e−x/20 (13.21)
7. A eficiência de um aerogerador em função da velocidade
do vento v (m/s) pode ser aproximada pela Equação 13.14.
Use a busca da razão áurea com aproximações iniciais vi = 0 15. A Equação 13.22 descreve a variação de amplitude de um
m/s e vf = 150 m/s para determinar v que maximiza A(v). sinal amortecido. Use a busca da razão áurea com aproxima-
ções iniciais xi = 0 e xf = 4 para determinar x que maximiza
A(v) = v e−0.01 v (13.14) f (x).
14.1 Fundamentos
Muitas vezes, ao dispor de um conjunto de dados ou
pontos, surge a questão de saber se é possível mo- Tempo Temperatura
delar uma curva que represente o comportamento em minutos em C o
dessa distribuição e passe por todos os pontos. A
interpolação estuda métodos para construir tais 0 80
curvas, garantindo que essas condições sejam satis- 2 ?
feitas. 5 64
Muitas funções são conhecidas apenas em um 10 52
conjunto finito e discreto de pontos dentro de um 15 44
intervalo [a, b]. Um exemplo clássico é a tabela 20 38
que relaciona o calor específico da água com a 25 33
temperatura. 30 30
Imagine que você está testando um novo ma- 35 28
terial para fabricar xícaras de café. Um estagiário 40 25
registrou, a cada 5 minutos, a temperatura do café 45 25
após ser servido na xícara. Qual seria a tempera-
tura do café após 2 minutos do início do processo? Tabela 14.1: Temp. do café.
A interpolação auxilia na resolução desse tipo de
problema, bem como em situações em que possuí-
mos um conjunto de valores obtidos por meio de experimentos.
Interpolar uma função f (x) consiste em aproximar essa função por uma outra função
g(x), escolhida entre uma classe de funções definida a priori e que satisfaça algumas
propriedades. A função g(x) é então usada em substituição à função f (x).
A necessidade dessa substituição surge em diversas situações, tais como:
• Quando apenas os valores numéricos da função são conhecidos em um conjunto de
pontos, sem a sua forma analítica, e é necessário calcular o valor da função em um
ponto não tabelado.
• Quando a função em estudo possui uma expressão cuja diferenciação e integração
são complexas ou inviáveis. Nesses casos, pode-se buscar uma função aproximada
174 Capítulo 14. Interpolação
Essa notação estabelece uma convenção que será usada para construir diferenças
divididas de ordens superiores, mesmo que o valor da diferença dividida de ordem zero
coincida com o valor da função no ponto. Ou seja, o operador f [x0 ] representa, formalmente,
a aplicação do operador de diferenças divididas sobre um único nó, sendo por definição
idêntico à avaliação direta da função f em x0 .
Matematicamente, podemos considerar que a diferença dividida de ordem zero fornece
a base da estrutura triangular utilizada no algoritmo de Newton para interpolação, e serve
como ponto de partida para a construção de coeficientes mais complexos. Essa formalização
é importante porque permite descrever a interpolação de forma sistemática e recursiva,
mesmo nos casos em que se começa apenas com os valores pontuais da função.
f [x0 ] = f (x0 ) = y0
f [x1 ] = f (x1 ) = y1
14.3 Operador de Diferenças Divididas de Ordem 1 (ODD-1) 175
y
1.5
B
A = (x0 , f (x0 ))
1 B = (x1 , f (x1 ))
∆y
∆y m= ∆x
0.5
A
∆x
x
100 120 140 160 180 200 220 240 260
Figura 14.1: Representação geométrica das diferenças divididas de ordem zero e primeira.
O ponto (x0 , f (x0 )) representa a avaliação da função (ordem zero), enquanto a reta
secante entre (x0 , f (x0 )) e (x1 , f (x1 )) representa a diferença dividida de ordem um, dada
por f [x0 , x1 ].
2 O coeficiente angular (m) de uma reta secante entre dois pontos é dado pela razão
entre a variação em y e a variação em x, isto é, a diferença entre y0 e y1 dividida
pela diferença entre x0 e x1 .
Portanto, valor m representa a inclinação da reta que conecta (x0 , y0 ) e (x1 , y1 ), sendo
exatamente igual à diferença dividida de ordem 1, como descrito pela Equação 14.2:
1.2
f (x)
(x0 , f (x0 ))
f [x1 , x0 ] 0.8
0.5
(x1 , f (x1 ))
f [x2 , x1 ]
x
−0.95 −0.7 −0.5
f [x3 , x2 , x1 ] − f [x2 , x1 , x0 ]
f [x3 , x2 , x1 , x0 ] =
x3 − x0
f (x)
1.2
1
(x0 , f (x0 ))
f [x1 , x0 ]
0.8
(x1 , f (x1 ))
f [x2 , x1 ]
0.5
(x2 , f (x2 ))
f [x3 , x2 ]
0.2
(x3 , f (x3 ))
x
−1 −0.85 −0.65 −0.4
f [x1 ] − f [x0 ]
f [x1 , x0 ] = (14.7)
x1 − x0
f [x2 , x1 ] − f [x1 , x0 ]
f [x2 , x1 , x0 ] = (14.8)
x2 − x0
f [x3 , x2 , x1 ] − f [x2 , x1 , x0 ]
f [x3 , x2 , x1 , x0 ] = (14.9)
x3 − x0
f [x4 , x3 , x2 , x1 ] − f [x3 , x2 , x1 , x0 ]
f [x4 , x3 , x2 , x1 , x0 ] = (14.10)
x4 − x0
Tabela 14.2: Tabela de diferenças divididas para um conjunto de dados com seis pontos.
forma geral do polinômio interpolador de Newton com diferenças divididas. Esse polinômio
pode ser representado de forma compacta pela seguinte expressão:
n
X i−1
Y
pn (x) = f [x0 ] + f [xi , xi−1 , . . . , x0 ] (x − xj ) (14.11)
i=1 j=0
Cada termo adicionado ao polinômio aumenta seu grau e incorpora mais informações
sobre o comportamento da função. Essa estrutura permite construir o polinômio progressi-
vamente, sem necessidade de recalcular tudo ao incluir um novo ponto. A Equação 14.12
mostra a forma expandida da Equação 14.11, evidenciando a contribuição de cada termo
individualmente:
p(x) = f [x0 ]
+ f [x1 , x0 ](x − x0 )
+ f [x2 , x1 , x0 ](x − x0 )(x − x1 )
+ f [x3 , x2 , x1 , x0 ](x − x0 )(x − x1 )(x − x2 )
+ f [xn , . . . , x3 , x2 , x1 , x0 ](x − x0 )(x − x1 )(x − x2 ) . . . (x − xn ) (14.12)
Um aspecto importante é que o método de Newton não exige que os pontos estejam
igualmente espaçados, o que o torna bastante flexível. Além disso, as diferenças divididas
são calculadas de forma recursiva: cada diferença de ordem superior depende apenas das
de ordem imediatamente inferior.
f (x)
0.4
0.2
x
−1.2 −1 −0.8 −0.6 −0.4 −0.2 0.2 0.4 0.6 0.8 1 1.2
−0.2
sin(5x)
f (x) = 1+25x2
−0.4
Pontos discretos
Função interpolada
sin(5x)
Figura 14.4: Comparação entre a função original f (x) = 1+25x 2 (linha azul), os pontos
discretos utilizados na interpolação de Newton (marcadores vermelhos) e a função
interpolada resultante (linha vermelha tracejada).
f (x)
0.4
0.2
x
−1.2 −1 −0.8 −0.6 −0.4 −0.2 0.2 0.4 0.6 0.8 1 1.2
−0.2
sin(5x)
f (x) = 1+25x2
−0.4
Pontos discretos
Erro absoluto
sin(5x)
Figura 14.5: Gráfico da função original f (x) = 1+25x 2 (linha azul), com os pontos discretos
usados na interpolação (pontos vermelhos) e a curva do erro absoluto (linha laranja
tracejada).
14.8 Interpolação de Newton 183
Provas Anteriores: 4
[Prova 2024.2] - Seja a função f (x) tabelada abaixo, Use o Polinômio Interpolador de Newton
para obter a aproximação em x = 0
x −2 −1 1 2
f (x) 1 0 −1 3
−2 f [x0 ]
−1 f [x1 ] f [x1 , x0 ]
1 f [x2 ] f [x2 , x1 ] f [x2 , x1 , x0 ]
2 f [x3 ] f [x3 , x2 ] f [x3 , x2 , x1 ] f [x3 , x2 , x1 , x0 ]
0−1 −1
f [x1 , x0 ] = = = −1
−1 − (−2) 1
−1 − 0 −1
f [x2 , x1 ] = = = −0.5
1 − (−1) 2
3 − (−1) 4
f [x3 , x2 ] = = =4
2−1 1
−0.5 − (−1) 0.5
f [x2 , x1 , x0 ] = = ≈ 0.1667
1 − (−2) 3
4 − (−0.5) 4.5
f [x3 , x2 , x1 ] = = = 1.5
2 − (−1) 3
1.5 − 0.1667 1.3333
f [x3 , x2 , x1 , x0 ] = = ≈ 0.3333
2 − (−2) 4
Assim, considerando x = 0 e aplicando a Equação 14.11 da forma geral do polinômio interpolador
de Newton:
p(x) = f [x0 ]
+ f [x1 , x0 ](x − x0 )
+ f [x2 , x1 , x0 ](x − x0 )(x − x1 )
+ f [x3 , x2 , x1 , x0 ](x − x0 )(x − x1 )(x − x2 )
p(x) = 1
+ −1(0 − (−2))
+ 0.1666(0 − (−2))(0 − (−1))
+ 0.3333(0 − (−2))(0 − (−1))(0 − 1)
≈ −1.3333 . . .
Esse polinômio é expresso como uma combinação linear de funções base conhecidas como
polinômios de Lagrange, os quais são definidos de forma a valer 1 em um ponto xi e 0 nos
demais. Uma das principais vantagens do método de Lagrange é que ele fornece uma forma
fechada e direta para o polinômio interpolador, sem a necessidade de cálculo de diferenças
divididas, como ocorre no método de Newton.
Apesar de ser matematicamente elegante e conceitualmente simples, a interpolação de
Lagrange pode apresentar limitações práticas quando aplicada a um grande número de
pontos, especialmente se eles forem equidistantes, devido à possibilidade de surgimento de
oscilações indesejadas (fenômeno de Runge). Ainda assim, é uma ferramenta fundamental
na teoria da aproximação de funções e serve de base para diversos métodos numéricos mais
avançados.
O polinômio interpolador de Lagrange é uma combinação linear de funções base
projetadas especificamente para passar por um conjunto de pontos dados. Ele é definido
por:
n
X
P (x) = yi · Li (x) (14.14)
i=0
onde yi = f (xi ) são os valores da função nos pontos de interpolação, e Li (x) são os
polinômios básicos de Lagrange, responsáveis por construir a base da interpolação. Cada
Li (x) atua como um peso seletivo que isola o valor yi , assumindo o valor 1 no ponto xi
e 0 em todos os outros pontos xj com j ̸= i. Essa característica garante que o polinômio
interpolador passe exatamente por todos os pontos dados. A forma geral de cada Li (x) é
dada por:
n
Y x − xj
Li (x) = (14.15)
j=0
xi − xj
j̸=i
Cada polinômio Li (x) é construído de modo que assuma o valor 1 no ponto xi e zero
em todos os demais pontos xj , com j ̸= i. Em outras palavras:
1, se i = j
Li (xj ) = (14.16)
0, se i ̸= j
onde cada Li (x) é um polinômio de grau três. Os polinômios básicos de Lagrange para os
quatro pontos são definidos por:
(x − x1 )(x − x2 )(x − x3 )
L0 (x) =
(x0 − x1 )(x0 − x2 )(x0 − x3 )
(x − x0 )(x − x2 )(x − x3 )
L1 (x) =
(x1 − x0 )(x1 − x2 )(x1 − x3 )
(x − x0 )(x − x1 )(x − x3 )
L2 (x) =
(x2 − x0 )(x2 − x1 )(x2 − x3 )
(x − x0 )(x − x1 )(x − x2 )
L3 (x) = (14.18)
(x3 − x0 )(x3 − x1 )(x3 − x2 )
Essas frações polinomiais garantem que, ao multiplicarmos cada Li (x) pelo respectivo
valor yi , o termo resultante contribua apenas na posição correta, construindo assim um
polinômio P (x) que satisfaz a condição de interpolar os dados.
Substituindo explicitamente os polinômios básicos na expressão geral, obtemos a forma
completa de P (x):
(x − x1 )(x − x2 )(x − x3 )
P (x) = y0 ·
(x0 − x1 )(x0 − x2 )(x0 − x3 )
(x − x0 )(x − x2 )(x − x3 )
+ y1 ·
(x1 − x0 )(x1 − x2 )(x1 − x3 )
(x − x0 )(x − x1 )(x − x3 )
+ y2 ·
(x2 − x0 )(x2 − x1 )(x2 − x3 )
(x − x0 )(x − x1 )(x − x2 )
+ y3 · (14.19)
(x3 − x0 )(x3 − x1 )(x3 − x2 )
Essa forma analítica permite não apenas estimar o valor de P (x) para qualquer ponto
x, mas também visualizar a contribuição de cada ponto original para o valor final do
polinômio. Além disso, o método de Lagrange tem a vantagem de ser fácil de implementar
e compreender, embora o cálculo do polinômio completo possa se tornar custoso para
grandes conjuntos de dados.
186 Capítulo 14. Interpolação
Provas Anteriores: 5
[Prova 2024.2] - Seja a função f (x) tabelada abaixo, Use o Polinômio Interpolador de Lagrange
para obter a aproximação em x = 0
x −2 −1 1 2
f (x) 1 0 −1 3
Solução: Aplicando aos pontos dados (−2, 1), (−1, 0), (1, −1), (2, 3), temos:
= −1.33333
Resposta final:
f (0) ≈ −1.33333
14.9 Interpolação de Lagrange 187
1. Use o polinômio interpoladores de Newton para determinar 8. A temperatura no interior de uma parede foi registrada
y em x = 3.5 para a melhor precisão possível. Calcule as para diferentes profundidades. Estime a temperatura em
diferenças divididas finitas e ordene seus pontos para obter x = 7 cm.
acurácia e convergência ótimas; ou seja, os pontos devem
Profundidade (cm) 0 5 10
ser centrados em torno e tão próximo quanto possível do
valor desconhecido. Temperatura (◦ C) 28 23 18
3. Você mediu a queda de tensão V através de um resistor para 11. Em uma análise de engenharia ambiental, a concentração
diversos valores diferentes de corrente i. Os resultados são de um gás poluente no ar foi medida em diferentes alturas.
mostrados na tabela abaixo. Use interpolação polinomial de Use o método de Newton para estimar a concentração em
quarto grau para fazer uma estimativa da queda de tensão h = 22 m e plote o gráfico do polinômio interpolador com os
para i = 1.15. pontos.
4. A aceleração da gravidade a uma altitude y acima da su- 12. O rendimento de uma reação enzimática foi tabelado para
perfície da Terra é dada na tabela abaixo. Calcule g em diferentes temperaturas. Use o polinômio de Lagrange para
y = 55000m. estimar o rendimento em T = 33◦ C e plote o gráfico.
5. A economia de um carro (km/litro) varia com sua veloci- 13. Um sensor de pressão apresentou leituras em diferentes pro-
dade. Em um experimento, são feitas as cinco medições a fundidades. Use o método de Newton para estimar a pressão
seguir: para z = 3, 5 m e plote o gráfico do polinômio interpolador.
Concentração (mol/L) 0,1 0,5 1,0 Concentração (mol/L) 0,2 0,4 0,6
pH 1,0 0,5 0,0 Tempo (s) 75 51 39
188 Capítulo 14. Interpolação
1. Uma ponte de aço sofre deformação térmica devido à varia- ω (rad/s) 100 200 300
ção de temperatura. Os dados experimentais são apresenta-
Torque (Nm) 35 47 55
dos na tabela. Use a interpolação de Newton para estimar
o comprimento da ponte em T = 40◦ C.
9. A deflexão de uma viga sob carga foi registrada para dife-
Temperatura (◦ C) 10 30 50 rentes posições, conforme a tabela. Estime a deflexão para
x = 5 m.
Comprimento (m) 100,00 100,12 100,26
Posição (m) 0 2 4 6
2. O consumo de energia de um motor foi registrado nas rota-
Deflexão (mm) 0 5 15 28
ções apresentadas na tabela. Estime, pela interpolação de
Newton, a potência para n = 1500 rpm.
10. Uma célula solar foi testada para diferentes intensidades
Rotação (rpm) 900 1200 1800 de luz. Use interpolação de Newton para estimar a tensão
gerada sob I = 600 W/m2 .
Potência (kW) 4,2 5,0 7,5
Intensidade (W/m2 ) 200 500 800
3. Em um ensaio de solos, foram obtidos os valores de resis-
tência ao cisalhamento para diferentes umidades conforme a Tensão (V) 0,45 0,50 0,53
tabela. Estime a resistência para uma umidade de w = 25%
usando interpolação de Newton. 11. O tempo de meia-vida de uma reação química foi regis-
trado em diferentes temperaturas. Estime, pelo método de
Umidade (%) 10 20 30 Newton, o tempo de meia-vida para T = 25◦ C.
Resistência (kPa) 22 18 13
Temperatura (◦ C) 10 20 40
4. O rendimento de um reator químico foi registrado para dife- t1/2 (min) 30 20 10
rentes temperaturas, conforme a tabela. Use interpolação
de Newton para estimar o rendimento em T = 175◦ C. 12. Em um processo de usinagem, a força de corte foi medida
◦ para diferentes avanços. Estime, via Newton, a força para
Temperatura ( C) 50 100 150 200
f = 0, 25 mm/volta.
Rendimento (%) 65 75 80 78
Avanço (mm/volta) 0,10 0,20 0,30
5. O coeficiente de arrasto CD de uma esfera em água foi tabe- Força (N) 200 250 320
lado para diferentes números de Reynolds. Use interpolação
de Newton para estimar CD em Re = 5 000. 13. A absorção de contaminantes por carvão ativado foi me-
Re 1,0 × 10 2
1,0 × 10 3
1,0 × 10 4 dida em diferentes concentrações. Estime a capacidade de
adsorção para C = 8 mg/L.
CD 1,20 0,47 0,25
Concentração (mg/L) 2 6 10
6. Para um material polimérico, as deformações observadas
Adsorção (mg/g) 1,1 2,0 2,6
para diferentes tensões estão na tabela. Calcule, por inter-
polação de Newton, a deformação para σ = 30 MPa.
14. A velocidade de sedimentação de partículas foi medida para
Tensão (MPa) 0 20 40 diferentes diâmetros. Calcule, por Newton, a velocidade
para d = 0, 05 mm.
Deformação 0,000 0,015 0,030
Diâmetro (mm) 0,01 0,03 0,07
7. O nível de poluentes em um rio foi monitorado nos instantes
abaixo. Estime, usando Newton, a concentração em t = 4 h. Velocidade (mm/s) 0,08 0,24 0,52
Tempo (h) 0 3 6 15. A eficiência de uma turbina eólica foi registrada para dife-
Concentração (mg/L) 1,5 1,1 0,9 rentes velocidades de vento. Estime, pela interpolação de
Newton, a eficiência para v = 10 m/s.
8. O torque transmitido por um eixo foi medido nas veloci-
Velocidade (m/s) 4 8 12
dades angulares apresentadas. Estime, via interpolação de
Newton, o torque para ω = 250 rad/s. Eficiência (%) 22 29 34
14.9 Interpolação de Lagrange 189
1. O coeficiente de expansão térmica de um metal foi medido Temperatura (◦ C) 100 200 400 600
em várias temperaturas. Use o polinômio interpolador de
E (GPa) 200 192 180 150
Lagrange para estimar o coeficiente em T = 250◦ C e plote o
gráfico do polinômio junto aos pontos experimentais.
9. O teor de umidade de uma amostra de solo foi registrado em
Temperatura (◦ C) 100 200 300 400 várias profundidades. Use Lagrange para estimar a umidade
Expansão (10−6 /ºC) 12,1 13,0 14,2 15,9 em x = 0, 35 m e plote o gráfico.
4. Uma viga de concreto foi submetida a diferentes cargas e Vazão (L/s) 400 600 800 1000
as flechas foram registradas. Use Lagrange para estimar a Potência (kW) 130 180 255 340
flecha para F = 60 kN e plote o gráfico do polinômio e dos
dados.
12. A altura de uma coluna de líquido foi registrada ao longo do
Carga (kN) 20 40 80 tempo. Use Lagrange para estimar a altura em t = 12 min e
plote o gráfico.
Flecha (mm) 0,9 2,7 6,5
Tempo (min) 0 10 20
5. A concentração de poluente em um lago foi monitorada
em diferentes horas do dia. Use Lagrange para estimar a Altura (cm) 100 65 42
concentração às 16 h e plote o gráfico do polinômio e dos
dados. 13. O consumo de energia de um equipamento foi monitorado ao
Hora (h) 8 12 18 22 longo de três meses. Use Lagrange para estimar o consumo
no 2º mês e plote o gráfico.
Concentração (mg/L) 0,20 0,27 0,18 0,14
Mês 1 3 4
6. O rendimento de uma reação química foi registrado para
diferentes concentrações de reagente. Use Lagrange para Consumo (kWh) 430 512 610
estimar o rendimento para C = 0, 45 mol/L e plote o gráfico
do polinômio e dos dados. 14. O teor de oxigênio dissolvido em um tanque de aeração
foi medido em diferentes velocidades de agitação. Use o
Concentração (mol/L) 0,2 0,4 0,6
polinômio de Lagrange para estimar o teor em v = 45 rpm e
Rendimento (%) 68 74 79 plote o gráfico.
Rotação (rpm) 1200 1800 2400 15. A pressão em um tubo foi medida em diferentes distâncias
3 da bomba. Use Lagrange para estimar a pressão em d = 17 m
Vazão (m /h) 20 31 52
e plote o gráfico do polinômio e dos pontos experimentais.
8. O módulo de elasticidade de um material foi tabelado para
Distância (m) 0 10 20
diferentes temperaturas. Use Lagrange para estimar E em
T = 350◦ C e plote o gráfico. Pressão (kPa) 90 82 74
15. Sistemas de Equações Lineares e Matrizes
1
a11 x1 + a12 x2 + a13 x3 + a14 x4 = b1 x1 = (b1 − a12 x2 − a13 x3 − a14 x4 )
a11
1
a21 x1 + a22 x2 + a23 x3 + a24 x4 = b2 x2 = (b2 − a21 x1 − a23 x3 − a24 x4 )
a22
1
a31 x1 + a32 x2 + a33 x3 + a34 x4 = b3 x3 = (b3 − a31 x1 − a32 x2 − a34 x4 )
a33
1
a41 x1 + a42 x2 + a43 x3 + a44 x4 = b4 x4 = (b4 − a41 x1 − a42 x2 − a43 x3 )
a44
O método iterativo para resolução de sistemas lineares começa com a escolha de valores
iniciais para todas as incógnitas. Esses valores formam a primeira estimativa da solução.
Na primeira iteração, essa estimativa inicial é substituída no lado direito das equações,
permitindo o cálculo de uma nova estimativa, chamada segunda solução estimada.
Na segunda iteração, os novos valores obtidos são novamente substituídos no sistema,
resultando na terceira estimativa, e assim por diante. Esse processo é repetido até que
as estimativas sucessivas se tornem suficientemente próximas umas das outras. Quando
isso ocorre, dizemos que o método convergiu, e a estimativa obtida é considerada uma
aproximação da solução real do sistema.
192 Capítulo 15. Sistemas de Equações Lineares
(0)
Com essas estimativas iniciais xj , calculamos a primeira estimativa da solução,
(1) (1) (1) (1)
x1 , x2 , x3 , . . . , xn , substituindo os valores da estimativa inicial no lado direito da
Equação (15.4). Assim, temos:
n
(1) 1 X
bi − (0)
xi = aij · xj i = 1, 2, . . . , n (15.4)
aii
j=1
j̸=i
Esse processo é repetido a cada nova iteração. De forma geral, a estimativa da (k + 1)-
ésima iteração para cada incógnita é calculada com base nos valores obtidos na k-ésima
iteração. O critério de parada do método pode ser definido de modo que as iterações
sejam interrompidas quando as estimativas deixarem de apresentar variações significativas.
Assim, podemos definir o critério de parada de acordo com a Equação(15.6)
(k+1) (k)
xi − xi <ε para i = 1, 2, . . . , n (15.6)
Para que o método de Jacobi seja aplicável, é necessário que o sistema linear
seja quadrado, ou seja, que o número de equações seja igual ao número de
incógnitas. Sistemas não quadrados, com mais equações do que incógnitas ou vice-versa,
não são compatíveis com a formulação clássica do método, pois não permitem a atualização
simultânea de todas as variáveis a partir de equações independentes.
15.2 Método de Jacobi 193
Exemplo: 7
Exercício: Resolva o seguinte sistema linear usando o método de Jacobi.
10x1 + 2x2 + x3 = 9
Iteração: k = 0
(0)
Definimos a aproximação inicial xi = 0 para i = 1, 2, . . . , n.
(0) (0) (0)
x1 = 0, x2 = 0, x3 = 0
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
(1) 1
x1 = 9 − (2 · 0) + (1 · 0)
= 0.9000
10
(1) 1
x2 = − 44 − (2 · 0) + (−2 · 0) = −2.2000
20
(1) 1
x3 = 22 − (−2 · 0) + (3 · 0) = 2.2000
10
Iteração: k = 1
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
1
(2)
x1 = 9 − (2 · −2.2) + (1 · 2.2) = 1.1200
10
(2) 1
x2 = − 44 − (2 · 0.9) + (−2 · 2.2) = −2.0700
20
(2) 1
x3 = 22 − (−2 · 0.9) + (3 · −2.2) = 3.0400
10
Iteração: k = 2
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
1
(3)
x1 = 9 − (2 · −2.07) + (1 · 3.04) = 1.0100
10
(3) 1
x2 = − 44 − (2 · 1.12) + (−2 · 3.04) = −2.0080
20
(3) 1
x3 = 22 − (−2 · 1.12) + (3 · −2.07) = 3.0450
10
O processo continua até que o erro relativo seja inferior ε = 10−4 .
Iteração x1 x2 x3
k = 0 0.00000 0.00000 0.00000
k = 1 0.90000 -2.20000 2.20000
k = 2 1.12000 -2.07000 3.04000
k = 3 1.01000 -2.00800 3.04500
k = 4 0.99710 -1.99650 3.00440
k = 5 0.99886 -1.99927 2.99837
k = 6 1.00002 -2.00005 2.99955
k = 7 1.00005 -2.00005 3.00002
k = 8 1.00001 -2.00000 3.00002
k = 9 1.00000 -2.00000 3.00000
194 Capítulo 15. Sistemas de Equações Lineares
(0) (0)
x1 = x2 = · · · = x(0)
n =0 (15.7)
(k+1)
Note que os valores xj com j < i já foram atualizados dentro da mesma iteração,
(k)
enquanto os valores xj
com j > i ainda pertencem à iteração anterior. Essa utilização
imediata dos valores mais recentes é o que torna o Gauss-Seidel, em geral, mais eficiente
que o Jacobi.
Para o caso de quatro variáveis, a forma expandida da Equação (15.8) é:
Assim como no método de Jacobi, o processo iterativo continua até que a diferença
entre as estimativas obtidas em duas iterações consecutivas seja suficientemente pequena.
O critério de parada pode ser estabelecido pelo erro relativo, conforme a Equação (15.6),
previamente apresentada.
O método de Gauss-Seidel tende a convergir mais rapidamente do que o método de
Jacobi, especialmente quando a matriz A é diagonal dominante ou simétrica definida
positiva. No entanto, assim como outros métodos iterativos, sua convergência não é
garantida em todos os casos. Por isso, é importante verificar as condições do sistema antes
de aplicar o método.
15.3 Método de Gauss-Seidel 195
Exemplo: 8
Exercício: Resolva o seguinte sistema linear usando o método de Gauss-Seidel.
10x1 + 2x2 + x3 = 9
Iteração: k = 0
(0)
Definimos a aproximação inicial xi = 0 para i = 1, 2, . . . , n.
(0) (0) (0)
x1 = 0, x2 = 0, x3 = 0
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
(1) 1
x1 = 9 − (2 · 0) + (1 · 0)
= 0.9000
10
(1) 1
x2 = − 44 − (2 · 0.9) + (−2 · 0) = −2.2900
20
(1) 1
x3 = 22 − (−2 · 0.9) + (3 · −2.29) = 3.0670
10
Iteração: k = 1
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
(2) 1
x1 = 9 − (2 · −2.29) + (1 · 3.067) = 1.0513
10
(2) 1
x2 = − 44 − (2 · 1.0513) + (−2 · 3.067) = −1.99843
20
(2) 1
x3 = 22 − (−2 · 1.0513) + (3 · −1.99843) = 3.00979
10
Iteração: k = 2
(k+1)
Atualizamos os valores de xi para i = 1, 2, . . . , n.
(3)1
x1 = 9 − (2 · −1.99843) + (1 · 3.00979) = 0.99871
10
(3) 1
x2 = − 44 − (2 · 0.99871) + (−2 · 3.00979) = −1.99889
20
(3) 1
x3 = 22 − (−2 · 0.99871) + (3 · −1.99889) = 2.99941
10
O processo continua até que o erro relativo seja inferior ε = 10−4 .
1. Resolva o seguinte sistema linear utilizando o método de 6. O cálculo de correntes em um circuito elétrico resulta no
Jacobi até a terceira iteração. sistema:
Realize as iterações até que o erro médio entre duas iterações 10. Resolva o sistema linear abaixo pelo método de Jacobi:
consecutivas seja inferior a ε = 10−3 , utilizando Equação:
9x1 + x2 + x3 = 10
Pn (k+1) (k)
i=1 |xi − xi |
2x1 + 12x2 − x3 = 20
<ε
n
x1 − 2x2 + 15x3 = 30
15.3 Método de Gauss-Seidel 197
1. Em um modelo de distribuição de temperatura, as variá- 6. Resolva pelo método de Gauss-Seidel o seguinte sistema de
veis T1 , T2 e T3 obedecem ao sistema: correntes elétricas:
4. Resolva numericamente o sistema associado à transferência 9. Resolva numericamente o sistema derivado da discretização
de calor em uma barra metálica: de uma viga engastada:
4T1 − T2 = 100 (15.17) 20x1 − 4x2 = 10 (15.33)
−T1 + 4T2 − T3 = 200 (15.18) −4x1 + 20x2 − 4x3 = 0 (15.34)
−T2 + 4T3 = 300 (15.19) −4x2 + 20x3 = 5 (15.35)
5. Resolva manualmente até k = 4 o sistema: 10. Resolva o sistema abaixo pelo método de Gauss-Seidel até
15x1 + x2 − x3 = 20 (15.20) convergência com 4 casas decimais:
9x1 + x2 + x3 = 10 (15.36)
x1 + 12x2 + 2x3 = 33 (15.21)
2x1 + 12x2 − x3 = 20 (15.37)
−2x1 + x2 + 10x3 = −7 (15.22)
x1 − 2x2 + 15x3 = 30 (15.38)
198 Capítulo 15. Sistemas de Equações Lineares
36.
16. Integração Numérica
16.1 Introdução
A operação de integração desempenha um papel fundamental na formulação e solução de
problemas em diversas áreas da engenharia, física, estatística e outras ciências aplicadas.
Ela está presente no cálculo de áreas, volumes, centros de massa, trabalho, energia, e
também na resolução de equações diferenciais.
Em muitos casos, a integração analítica, ou seja, a obtenção de uma solução exata por
meio de técnicas de cálculo simbólico, pode ser muito difícil ou até mesmo impossível. Nessas
situações, recorre-se aos métodos numéricos de integração para obter aproximações
da integral definida com a precisão desejada. Diversas circunstâncias justificam a adoção
de métodos numéricos:
2
• Funções sem antiderivada elementar: Algumas funções, como f (x) = e−x ,
não possuem uma antiderivada expressável em termos de funções elementares. Isso
impede a obtenção de uma solução exata via cálculo simbólico, tornando necessário
o uso de técnicas numéricas.
• Funções definidas por dados experimentais: Em muitas aplicações práticas,
especialmente na engenharia e na física experimental, a função que se deseja integrar
é conhecida apenas por um conjunto de dados tabulados, provenientes de medições
ou simulações computacionais. Nesses casos, a função subjacente não possui uma
expressão analítica, e a integração precisa ser feita numericamente.
• Modelagem computacional e grandes volumes de dados: Em contextos como
aprendizado de máquina, otimização e análise estatística de grandes bases de dados,
integrais definidas frequentemente aparecem em expressões envolvendo funções de
custo, estimativas de probabilidade e distribuições estatísticas. A complexidade ou o
tamanho dessas funções torna o uso de integração numérica indispensável.
• Integrais multidimensionais: Quando a integral envolve múltiplas variáveis (como
integrais duplas, triplas ou integrais de volume), a dificuldade do processo analítico
cresce significativamente, e métodos numéricos, como quadratura múltipla ou Monte
Carlo, tornam-se ferramentas fundamentais.
200 Capítulo 16. Integração Numérica
16.2 Fundamentos
A integração numérica tem como objetivo estimar o valor de uma integral definida, ou
seja, calcular numericamente a área sob a curva de uma função f (x) no intervalo [a, b].
Esse valor é representado por:
Z b
I(f ) = f (x) dx (16.1)
a
3
f (x)
2
b f (x)
1 A
x
1 2 3 4 5 6 7 8 9
Quando a função f (x) possui uma expressão analítica conhecida, podemos aplicar
métodos numéricos que avaliam a função em um número finito de pontos para obter uma
aproximação da integral. Uma abordagem simples seria considerar apenas os valores da
função nas extremidades do intervalo, ou seja, os pares (a, f (a)) e (b, f (b)). No entanto,
essa estratégia pode levar a erros significativos quando: (i) o intervalo [a, b] é relativamente
grande ou (ii) a função f (x) apresenta variações acentuadas ao longo do intervalo.
Para melhorar a precisão, uma estratégia comum é dividir o intervalo [a, b] em subinter-
valos menores e aplicar a regra de integração em cada um deles. Os resultados parciais são
então somados para fornecer uma estimativa mais precisa da integral. Esse procedimento é
conhecido como método composto.
Em algumas aplicações práticas, a função f (x) não é conhecida por uma equação, mas
por um conjunto de valores obtidos experimentalmente (dados tabulados). Nesses casos, a
integração numérica deve ser feita diretamente sobre os pontos disponíveis. Assim:
• Se f (x) for conhecida analiticamente, os pontos de amostragem podem ser escolhidos
pelo usuário ou definidos pelo próprio método numérico;
• Se f (x) for conhecida apenas por dados tabelados, os pontos são fixos e não podem
ser alterados.
Em todos os casos, a ideia central consiste em deduzir uma fórmula que permita
calcular uma boa aproximação da integral com base em valores discretos da função. Entre
os métodos mais conhecidos e aplicados estão o método dos retângulos, o método dos
trapézios e a regra de Simpson.
16.3 Fórmulas de Integração de Newton-Cotes 201
f (x)
a
2
b f (x)
1 A
x
1 2 3 4 5 6 7 8 9
f (x) x0 = a x1
2 x2 x3 = b
f (x)
1 A2 A1 A3
x
1 2 3 4 5 6 7 8 9
f (x)
h
3
2
b f (x)
1 A
x
1 2 3 4 5 6 7 8 9
Exemplo: 9
Calcule a Integral pelo método dos trapézios usando uma única reta.
3.6
1
Z
I= dx (16.5)
3 x
Pelo método dos trapézios:
0.6 1 1
h
A = f (xa ) + f (xb ) = + = 0.18333
2 2 3 3.6
Pelo cálculo integral:
3.6
1
Z
dx = ln(3.6) − ln(3) = 0.18232
3 x
f (x) x2
h
6 x1 x3
4 x0 = a x4
x5
2
x6 = b
A1 A2 A3 A4 A5 A6
x
0
0 1 2 3 4 5 6 7 8
A integral ao longo do intervalo completo pode ser escrita como a soma das integrais
dos subintervalos:
Z b
A(f ) = f (x)dx
a
Z x1 Z x2 Z xi +1 Z xn
= f (x)dx + f (x)dx + · · · + f (x)dx + · · · + f (x)dx
x0 =a x1 xi xn−1
n−1
X Z xi+1
= f (x) (16.6)
i=0 xi
204 Capítulo 16. Integração Numérica
Aplicando o método do trapézio (Equação 16.4) a cada subintervalo [xi , xi+1 ] da partição
do intervalo [a, b], obtemos uma aproximação local da integral da função f (x) nesse trecho.
A fórmula trapezoidal aproxima a área sob a curva como a área de um trapézio, cuja base
é dada por (xi+1 − xi ) e as alturas são os valores da função nos extremos do subintervalo,
isto é, f (xi ) e f (xi+1 ):
hh i
≈ f (xa ) + f (xb )
2
Z xi+1
(xi+1 − xi ) h i
f (x) dx ≈ f (xi ) + f (xi+1 ) (16.7)
xi 2
Substituindo essa expressão aproximada para cada subintervalo na soma das integrais
parciais (conforme Equação 16.6), obtemos a fórmula geral do método dos trapézios
composto:
n−1
X (xi+1 − xi )
A(f ) ≈ [f (xi ) + f (xi+1 )] (16.8)
i=0
2
A Equação 16.8 representa a fórmula geral do método dos trapézios composto. Note
que os subintervalos [xi , xi+1 ] não precisam ter a mesma largura; ou seja, o método é
aplicável mesmo com subintervalos desiguais. No entanto, se todos os subintervalos forem
de mesmo comprimento, temos:
h n−1
Xh i
I(f ) ≈ f (xi ) + f (xi+1 ) (16.10)
2 i=0
n−1
" ! #
h X
I(f ) ≈ f (xa ) + 2f (xi ) + f (xb ) (16.12)
2 i=1
A Equação 16.12 constitui a forma final e otimizada do método dos trapézios composto
para o caso de subintervalos igualmente espaçados.
16.5 Método dos Trapezios Composto 205
Exemplo: 10
Calcule a aproximação da seguinte integral 16.13 usando a regra dos trapezios com 3 e 11 pontos.
Z 1
x3 dx (16.13)
0
≈ 0.3125 (16.14)
f (x) 0 0.001 0.008 0.027 0.064 0.125 0.216 0.343 0.512 0.729 1
≈ 0.2525 (16.15)
R1
Considerando que a integral de 0
x3 dx = 0.25, os erros absoluto e relativo, respectivamente, são:
0.0025 e 0.0100.
206 Capítulo 16. Integração Numérica
2.5
1.5
0.5
2.5
1.5
0.5
p(x) = f (x0 )L0 (x) + f (x1 )L1 (x) + f (x2 )L2 (x) (16.16)
onde:
(x − x1 )(x − x2 ) (x − x0 )(x − x2 ) (x − x0 )(x − x1 )
L0 (x) = L1 (x) = L2 (x) =
(x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 ) (x2 − x0 )(x2 − x1 )
Assim, a integral aproximada da regra de Simpson é:
Z x2 Z x2
f (x)dx ≈ p(x)dx
x0 x0
Considerando que os pontos são pontos igualmente espaçados entre f (a) e f (b):
x1 = x0 + h
x2 = x0 + 2h = x1 + h (16.18)
Z x2
hh i
p(x)dx ≈ f (x0 ) + 4 · f (x1 ) + f (x2 ) (16.19)
x0 3
para esse caso, h = (b − a)/2. Essa equação é conhecida como a regra 1/3 de Simpson. A
designação 1/3 vem do fato que h está dividido por 3 na Equação 16.19.
208 Capítulo 16. Integração Numérica
n−2 n−3
Z b " #
h X X
f (x) dx ≈ f (x0 ) + 4 f (xi ) + 2 f (xi ) + f (xn−1 ) (16.21)
a 3 i=1 i=2
i ímpar i par
onde:
• f (x0 ) e f (xn−1 ) são os valores nos extremos do intervalo;
• os pontos de índice ímpar (excluindo os extremos) recebem peso 4;
• os pontos de índice par (excluindo os extremos) recebem peso 2.
y
2
2 4 4
2 2
1.5 4 4
bloco 2 (2 h)
1 1
1
0.5 bloco 1 (2 h)
x
0.5 1 1.5 2 2.5 3
Exemplo: 11
Calcule a aproximação da seguinte integral 16.19 usando a regra de Simpson 1/3 com 3 e 9 pontos.
Z 1
x3 dx
0
x 0 0.5 1
f (x) 0 0.125 1
≈ 0.25
Aplicando a fórmula composta (com i ímpares: pesos 4; i pares internos: pesos 2):
7 6
h
h X X i
I(f ) ≈ f (x0 ) + 4 f (xi ) + 2 f (xi ) + f (x8 )
3
i=1 i=2
i ímpar i par
0.12500
h
= 0 + 4(0.00195 + 0.05273 + 0.24414 + 0.66992)
3 i
+2(0.01562 + 0.12500 + 0.42188) + 1
0.12500
h i
= 4(0.96874) + 2(0.56250) + 1
3
0.12500
= (5.99996) ≈ 0.25000.
3
Z 1
Observação: o valor exato de x3 dx é 1
4 = 0.25000, portanto a aproximação coincide com o
0
valor exato neste caso.
210 Capítulo 16. Integração Numérica
R2
15. Calcule a integral 0 sin(x2 ) dx com n = 50 trapézios. Essa
1. Use o método dos trapézios para aproximar a integral de- integral não tem solução elementar.
finida da função f (x) = x2 no intervalo [0, 2] com n = 4 R3 x2
subintervalos. 16. Calcule 0
e− 2 dx numericamente pelo método dos trapé-
zios.
2. Implemente em Python uma função que calcule a integral
definida de f (x) = sin(x) no intervalo [0, π] usando o método 17. Implemente em Python uma função que calcule a integral
Rb
dos trapézios. Teste com n = 10. f (x) dx via trapézios e compare os resultados para dife-
a
3. Calcule numericamente a integral da função f (x) = ex em rentes n com o valor exato, para f (x) = x3 em [0, 2].
[0, 1] com n = 5 usando o método dos trapézios. Compare o 18. Use o método dos trapézios para calcular a integral
resultado com a solução analítica e − 1. R π/4
0
tan(x) dx. Compare com o valor exato ln(cos(0)) −
4. A corrente elétrica em um circuito varia com o tempo se- ln(cos(π/4)).
gundo i(t) = 5te−t . Calcule numericamente a carga total R4
transferida no intervalo [0, 5] usando o método dos trapézios 19. Calcule a integral 0 f (x) dx usando o método dos trapé-
com n = 20. zios para a função dada pelos seguintes pontos tabelados
uniformemente espaçados: (0, 2), (1, 3), (2, 5), (3, 4), (4, 2).
5. Implemente em Python uma rotina que calcule a integral
R 10 20. A velocidade v(t) (em m/s) de um veículo foi medida a cada 2
cos(x2 ) dx pelo método dos trapézios. Essa integral não
0 segundos, resultando na seguinte tabela: t = [0, 4, 7, 8, 10, 15]
tem solução analítica elementar.
√ e v = [0, 15, 20, 22, 18, 0]. Estime a distância total percorrida
6. Um reservatório possui seção transversal descrita por y = x em metros usando o método dos trapézios.
no intervalo [0, 4]. Calcule a área da seção utilizando o mé-
21. Calcule a aproximação da integral para um conjunto de
todo dos trapézios com n = 16.
dados com espaçamento irregular. Os pontos medidos são:
7. Implemente em Python um programa que calcule a integral x = [0, 1.1, 2.2, 4.7, 5.3] e f (x) = [1.0, 3.0, 2.0, 4.0, 1.0].
R π/2
0
ln(cos(x)) dx pelo método dos trapézios. Essa integral 22. A largura L(y) de um rio (em metros) foi medida em inter-
não é elementar. valos de 5 metros a partir de uma das margens, gerando
8. Em física nuclear, a função de decaimento radioativo a tabela: y = [0, 3, 10, 12, 24], L = [0, 8, 12, 9, 0]. Estime a
é N (t) = N0 e−λt . Calcule numericamente a integral área da superfície do rio nesse trecho utilizando a regra dos
R 10
N (t) dt para N0 = 1000 e λ = 0.1. trapézios.
0
R 3 sin(x) sin(0) 23. A força F (x) (em N) aplicada a um objeto em função da sua
9. Calcule numericamente a integral 0 x dx (com 0 = posição x (em m) foi registrada como: x = [0, 0.3, 1.5, 1.7, 2.9],
1). Essa integral não tem solução elementar. F = [10,
R 12, 15, 10, 5]. Calcule o trabalho total realizado
10. Implemente em Python um programa que plote a conver- W = F (x) dx.
gência do método dos trapézios em função do número de 24. Escreva um script em Python que utilize a função
subintervalos para f (x) = cos(x) em [0, π/2]. [Link] para calcular a área sob a curva dada pelos ar-
11. Em termodinâmica, a energia interna pode ser escrita rays de dados experimentais x = [0, 1, 3.5, 4.9, 6.6]
como U = Cv (T ) dT . Considere Cv (T ) = 25 + 0.01T para e y = [2.5, 3.0, 4.5, 2.0, 1.0].
R
T ∈ [300, 600]. Calcule U numericamente. 25. Implemente em Python uma função trapezios_tabela(x,
12. Implemente em Python um programa que calcule y) que receba duas listas de pontos (assuma que podem
R 1 −x2
e cos(x) dx pelo método dos trapézios. não ser equidistantes) e retorne a integral calculada pelo
0 método dos trapézios, sem utilizar bibliotecas externas de
R4√
13. Calcule 0 x + 1 dx usando o método dos trapézios com integração.
n = 8. 26. A taxa de fluxo volumétrico Q(t) (em m3/min) em
14. Implemente em Python uma rotina que estime a integral uma tubulação foi registrada nos instantes t (em min):
(0, 0.5), (2, 1.2), (5, 1.5), (7, 0.8), (10, 0.2). Calcule o volume
R ∞ −x
0
e dx truncando o intervalo em [0, 10].
total escoado nestes 10 minutos.
16.7 Método de Simpson 1/3 Composta 211
1. Use o método de Simpson 1/3 (composto) para aproximar Simpson 1/3 em f (x) = cos x no intervalo [0, π/2], mostrando
a integral de f (x) = x2 no intervalo [0, 2] com n = 5. o decaimento do erro em função de n.
R1√
2. Implemente em Python uma função simpson13(a,b,n) que 14. Estime 0 1 − x2 dx por Simpson 1/3 e compare com π/4.
Rb
calcule a f (x) dx via Simpson 1/3 composto. Teste com Comente o desempenho versus a regra dos trapézios para os
f (x) = sin x em [0, π]. A função deve retornar um erro caso mesmos n.
n seja par. 15. Em escoamento laminar, o perfil é v(y) = 4y(1 − y), y ∈ [0, 1].
R1 R1
x
3. Aproxime numericamente 0 e dx usando Simpson 1/3 com Calcule a vazão Q = 0 v(y) dy com Simpson 1/3 usando
n = 7. Compare com o valor exato e − 1 (1.71828182845905) n = 9 e compare com o valor exato.
e estime o erro absoluto. R5 2
16. Calcule 0 e−x dx com Simpson 1/3 para n = 97 e compare
R5 √
4. Em um circuito RC, a carga total transferida é Q = 0 i(t) dt, com 0.5 π erf(5). Discuta a escolha do intervalo finito.
com i(t) = 5te−t . Calcule Q por Simpson 1/3 com n = 13 e R3
compare a diferença para a regra dos trapézios com o mesmo 17. Estime 1 1
x dx por Simpson 1/3 com n = 7 e compare com
n. ln 3 − ln 1.
18. O trabalho de uma força F (x) = 2x2 + 3x ao longo de [0, 4]
R 10
5. Calcule numericamente 0 cos(x2 ) dx (integral de Fresnel) R4
com Simpson 1/3 para n = 17. Explore a sensibilidade do é W = 0 F (x) dx. Calcule W via Simpson 1/3 com n = 13.
resultado variando n. Rπ
R1 19. Compute numericamente 0 | sin x| dx por Simpson 1/3 com
6. Use Simpson 1/3 para aproximar 0 1+x 1
2 dx com n = 7 e n = 37. Compare com o valor exato 2.
compare com a solução 0.785398163397448.
20. Em termodinâmica, U = Cv (T ) dT . Para Cv (T ) = 25 +
R
√
7. A seção de um reservatório é dada por y = x para x ∈ [0, 4]. 0.01T em [300, 600], estime U com Simpson 1/3 usando
R4√
Estime a área 0 x dx via Simpson 1/3 com n = 15 e com- n = 13.
pare com o valor analítico. R1 2
21. Implemente em Python Simpson 1/3 para 0 e−x cos x dx
8. Implemente em Python a integração por Simpson 1/3 para e estude a convergência com n = 7, 13, 21, 111.
R π/2
ln(cos x) dx. Avalie a integral com n = 17. R4√
0 22. Estime 0 x + 1 dx por Simpson 1/3 com n = 13 e compare
com a solução analítica 2[(x + 1)3/2 /3]40 .
R2
9. Calcule 0 (x3 + 2x) dx por Simpson 1/3 com n = 5. Com-
pare com o valor exato 6 e estime o erro relativo. 23. Implemente em Python Simpson 1/3 para aproximar
R ∞ −x
10. Em decaimento radioativo, N (t) = N0 e−λt . Estime 0
e dx em [0, 10]. Compare com o valor exato 1 e analise
R 10 o erro de truncamento.
0
N (t) dt para N0 = 1000, λ = 0.1 via Simpson 1/3 com R2
n = 37. 24. Aproxime 0
sin(x2 ) dx com Simpson 1/3 para n = 99.
11. Escreva um programa em Python usando Simpson 1/3 para R3 2
25. Calcule 0 e−x /2 dx por Simpson 1/3 com n = 21 e compare
2
f (x) = e−x em [0, 2], usando n = 11. √
com
pπ
R3 2 erf(3/ 2).
12. Aproxime 0 sinx x dx por Simpson 1/3, tratando f (0) = 1. R π/4
Avalie a convergência com n = 13. 26. Estime 0 tan x dx por Simpson 1/3 com n = 21 e compare
com ln(cos 0) − ln(cos(π/4)).
13. Implemente em Python um estudo de convergência para
17. Derivação Numérica
17.1 Introdução
Métodos Numéricos para Aproximação de Derivadas
1. Diferenças Finitas
f (x + h) − f (x)
Forward difference: f ′ (x) ≈ O(h)
h
(17.1)
f (x) − f (x − h)
Backward difference: f ′ (x) ≈ O(h)
h
(17.2)
f (x + h) − f (x − h)
Central difference: f ′ (x) ≈ O(h2 )
2h
(17.3)
−f (x + 2h) + 8f (x + h) − 8f (x − h) + f (x − 2h)
4ª ordem: f ′ (x) ≈ O(h4 )
12 h
(17.4)
2. Extrapolação de Richardson
f (x + h) − f (x − h)
D(h) = = f ′ (x) + c2 h2 + c4 h4 + · · · , (17.5)
2h
4 D(h/2) − D(h)
DR (h) = = f ′ (x) + O(h4 ) (17.6)
4−1
3. Interpolação Polinomial
Polinômio de Lagrange
n n
X Y x − xj
Pn (x) = yi Li (x), Li (x) = ,
i=0 j=0
xi − xj
j̸=i
214 Capítulo 17. Derivação Numérica
n
f ′ (x) ≈ Pn′ (x) = yi L′i (x),
X
i=0
onde
n n
!
x − xj 1
L′i (x)
X Y
= .
k=0 j=0
xi − xj xi − xk
k̸=i j̸=i,k
Spline Cúbica
f ′ (x) ≈ S ′ (x),
4. Método do Complex-Step
′ ℑ f (x + i h)
f (x) ≈ , O(h2 ),
h
com h muito pequeno (e.g. 10−20 ).
[11] Monty Python. Monty Python’s Flying Circus. Programa de televisão. Produzido
pela BBC Television, Reino Unido. Criado por Graham Chapman, John Cleese,
Terry Gilliam, Eric Idle, Terry Jones e Michael Palin. 1969. url: https : / / en .
[Link]/wiki/Monty_Python%27s_Flying_Circus (acesso em 16/05/2025)
(ver página 18).
[12] NumPy Developers. NumPy Documentation. Accessed: 2025-05-17. 2025. url: https:
//[Link]/doc/ (ver página 18).
[13] JetBrains. PyCharm: The Python IDE for Professional Developers. [Link]
[Link]/pt-br/pycharm/. Acessado em: 6 de Outubro de 2025. 2025 (ver
página 24).
[14] Python Package Index (PyPI). Python Package Index. [Link]
wiki/Python_Package_Index. Acessado em 24 de junho de 2025. Registrado como
tendo mais de 530000 pacotes em maio de 2024. 2024 (ver página 47).
[15] Python Software Foundation. The Python Standard Library: math - Mathematical
Functions. Available at [Link] Python
Software Foundation. 2024. url: [Link]
html (ver página 18).
[16] Python Software Foundation. Download Python. Página oficial de distribuição da
linguagem Python. 2025. url: [Link] (acesso em
16/05/2025) (ver página 19).
[17] Spyder Development Team. Spyder: The Scientific Python Development Environment.
[Link] Acessado em: 6 de Outubro de 2025. 2025 (ver
página 24).
[18] Thonny Team. Thonny: Python IDE for beginners. [Link] Acessado
em: 6 de Outubro de 2025. 2025 (ver página 24).
[19] Microsoft. Visual Studio Code: Code Editing. Redefined. https : / / code .
[Link]/. Acessado em: 6 de Outubro de 2025. 2025 (ver página 24).
[20] Wikipédia. Álgebra booliana. Acesso em: 22 de maio de 2025. 2025. url: https:
//[Link]/wiki/%C3%81lgebra_booliana (ver página 31).
[21] Wikipédia. Depuração. Acesso em: 22 de maio de 2025. 2025. url: [Link]
[Link]/wiki/Depura%C3%A7%C3%A3o (ver página 34).
BIBLIOGRAFIA 219
–––––––––––––––––––––––––––––––––––––-
LOG - DEPURAÇÃO - LaTeX
prof. Carlos Wilson
Ciência da Computação - UFCG
–––––––––––––––––––––––––––––––––––––-
5. Sol questao 5
6. Sol questao 6
7. Sol questao 7
8. Sol questao 8
9. Sol questao 9
10. Sol questao 10
11. Sol questao 11
4. Sol questao 4
5. Sol questao 5
6. Sol questao 6
7. Sol questao 7
8. Sol questao 9
9. Sol questao 9
10. Sol questao 10
11. Sol questao 11
12. Sol questao 12
13. Sol questao 13
14. Sol questao 14
15. Sol questao 2
16. Sol questao 2
17. Sol questao 2
18. Sol questao 2
19. Sol questao 2
20. Sol questao 2
21. Sol questao 2
22. Sol questao 2
2. Sol questao 2
3. Sol questao 3
4. Sol questao 4
5. Sol questao 5
6. Sol questao 6
7. Sol questao 7
8. Sol questao 8
9. Sol questao 9
10. Sol questao 10
11. Sol questao 11
12. Sol questao 12
13. Sol questao 13
14. Solução Folha 04, Questão 14
7
8 for i in range (0 ,n ,1) :
9 for j in range (0 ,n ,1) :
10 soma_EMQ += ( F [i , j ] - G [i , j ]) **2
11
12 sol_EMQ = soma_EMQ / ( n **2)
13 print ( " O erro Medio Absoluto ( EMQ ) : %.9 f " %( sol_EMQ ) )
2. Sol questao 4
3. Sol questao 5
4. Sol questao 9
5. Sol questao 13
8. Sol questao 8
9. Sol questao 9
10. Sol questao 10
1. Após a realização de cinco iterações do método da bisseção para a função f (x) = cos(x) − x,
no intervalo inicial [0, 1], a aproximação para a raiz da equação é xc ≈ 0.71875.
2. O método da falsa posição irá atingir a convergência após 25 iterações. A solução encontrada
será xr ≈ 1.35730636886233, com um erro relativo de εrel ≈ 7.417540 × 10−5 .
3. Após a conclusão de cinco iterações do método da secante, a aproximação para a raiz é obtida
como: ≈ 0.567143290409705
4. Após a conclusão de cinco iterações do método da secante modificada, a aproximação para a
raiz é obtida como: ≈ 1.414215047848775
5. Sol questao 5
6. Sol questao 6
7. Sol questao 7
8. Sol questao 8
9. Sol questao 9
10. Sol questao 10
11. Sol questao 11
12. Sol questao 12
13. Sol questao 13
14. Sol questao 14
15. Sol questao 15
16. Sol questao 16
17. Sol questao 17
18. Sol questao 18
19. Sol questao 19
20. Sol questao 20
232 Capítulo 18. Solução
5. Para os valores dos parâmetros fornecidos, a velocidade será igual a v = 35m/s em t = 9s para
uma massa m tal que f (m) = 0, onde:
gm c
f (m) = v − 1 − e −( m ) t
c
Substituindo os valores conhecidos, obtemos:
9,8m 15
f (m) = 35 − 1 − e−( m )·9
15
Utilizamos os palpites iniciais xa = 50 e xb = 100, o que faz sentido, dado que o valor procurado
representa a massa do pára-quedista. Verifique que há, de fato, uma raiz neste intervalo:
Como f (xa )f (xb ) < 0, existe um x entre 50 e 100 tal que f (x) = 0. A primeira aproximação
obtida pelo método da falsa posição é:
f (100)(50 − 100)
xr = 100 − = 62.6324
f (50) − f (100)
Segue o código Python:
1 import math
2
3 def f ( m ) :
4 return v - (( g * m ) / c ) * (1 - math . exp ( -( c / m ) * t ) )
5
6 v = 35
7 t = 9
8 g = 9.8
9 c = 15
10 xa = 50
11 xb = 100
12
13 for i in range (0 ,10 ,1) :
14 fxa = f ( xa )
15 fxb = f ( xb )
233
1. Após cinco iterações do método da bisseção, a aproximação da raiz da equação f (x) = cos(x) − x
no intervalo [0, 1] é: x ≈ 0.71875
2.
1. x = 3.5, y = 7.7421666
2. x = 8, y = 10.747093795093797
3. i = 1.15, y = 0.3373
4. y = 55000, g = 9.7010
5. Sol questao 5
6. Solução Folha 32, Questão 16
7. Solução Folha 32, Questão 17
8. Solução Folha 32, Questão 18
9. Solução Folha 32, Questão 19
10. Solução Folha 32, Questão 20
11. Solução Folha 32, Questão 36
12. Solução Folha 32, Questão 37
13. Solução Folha 32, Questão 38
14. Solução Folha 32, Questão 39
15. Solução Folha 32, Questão 40
236 Capítulo 18. Solução