Livro Cálculo Numérico Com Python Google Colab Fábio e Cinthia

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 119

Cálculo Numérico com Python no Google Colaboratory 1

Cálculo Numérico
com Python no Google Colaboratory

Fábio José da Costa Alves


Cinthia Cunha Maradei Pereira
Cálculo Numérico com Python no Google Colaboratory 2

UNIVERSIDADE DO ESTADO DO PARÁ


CENTRO DE CIÊNCIAS SOCIAIS E EDUCAÇÃO

Clay Anderson Nunes Chagas


REITOR

Ilma Pastana Ferreira


VICE-REITOR

Anderson Madson Oliveira Maia


DIRETORA DO CENTRO DE CIÊNCIAS SOCIAIS E EDUCAÇÃO

Fabrício Martins da Costa


CHEFE DO DEPARTAMENTO DE MATEMÁTICA, ESTATÍSTICA E INFORMÁTICA.

Carlos Alberto de Miranda Pinheiro


COORDENADOR DO CURSO DE MATEMÁTICA

Pedro Franco de Sá
PROGRAMA DE PÓS-GRADUAÇÃO EM ENSINO DE MATEMÁTICA

Marta Genu Soares


PROGRAMA DE PÓS-GRADUAÇÃO EM EDUCAÇÂO
Cálculo Numérico com Python no Google Colaboratory 3

ALVES, Fábio José Costa da; PEREIRA, Cinthia Cunha Maradei. Cálculo Numérico com
Python no Google Colaboratory. Grupo de Pesquisa em Ensino da Matemática e
Tecnologias, Universidade do Estado do Pará (UEPA), Belém-Pa, 2023.

ISBN: 978-65-84998-59-9

Cálculo Numérico; Python; Google Colaboratory.


Cálculo Numérico com Python no Google Colaboratory 4

SUMÁRIO

APRESENTAÇÃO 05
1. SISTEMA NUMÉRICO E ERROS 06
2. GOOGLE COLABORATORY 12
3. RESOLUÇÃO NUMÉRICA DE EQUAÇÕES NÃO LINEARES 07
3.1. MÉTODO DA BISSEÇÃO 20
3.2. MÉTODO DAS CORDAS
3.3. MÉTODO DE NEWTON
3.4. MÉTODO DE JACOBI
3.5. MÉTODO DE GAUSS-SEIDEL
4. SISTEMAS DE EQUAÇÕES LINEARES 23
4.1. MÉTODO DE GAUSS-JORDAN 42
4.2. MÉTODO DE JACOBI
4.3. MÉTODO DE GAUSS-DEIDEL
5 AJUSTE DE CURVAS 62
5.1. AJUSTE LINEAR
5.2. AJUSTE POLINOMIAL
6. INTERPOLAÇÃO 45
6.1. INTERPOLAÇÃO LINEAR
6.1. INTERPOLAÇÃO DE LAGRANGE
6.2. INTERPOLAÇÃO DE NEWTON
7. INTEGRAÇÃO NUMÉRICA 72
7.1. REGRA DOS TRAPÉZIOS
7.2. PRIMEIRA REGRA DE SIMPSON
7.3. SEGUNDA REGRA DE SIMPSON
Cálculo Numérico com Python no Google Colaboratory 5

APRESENTAÇÃO

Prezado(a) Leitor(a)

O livro Cálculo Numérico com Python no Google Colaboratory foi desenvolvido


para o desenvolvimento de habilidades de do pensamento computacional, importante
para o futuro desenvolvimento profissional, ao mesmo tempo que se estuda os métodos
do cálculo numérico, em uma abordagem prática-experimental.
Na abordagem de cada método, é apresentada a demonstração das expressões
e/ou o detalhamento do algoritmo recursivo, cuja exemplificação é apresentada com
detalhes, havendo um programa de Python para ser executado na plataforma Google
Colaboratory, possibilitando verificar os resultados das atividades, bem como
aprofundar conhecimentos na programação em Python.
É importante destacar que o Google Colaboratory é um ambiente de web, pode ser
executado tanto no computador quanto no celular, e quem não há necessidade de
instalação de nenhum programa ou app. Além disso, os programas Python são
executados nos processadores dos computadores da Google, viabilizando a programação
em qualquer tipo de computador ou celular, desde que os mesmos possam internet.
Esperamos que com o livro Cálculo Numérico com Python no Google Colaboratory,
você consiga adquirir conhecimentos e desenvolver habilidades que possam ajudá-los
no desenvolvimento de atividades futuras tanto no âmbito da pós-graduação quanto no
dia a dia sua vida profissional em sala de aula.

Os Autores
Cálculo Numérico com Python no Google Colaboratory 6

1. SISTEMA NUMÉRICO E ERROS


Você já observou que no dia a dia estamos cercados de várias situações que
representam problemas das mais diversas origens, como física, química, estatística, etc,
e que alguns destes problemas são: queda livre de um objeto de cima de um prédio, o
crescimento de uma população de uma cidade, o consumo de combustível de um carro, o
consumo de energia de nossa casa, entre outros. Quando um problema é representado
por uma fórmula ou procedimento matemático, que expressam as características
principais deste problema, temos o modelo matemático do problema.

Para que você compreenda melhor a seqüência lógica da solução de um problema,


observe o diagrama a baixo.

Modelagem Modelo Resolução


Problema Solução
Matemático

Observe que para resolvermos um problema, devemos primeiro fazer a


modelagem deste problema, isto é, produzir um modelo matemático que descreva todo
o comportamento do problema, em seguida devemos buscar a resolução numérica do
modelo matemático, que representará a solução do problema.
Você sabia que podemos obter a solução de um problema (físico), através de
métodos numéricos. Porém, é importante ressaltar, que em certas situações a solução
estimada, pelos métodos numéricos, se afasta da verdadeira solução do problema. Isto
ocorre devido a presença de fontes de erro que podem ocorrer na fase de modelagem do
problema ou na fase resolução do problema.
Para que você possa compreender a fonte de erro no processo de modelagem,
observe o exemplo a seguir.

Exemplo: Uma bola cai de cima de um prédio e sua velocidade em cada instante é
descrita pela equação horária:
𝑎
𝑠 = 𝑠𝑜 + 𝑣𝑜 𝑡 + 𝑡 2
2
onde 𝑠𝑜 é a altura do prédio, 𝑣𝑜 é a sua velocidade inicial e 𝑎 representa, neste caso, a
gravidade.
Cálculo Numérico com Python no Google Colaboratory 7

Se a altura do prédio for de 30 m (𝑠𝑜 = 30), a velocidade inicial da bola for zero (𝑣𝑜 = 0)
e considerando a gravidade igual a 10 m/s2 (𝑎 = 10). A posição após 3 s após a queda é:
10 2
𝑠 = 30 + 0.1 − 2  𝑠 = 10𝑚
2

Você acha que este resultado é confiável?


É bem provável que não, pois no modelo matemático não foram consideradas outras
forças, como, por exemplo, a resistência do ar, a velocidade do vento, etc.

Já na fase de resolução, o erro é gerado no momento que se faz os cálculos na


calculadora ou computador devido aos processos de arredondamentos. Para
exemplificar observe o exemplo a seguir.

Exemplo: Erros na fase de Resolução


𝑥
Observe que √2 = 1,41421356237310. Ao se resolver esta equação 105 − √2 = 0, cuja

solução é 𝑥 = 105 √2. Observe que a resposta desta equação dependerá do número de
dígitos significativos.

se √2 = 1,41  𝑥 = 141.000

se √2 = 1,4142  𝑥 = 141.420

se √2 = 1,414213  𝑥 = 141.421,30

MUDANÇA DE BASE
Para você compreender melhor a fonte de erro na fase de resolução, e necessário
nos compreendermos como funciona de mudança de base. Você sabia sábia que os
Cálculo Numérico com Python no Google Colaboratory 8

números que usamos no nosso dia a dia estão na base 10. Para uma melhor
compreensão observe a decomposição do seguinte número
8052 = 8 ∗ 103 + 0 ∗ 102 + 5 ∗ 101 + 2 ∗ 100
é assim que se decompõem um número na base dez. Se o numero tiver dígitos atrás da
vírgula a decomposição fica da seguinte forma
8052,406 = 8 ∗ 103 + 0 ∗ 102 + 5 ∗ 101 + 2 ∗ 100 + 4 ∗ 10−1 + 0 ∗ 10−2 + 6 ∗ 10−3
de uma forma compacta podemos dizer que os números na base dez pode ser escritos
por:
𝑚

∑ 𝑎𝑖 . 10𝑖 = 𝑎𝑚 . 10𝑚 +. . . +𝑎2 . 102 + 𝑎1 . 101 + 𝑎0 . 100 + 𝑎−1 . 10−1 𝑎−2 . 10−2 +. . . +𝑎𝑛 . 10𝑛
𝑖=𝑛

onde: 𝑎𝑖 ⎯ é 0 ou 1 e 𝑛, 𝑚 ⎯ números inteiros, com 𝑛 ≤ 0 e 𝑚 ≥ 0


Um número na base 2 pode ser escrito como
𝑚

∑ 𝑎𝑖 . 2𝑖 = 𝑎𝑚 . 2𝑚 +. . . +𝑎2 . 22 + 𝑎1 . 21 + 𝑎0 . 20 + 𝑎−1 . 2−1 + 𝑎−2 . 2−2 +. . . +𝑎𝑛 . 2𝑛


𝑖=𝑛

para compreender melhor observe os exemplos a seguir:


1011 = 1. 23 + 0. 22 + 1. 21 + 1. 20
1011,101 = 1. 23 + 0. 22 + 1. 21 + 1. 20 + 1. 2−1 + 0. 2−2 + 1. 2−3

Você sabia, que as calculadoras e os computadores trabalham na base 2, que uma


fonte de erro de resolução está nas aproximações que são, as vezes necessárias. Para que
você possa entende melhor este problema, vamos, agora, estudar a conversão de um
número a base 10 para a base 2. Para isto devemos decompô-lo com fizemos
anteriormente, e em seguida efetuar a multiplicação dos dígitos binários pelas potências
de base 2 adequadas.

1011 2 = 1 . 2 3 + 0 . 2 2 + 1 . 21 + 1 . 2 0  10112 = 1110


1011,101 = 1 . 2 3 + 0 . 2 2 + 1 . 21 + 1 . 2 0 + 1 . 2 −1 + 0 . 2 −2 + 1 . 2 −3  1011 2 = 11,6310
Para transformar um número inteiro da base 10 para a base 2, utiliza-se o método
de divisões sucessivas, que consiste em dividir o número por 2, a seguir dividi-se por 2 o
quociente encontrado e assim o processo é repetido até que o último quociente seja
igual a 1. O número binário será, então, formado pela concatenação do último quociente
com os restos das divisões lidos em sentido inverso ao que foram obtidos, ou seja,
Cálculo Numérico com Python no Google Colaboratory 9

N 2
r1 q1 2
r2 q2 2
r3 q3
qn-1 2
rn-1 1
𝑁10 = 1. 𝑟𝑛−1 . . . . . 𝑟3 . 𝑟2 . 𝑟1

Exemplo:
18 2
0 9 2
1 4 2
0 2 2
0 1

1810 = 100102

11 2
1 5 2
1 2 2
0 1

1110 = 11012

Para transformar números fracionários da base 10 para a base 2, utiliza-se o


método das multiplicações sucessivas, que consiste em:

1º Passo – multiplicar o numero fracionários por 2;

2º Passo – deste resultado, a parte inteira será o primeiro dígito do número na base 2 e
a parte fracionária é novamente multiplicada por 2. O processo é repetido até que a
parte fracionária do último produto seja igual a zero.
Cálculo Numérico com Python no Google Colaboratory 10

Exemplo: transforme 0,187510 para a base 2

0,1875 0,375 0,75 0,50


2 2 2 2
0,3750 0,750 1,50 1,00

logo 0,187510 = 0,00112

Exemplo: transforme 13,2510 para a base 2

13 2
1 6 2
0 3 2
1 1
1310 = 11012

0,25 0,50
2 2
0,50 1,00

0,2510 = 0,012 , logo 13,2510 = 1101,012

Você sabia que, de maneira geral, o número 𝑥 em uma base 𝛽 é representado por:

𝑑1 𝑑2 𝑑3 𝑑𝑡
𝑥 = ±[ + 2 + 3 +. . . + 𝑡 ] . 𝛽 𝑒𝑥𝑝
𝛽 𝛽 𝛽 𝛽
onde:

𝑑𝑖 ⎯ são os números inteiros contidos no intervalo 0 ≤ 𝑑𝑖 ≤ 𝛽, 𝑖 = 1,2, . . . , 𝑡

𝑒𝑥𝑝 ⎯ representa o expoente de 𝛽 e assume valores entre 𝐼 ≤ 𝑒𝑥𝑝 ≤ 𝑆,

𝐼, 𝑆 ⎯ os limites inferior e superior, respectivamente, para a variação do expoente

𝑑 𝑑 𝑑 𝑑
[ 𝛽1 + 𝛽22 + 𝛽33 +. . . + 𝛽𝑡𝑡] ⎯ é chamado de mantissa e é a parte do número que representa

seus dígitos significativos e 𝑡 é o número de dígitos significativos do sistema de


representação, comumente chamado de precisão da máquina.
Cálculo Numérico com Python no Google Colaboratory 11

Exemplo: Obs: a mantissa é um


número entre 0 e 1.
Sistema decimal
3 5 7 2 9 3 5 7
0,35710 = [10 + 102 + 103 ] . 100 29,35710 = [10 + 102 + 103 + 104 + 105 ] . 102

Sistema binário
1 1 0 0 1
110012 = [2 + 22 + 23 + 24 + 25 ] . 25

1 1 0 0 1 0 1
11001,012 = [2 + 22 + 23 + 24 + 25 + 26 + 27 ] . 25

Saiba que cada dígito do computador é chamado de bit. Apresentaremos abaixo


uma maquina fictícia de 10 bits para a mantissa, 4 bits para o expoente e 1 bit para o
sinal da mantissa e outro bit para o sinal do expoente.

Mantissa Expoente
Expoente
Mantissa
Sinal da

Sinal do

Para você entender melhor, faremos um exemplo numérico.

Exemplo: Numa máquina de calcular cujo sistema de representação utilizado tenha 𝛽 =


2, 𝑡 = 10, 𝐼 = −15 e 𝑆 = 15, o número 25 na base decimal é representado por

−2510 = −110012 = −0,11001. 25 = −0,11001. 2101

1 1 1 0 0 1 0 0 0 0 0 0 1 0 1

Observe que utilizamos bit = 0 para positivo e bit = 1 para negativo.

Um parâmetro muito utilizado para avaliar a precisão de um determinado sistema


de representação é o número de casas decimais exatas da mantissa e que este valor é
Cálculo Numérico com Python no Google Colaboratory 12

dado pelo valor decimal do último bit da mantissa, ou seja, o bit de maior significado,
logo:

1
𝑃𝑅𝐸𝐶𝐼𝑆Ã𝑂 ≤
𝛽𝑡

Apresentaremos a seguir, a titulo de curiosidade, os sistemas de representação de


algumas máquinas.

Máquinas 𝛽 𝑡 I S
Burroughs 5500 8 13 - 51 77
Burroughs 6700 8 13 - 63 63
Hewlett-Packard 45 10 10 - 98 100
Texas SR-5X 10 12 - 98 100
PDP-11 2 24 - 128 127
IBM/360 16 6 - 64 63
IBM/370 16 14 - 64 63
Quartzil QI 800 2 24 - 127 127

ATIVIDADE
(01) Os números a seguir estão na base 2, escreva-os na base 10.

(a) 110112 = (b) 1111002 = (c) 1001112 =

(02) Os números a seguir estão na base 10, escreva-os na base 2.

(a) 1510 = (b) 1210 = (c) 3610 =

(03) Considere uma máquina de calcular cujo sistema de representação utilizado tenha
𝛽 = 2, 𝑡 = 10, 𝐼 = −15 e 𝑆 = 15. Represente nesta máquina os números:

(a) 3510 (b) 8, 210 (c) −2410


Cálculo Numérico com Python no Google Colaboratory 13

2. GOOGLE COLABORATORY
Uma pesquisa em 2019 que investigou milhares de listas de empregos para
cientistas de dados, verificou-se que entre as 15 tecnologias mais procuradas, Python
ficou em primeiro lugar e foi de longe a palavra-chave mais frequente nas listas. Além
disso, muitas empresas de tecnologia famosas como Google, Instagram e Netflix fazem
uso dessa linguagem, contribuindo para a popularização da mesma.

Python possui uma sintaxe simples se comparada com outras linguagens de


programação, com isso a curva de aprendizado é mais rápida do que se comparada com
outras opções. O Python é uma linguagem de programação amplamente usada em
aplicações da Web, desenvolvimento de software, ciência de dados e machine learning
(ML). Os desenvolvedores usam o Python porque é eficiente e fácil de aprender e pode
ser executado em muitas plataformas diferentes.

A plataforma Google Colaboratory, ou mais conhecida como “Colab”,


abreviadamente, é um produto da Google Research, que permite que qualquer pessoa
escreva e execute código Python por meio do navegador e é especialmente adequado
para aprendizado, análise de dados e aplicações na educação.

O primeiro passo para usar o Google Colab, para programar em Python, é fazer o
login em uma conta do Google, depois acesse o endereço
https://colab.research.google.com/ e acessará o Google Colab diretamente pelo
navegador, sem precisar instalar nada em seu computador. Ao abrir o Google Colab, você
será recebido com uma interface limpa e amigável.

Os programas Python na plataforma no Google Colaboraty são escutados em um


arquivo denominado de notebooks do Colab que executam código dos servidores em
nuvem do Google, e isso significa que pode tirar proveito da potência de hardware do
Google, como GPUs e TPUs, independentemente da potência da sua máquina, e só
precisa de um navegador para isso.
Cálculo Numérico com Python no Google Colaboratory 14

3. RESOLUÇÃO NUMÉRICA DE EQUAÇÕES NÃO LINEARES


Você sabia, que nas mais diversas áreas das ciências ocorrem situações que
envolvem a resolução de uma equação do tipo 𝑓(𝑥) = 0 que não possui solução
algébrica. Está é a razão porque devemos desenvolver métodos numéricos para
resoluções as equações do tipo 𝑓(𝑥) = 0, podendo ser equações lineares ou não lineares.

Iniciaremos uma nova etapa estudando os métodos para isolar e calcular as raízes
de uma equação real. Tais métodos numéricos são usados na busca das raízes das
equações, ou os zeros reais de 𝑓(𝑥). Embora estes métodos não forneçam raízes exatas,
eles podem calcular as raízes com a exatidão que o problema requeira.

Em geral, os métodos, utilizados apresentam duas fases distintas:

Fase I – Localização ou Isolamento das Raízes

Está fase consiste em obter um intervalo que contém a raiz da função 𝑓(𝑥) = 0, e
em seguida iremos para a segunda fase.

Fase II – Refinamento

Nesta fase definimos a precisão que desejamos da nossa resposta e escolhemos as


aproximações iniciais dentro do intervalo encontrado na Fase I. Em seguida
melhoramos, sucessivamente, a aproximação da raiz da função 𝑓(𝑥) = 0, até se obter
uma aproximação para a raiz dentro de uma precisão pré-fixada.

ISOLAMENTO DE RAÍZES
É importante, que você saiba que os métodos numéricos utilizados para calcular
raízes da equação 𝑓(𝑥) = 0, só calculam uma raiz de cada vez!

Esta é a razão porque devemos determinar um intervalo para cada raiz que
desejamos calcular. Para entendermos melhor como isolar uma raiz de uma equação,
nós devemos observar o teorema a seguir.

Teorema
“Se uma função contínua 𝑓(𝑥) assume valores de sinais oposto nos pontos
extremos do intervalo [ a , b ] , isto é, 𝑓(𝑎). 𝑓(𝑏) < 0, então o intervalo conterá, no
mínimo, uma raiz da equação 𝑓(𝑥) = 0, em outras palavras haverá no mínimo um
número 𝜀, pertencente ao intervalo aberto (𝑎, 𝑏), 𝜀 ∈ (𝑎, 𝑏), tal que, 𝑓(𝜀) = 0”
Cálculo Numérico com Python no Google Colaboratory 15

Exemplo:
Neste exemplo apresentamos uma função 𝑓(𝑥) que possui dentro do intervalo
[𝑎, 𝑏] três raízes: 𝜀1 , 𝜀2 e 𝜀3 . Isto é, são três valores de 𝑥, para os quais a função 𝑓(𝑥) tem
imagem igual a zero, isto é: 𝑓(𝜀1 ) = 0, 𝑓(𝜀2 ) = 0 e 𝑓(𝜀3 ) = 0.

y
f(x) Se a função possui imagem
zero nos pontos 𝜀1 , 𝜀2 e 𝜀3 , o
a gráfico da função 𝑓(𝑥), nestes
0 b x pontos, intercepta o eixo dos 𝑥.

Observe no exemplo que 𝑓(𝑎) < 0 e 𝑓(𝑏) > 0, logo o produto 𝑓(𝑎). 𝑓(𝑏) < 0

y
f(b) f(x)

a
0 b x

f(a)

Observe que toda vez que dentro de um intervalo [𝑎, 𝑏], tivermos 𝑓(𝑎). 𝑓(𝑏) < 0,
significa que neste intervalo temos pelo menos uma raiz da função 𝑓(𝑥), como vemos na
figura a seguir.

y
f(x)

a
0 b x

Observe, na figura a seguir, que quando uma função possui um número par de raízes
dentro do intervalo [𝑎, 𝑏], temos 𝑓(𝑎). 𝑓(𝑏) > 0
Cálculo Numérico com Python no Google Colaboratory 16

y y
f(x)
f(b)
f(a)
0 a b
x 0 a b x
f(a)
f(b)
f(x)
𝑓(𝑎) < 0 𝑓(𝑎) > 0

𝑓(𝑏) < 0 𝑓(𝑏) > 0

logo 𝑓(𝑎). 𝑓(𝑏) > 0 logo 𝑓(𝑎). 𝑓(𝑏) > 0

Observe, na figura a seguir, que quando uma função não possui raízes dentro
dointervalo [𝑎, 𝑏], temos 𝑓(𝑎). 𝑓(𝑏) > 0

y y
f(x)
0 f(b)
x
f(a)
a b
a b
f(a)
0 x
f(b)
f(x)

𝑓(𝑎) < 0 𝑓(𝑎) > 0

𝑓(𝑏) < 0 𝑓(𝑏) > 0

logo 𝑓(𝑎). 𝑓(𝑏) > 0 logo 𝑓(𝑎). 𝑓(𝑏) > 0

O número de raizes de uma função 𝑓(𝑥), dentro do intervalo [𝑎, 𝑏] , que


observamos nos exemplos anteriores, é formalmente expressõ pelo teorema que
anunciaremos a seguir.
Cálculo Numérico com Python no Google Colaboratory 17

TEOREMA DE BOLZANO
Seja 𝑃(𝑥) = 0 uma equação algébrica com coeficientes reais e 𝑥 ∈ (𝑎, 𝑏).
• Se 𝑃(𝑎). 𝑃(𝑏) < 0, então existem um número ímpar de raízes reais no intervalo
(𝑎, 𝑏).

• Se 𝑃(𝑎). 𝑃(𝑏) > 0, então existem um número par de raízes reais no intervalo
(𝑎, 𝑏) ou não existem raízes reais no intervalo (𝑎, 𝑏).

EQUAÇÕES TRANSCENDENTES
Saiba que a determinação do número de raízes de funções transcendentes é quase
impossível, pois algumas equações podem ter um número infinito de raízes. Como
exemplo temos as funções:

Função Seno Função Cosseno


1
0.8
0.8
0.6 0.6
0.4 0.4
0.2 0.2
0
Y

0
Y

-0.2 -0.2
-0.4 -0.4

-0.6 -0.6

-0.8 -0.8

0 2 4 6 8 10 12 0 2 4 6 8 10 12
X X

Função Tangente Função Exponencial


20 10
9
15
8

10 7
6
5 5
4
Y

0
Y

3
-5 2
1
-10
0
-15 -1

-20 -4 -3 -2 -1 0 1 2 3 4
0 1 2 3 4 5 6 7 8 9 X
X

O método mais simples de se achar um intervalo que contenha só uma raiz de uma
função, ou seja, isolar uma raiz, é o método gráfico que abordaremos a seguir.
Cálculo Numérico com Python no Google Colaboratory 18

MÉTODO GRÁFICO
Lembre-se que uma raiz de uma equação 𝑓(𝑥) = 0 é um ponto onde a função 𝑓(𝑥)
toca o eixo dos 𝑥. Observe a função 𝑓(𝑥) = 𝑥 2 − 6𝑥 + 5 cujo gráfico está na figura a
seguir.

Saiba que uma outra forma de identificarmos as raízes da equação é substituir


𝑓(𝑥) = 𝑔(𝑥) − ℎ(𝑥), onde 𝑔(𝑥) − ℎ(𝑥) = 0. As raízes de 𝑓(𝑥) = 0 corresponderam a
interseção das funções 𝑔(𝑥) e ℎ(𝑥).

Para você entender melhor, observe o exemplo a seguir, onde utilizamos a função
𝑓(𝑥) = 𝑥 2 − 7𝑥 + 10 que possui raízes 2 e 5.

Se fizermos 𝑓(𝑥) = 𝑔(𝑥) − ℎ(𝑥), onde 𝑔(𝑥) = 𝑥 2 e ℎ(𝑥) = 7𝑥 − 10 temos a


interseção de 𝑔(𝑥) com ℎ(𝑥) acontece em 2 e 5.

f ( x ) = x 2 − 7x + 10
10
Y

-10
0 1 2 3 4 5 6 7
2
g( x ) = x
40
30
20
h(x) = 7x − 10
Y

10
0
-10
-1 0 1 2 3 4 5 6 7
X

Observe no próximo exemplo que o método gráfico também funciona com funções
mais complexas cujas raízes não são simples de se determinar.

Exemplo:

A aplicação do método utilizaremos a função 𝑓(𝑥) = 𝑒 𝑥 − 2 − 𝑠𝑒𝑛𝑥 que possui


raízes 2 e 5. Fazendo 𝑔(𝑥) = 𝑒 𝑥 e ℎ(𝑥) = +2 + 𝑠𝑒𝑛𝑥, observe que é muito mais fácil
fazer o gráfico de 𝑔(𝑥) e ℎ(𝑥) do que a fazer o gráfico da função 𝑓(𝑥).
Cálculo Numérico com Python no Google Colaboratory 19

4 f ( x ) = e x − 2 − sen x
2
Y

-2
-1 -0.5 0 0.5 1 1.5 2
x
X g( x ) = e
6

2
Y

h(x) = 2 + sen x
0

-2
-1 -0.5 0 0.5 1 1.5 2
X

Analisando o gráfico podemos afirmar que a nossa raiz esta próxima de 1, então
este será nosso valor inicial para os nossos métodos numéricos.

ATIVIDADE
(01) Dada a função 𝑓(𝑥) = 0.2𝑥 2 + 𝑠𝑒𝑛𝑥, separe está em duas funções e aproxime pelo
menos uma de suas raízes pelo método gráfico.

(02) Dada a função 𝑓(𝑥) = 𝑥 2 − 4𝑥, separe está em duas funções e aproxime pelo menos
uma de suas raízes pelo método gráfico.

(03) Dada a função 𝑓(𝑥) = 𝑥 2 − 𝑐𝑜𝑠 𝑥, separe está em duas funções e aproxime pelo
menos uma de suas raízes pelo método gráfico.

(04) Dada a função 𝑓(𝑥) = 𝑥 3 + 𝑠𝑒𝑛𝑥, separe está em duas funções e aproxime pelo
menos uma de suas raízes pelo método gráfico.
Cálculo Numérico com Python no Google Colaboratory 20

3.1. MÉTODO DA BISSEÇÃO

Para utilizarmos este método devemos primeiro isolar a raiz dentro de um


intervalo [𝑎, 𝑏], isto é, devemos utilizar o método gráfico para aproximar visualmente a
raiz para em seguida isolá-la pelo intervalo (𝑎, 𝑏), onde esta raiz pertença a este
intervalo.

Para utilizarmos o método da bisseção é necessário que a função 𝑓(𝑥) seja uma
continua no intervalo [𝑎, 𝑏] e que 𝑓(𝑎). 𝑓(𝑏) < 0. No método da bisseção devemos
dividir o intervalo [𝑎, 𝑏] ao meio, obtendo assim 𝑥𝑜 , com isto temos agora dois intervalos
[𝑎, 𝑥𝑜 ] e [𝑥𝑜 , 𝑏]

a x
b

Se 𝑓(𝑥𝑜 ) = 0, então, 𝜀 = 𝑥𝑜 ; Caso contrário, a raiz estará no subintervalo onde a


função tem sinais oposto nos pontos extremos, ou seja, se

𝑓(𝑎). 𝑓(𝑥𝑜 ) < 0 implica que a raiz está no intervalo [𝑎, 𝑥𝑜 ].

𝑓(𝑥𝑜 ). 𝑓(𝑏) < 0 implica que a raiz está no intervalo [𝑥𝑜 , 𝑏].

A partir daí construiremos um novo intervalo [𝑎1 , 𝑏1 ]

x
Cálculo Numérico com Python no Google Colaboratory 21

O novo intervalo [𝑎1 , 𝑏1 ] que contém 𝜀 é dividido ao meio e obtém-se 𝑥1 onde se

𝑓(𝑎1 ). 𝑓(𝑥1 ) < 0 implica que a raiz está no intervalo [𝑎1 , 𝑥1 ].

𝑓(𝑥1 ). 𝑓(𝑏1 ) < 0 implica que a raiz está no intervalo [𝑥1 , 𝑏1 ].

O processo se repete até que se obtenha uma aproximação para a raiz exata 𝜀, com
a tolerância ∈ desejada. Tolerância (∈) é um valor que o calculista define, que define a
proximidade que deve ter do valor estimado do valor exato. A partir da tolerância,
definimos o critério de parada, onde se para de refinar a solução e se aceita o valor
aproximado calculado. A tolerância ∈, é muitas vezes avaliada por um dos três critérios
abaixo:

|𝑓(𝑥𝑛 )| ≤ 𝐸

|𝑥𝑛 − 𝑥𝑛−1 | ≤ 𝐸

|𝑥𝑛 − 𝑥𝑛−1 |
≤𝐸
|𝑥𝑛 |

Para você compreender melhor a aplicação do método da bisseção, observe os


próximos exemplos numéricos, onde determinaremos as raízes das funções
determinadas.

Exemplo:

(01) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 3 com 𝐸 ≤ 0,01.

Solução: Primeiro devemos determinar um intervalo onde está a raiz que desejamos
calcular, para isto devemos fazer uma no seu gráfico.

14

12 Intervalo Raiz procurada


10 de busca
8

6
y

-2

-4
-4 -3 -2 -1 0 1 2 3 4
x

A raiz procurada está próxima de 2 e está dentro do intervalo [1 , 3].


Cálculo Numérico com Python no Google Colaboratory 22

Logo

N an bn xn f(xn) E
0 1.0000 3.0000 2.0000 1.0000
1 1.0000 2.0000 1.5000 -0.7500 0.5000
2 1.5000 2.0000 1.7500 0.0625 0.2500
3 1.5000 1.7500 1.6250 -0.3594 0.1250
4 1.6250 1.7500 1.6875 -0.1523 0.0625
5 1.6875 1.7500 1.7188 -0.0459 0.0313
6 1.7188 1.7500 1.7344 0.0081 0.0156
7 1.7266 1.7344 1.7266 -0.0190 0.0078

onde N  número da interação


an  extremo inferior do intervalo [𝑎𝑛 , 𝑏𝑛 ].
bn  extremo superior do intervalo [𝑎𝑛 , 𝑏𝑛 ].
xn  ponto médio do intervalo [𝑎𝑛 , 𝑏𝑛 ].
f(xn)  valor da função em xn.
E  erro calculado pela expressão |𝑥𝑛 − 𝑥𝑛−1 |
Construção da tabela
1ª linha: Na iteração inicial ( N = 0 ) temos [𝑎𝑜 𝑏𝑜 ] = [13] sendo o ponto médio 𝑥𝑜 = 2.
2ª linha: ( N = 1 ) Como 𝑓(𝑎𝑜 ). 𝑓(𝑥𝑜 ) < 0, substituímos 𝑏1 = 𝑥𝑜 , logo [𝑎1 𝑏1 ] = [12]
sendo o ponto médio 𝑥1 = 1,5.
3ª linha: ( N = 2 ) Como 𝑓(𝑥1 ). 𝑓(𝑏1 ) < 0, substituímos 𝑎2 = 𝑥1 , logo [𝑎2 𝑏2 ] = [1,52]
sendo o ponto médio 𝑥2 = 1,75.
.........................................................................................................
8ª linha: ( N = 7 ) Como 𝑓(𝑎6 ). 𝑓(𝑥6 ) < 0, substituímos 𝑎7 = 𝑥6 , logo [𝑎7 𝑏7 ] =
[1.7188 1.7344] sendo o ponto médio 𝑥7 = 1.7266.
Como o erro é menor que tolerância (0.0078 < 𝐸) então a aproximação final é 𝑥 =
1,7266.
Cálculo Numérico com Python no Google Colaboratory 23

PROGRAMA EM PYTHON
# Método da Bisseção
# Entrada
a = 1 # intervalo [a , b]
b = 3
tolerancia = 0.01 # tolerância
nloop = 50 # número máximo de loop

def f(x):
return x**2 - 3

import math

print("Método da Bisseção")
print("
n a b x f(a) f(x) f(b) f(a)*f(x) err
o")

n = 1
fa = f(a)
fb = f(b)
xm2 = (a + b)/2
fxm = f(xm2)
v = fa*fxm
erro = 10

print("%2d"%n, "%8.4f"%a, "%8.4f"%b, "%8.4f"%xm2, "%8.4f"%fa,


"%8.4f"%fb, "%8.4f"%fxm, "%8.4f"%v, "%8.4f"%erro)

if v < 0: b = xm2
if v > 0: a = xm2
if v == 0: print("o valor da raiz é %4.4f" %xm2)

while(erro > tolerancia):


xm1 = xm2
n = n + 1.
xm2 = (a + b)/2
fxm = f(xm2)
erro = math.fabs(xm1 - xm2)
v = fa*fxm
if v < 0: b = xm2
if v > 0: a = xm2
print("%2d"%n, "%8.4f"%a, "%8.4f"%b, "%8.4f"%xm2, "%8.4f"%fa,
"%8.4f"%fb, "%8.4f"%fxm, "%8.4f"%v, "%8.4f"%erro)
if(n == nloop):
break
Cálculo Numérico com Python no Google Colaboratory 24

print("\nA raiz aproximada é %4.4f" %xm2)


print('Loop para com no máximo 50 interações')

import matplotlib.pyplot as plt


import numpy as np
xi = np.linspace(-10, 10, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()

SAÍDA DO PROGRAMA
Método da Bisseção
n a b x f(a) f(x) f(b) f(a)*f(x) erro
1 1.0000 3.0000 2.0000 -2.0000 6.0000 1.0000 -2.0000 10.0000
2 1.5000 2.0000 1.5000 -2.0000 6.0000 -0.7500 1.5000 0.5000
3 1.5000 1.7500 1.7500 -2.0000 6.0000 0.0625 -0.1250 0.2500
4 1.6250 1.7500 1.6250 -2.0000 6.0000 -0.3594 0.7188 0.1250
5 1.6875 1.7500 1.6875 -2.0000 6.0000 -0.1523 0.3047 0.0625
6 1.7188 1.7500 1.7188 -2.0000 6.0000 -0.0459 0.0918 0.0312
7 1.7188 1.7344 1.7344 -2.0000 6.0000 0.0081 -0.0161 0.0156
8 1.7266 1.7344 1.7266 -2.0000 6.0000 -0.0190 0.0380 0.0078

A raiz aproximada é 1.7266


Loop para com no máximo 50 interações
Cálculo Numérico com Python no Google Colaboratory 25

ATIVIDADE
(01) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 2 − 10 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 2.2422
(02) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 3 − 5 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [0 , 3]) Resposta: 1.3535
(03) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 16 + 𝑠𝑒𝑛𝑥 com 𝐸 ≤ 0,01 utilizando o
método da bisseção. (Sugestão utilizar intervalo de busca [3 , 5]) Resposta: 4.1016
(04) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 5𝑠𝑒𝑛𝑥 com 𝐸 ≤ 0,01 utilizando o método
da bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 2.0000
(05) Calcular a raiz da equação 𝑓(𝑥) = −𝑥 2 + 7 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [2 , 4])
(06) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 4 + 𝑐𝑜𝑠 𝑥 com 𝐸 ≤ 0,01 utilizando o
método da bisseção. (Sugestão utilizar intervalo de busca [0 , 2])
(07) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 3 − 12 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [1 , 3])
Cálculo Numérico com Python no Google Colaboratory 26

3.2. MÉTODO DAS CORDAS


Este será o segundo método numérico para o cálculo de raízes que iremos estudar.
Para utilizarmos este método devemos primeiro isolar a raiz dentro de um intervalo
[𝑎, 𝑏], isto é, devemos, novamente, utilizar o método gráfico para aproximar visualmente
a raiz para em seguida isolá-la pelo intervalo [𝑎 , 𝑏], sendo que a raiz pertença ao
intervalo (𝑎 , 𝑏).
Para utilizarmos o método das cordas é necessários que a função 𝑓(𝑥) seja uma
continua no intervalo [𝑎 , 𝑏] e que derivada segunda com sinal constante, sendo
𝑓(𝑎). 𝑓(𝑏) < 0 e que somente um número 𝜀 ∈ [𝑎 , 𝑏] tal que 𝑓(𝜀) = 0
No método das cordas, ao invés de se dividir o intervalo [𝑎 , 𝑏] ao meio, ele é
dividido em partes proporcionais à razão −𝑓(𝑎)/𝑓(𝑏), ou seja
y

f(b)
A existência da corda da origem
Corda
a dois triângulos semelhantes,
que permitem estabelecer a
seguinte relação:
b x
ℎ1 𝑏−𝑎
=
−𝑓(𝑎) 𝑓(𝑏) − 𝑓(𝑎)
f(a) esta relação nos conduz a um
valor aproximado da raiz
𝑥1 = 𝑎 + ℎ1

y 𝑓(𝑎)
𝑥1 = 𝑎 − (𝑏 − 𝑎)
𝑓(𝑏) − 𝑓(𝑎)
f(b)

b x

f(a)
Cálculo Numérico com Python no Google Colaboratory 27

Ao se aplicar este procedimento ao novo intervalo que contém 𝜀, como mostra a


figura a seguir, ([𝑎 , 𝑥1 ] 𝑜𝑢 [𝑥1 , 𝑏]), obtém-se uma nova aproximação 𝑥2 da raiz pela
aproximação apresentada acima

f(b)
Corda

b x

f(a)

No método das cordas substituímos a curva 𝑦 = 𝑓(𝑥) por uma corda que passa
pelos pontos 𝐴(𝑎 , 𝑓(𝑎)) e 𝐵(𝑏 , 𝑓(𝑏))

Observe, nas figuras a seguir, como no método das cordas é escolhido o extremo do
intervalo [𝑎 , 𝑏] que deve ser igual ao valor 𝑥𝑜 .

y y

f(b) f(a)

b x a x

f(a) f(b)
𝑓′′(𝑥) > 0 𝑓′′(𝑥) > 0
𝑓(𝑎) < 0 𝑒 𝑓(𝑏) > 0 𝑓(𝑎) > 0 𝑒 𝑓(𝑏) < 0
𝑐=𝑏 𝑐=𝑎
Cálculo Numérico com Python no Google Colaboratory 28

y y

f(a) f(b)

b a x
x

f(b) f(a)
𝑓′′(𝑥) < 0 𝑓′′(𝑥) < 0
𝑓(𝑎) > 0 𝑒 𝑓(𝑏) < 0 𝑓(𝑎) < 0 𝑒 𝑓(𝑏) > 0
𝑐=𝑏 𝑐=𝑎

A fórmula de recorrência para a aproximação da raiz enésima é


𝑓(𝑥𝑛 )
𝑥𝑛+1 = 𝑥𝑛 − 𝑓(𝑥 (𝑥𝑛 − 𝑐), onde 𝑛 = 0,1,2, . ..,
𝑛 )−𝑓(𝑐)

onde o ponto fixado 𝑐 (ou “𝑎” ou “𝑏”) é aquele no qual o sinal da função 𝑓(𝑥)
coincide com o sinal da segunda derivada 𝑓′′(𝑥), ou seja 𝑓′′(𝑐). 𝑓(𝑐) > 0.
| x n − x n −1 |
 E
| xn |
Para você compreender melhor a aplicação do método das cordas, observe os
próximos exemplos numéricos, onde determinaremos as raízes das funções.

Exemplo:
(01) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 3 com 𝐸 ≤ 0,01.
Solução
Primeiro devemos determinar um intervalo onde esta a raiz que desejamos
calcular, para isto devemos fazer uma no seu gráfico.
Cálculo Numérico com Python no Google Colaboratory 29

14

12 Intervalo Raiz procurada


10 de busca
8

y
4

-2

-4
-4 -3 -2 -1 0 1 2 3 4
x

A raiz procurada está próxima de 2 e está dentro do intervalo [1 , 3]. Logo

N an bn xn f(xn) E
0 1.0000 3.0000 3.0000 6.0000 1.5000
1 1.0000 1.5000 1.5000 -0.7500 0.3000
2 1.0000 1.8000 1.8000 0.2400 0.0857
3 1.0000 1.7143 1.7143 -0.0612 0.0226
4 1.0000 1.7368 1.7368 0.0166 0.0061
onde
N  número da interação
an  extremo inferior do intervalo [𝑎𝑛 , 𝑏𝑛 ].
bn  extremo superior do intervalo [𝑎𝑛 , 𝑏𝑛 ].
xn  ponto médio do intervalo [𝑎𝑛 , 𝑏𝑛 ].
f(xn)  valor da função em xn.
E  erro calculado pela expressão |𝑥𝑛 − 𝑥𝑛−1 |
Construção da tabela
Como 𝑓′′(𝑥) = 2  𝑓′′(3) = 2 > 0 e 𝑓(3) = 32 − 3 = 6 > 0
logo 𝑓′′(3). 𝑓(3) > 0 de onde temos que 𝑐 = 𝑎 = 1 usando a fórmula de recorrência
𝑓(𝑥𝑛 )
𝑥𝑛+1 = 𝑥𝑛 − 𝑓(𝑥 (𝑥𝑛 − 𝑐) temos que 𝑥0 = 𝑏 = 3
𝑛 )−𝑓(𝑐)

𝑓(𝑥0 )
𝑥1 = 𝑥0 − 𝑓(𝑥 (𝑥0 − 1) = 1.5000  [𝑎 , 𝑏] = [1.0 1.50]
0 )−𝑓(1)

𝑓(𝑥1 )
𝑥2 = 𝑥1 − 𝑓(𝑥 (𝑥1 − 1) = 1.8000  [𝑎 , 𝑏] = [1.0 , 1.80]
1 )−𝑓(1)

𝑓(𝑥2 )
𝑥3 = 𝑥2 − 𝑓(𝑥 (𝑥2 − 1) = 1.7143  [𝑎 , 𝑏] = [1.0 1.7143]
2 )−𝑓(1)

𝑓(𝑥3 )
𝑥4 = 𝑥3 − 𝑓(𝑥 (𝑥3 − 1) = 1.7368  [𝑎 , 𝑏] = [1.0 1.7368]
3 )−𝑓(1)

Como o erro é menor que tolerância, então a aproximação é 𝑥 = 1,7368.


Cálculo Numérico com Python no Google Colaboratory 30

PROGRAMA EM PYTHON
# Método das Cordas
# Entrada
a = 1 # intervalo [a , b]
b = 3
tolerancia = 0.01 # tolerância
nloop = 50 # número máximo de loop

def f(x):
return x**2 - 3

def der1(x):
# Derivada de primeira ordem
dxd1 = 0.0001
return ( f(x + dxd1) - f(x) ) / dxd1

def der2(x):
# Derivada de segunda ordem
dxd2 = 0.0001
d11 = ( f(x) - f(x - dxd2) ) / dxd2
d12 = ( f(x + dxd2) - f(x) ) / dxd2
return ( d12 - d11 ) / dxd2

import math

print("Método das Cordas")


print(" n a b xn f(xn) erro")

vfa = 0
vfb = 0
vder2a = 0
vder2b = 0

if (f(a) >= 0):


vfa = 1

if (f(b) >= 0):


vfa = 1

if (der2(a) >= 0):


vder2a = 1

if (der2(b) >= 0):


vder2b = 1

if (vder2a == vfa):
xo = a
c = b
Cálculo Numérico com Python no Google Colaboratory 31

if (vder2b == vfb):
xo = b
c = a

# Variáveis auxiliares
para = 0
xk = 0
h = 0

erro = 10

if (vder2a == vfa):
print("%2d"%h, "%8.4f"%xo, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if (vder2b == vfb):
print("%2d"%h, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)

while(para == 0):
xk = xo - (f(xo)/(f(xo)-f(c)))*(xo - c);
erro = abs(xk - xo)
xo = xk
h = h + 1
if (vder2a == vfa):
print("%2d"%h, "%8.4f"%xo, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if (vder2b == vfb):
print("%2d"%h, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if ( erro < tolerancia):
if (h > 1):
para = 1

print("\nA raiz aproximada é %4.4f \n" %xo)

import matplotlib.pyplot as plt


import numpy as np
xi = np.linspace(-10, 10, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()
Cálculo Numérico com Python no Google Colaboratory 32

SAÍDA DO PROGRAMA
Método das Cordas
n a b xn f(xn) erro
0 1.0000 3.0000 1.0000 -2.0000 10.0000
1 1.5000 3.0000 1.5000 -0.7500 0.5000
2 1.6667 3.0000 1.6667 -0.2222 0.1667
3 1.7143 3.0000 1.7143 -0.0612 0.0476
4 1.7273 3.0000 1.7273 -0.0165 0.0130
5 1.7308 3.0000 1.7308 -0.0044 0.0035

A raiz aproximada é 1.7308

ATIVIDADE

(01) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 2 − 10 com 𝐸 ≤ 0,01 utilizando o método da


bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 2.2308
(02) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 3 − 5 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 1.3545
(03) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 16 + 𝑠𝑒𝑛𝑥 com 𝐸 ≤ 0,01 utilizando o
método da bisseção. (Sugestão utilizar intervalo de busca [3 , 5]) Resposta: 4.1032
(04) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 5𝑠𝑒𝑛𝑥 com 𝐸 ≤ 0,01 utilizando o método
da bisseção. (Sugestão utilizar intervalo de busca [2 , 3]) Resposta: 2.0870
(05) Calcular a raiz da equação 𝑓(𝑥) = −𝑥 2 + 7 com 𝐸 ≤ 0,01 utilizando o método das
cordas. (Sugestão utilizar intervalo de busca [2 , 4])
(06) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 4 + 𝑐𝑜𝑠 𝑥 com 𝐸 ≤ 0,01 utilizando o
método das cordas. (Sugestão utilizar intervalo de busca [1 , 3])
(07) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 3 − 12 com 𝐸 ≤ 0,01 utilizando o método das
cordas. (Sugestão utilizar intervalo de busca [1 , 3])
Cálculo Numérico com Python no Google Colaboratory 33

3.3. MÉTODO DE NEWTON


Iremos estudar agora, o método de Newton para o cálculo de raízes de uma
equação que utiliza informação da primeira e segunda derivada. Semelhantes aos
métodos da bisseção e da corda, devemos primeiro isolar a raiz que desejamos procurar
dentro de um intervalo [𝑎 , 𝑏] utilizando para isto o método gráfico.
Para utilizarmos o método de Newton é necessários que a função 𝑓(𝑥) seja uma
continua no intervalo [𝑎 , 𝑏] e que 𝜀 o seu único zero neste intervalo; as derivada 𝑓′(𝑥)
[𝑓′(𝑥) ≠ 0] e 𝑓′′(𝑥) devem também ser contínuas. Para se encontrar a expressão para o
cálculo da aproximação 𝑥𝑛 para a raiz 𝜀 devemos fazer uma expansão em série de Taylor
para 𝑓(𝑥) = 0, de onde temos 𝑓(𝑥) = 𝑓(𝑥𝑛 ) + 𝑓′(𝑥𝑛 )(𝑥 − 𝑥𝑛 ) se fizermos 𝑓(𝑥) =
𝑓(𝑥𝑛+1 ) = 0 obteremos a seguinte expressão 𝑓(𝑥𝑛 ) + 𝑓′(𝑥𝑛 )(𝑥𝑛+1 − 𝑥𝑛 ) = 0, isolando o
𝑓(𝑥 )
termo 𝑥𝑛+1 na temos 𝑥𝑛+1 = 𝑥𝑛 − 𝑓′(𝑥𝑛 ), de 𝑥𝑛+1 é uma aproximação de 𝜀.
𝑛

Você sabia, que o método de Newton é equivalente a substituir um pequeno arco


de curva 𝑦 = 𝑓(𝑥) por uma reta tangente, traçada a partir de um ponto da curva?
Observe, nas figuras a seguir como, no método de Newton, é escolhido o extremo do
intervalo [𝑎 , 𝑏] deve ser igual ao valor 𝑥𝑜 . Para você compreender melhor a utilização do
método de Newton, observe os exemplos numéricos a seguir.

Exemplo:
(01) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 3 com 𝐸 ≤ 0,01.
Solução
y y

f(b) f(a)

a
x x

f(a) f(b)
Cálculo Numérico com Python no Google Colaboratory 34

Primeiro devemos determinar um intervalo onde está a raiz que desejamos


calcular, para isto devemos fazer uma no seu gráfico.
y y

f(a) f(b)

x
b x

f(b) f(a)

14

12 Intervalo Raiz procurada


10 de busca
8

6
y

-2

-4
-4 -3 -2 -1 0 1 2 3 4
x

A raiz procurada está próxima de 2 e está dentro do intervalo [1 , 3]. Logo

N na bn xn f (xn) E
0 1.0000 3.0000 3.0000 6.0000
1 1.0000 2.0000 2.0000 1.0000 0.2500
2 1.0000 1.7500 1.7500 0.0625 0.0179
3 1.0000 1.7321 1.7321 0.0003 0.0001

Como 𝑓′(𝑥) = 2𝑥  𝑓′(3) = 6 > 0 e como 𝑓′′(𝑥) = 2 > 0 logo temos 𝑥0 = 𝑏 = 3


𝑓(𝑥 )
usando a expressão 𝑥𝑛+1 = 𝑥𝑛 − 𝑓′(𝑥𝑛 ), temos a seguinte recorrência
𝑛

𝑓(𝑥 )
𝑥1 = 𝑥0 − 𝑓′(𝑥0 ) = 2.0000  [𝑎 , 𝑏] = [1.0 2.0]
0

𝑓(𝑥 )
𝑥2 = 𝑥1 − 𝑓′(𝑥1 ) = 1.7500  [𝑎 , 𝑏] = [1.0 1.75]
1

𝑓(𝑥 )
𝑥3 = 𝑥2 − 𝑓′(𝑥2 ) = 1.7321  [𝑎 , 𝑏] = [1.0 1.7321]
2

Como o erro é menor que tolerância então a aproximação final é 𝑥 = 1,7321.


Cálculo Numérico com Python no Google Colaboratory 35

PROGRAMA EM PYTHON
# Método de Newton
# Entrada
a = 1 # intervalo [a , b]
b = 3
tolerancia = 0.01 # tolerância
nloop = 50 # número máximo de loop

def f(x):
return x**2 - 3

def der1(x):
# Derivada de primeira ordem
dxd1 = 0.0001
return ( f(x + dxd1) - f(x) ) / dxd1

def der2(x):
# Derivada de segunda ordem
dxd2 = 0.0001
d11 = ( f(x) - f(x - dxd2) ) / dxd2
d12 = ( f(x + dxd2) - f(x) ) / dxd2
return ( d12 - d11 ) / dxd2

import math

print("Método de Newton")
print(" n a b xn f(xn) erro")

vfa = 0
vfb = 0
vder2a = 0
vder2b = 0

if (f(a) >= 0):


vfa = 1

if (f(b) >= 0):


vfa = 1

if (der2(a) >= 0):


vder2a = 1

if (der2(b) >= 0):


vder2b = 1

if (vder2a == vfa):
xo = a
c = b
Cálculo Numérico com Python no Google Colaboratory 36

if (vder2b == vfb):
xo = b
c = a

# Variáveis auxiliares
para = 0
xk = 0
h = 0

erro = 10

if (vder2a == vfa):
print("%2d"%h, "%8.4f"%xo, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if (vder2b == vfb):
print("%2d"%h, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)

while(para == 0):
xk = xo - (f(xo)/der1(xo));
erro = abs(xk - xo)
xo = xk
h = h + 1
if (vder2a == vfa):
print("%2d"%h, "%8.4f"%xo, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if (vder2b == vfb):
print("%2d"%h, "%8.4f"%c, "%8.4f"%xo, "%8.4f"%xo, "%8.4f"%f(xo),
"%8.4f"%erro)
if ( erro < tolerancia):
if (h > 1):
para = 1

print("\nA raiz aproximada é %4.4f \n" %xo)

import matplotlib.pyplot as plt


import numpy as np
xi = np.linspace(-10, 10, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()
Cálculo Numérico com Python no Google Colaboratory 37

SAÍDA DO PROGRAMA
Método de Newton
n a b xn f(xn) erro
0 1.0000 3.0000 1.0000 -2.0000 10.0000
1 2.0000 3.0000 2.0000 0.9998 1.0000
2 1.7500 3.0000 1.7500 0.0625 0.2500
3 1.7321 3.0000 1.7321 0.0003 0.0179
4 1.7321 3.0000 1.7321 0.0000 0.0001

A raiz aproximada é 1.7321

ATIVIDADES
(01) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 2 − 10 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 2.2381
(02) Calcular a raiz da equação 𝑓(𝑥) = 2𝑥 3 − 5 com 𝐸 ≤ 0,01 utilizando o método da
bisseção. (Sugestão utilizar intervalo de busca [1 , 3]) Resposta: 1.7150
(03) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 16 + 𝑠𝑒𝑛𝑥 com 𝐸 ≤ 0,01 utilizando o
método da bisseção. (Sugestão utilizar intervalo de busca [3 , 5]) Resposta: 4.1035
(04) Calcular a raiz da equação 𝑓(𝑥) = −𝑥 2 + 7 com 𝐸 ≤ 0,01 utilizando o método de
Newton. (Sugestão utilizar intervalo de busca [2 , 4])
(06) Calcular a raiz da equação 𝑓(𝑥) = 𝑥 2 − 4 + 𝑐𝑜𝑠 𝑥 com 𝐸 ≤ 0,01 utilizando o
método de Newton. (Sugestão utilizar intervalo de busca [1 , 3])
Cálculo Numérico com Python no Google Colaboratory 38

COMPARAÇÂO DOS MÉTODOS: BISSEÇÃO, CORDAS E NEWTON


Você observou que os exemplos utilizados nos três métodos (bisseção, cordas e de
Newton) são iguais? Fizemos isto, para que você percebesse melhor as diferenças entre
os três métodos!
Retorne aos exemplos do método da bisseção e verifique que este método tem
convergência lenta, embora este método não necessite de informações da primeira e
nem da segunda derivada.
Se você rever os exemplos do método da corda, observará que sua convergência
depende da proximidade de 𝑥0 da raiz exata. Você, também irá perceber que este
método necessita que sinal da segunda derivada permaneça constante no intervalo, para
que haja convergência do resultado. Já o método de Newton necessita da forma analítica
da primeira derivada, porém sua convergência e extraordinária.
Cálculo Numérico com Python no Google Colaboratory 39

4. SISTEMAS DE EQUAÇÕES LINEARES


Em nosso dia a dia, a solução de muitos problemas, geralmente está
relacionado com a resolução de um sistema. Um exemplo simples é a determinação do
ponto de interseção de duas retas: 𝑦 + 𝑥 = 5 e 𝑦 − 𝑥 = 1.

6 𝑦−𝑥 =1
4

?
Y
2

𝑦+𝑥 =5
0

-2

-4 -2 0 2 4 6 8
X

Para dar a solução deste problema, devemos resolver o seguinte sistema


𝑦+𝑥 =5
{
𝑦−𝑥 =1
que tem a seguinte solução é 𝑥 = 2 e 𝑦 = 3. Onde o ponto (2 , 3) corresponde a
coordenada da interseção das duas retas.
Para problemas simples, que envolvem um número reduzido de variáveis (2
ou três variáveis), a solução pode ser facilmente obtida com procedimentos simples de
substituição ou comparação que aprendemos ao longo do nosso curso primário e
secundário. Porém, o grau de dificuldade, na resolução do sistema, aumenta
consideravelmente quando aumenta o número de variáveis (acima de 4 variáveis),
sendo inclusive necessário o uso de computador para a obtenção de sua solução.
No dia a dia, são vários os problemas que envolvem sistemas com grandes
números de incógnitas, como por exemplo, a tomografia médica, onde os sistemas
envolvidos chegam a ter mais de 5.000 incógnitas.
Para entendermos os métodos de resolução de sistemas lineares, devemos
primeiro compreender que um sistema linear 𝑆𝑛 é uma coleção de 𝑛 equações lineares,
como mostraremos a seguir
𝑎11 𝑥1 + 𝑎12 𝑥2 + 𝑎13 𝑥3 +. . . +𝑎1𝑛 𝑥𝑛 = 𝑏1
𝑎 𝑥 + 𝑎22 𝑥2 + 𝑎23 𝑥3 +. . . +𝑎2𝑛 𝑥𝑛 = 𝑏2
𝑆𝑛 = { 21 1
..........................................................
𝑎𝑛1 𝑥1 + 𝑎𝑛2 𝑥2 + 𝑎𝑛3 𝑥3 +. . . +𝑎𝑛𝑛 𝑥𝑛 = 𝑏𝑛
que pode, também, ser representado por
𝑆𝑛 = ∑𝑛𝑖=1 𝑎𝑖𝑗 𝑥𝑗 = 𝑏𝑖 , onde 𝑖 = 0,1,2, . . . , 𝑛
e na forma matricial o sistema 𝑆𝑛 pode ser escrito como
Cálculo Numérico com Python no Google Colaboratory 40

𝐴𝑥 = 𝑏
onde 𝐴 é uma matriz quadrada de ordem 𝑛, 𝑥 e 𝑏 não matrizes 𝑛 × 1, isto é, com 𝑛 linhas
e uma coluna. A matriz 𝐴 tem a seguinte forma
𝑎11 𝑎12 𝑎13 . . . 𝑎1𝑛
𝑎21 𝑎22 𝑎23 . . . 𝑎2𝑛
𝐴 = [. . . . .... .... . . . . . . . .]
𝑎𝑛1 𝑎𝑛2 𝑎𝑛3 . . . 𝑎𝑛𝑛
onde 𝑎𝑖𝑗 é chamado coeficiente da incógnita 𝑥𝑗 e os 𝑏𝑖 são chamados termos
independentes. Com a matriz dos coeficientes e a matriz dos termos independentes
montamos a matriz 𝐵, denominada de matriz ampliada, que pode ser escrita por
𝐵 = [𝐴: 𝑏]
ou seja
𝑎11 𝑎12 𝑎13 . . . 𝑎1𝑛 𝑏1
𝑎21 𝑎22 𝑎23 . . . 𝑎2𝑛 𝑏2
𝐵 = [. . . . .... .... . . . . . . . . . . . .]
𝑎𝑛1 𝑎𝑛2 𝑎𝑛3 . . . 𝑎𝑛𝑛 𝑏𝑛
Uma solução do sistema 𝑆𝑛 , são os valores 𝑥1 , 𝑥2 , ... , 𝑥𝑛 , que constituem a matriz coluna
𝑥, denominada de matriz solução que pode ser escrita por
𝑥1
𝑥2
𝑥=( ⋮ )
𝑥𝑛
Os sistemas lineares 𝑆𝑛 podem ser classificados da seguinte forma:
Determinado
Homogêneo {Possível {
Indeterminado
𝑆𝑛 = Impossível
Não − Homogêneo { Determinado
{ Possível {
Indeterminado
Certamente, você deve estar se questionando sobre alguns itens do diagrama
apresentado. Um sistema 𝑆𝑛 (𝐴𝑥 = 𝑏) é denominado de homogêneo quando a matriz 𝑏,
dos termos independentes, é nula, isto é, quando
0
0
𝑏=[ ]

0
Um sistema 𝑆𝑛 (𝐴𝑥 = 𝑏) é denominado de não-homogêneo quando a matriz 𝑏, não é
nula, isto é, existe pelo menos um termo em 𝑏, que não é nulo.
Cálculo Numérico com Python no Google Colaboratory 41

Um sistema é dito impossível quando não há nenhuma solução que satisfaça o


sistema, isto é, sua solução é o vazio. Um sistema é dito possível quando há, pelo menos,
uma seqüência de valores 𝑥1 , 𝑥2 , ..., 𝑥𝑛 que satisfaça o sistema, isto é, a sua solução nunca
é o vazio. Se existir uma única seqüência de valores que satisfaça o sistema 𝑆𝑛 , então este
sistema é dito Possível e determinado, se existir mais de uma sequência de valores 𝑥1 ,
𝑥2 , ... , 𝑥𝑛 que satisfaça o sistema 𝑆𝑛 , estão podemos afirmar que o sistema é Possível e
indeterminado.

TRANSFORMAÇÕES ELEMENTARES
Você sabia, que o cálculo da solução de sistemas através de métodos interativos,
consiste em uma seqüência de transformações, onde um sistema mais complexo é
transformado em outro mais simples com a mesma solução.
As transformações utilizadas para modificar os sistemas de equações lineares são
formadas pelas seguintes operações elementares:
(1) Trocar a ordem de duas equações do sistema.
(2) Multiplicar uma equação do sistema por uma constante não numa.
(3) Adicionar duas equações do sistema.

A partir das operações apresentadas podemos transformar um sistema 𝑆1 em um


sistema 𝑆2 . Isto é, 𝑆1 e 𝑆2 são equivalentes.
Para que você possa entender bem estas transformações observe o exemplo a
seguir.
Exemplo:
𝑥+𝑦+𝑧 =6
Calcule a solução do sistema 𝑆1 = {𝑧 = 3
𝑦+𝑧 =5
Solução
Para obtermos a solução do sistema teremos que fazer uma seqüência de
transformações no sistema, observe!
𝑥+𝑦+𝑧 =6
𝑆2 = {𝑦 + 𝑧 = 5
𝑧=3
O sistema 𝑆2 foi obtido do sistema 𝑆1 a partir da operação: “Trocar a ordem de duas
equações do sistema”.
Cálculo Numérico com Python no Google Colaboratory 42

O sistema 𝑆3 foi obtido do sistema 𝑆2 a partir da operação: “Multiplicar uma equação do


sistema por uma constante não numa.”  Multiplicamos a segunda equação por (−1).
𝑥+𝑦+𝑧 =6
𝑆3 = {−𝑦 − 𝑧 = −5
𝑧=3
O sistema 𝑆4 foi obtido do sistema 𝑆3 a partir da operação: “Adicionar duas equações do
sistema.”  Somamos a segunda com a terceira equação de 𝑆3 e colocamos a resposta na
segunda equação de 𝑆4 .
𝑥+𝑦+𝑧 =6
𝑆4 = {−𝑦 = −2
𝑧=3
Observe que é muito mais fácil calcular a solução do sistema 𝑆4 do que a do sistema 𝑆1. E
ambos sistemas possuem a seguinte solução: 𝑥 = 1, 𝑦 = 2 e 𝑧 = 3.
Se o sistema que você tiver trabalhando tiver 25 incógnitas, como aplicar estas
transformações para calcular a solução do seu sistema?

MÉTODO DIRETO
Consiste de métodos que determinam a solução do sistema linear com um número
finito de transformações elementares.

4.1. MÉTODO DE GAUSS-JORDAN


Explicaremos o método de Gauss-Jordan com o auxilio do exemplo a seguir.

Exemplo 01 - Calcule a solução do sistema


𝑥 + 2𝑦 − 𝑧 = 2
{2𝑥 − 𝑦 + 2𝑧 = 6
3𝑥 + 2𝑦 − 𝑧 = 4
Solução
Para facilitar a aplicação do método de Gauss-Jordan devemos, primeiramente,
escrever o sistema na forma matricial, isto é:
𝑥 + 2𝑦 − 𝑧 = 2 1 2 −1 𝑥 2
o sistema {2𝑥 − 𝑦 + 2𝑧 = 6 deve ser escrito por [2 −1 2 ] [ 𝑦 ] = [ 6]
3𝑥 + 2𝑦 − 𝑧 = 4 3 2 −1 𝑧 4
onde
1 2 −1
𝐴 = [2 −1 2 ] é a matriz dos coeficientes e
3 2 −1
Cálculo Numérico com Python no Google Colaboratory 43

2
𝑏 = [6] é a matriz dos termos independentes;
4
Com estas duas matrizes montamos a matriz ampliada 𝐵, onde iremos aplicar as
transformações elementares para obtenção da solução do sistema.
1 2 −1 2
𝐵 = [𝐴: 𝑏] = [2 −1 2 | 6]
3 2 −1 4
As primeiras transformações que iremos fazer tem como objetivo zerar as
posições 𝑎21 = 2 e 𝑎31 = 3 do sistema 𝐵.

 1 2 −1 2 
 
B0 =  2 − 1 2 6 
 3 2 − 1 4 

Para zerar 𝑎21 = 2, usaremos o elemento do pivô desta linha 𝑎11 = 1, para
(0)
determinar 𝑚1 :

(0)
(0) −𝑎21 −2
𝑚1 = (0) = = −2 (0)  significa que tomaremos estes valores da matriz 𝐵0.
𝑎11 1

−(𝑣𝑎𝑙𝑜𝑟𝑞𝑢𝑒𝑠𝑒 𝑑𝑒𝑠𝑒𝑗𝑎𝑧𝑒𝑟𝑎𝑟)
Observe que: 𝑚= (𝑉𝑎𝑙𝑜𝑟𝑑𝑜𝑝𝑖𝑣ô𝑛𝑒𝑠𝑡𝑎𝑐𝑜𝑙𝑢𝑛𝑎)

(0)
após determinar 𝑚1 , faremos a seguinte operação

 tomaremos estes valores da matriz 𝐵0.


(1)
𝐿2 →
(0) (0)
𝑚1 𝐿1 +
(0)
𝐿2  tomaremos estes valores da linha 1 da matriz 𝐵0.

 colocaremos estes valores na matriz 𝐵1.


 colocaremos estes valores na linha 2 da matriz 𝐵1.

Observe que em todos os cálculos será obedecida esta sequência


(1) (0) (0) (0)
𝐿2 → 𝑚1 𝐿1 + 𝐿2
(0)
onde: 𝐿1 é a linha onde está o pivô
(0)
𝐿2 é a linha onde está o elemento que queremos zerar
Cálculo Numérico com Python no Google Colaboratory 44

(1) (0) (0)


isto é, cada elemento da linha 𝐿2 é obtido da combinação linear das linhas 𝐿1 e 𝐿2
uma matriz 𝐵0, da seguinte forma:
(1) (0) (0) (0)
𝑎21 = 𝑚1 . 𝑎11 + 𝑎21 = −2 ∗ 1 + 2 = 0
(1) (0) (0) (0)
𝑎22 = 𝑚1 . 𝑎12 + 𝑎22 = −2 ∗ 2 + (−1) = −5
(1) (0) (0) (0)
𝑎23 = 𝑚1 . 𝑎13 + 𝑎23 = −2 ∗ (−1) + 2 = 4
(1) (0) (0) (0)
𝑎24 = 𝑚1 . 𝑎14 + 𝑎24 = −2 ∗ 2 + 6 = 2

 1 2 −1 2 
 
B1 =  0 − 5 4 2 
 3 2 − 1 4 

(0)
Para zerar 𝑎31 = 3, usaremos o pivô desta linha 𝑎11 = 1, para determinar 𝑚1 .

 1 2 −1 2 
 
B1 =  0 − 5 4 2 
 3 2 − 1 4 
(0)
(0) −𝑎31 −3
𝑚2 = (0) = = −3
𝑎11 1

m1(0)
após determinar , faremos a seguinte operação

L(31) → m(20)L(10) + L(30)


(1) (0) (0)
isto é, cada elemento da linha 𝐿3 é obtido da combinação linear das linhas 𝐿1 e 𝐿3
uma matriz 𝐵0, da seguinte forma:
(1) (0) (0) (0)
𝑎31 = 𝑚1 . 𝑎11 + 𝑎31 = −3 ∗ 1 + 3 = 0
(1) (0) (0) (0)
𝑎32 = 𝑚1 . 𝑎12 + 𝑎32 = −3 ∗ 2 + 2 = −4
(1) (0) (0) (0)
𝑎33 = 𝑚1 . 𝑎13 + 𝑎33 = −3 ∗ (−1) + (−1) = 2
(1) (0) (0) (0)
𝑎34 = 𝑚1 . 𝑎14 + 𝑎34 = −3 ∗ 2 + 4 = −2

 1 2 −1 2 
 
B1 =  0 − 5 4 2 
 0 − 4 2 −2 

Vamos agora zerar o elemento 𝑎32 = −4, para isto, usaremos o pivô da segunda linha
(1)
𝑎22 = −5, para determinar 𝑚1 .
Cálculo Numérico com Python no Google Colaboratory 45

 1 2 −1 2 
 
B1 =  0 − 5 4 2 
 0 − 4 2 −2 
(1)
(1) −𝑎32 −(−4) −4
𝑚1 = (1) = =
𝑎22 −5 5
(1)
após determinar 𝑚1 , faremos a seguinte operação
(2) (1) (1) (1)
𝐿3 → 𝑚1 𝐿2 + 𝐿3
(2) (1) (1)
isto é, cada elemento da linha 𝐿3 é obtido da combinação linear das linhas 𝐿2 e 𝐿3
uma matriz 𝐵1, da seguinte forma:
(2) (1) (1) (1) −4
𝑎31 = 𝑚1 . 𝑎21 + 𝑎31 = ∗0+0 =0
5
(2) (1) (1) (1) −4
𝑎32 = 𝑚1 . 𝑎22 + 𝑎32 = ∗ (−5) + (−4) = 0
5
(2) (1) (1) (1) −4 −6
𝑎33 = 𝑚1 . 𝑎23 + 𝑎33 = ∗4+2 =
5 5
(2) (1) (1) (1) −4 −18
𝑎34 = 𝑚1 . 𝑎24 + 𝑎34 = ∗ 2 + (−2) =
5 5

1 2 −1 2 
 
B2 =  0 − 5 4 2 
 0 0 − 6 / 5 − 18 / 5 

Observe que as operações realizadas resultaram em um sistema cujos elementos abaixo


da diagonal principal (triangulo inferior) são iguais a zero.
1 2 −1 2 
 
B2 =  0 − 5 4 2 
 0 0 − 6 / 5 − 18 / 5 

Agora o nosso objetivo é zerar o triangulo superior deste sistema


1 2 −1 2 
 
B2 =  0 − 5 4 2 
 0 0 − 6 / 5 − 18 / 5 

Para isto devemos primeiramente zerar o elemento 𝑎23 = 4, para isto utilizaremos o
(2) (2)
pivô 𝑎33 = −6/5 para calcular 𝑚1
Cálculo Numérico com Python no Google Colaboratory 46

1 2 −1 2 
 
B2 =  0 − 5 4 2 
 0 0 − 6 / 5 − 18 / 5 
(2)
(2) −𝑎23 −4 10
𝑚1 = (2) = −6/5 =
𝑎33 3

(2)
após determinar 𝑚1 , faremos a seguinte operação
(3) (2) (2) (2)
𝐿2 → 𝑚1 𝐿3 + 𝐿2
(3) (2) (2)
isto é, cada elemento da linha 𝐿2 é obtido da combinação linear das linhas 𝐿2 e 𝐿3
uma matriz 𝐵2, da seguinte forma:
(3) (2) (2) (2) 10
𝑎21 = 𝑚1 . 𝑎31 + 𝑎21 = ∗0+0=0
3
(3) (2) (2) (2) 10
𝑎22 = 𝑚1 . 𝑎32 + 𝑎22 = ∗ 0 + (−5) = −5
3
(3) (2) (2) (2) 10
𝑎23 = 𝑚1 . 𝑎33 + 𝑎23 = ∗ (−6/5) + 4 = 0
3
(3) (2) (2) (2) 10
𝑎24 = 𝑚1 . 𝑎34 + 𝑎24 = ∗ (−18/5) + 2 = −10
3

1 2 −1 2 
 
B3 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 

(2)
Vamos, agora, zerar o elemento 𝑎13 = −1, para isto utilizaremos o pivô 𝑎33 = −6/5
(2)
para calcular 𝑚2

1 2 −1 2 
 
B3 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 

(2)
(2) −𝑎13 −(−1) −5
𝑚2 = (2) = =
𝑎33 −6/5 6
(2)
após determinar 𝑚2 , faremos a seguinte operação
(3) (2) (2) (2)
𝐿1 → 𝑚2 𝐿3 + 𝐿1
(3) (2) (2)
isto é, cada elemento da linha 𝐿1 é obtido da combinação linear das linhas 𝐿1 e 𝐿3
uma matriz 𝐵2, da seguinte forma:
(3) (2) (2) (2) −5
𝑎11 = 𝑚2 . 𝑎31 + 𝑎11 = ∗0+1 =1
6
Cálculo Numérico com Python no Google Colaboratory 47

(3) (2) (2) (2) −5


𝑎12 = 𝑚2 . 𝑎32 + 𝑎12 = ∗0+2 =2
6
(3) (2) (2) (2) −5 −5
𝑎13 = 𝑚2 . 𝑎33 + 𝑎13 = ∗ (−1) + ( 6 ) = 0
6
(3) (2) (2) (2) −5 −18
𝑎14 = 𝑚2 . 𝑎34 + 𝑎14 = ∗2+( )=5
6 5

1 2 0 5 
 
B3 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 

Vamos agora zerar o elemento 𝑎12 = 2, para isto, usaremos o pivô da segunda linha
(3)
𝑎22 = −5, para determinar 𝑚1 .

1 2 0 5 
 
B3 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 
(3)
(3) −𝑎13 −2 2
𝑚1 = (3) = −5 = 5
𝑎33
(3)
após determinar 𝑚1 , faremos a seguinte operação
(4) (3) (3) (3)
𝐿1 → 𝑚1 𝐿2 + 𝐿1
(4) (3) (3)
isto é, cada elemento da linha 𝐿1 é obtido da combinação linear das linhas 𝐿1 e 𝐿2
uma matriz 𝐵3, da seguinte forma:
(4) (3) (3) (3) 2
𝑎11 = 𝑚1 . 𝑎21 + 𝑎11 = 5 ∗ 0 + 1 = 1
(4) (3) (3) (3) 2
𝑎12 = 𝑚1 . 𝑎22 + 𝑎12 = 5 ∗ (−5) + 2 = 0
(4) (3) (3) (3) 2
𝑎13 = 𝑚1 . 𝑎23 + 𝑎13 = ∗ 0 + 0 = 0
5
(4) (3) (3) (3) 2
𝑎14 = 𝑚1 . 𝑎24 + 𝑎14 = 5 ∗ (−10) + 5 = 1

1 0 0 1 
 
B4 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 

Observe que as operações realizadas resultaram em um sistema cujos elementos acima


da diagonal principal (triangulo superior) são iguais a zero.
Cálculo Numérico com Python no Google Colaboratory 48

1 0 0 1 
 
B4 =  0 − 5 0 − 10 
 0 0 − 6 / 5 − 18 / 5 

Para obtermos a solução do sistema divida cada linha pelo seu respectivo pivô, com isto
temos:
(4) (4) (4) (4) (4) (4)
(5) 𝐿1 𝐿1 (5) 𝐿2 𝐿2 (5) 𝐿3 𝐿3
𝐿1 → (4) = ; 𝐿2 → (4) = ; 𝐿3 → (4) = .
𝑎11 1 𝑎22 −5 𝑎33 −6/5

Com esta operação obtemos


1 0 0 1 𝑥=1
𝐵5 = [0 1 0 |2]  {𝑦 = 2
0 0 1 3 𝑧=3

PROGRAMA EM PYTHON
# Gauss - Jordan - Sistema

import numpy as np

# Entrada (sistema)

M = np.array(
[[2.0 , -1.0 , 1.0 , 3.0],
[1.0 , 2.0 , 1.0 , 8.0],
[2.0 , 1.0 , 2.0 , 10.0]]
)

print("Gauss - Jordan - Sistema")


print("Matriz Ampliada")
#print(D)

linha = np.size(M[:,1])
coluna = np.size(M[1,:])

for i in range(0 , linha , 1):


for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

print('Linha: {:d}'.format(linha))
print('Coluna: {:d}'.format(coluna))

# Zera Triangulo Infrerior


t = 1
fm = 0
Cálculo Numérico com Python no Google Colaboratory 49

for j in range(0 , linha , 1):


for i in range(t , linha , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
M[i , k] = fm * M[j , k] + M[i , k]
t = t + 1

print("Zera Triangulo Inferior")


for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

t = 1
fm = 0

for j in range(linha - 1 , 0 , -1):


for i in range(0 , linha - t , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
M[i,k] = fm * M[j,k] + M[i,k]
t = t + 1

print("Zera Triangulo Superior")


for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

fm = 0;

for i in range(0 , linha , 1):


fm = M[i,i]
for j in range(0 , coluna , 1):
M[i,j] = M[i,j]/fm

print("Matriz Normalizada")
for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

print("Solução do Sistema")
for i in range(0 , linha , 1):
print("%8.4f"%M[i , coluna-1])
Cálculo Numérico com Python no Google Colaboratory 50

SAÍDA DO PROGRAMA
Gauss - Jordan - Sistema
Matriz Ampliada
2.0000 -1.0000 1.0000 3.0000
1.0000 2.0000 1.0000 8.0000
2.0000 1.0000 2.0000 10.0000
Linha: 3
Coluna: 4
Zera Triangulo Inferior
2.0000 -1.0000 1.0000 3.0000
0.0000 2.5000 0.5000 6.5000
0.0000 0.0000 0.6000 1.8000
Zera Triangulo Superior
2.0000 0.0000 0.0000 2.0000
0.0000 2.5000 0.0000 5.0000
0.0000 0.0000 0.6000 1.8000
Matriz Normalizada
1.0000 0.0000 0.0000 1.0000
0.0000 1.0000 0.0000 2.0000
0.0000 0.0000 1.0000 3.0000
Solução do Sistema
1.0000
2.0000
3.0000

ATIVIDADE
(01) Resolva o sistemas
𝑥+𝑦+𝑧 =6 𝑥 + 2𝑦 − 𝑧 = 0
(a) {𝑥 − 𝑦 − 𝑧 = −4 (b) {𝑥 + 𝑦 + 𝑧 = 7
𝑥−𝑦+𝑧 =2 −𝑥 + 2𝑦 + 3𝑧 = 12
(02) Resolva o sistemas
𝑥 + 2𝑦 + 3𝑧 = −1 𝑥 + 2𝑦 + 3𝑧 = 8
(a) {−𝑥 + 5𝑦 + 2𝑧 = 5 (b) {𝑥 + 𝑦 + 2𝑧 = 5
−2𝑥 + 2𝑦 + 𝑧 = 0 −2𝑥 + 𝑦 + 𝑧 = 1
Cálculo Numérico com Python no Google Colaboratory 51

CÁLCULO DA INVERSA DE UMA MATRIZ


Usaremos, agora, o método de Gauss-Jordan para calcular a inversa de uma matriz.
Para que você entender facilmente explicaremos este método, de determinação da
inversa de uma matriz, utilizando um exemplo.
1 1 2
Exemplo 01 – Calcule a inversa da matriz 𝑀 = [ 0 -1 4 ]
1 1 1
Solução: No cálculo da inversa de uma matriz (𝑀−1), a matriz ampliada 𝐵 é montada
utilizando a matriz 𝑀 e uma matriz identidade 𝐼 da dimensão da matriz 𝑀. Isto é, a
matriz identidade 𝐼 substitui a matriz dos termos independentes 𝑏, utilizada na
resolução de sistemas lineares. Deste modo, a matriz 𝐵 fica da forma: 𝐵 = [𝑀: 𝐼]

1 1 2 1 0 0
− a(31
0)
B0 =  0 - 1 0
(0)
4 0 1 m1 = = −1
  (0)
a11
 1 1 1 0 0 1 
L(31) → m1(0)L(10) + L(30)
1 1 2 1 0 0
B1 =  0 - 1 4 0 1 0 − a(23
1)
(1)
  m1 = =2
 0 0 -1 - 1 0 1  a(33
1)

L(22) → m1(1)L(31) + L(21)


1 1 0 -1 0 2
B2 =  0 - 1 4 0 − a(23
1)
0 1 (1)
m2 = =4
 
 0 0 -1 -1 0 1  a(33
1)

1 1 0 -1 0 2 L(22) → m(21)L(31) + L(21)


B2 =  0 - 1 0 -4 1 4
  ( 2) − a12( 2)
 0 0 - 1 -1 0 1 m1 = = 1
a(222)

1 0 0 -5 1 6
 L(13) → m1( 2)L(22) + L(12)
B3 = 0 - 1 0 -4 1 4
  
 0 0 - 1 -1 0 1  L(14) L(14)
 L1 →
( 5)
=
 ( 4)
a11 1
1 0 0 -5 1 6  
 (5)
B3 =  0 1 0 4 - 1 - 4 →
L(24) L(24)
   2L
4) − 1
 0 0 1 1 0 - 1   a(22

1 1 2  - 5 1 6  (5) L(34) L(34)
 3L → =
M =  0 -1 4 −1
=  4 - 1 - 4 −1
( 4)
e M  a
    33
 1 1 1   1 0 - 1 
Cálculo Numérico com Python no Google Colaboratory 52

PROGRAMA EM PYTHON

# Gauss - Jordan - Matriz Inversa

import numpy as np

# Entrada (matriz)

MM = np.array(
[[-1.0 , 2.0 , 1.0],
[-1.0 , 1.0 , 1.0],
[-1.0 , 1.0 , -1.0]]
)

print("Gauss - Jordan - Matriz Inversa")

linha = np.size(MM[:,1])
coluna = np.size(MM[1,:])

print("Matriz a ser invertida")


for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%MM[i,j], end=' ')
print(" ")

print('Linha: {:d}'.format(linha))
print('Coluna: {:d}'.format(coluna))

M = np.zeros((linha , 2*linha))

for j in range(0 , linha , 1):


M[: , j] = MM[: , j]

M0 = np.eye(3)
for j in range(linha , 2*linha , 1):
M[: , j] = M0[: , j - linha]

print("Matriz a ser escalonada")


for i in range(0 , linha , 1):
for j in range(0 , 2*linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

# Zera Triangulo Infrerior


t = 1
fm = 0

for j in range(0 , linha , 1):


for i in range(t , linha , 1):
Cálculo Numérico com Python no Google Colaboratory 53

fm = - M[i,j]/M[j,j]
for k in range(0 , 2*linha , 1):
M[i , k] = fm * M[j , k] + M[i , k]
t = t + 1

print("Zera Triangulo Inferior")


for i in range(0 , linha , 1):
for j in range(0 , 2*linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

t = 1
fm = 0

for j in range(linha - 1 , 0 , -1):


for i in range(0 , linha - t , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , 2*linha , 1):
M[i,k] = fm * M[j,k] + M[i,k]
t = t + 1

print("Zera Triangulo Superior")


for i in range(0 , linha , 1):
for j in range(0 , 2*linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

fm = 0;

for i in range(0 , linha , 1):


fm = M[i,i]
for j in range(0 , 2*linha , 1):
M[i,j] = M[i,j]/fm

print("Matriz Normalizada")
for i in range(0 , linha , 1):
for j in range(0 , 2*linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

print("Matriz Inversa")
for i in range(0 , linha , 1):
for j in range(linha , 2*linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")
Cálculo Numérico com Python no Google Colaboratory 54

SAÍDA DO PROGRAMA
Gauss - Jordan - Matriz Inversa
Matriz a ser invertida
-1.0000 2.0000 1.0000
-1.0000 1.0000 1.0000
-1.0000 1.0000 -1.0000
Linha: 3
Coluna: 3
Matriz a ser escalonada
-1.0000 2.0000 1.0000 1.0000 0.0000 0.0000
-1.0000 1.0000 1.0000 0.0000 1.0000 0.0000
-1.0000 1.0000 -1.0000 0.0000 0.0000 1.0000
Zera Triangulo Inferior
-1.0000 2.0000 1.0000 1.0000 0.0000 0.0000
0.0000 -1.0000 0.0000 -1.0000 1.0000 0.0000
0.0000 0.0000 -2.0000 0.0000 -1.0000 1.0000
Zera Triangulo Superior
-1.0000 0.0000 0.0000 -1.0000 1.5000 0.5000
0.0000 -1.0000 0.0000 -1.0000 1.0000 0.0000
0.0000 0.0000 -2.0000 0.0000 -1.0000 1.0000
Matriz Normalizada
1.0000 -0.0000 -0.0000 1.0000 -1.5000 -0.5000
-0.0000 1.0000 -0.0000 1.0000 -1.0000 -0.0000
-0.0000 -0.0000 1.0000 -0.0000 0.5000 -0.5000
Matriz Inversa
1.0000 -1.5000 -0.5000
1.0000 -1.0000 -0.0000
-0.0000 0.5000 -0.5000

ATIVIDADE
(01) Determine a inversa das matriz abaixo
1 1 1 1/2 1/2 0
(a) [ 1 -1 -1 ] Resposta = [ 1/2 0 -1/2 ]
1 -1 1 0 -1/2 1/2
1 2 -1 -1/10 4/5 -3/10
(b) [ 1 1 1 ] Resposta = [ 2/5 -1/5 1/5 ]
-1 2 3 -3/10 2/5 1/10
(02) Determine a inversa das matrizes abaixo
1 2 3 1 2 3
(a) [−1 5 2] (b) [ 1 1 2]
−2 2 1 −2 1 1
Cálculo Numérico com Python no Google Colaboratory 55

CÁLCULO DO DETERMINANTE DE UMA MATRIZ


O método de Gauss-Jordan, também pode ser utilizado para calcularmos o
determinante de uma matriz. Para isto, devemos escalonar a matriz ampliada 𝐵, como
fizemos no cálculo da solução do sistema e na determinação da matriz inversa, porém
não devemos fazer o último passo, que é a normalização da matriz pelos elementos da
diagonal principal. Para que você entender melhor observe o exemplo a seguir, onde
iremos calcular o determinante de uma matriz utilizando o método de Gauss-Jordan.
1 3 0
Exemplo 02 – Calcule o determinante da matriz 𝑀 = [ 0 2 1]
1 2 -1
Solução: Observe que a matriz que iremos calcular o determinante é a mesma do
exemplo anterior. Fizemos isto, para que você entendesse melhor que os passos
utilizados no calculo do determinante são os mesmo utilizados na inversa da matriz.
Devemos primeiramente montar a matriz ampliada 𝐵 = [𝑀: 𝐼]

1 3 0
− a(31
0)
B0 =  0 2 1  (0)
m1 = = −1
  (0)
 1 2 - 1  a11
L(31) → m1(0)L(10) + L(30)

1 3 0  − a(32
1)
m1(1) = = 0.5

B1 = 0 2 1  a(22
1)
 
 0 - 1 - 1  L(32) → m1(1)L(21) + L(31)
1.00 3.00 0
B2 =  0 2.00 1.00  − a(23
2)
  m1(2) = = 2
 0 0 - 0.50  a(332)

 1.00 3.00 0 L(23) → m(22)L(32) + L(22)


(3)
 − a12
B3 = 0 2.00 0 (3)
m1 = = - 1.5
 
 0 0 - 0.50  a(22
3)

L(14) → m1(3)L(23) + L(13)


 1.00 0 0
B4 =  0 2.00 0
 
 0 0 - 0.50 

det( M) = 1.00 * 2.00 * ( − 0.50) = − 1.00


Cálculo Numérico com Python no Google Colaboratory 56

PROGRAMA EM PYTHON
# Gauss - Jordan - Determinante

import numpy as np

# Entrada (sistema)

M = np.array(
[[1.0 , 2.0 , 2.0],
[2.0 , -2.0 , 2.0],
[2.0 , -1.0 , 2.0]]
)

print("Gauss - Jordan - Determinante")


print("Matriz")

linha = np.size(M[:,1])
coluna = np.size(M[1,:])

for i in range(0 , linha , 1):


for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

#print('Linha: {:d}'.format(linha))
#print('Coluna: {:d}'.format(coluna))

# Zera Triangulo Infrerior


t = 1
fm = 0

for j in range(0 , linha , 1):


for i in range(t , linha , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
M[i , k] = fm * M[j , k] + M[i , k]
t = t + 1

print("\nZera Triangulo Inferior")


for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

t = 1
fm = 0
Cálculo Numérico com Python no Google Colaboratory 57

for j in range(linha - 1 , 0 , -1):


for i in range(0 , linha - t , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
M[i,k] = fm * M[j,k] + M[i,k]
t = t + 1

print("Zera Triangulo Superior")


for i in range(0 , linha , 1):
for j in range(0 , coluna , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

det = 1.

for i in range(0 , linha , 1):


det = det * M[i,i]

print("\nDeterminante: %8.4f" %det)

SAÍDA DO PROGRAMA
Gauss - Jordan - Determinante
Matriz
1.0000 2.0000 2.0000
2.0000 -2.0000 2.0000
2.0000 -1.0000 2.0000

Zera Triangulo Inferior


1.0000 2.0000 2.0000
0.0000 -6.0000 -2.0000
0.0000 0.0000 -0.3333
Zera Triangulo Superior
1.0000 0.0000 0.0000
0.0000 -6.0000 0.0000
0.0000 0.0000 -0.3333

Determinante: 2.0000

ATIVIDADE
(01) Determine o determinante das matrizes abaixo
1 1 1 1 2 -1
(a) [ 1 -1 -1 ] (b) [ 1 1 1 ]
1 -1 1 -1 2 3
(02) Calcule o determinante das matrizes
1 2 3 1 2 3
(a) [−1 5 2] (b) [ 1 1 2]
−2 2 1 −2 1 1
Cálculo Numérico com Python no Google Colaboratory 58

MÉTODOS ITERATIVOS
A outra forma de se determinar a solução de um sistema 𝐴𝑥 = 𝑏, que é através dos
métodos iterativos. Os métodos iterativos consistem em determinar uma sequência de
aproximações 𝑥 (1) , 𝑥 (2) , ... , 𝑥 (𝑘) , para a solução do sistema 𝑥, a partir de uma dada
aproximação inicial 𝑥 (0) .
Segundo este raciocínio, o sistema 𝐴𝑥 = 𝑏, é transformado em um outro sistema
equivalente com a seguinte forma
𝑥 (𝑘+1) = 𝐹𝑥 (𝑘) + 𝑑
onde 𝐹 é uma matriz 𝑛 × 𝑛, 𝑥 e 𝑑 são matrizes 𝑛 × 1. 𝑥 (𝑘+1) é uma aproximação obtida a
partir da aproximação 𝑥 (𝑘) . Sendo a seqüência de aproximações obtida da seguinte
forma
𝑥 (1) = 𝐹𝑥 (0) + 𝑑
𝑥 (2) = 𝐹𝑥 (1) + 𝑑
𝑥 (3) = 𝐹𝑥 (2) + 𝑑
......................
𝑥 (𝑘+1) = 𝐹𝑥 (𝑘) + 𝑑
As aproximações são calculadas até que se tenha
(𝑘)
‖𝑥 (𝑘) − 𝑥‖ = 𝑚𝑎𝑥 {𝑥𝑖 − 𝑥𝑖 }
1≤𝑖≤𝑛

O que garante que a sequência 𝑥 (1) , 𝑥 (2) , ... , 𝑥 (𝑘) converge para a solução? Se
𝑙𝑖𝑚 ‖𝑥 (𝑘) − 𝑥‖ = 0, então a seqüência 𝑥 (1) , 𝑥 (2) , ... , 𝑥 (𝑘) converge para a solução 𝑥.
𝑘→∞

O que diferencia um método iterativo de outro são as de definirmos as matrizes 𝐹 e


𝑑. A seguir apresentaremos o metido de Jacobi que será o nosso primeiro método
iterativo.

3.4. MÉTODO DE JACOBI


Para entendermos o método de Jacobi tomemos o sistema
𝑎11 𝑥1 + 𝑎12 𝑥2 +. . . +𝑎1𝑛 𝑥𝑛 = 𝑏1
𝑎 𝑥 + 𝑎22 𝑥2 +. . . +𝑎2𝑛 𝑥𝑛 = 𝑏2
{ 21 1
...................................
𝑎𝑛1 𝑥1 + 𝑎𝑏2 𝑥2 +. . . +𝑎𝑛𝑛 𝑥𝑛 = 𝑏𝑛
em cada equação do sistema devemos isolar o valor de 𝑥𝑖 , isto é, na primeira equação
devemos isolar 𝑥1 , na segunda equação devemos isolar 𝑥2 , e assim por diante, com isto
teremos:
Cálculo Numérico com Python no Google Colaboratory 59

𝑏1 − (𝑎12 𝑥2 + 𝑎13 𝑥3 +. . . +𝑎1𝑛 𝑥𝑛 )


𝑥1 =
𝑎11
𝑏2 − (𝑎21 𝑥1 + 𝑎13 𝑥3 +. . . +𝑎2𝑛 𝑥𝑛 )
𝑥2 =
𝑎22
...................................................
𝑏𝑛 − (𝑎𝑛1 𝑥1 + 𝑎𝑏2 𝑥2 + 𝑎13 𝑥3 +. . . +𝑎𝑛𝑛−1 𝑥𝑛−1 )
𝑥𝑛 =
{ 𝑎𝑛𝑛

É importante você observar que os elementos 𝑎𝑖𝑖 devem ser diferentes de zeros
𝑎𝑖𝑖 ≠ 0, ∀𝑖, se não teremos divisão por zero. Caso isto não ocorra devemos reagrupar o
sistema para que se consiga esta condição
Podemos colocar o sistema na seguinte forma 𝑥 (𝑘+1) = 𝐹𝑥 (𝑘) + 𝑑, onde
𝑏1
𝑥1 𝑎11
𝑏2
𝑥
𝑥 = [ 2] 𝑑= 𝑎22
⋮ ⋮
𝑥𝑛 𝑏𝑛
[𝑎𝑛𝑛 ]
𝑎12 𝑎13 𝑎1𝑛
0 − − . .. −
𝑎11 𝑎11 𝑎11
𝑎21 𝑎23 𝑎2𝑛
− 0 − . .. −
𝑎22 𝑎22 𝑎22
𝐹= 𝑎31 𝑎32 𝑎3𝑛
− − 0 . .. −
𝑎33 𝑎33 𝑎33
.........................................
𝑎𝑛1 𝑎𝑛2 𝑎𝑛3
− − − ... 0
[ 𝑎𝑛𝑛 𝑎𝑛𝑛 𝑎𝑛𝑛 ]

O método de Jacobi funciona da seguinte forma:


1º Passo: Devemos escolher uma aproximação inicial 𝑥 (0) .
2º Passo: Devemos gerar as aproximações 𝑥 (𝑘) a partir das iterações
𝑥 (𝑘+1) = 𝐹𝑥 (𝑘) + 𝑑, 𝑘 = 0,1,2, . ..
3º Passo: Paramos de calcular as aproximações quando um dos critérios de parada
abaixo for satisfeito.
(𝑘+1) (𝑘)
1º critério: 𝑚𝑎𝑥 |𝑥𝑖 − 𝑥𝑖 | ≤ 𝐸, onde 𝐸 é a tolerância.
1≤𝑖≤𝑛

2º critério: 𝑘 > 𝑀, onde 𝑀 é o número máximo de iterações.


A tolerância 𝐸 fixa o grau de precisão das soluções. Para você compreender melhor o
método de Jacobi observe o exemplo a seguir.
Cálculo Numérico com Python no Google Colaboratory 60

Exemplo 01 – Resolva pelo método de Jacobi o sistema


2𝑥1 − 𝑥2 = 1
{ com 𝐸 ≤ 10−2 ou 𝑘 > 10.
𝑥1 + 2𝑥2 = 3
Solução
Isolando o valor de 𝑥1 na primeira equação e 𝑥2 na segunda equação, temos as equações
de iteração
1
𝑥1𝑘+1 = 2 (1 + 𝑥2𝑘 )
{ 1 onde 𝑘 = 0,1,2, . ..
𝑥2𝑘+1 = (3 − 𝑥1𝑘 )
2

0
Utilizaremos como aproximação inicial 𝑥 (0) = [ ] para calcular 𝑥 (1) , como mostraremos
0
a seguir
Para 𝑘 = 0
1 1
𝑥11 = 2 (1 + 𝑥20 ) 𝑥11 = 2 (1 + 0) = 0.5 0.5
{ 1  { 1  𝑥 (1) = [ ]
𝑥21 = 2 (3 − 𝑥10 ) 𝑥21 = 2 (3 − 0) = 1.5 1.5

Para 𝑘 = 1
1 1
𝑥12 = 2 (1 + 𝑥21 ) 𝑥11 = 2 (1 + 0.5) = 1.25 1.25
{ 1  { 1  𝑥 (2) = [ ]
𝑥22 = 2 (3 − 𝑥11 ) 𝑥21 = 2 (3 − 1.5) = 1.25 1.25

repetiremos estes cálculos para 𝑘 = 2, 3, . . .. e colocamos os valores obtidos na tabela


abaixo:
k 𝑥1𝑘 𝑥2𝑘 𝐸

0 0.0000 0.0000 0.0000


1 0.5000 1.5000 1.5000
2 1.2500 1.2500 0.7500
3 1.1250 0.8750 0.3750
4 0.9375 0.9375 0.1875
5 0.9688 1.0313 0.0938
6 1.0156 1.0156 0.0469
7 1.0078 0.9922 0.0234
8 0.9961 0.9961 0.0117
9 0.9980 1.0020 0.0059
10 1.0010 1.0010 0.0029

como
0.0029 ≤ 10−2 𝑥 = 1.0010 1.0010
𝑜𝑢 }  { 1  𝑥=[ ]
𝑥2 = 1.0010 1.0010
𝑘 > 10?
Cálculo Numérico com Python no Google Colaboratory 61

Exemplo 02 – Resolva pelo método de Jacobi o sistema


𝑥1 − 0.25𝑥2 − 0.25𝑥3 + 0 = 0
−0.25𝑥1 + 𝑥2 − 0 − 0.25𝑥4 = 0
{
−0.25𝑥1 + 0 + 𝑥3 − 0.25𝑥4 = −0.25
0 − 0.25𝑥2 + 0 + 𝑥4 = −0.25
com 𝐸 ≤ 10−2 ou 𝑘 > 10 e 𝑥 = [0000].
Solução
Isolando o valor de 𝑥1 na primeira equação, 𝑥2 na segunda equação, 𝑥3 na terceira
equação e 𝑥4 na quarta equação, obtemos as equações de iteração
𝑥1𝑘+1 = 0.25𝑥2𝑘 + 0.25𝑥3𝑘
𝑥2𝑘+1 = 0.25𝑥1𝑘 + 0.25𝑥4𝑘
onde 𝑘 = 0,1,2, . ..
𝑥3𝑘+1 = 0.25𝑥1𝑘 + 0.25𝑥4𝑘 − 0.25
{𝑥4
𝑘+1
= 0.25𝑥2𝑘 − 0.25
Utilizaremos como aproximação inicial 𝑥 (0) = [0000], com os valores das aproximações
montaremos a próxima tabela.
k 𝑥1𝑘 𝑥2𝑘 𝑥3𝑘 𝑥4𝑘 𝐸

0.0000 0.0000 0.0000 0.0000 0.0000 0.0000


1.0000 0.0000 0.0000 -0.2500 -0.2500 0.2500
2.0000 -0.0625 -0.0063 -0.2562 -0.2500 0.0625
3.0000 -0.0656 -0.0219 -0.2719 -0.2516 0.0156
4.0000 -0.0734 -0.0227 -0.2727 -0.2555 0.0078
5.0000 -0.0738 -0.0247 -0.2747 -0.2557 0.0021
6.0000 -0.0749 -0.0249 -0.2749 -0.2562 0.0010
7.0000 -0.0749 -0.0251 -0.2751 -0.2562 0.0003

como
𝑥1 = −0.0749 −0.0749
0.0003 ≤ 10−2 𝑥 = −0.0251 −0.0251
𝑜𝑢 }  { 2  𝑥=[ ]
𝑥3 = −0.2751 −0.2751
𝑘 > 10?
𝑥4 = −0.2562 −0.2562

PROGRAMA EM PYTHON
#Jacobi - Sistema

import numpy as np

# Entrada (sistema)
nloop = 50 # numero máximo de loop
erro = 0.001 # tolerância
Cálculo Numérico com Python no Google Colaboratory 62

M = np.array(
[[3.0 , 1.0 , 1.0 , 8.0],
[1.0 , -2.0 , 2.0 , 3.0],
[1.0 , -1.0 , 3.0 , 8.0]]
)

print("Jacobi - Sistema")

tole = 10
pare = 0
v = 0
i1 = 0
i2 = 1
m = np.size(M[:,1])
n = np.size(M[1,:])

print("Matriz Ampliada")
for i in range(0 , m , 1):
for j in range(0 , n , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

#print('m: {:d}'.format(m))
#print('n: {:d}'.format(n))

R = np.zeros((nloop , m))
v = np.zeros((m))
va = 0;
k = 0

print('\n k x1 x2 x3 Erro')

while(pare == 0):
for i in range(0 , m , 1):
va = 0
for j in range(0 , m , 1):
if(i == j):
va = va + 0.0
if(i != j):
va = va + ( M[i,j] * R[i1,j] )
R[i2,i] = (1/M[i,i])*(M[i,n-1]- va)
print("%2d"%k , "%8.4f"%R[k , 0] , "%8.4f"%R[k , 1] , "%8.4f"%R[k ,
2] , "%8.4f"%tole)
tole = 10
if (k >= 0):
for i in range(0 , m , 1):
v[i] = abs(R[i2,i] - R[i1,i]);
tole = max(v[:]);
if(tole < erro):
Cálculo Numérico com Python no Google Colaboratory 63

print("\nSolução do sistema")
for t in range(0 , m , 1):
print("%8.2f"%R[i2 , t], end=' ')
pare = 1

if(i1 == nloop):
pare = 1
i1 = i1 + 1
i2 = i2 + 1
k = k + 1

SAÍDA DO PROGRAMA
Jacobi - Sistema
Matriz Ampliada
3.0000 1.0000 1.0000 8.0000
1.0000 -2.0000 2.0000 3.0000
1.0000 -1.0000 3.0000 8.0000

k x1 x2 x3 Erro
0 0.0000 0.0000 0.0000 10.0000
1 2.6667 -1.5000 2.6667 2.6667
2 2.2778 2.5000 1.2778 4.0000
3 1.4074 0.9167 2.7407 1.5833
4 1.4475 1.9444 2.5031 1.0278
5 1.1842 1.7269 2.8323 0.3292
6 1.1469 1.9244 2.8476 0.1975
7 1.0760 1.9210 2.9258 0.0782
8 1.0510 1.9638 2.9483 0.0428
9 1.0293 1.9739 2.9709 0.0226
10 1.0184 1.9856 2.9815 0.0117
11 1.0110 1.9907 2.9891 0.0075
12 1.0067 1.9945 2.9933 0.0042
13 1.0041 1.9966 2.9959 0.0027
14 1.0025 1.9980 2.9975 0.0016

Solução do sistema
1.00 2.00 3.00

ATIVIDADE
(01) Resolva os sistemas, com 𝑥0 = [000], 𝐸 ≤ 10−2 ou 𝑘 < 10, onde 𝑘 iterações.
2𝑥 − 𝑦 + 𝑧 = 2 4𝑥 − 𝑦 + 𝑧 = 5
(a) {𝑥 + 2𝑦 + 𝑧 = 4 (b) {𝑥 + 2𝑦 + 𝑧 = 5
2𝑥 + 𝑦 + 2𝑧 = 5 𝑥 − 3𝑦 + 3𝑧 = 4
(02) Resolva os sistemas
3𝑥 + 𝑦 − 𝑧 = 2 3𝑥 − 𝑦 + 𝑧 = 4
(a) {𝑥 + 5𝑦 + 𝑧 = 14 (b) {−𝑥 + 4𝑦 + 𝑧 = 10
𝑥 − 𝑦 − 3𝑧 = −10 −𝑥 − 𝑦 + 3𝑧 = 6
Cálculo Numérico com Python no Google Colaboratory 64

4.5. MÉTODO DE GAUSS-SEIDEL


O método Gauss-Seidel é um outro método iterativo para calcular a solução de
sistemas lineares. Sua conversão é mais rápida do que o método de Jacobi .
O método iterativo de Gauss-Seidel consiste em:
1º Passo: Definirmos uma aproximação inicial 𝑥 (0) .
2º Passo: Calcula-se a sequência de aproximações 𝑥 (1) , 𝑥 (2) , ... , 𝑥 (𝑘) utilizando-se as
seguintes fórmulas:

x1(k +1) =
1
a11

b1 − a12 x (2k) − a13 x (3k) − a13 x (3k) −  − a1n x n(k) 

x (2k +1) =
1
a 22

b 2 − a 21 x1(k +1) − a 23 x (3k) − a 23 x (3k) −  − a 2 n x n(k) 

x (3k +1) =
1
a 33

b 3 − a 31 x1(k +1) − a 32 x (2k +1) − a 34 x (4k) −  − a 3 n x n(k) 

x n(k +1) =
1
ann

bn − an1 x1(k +1) − an2 x (2k +1) − an4 x (4k +1) −  − an,n −1 x n(k−+11) 
(𝑘+1) (𝑘+1)
Observe que no cálculo da aproximação 𝑥𝑛 , utilizamos as aproximações 𝑥1 ,
(𝑘+1) (𝑘+1)
𝑥2 , ... , 𝑥𝑛−1 . Isto faz com que este método tenha convergência mais rápida.
Explicaremos o método iterativo de Gauss-Seidel com o auxílio do exemplo a seguir.

Exemplo 01 - Exemplo 01 – Resolva pelo método de Jacobi o sistema


2𝑥1 − 𝑥2 = 1
{ com 𝑥 (0) = [00], 𝐸 ≤ 10−2 ou 𝑘 > 10.
𝑥1 + 2𝑥2 = 3
Solução
Isolando o valor de 𝑥1 na primeira equação e 𝑥2 na segunda equação, temos as equações
de iteração
Cálculo Numérico com Python no Google Colaboratory 65

1
𝑥1𝑘+1 = 2 (1 + 𝑥2𝑘 )
{ 1 onde 𝑘 = 0,1,2, . ..
𝑥2𝑘+1 = 2 (3 − 𝑥1𝑘+1 )

O calculo das aproximações é feito da seguinte forma


Para 𝑘 = 0 (1ª iteração)
(1) 1 (0) (1) 1
𝑥1 = (1 + 𝑥2 ) 𝑥1 = 2 (1 + 0) = 0.5 0.5
{ (1) 21 (1)
 { (1) 1  𝑥 (1) = [ ]
𝑥2 = 2 (3 − 𝑥1 ) 𝑥2 = 2 (3 − 0.5) = 1.25 1.25

Para 𝑘 = 1 (2ª iteração)


(2) 1 (1) (2) 1
𝑥1 = (1 + 𝑥2 ) 𝑥1 = 2 (1 + 1.25) = 1.125 1.125
{ (2) 21 (2)
 { (2) 1  𝑥 (2) = [ ]
𝑥2 = 2 (3 − 𝑥1 ) 𝑥2 = 2 (3 − 1.125) = 0.9375 0.9375

repetiremos estes cálculos para 𝑘 = 2,3, . . .. e colocamos os valores obtidos na tabela a


seguir.

K x1k x k2 E
0 0.0000 0.0000 0.0000
1 0.5000 1.2500 1.2500
2 1.1250 0.9375 0.6250
3 0.9688 1.0156 0.1563
4 1.0078 0.9961 0.0391
5 0.9980 1.0010 0.0098
6 1.0005 0.9998 0.0024
7 0.9999 1.0001 0.0006
como
0.0006 ≤ 10−2 𝑥 = 0.9999 0.9999
𝑜𝑢 }  { 1  𝑥=[ ]
𝑥2 = 1.0001 1.0001
𝑘 > 10?

Perceba que este método converge mais rápido, comparando este exemplo com o
primeiro exemplo do método Jacobi. Para facilitar a nossa comparação entre os métodos
de Jacobi e Gauss-Seidel, resolveremos a seguir, pelo método de Gauss-Seidel, o exemplo
resolvido pelo método de Jacobi.
Cálculo Numérico com Python no Google Colaboratory 66

Exemplo 02 – Resolva pelo método de Gauss-Seidel o sistema


𝑥1 − 0.25𝑥2 − 0.25𝑥3 + 0 = 0
−0.25𝑥1 + 𝑥2 + 0 − 0.25𝑥4 = 0
{
−0.25𝑥1 + 0 + 𝑥3 − 0.25𝑥4 = −0.25
0 − 0.25𝑥2 + 0 + 𝑥4 = −0.25
com 𝐸 ≤ 10−2 ou 𝑘 > 10 e 𝑥 (0) = [0000].

Solução
Isolando o valor de 𝑥1 na primeira equação, 𝑥2 na segunda equação, 𝑥3 na terceira
equação e 𝑥4 na quarta equação, obtemos as equações de iteração
(𝑘+1) (𝑘) (𝑘)
𝑥1 = 0.25𝑥2 + 0.25𝑥3
(𝑘+1) (𝑘+1) (𝑘)
𝑥2 = 0.25𝑥1 + 0.25𝑥4
(𝑘+1) (𝑘+1) (𝑘)
onde 𝑘 = 0,1,2, . ..
𝑥3 = 0.25𝑥1 + 0.25𝑥4 − 0.25
(𝑘+1) (𝑘+1)
{𝑥4 = 0.25𝑥2 − 0.25
Utilizaremos como aproximação inicial 𝑥 (0) = [0000], com os valores das aproximações
montaremos a próxima tabela.
k 𝑥1𝑘 𝑥2𝑘 𝑥3𝑘 𝑥4𝑘 𝐸
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
1.0000 0.0000 0.0000 -0.2500 -0.2500 0.2500
2.0000 -0.0625 -0.0219 -0.2719 -0.2555 0.0625
3.0000 -0.0734 -0.0247 -0.2747 -0.2562 0.0109
4.0000 -0.0749 -0.0251 -0.2751 -0.2563 0.0014
5.0000 -0.0751 -0.0252 -0.2752 -0.2563 0.0002

como

𝑥1 = −0.0751 −0.0751
0.0002 ≤ 10−2 𝑥 = −0.0252 −0.0252
𝑜𝑢 }  { 2  𝑥=[ ]
𝑥3 = −0.2752 −0.2752
𝑘 > 10?
𝑥4 = −0.2563 −0.2563

PROGRAMA EM PYTHON
#Gauss - Seidel - Sistema

import numpy as np

# Entrada (sistema)
nloop = 50 # numero máximo de loop
erro = 0.001 # tolerância

M = np.array(
Cálculo Numérico com Python no Google Colaboratory 67

[[2.0 , -1.0 , 2.0 , 6.0],


[1.0 , 2.0 , 2.0 , 11.0],
[1.0 , -1.0 , 3.0 , 8.0]]
)

print("Gauss - Seidel - Sistema")

tole = 10
pare = 0
v = 0
i1 = 0
i2 = 1
m = np.size(M[:,1])
n = np.size(M[1,:])

print("Matriz Ampliada")
for i in range(0 , m , 1):
for j in range(0 , n , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

#print('m: {:d}'.format(m))
#print('n: {:d}'.format(n))

R = np.zeros((nloop , m))
v = np.zeros((m))
va = 0;
k = 0

print('\n k x1 x2 x3 Erro')

while(pare == 0):
for i in range(0 , m , 1):
va = 0
for j in range(0 , m , 1):
if(i == j):
va = va + 0.0
if(i != j):
if(i < j):
va = va + ( M[i,j] * R[i1,j] )
if(i > j):
va = va + ( M[i,j] * R[i2,j] )
R[i2,i] = (1/M[i,i])*(M[i,n-1]- va)
print("%2d"%k , "%8.4f"%R[k , 0] , "%8.4f"%R[k , 1] , "%8.4f"%R[k ,
2] , "%8.4f"%tole)
tole = 10
if (k >= 0):
for i in range(0 , m , 1):
v[i] = abs(R[i2,i] - R[i1,i]);
Cálculo Numérico com Python no Google Colaboratory 68

tole = max(v[:]);
if(tole < erro):
print("\nSolução do sistema")
for t in range(0 , m , 1):
print("%8.2f"%R[i2 , t], end=' ')
pare = 1

if(i1 == nloop):
pare = 1
i1 = i1 + 1
i2 = i2 + 1
k = k + 1

SAÍDA DO PROGRAMA
Gauss - Seidel - Sistema
Matriz Ampliada
2.0000 -1.0000 2.0000 6.0000
1.0000 2.0000 2.0000 11.0000
1.0000 -1.0000 3.0000 8.0000

k x1 x2 x3 Erro
0 0.0000 0.0000 0.0000 10.0000
1 3.0000 4.0000 3.0000 4.0000
2 2.0000 1.5000 2.5000 2.5000
3 1.2500 2.3750 3.0417 0.8750
4 1.1458 1.8854 2.9132 0.4896
5 1.0295 2.0720 3.0142 0.1866
6 1.0218 1.9749 2.9844 0.0971
7 1.0031 2.0141 3.0037 0.0392
8 1.0034 1.9946 2.9971 0.0195
9 1.0002 2.0028 3.0009 0.0082
10 1.0005 1.9989 2.9994 0.0039
11 1.0000 2.0006 3.0002 0.0017

Solução do sistema
1.00 2.00 3.00
Cálculo Numérico com Python no Google Colaboratory 69

ATIVIDADE
(01) Resolva o sistemas, com 𝑥0 = [0 , 0 , 0], 𝐸 ≤ 10−2 ou 𝑘 ≤ 10, onde 𝑘 é o número
de iterações. Utilize o método de Gauss Seidel.
2𝑥 − 𝑦 + 𝑧 = 2 4𝑥 − 𝑦 + 𝑧 = 5
(a) {𝑥 + 2𝑦 + 𝑧 = 4 (b) {𝑥 + 2𝑦 + 𝑧 = 5
2𝑥 + 𝑦 + 2𝑧 = 5 𝑥 − 3𝑦 + 3𝑧 = 4

3𝑥 − 𝑦 − 𝑧 + 𝑡 = 2
3𝑥 − 𝑦 − 𝑧 = −2
2𝑥 + 5𝑦 + 𝑧 + 𝑡 = 19
(c) {2𝑥 + 5𝑦 + 𝑧 = 15 (d) {
−𝑥 − 𝑦 − 3𝑧 − 𝑡 = −16
−𝑥 − 𝑦 − 3𝑧 = −12
𝑥 + 2𝑦 + 𝑧 + 5𝑡 = 28

(02) Resolva os sistemas, com 𝑥0 = [0 , 0 , 0], 𝐸 ≤ 10−2 ou 𝑘 ≤ 10, onde 𝑘 é o número de


iterações. Utilize o método de Gauss Seidel.
3𝑥 + 𝑦 − 𝑧 = 2 3𝑥 − 𝑦 + 𝑧 = 4
(a) {𝑥 + 5𝑦 + 𝑧 = 14 (b) {−𝑥 + 4𝑦 + 𝑧 = 10
𝑥 − 𝑦 − 3𝑧 = −10 −𝑥 − 𝑦 + 3𝑧 = 6

3𝑥 + 𝑦 − 𝑧 + 𝑡 = 6
3𝑥 + 𝑦 − 𝑧 = 2
𝑥 + 5𝑦 + 𝑧 + 𝑡 = 18
(c) {−𝑥 + 4𝑦 + 2𝑧 = 13 (d) {
𝑥 − 𝑦 − 3𝑧 + 𝑡 = −6
−𝑥 + 𝑦 + 2𝑧 = 7
𝑥 + 2𝑦 + 𝑧 + 5𝑡 = 28
Cálculo Numérico com Python no Google Colaboratory 70

5. AJUSTE DE CURVAS
Em muitas situações, principalmente as que estão relacionadas com levantamento
de dados, conhecemos alguns valores da função, só nos pontos amostrados, e na maioria
das vezes precisamos estimar o valor da função para pontos não amostrados. O exemplo
a seguir apresenta um problema desta natureza.

Exemplo – Em uma cidade A foi feito um foi feito um censo cujos resultado está
mostrado na tabela a seguir.

Ano Número de habitantes


1940 19600
1960 19800
1980 20000
1990 20100
2000 20200
Tabela 1 – Resultado do censo feito na cidade hipotética A.

Quantos habitantes havia na cidade A em 1970? Para resolver este problema


necessitamos estimar uma função que ajuste estes dados, e só então poderemos estimar
o número de habitantes no ano em que se deseja.

5.1. AJUSTE LINEAR


Para calcularmos o número de habitantes no ano de 1970, devemos observar que
os dados possuem um comportamento linear, como mostra a Figura 1, logo estes dados
podem ser aproximados por uma reta da forma
𝑦 = 𝛼0 + 𝛼1 𝑥,
onde 𝛼0 e 𝛼1 são denominados parâmetros do modelo.

4
x 10
2.03

2.02

2.01

1.99

1.98

1.97

1.96

1.95

1.94
1930 1940 1950 1960 1970 1980 1990 2000 2010

Figura 1 – Representação gráfica dos dados da Tabela 1.


Cálculo Numérico com Python no Google Colaboratory 71

Os valores de 𝛼0 e 𝛼1 que queremos estimar, para isto devemos fazer a seguinte


consideração que é ilustrada com o gráfico da Figura 2.
Y

Figura 2 – As bolinhas representam os valores amostrados no campo e a reta


representa a função ajustada nos pontos amostrados. No ponto 𝑥𝑖 o valor 𝑦𝑖 representa o
valor amostrado, e 𝑦̂𝑖 o seu valor estimado pela função ajustada e 𝑑𝑖 = 𝑦𝑖 − 𝑦̂𝑖 é a
diferença entre o valor amostrado (valor real do campo) e o valor estimado.
Como estimar a função 𝑦̂ = 𝛼0 + 𝛼1 𝑥? Para estimarmos a função 𝑦̂ = 𝛼0 + 𝛼1 𝑥, o
erro entre o valor amostrado 𝑦𝑖 e o valor estimado 𝑦̂𝑖 deve ser mínimo, para isto a soma
dos quadrados do erro de todos os pontos deve ser a menor possível.
Para você entender melhor, primeiro definiremos a função que representa a soma
do quadrado dos erros:
𝐷 = ∑𝑛𝑖=1(𝑦𝑖 − 𝑦̂𝑖 )2 ,
onde temos n é o número de pontos amostrados. A magnitude de 𝐷 depende da reta
ajustada, ou seja, depende de 𝛼0 e 𝛼1 . Assim como 𝑦̂ = 𝛼0 + 𝛼1 𝑥, podemos escrever:
𝐷(𝛼0 , 𝛼1 ) = ∑𝑛𝑖=1[𝑦𝑖 − (𝛼0 + 𝛼1 𝑥)]2.
O mínimo de uma função de duas variáveis 𝐷(𝛼0 , 𝛼1 ) ocorre quando as suas derivadas
𝜕𝐷(𝛼0 ,𝛼1 ) 𝜕𝐷(𝛼0 ,𝛼1 )
parciais e são simultaneamente iguais a zero.
𝜕𝛼0 𝜕𝛼1

Então para determinarmos 𝛼0 e 𝛼1 da função 𝑦̂ = 𝛼0 + 𝛼1 𝑥, devemos fazer


𝜕𝐷(𝛼0 ,𝛼1 ) 𝜕𝐷(𝛼0 ,𝛼1 )
=0 e = 0,
𝜕𝛼0 𝜕𝛼1

O que resulta nas expressões:


𝑛 ∑𝑛 𝑛 𝑛
𝑖=1 𝑥𝑖 𝑦𝑖 −∑𝑖=1 𝑥𝑖 ∑𝑖=1 𝑦𝑖 ∑𝑛 𝑛
𝑖=1 𝑦𝑖 −(∑𝑖=1 𝑥𝑖 )𝛼1
𝛼1 = 2 e 𝛼0 = .
𝑛 ∑𝑛 2 𝑛
𝑖=1 𝑥𝑖 −(∑𝑖=1 𝑥𝑖 )
𝑛
Cálculo Numérico com Python no Google Colaboratory 72

Explicaremos o uso destas fórmulas através de um exemplo e você perceberá que sua
aplicação é simples.

Exemplo: Encontre o número de habitantes de uma cidade no ano de 1970 considerando


os dados do censo mostrado na Tabela 2.
Número de
Ano
i (𝑥𝑖 )
habitantes
(𝑦𝑖 )
1
1940 19600
2
1960 19800
3
1980 20000
4
1990 20100
5
2000 20200
Tabela 2 – Censo feito na cidade hipotética A. É o mesmo dado da Tabela 1.

Para calcularmos 𝛼1 e 𝛼0 devemos primeiro completar a tabela com as colunas


contendo informação de 𝑥𝑖2 e 𝑥𝑖 𝑦𝑖 (ver Tabela 3)

Número de
Ano
i habitantes 𝑥𝑖2 𝑥𝑖 𝑦𝑖
(𝑥𝑖 )
(𝑦𝑖 )
1 1940 19600 3763600 38024000
2 1960 19800 3841600 38808000
3 1980 20000 3920400 39600000
4 1990 20100 3960100 39999000
5 2000 20200 4000000 40400000
Tabela 3 – Contém informações da Tabela 2 mais as colunas para 𝑥𝑖2 e 𝑥𝑖 𝑦𝑖 .

Agora calcularemos ∑𝑛𝑖=1 𝑥𝑖 , ∑𝑛𝑖=1 𝑦𝑖 , ∑𝑛𝑖=1 𝑥𝑖2 e ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖 que são obtidos
simplesmente pela soma dos elementos de cada coluna, como mostra a Tabela 4.

Número de
Ano
𝑖 habitantes 𝑥𝑖2 𝑥𝑖 𝑦𝑖
(𝑥𝑖 )
(𝑦𝑖 )
1 1940 19600 3763600 38024000
2 1960 19800 3841600 38808000
3 1980 20000 3920400 39600000
4 1990 20100 3960100 39999000
5 2000 20200 4000000 40400000
𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖 = 9870 ∑ 𝑦𝑖 = 99700 ∑ 𝑥𝑖2 = 19485700 ∑ 𝑥𝑖 𝑦𝑖 = 196831000


𝑖=1 𝑖=1 𝑖=1 𝑖=1
Tabela 4 – Estão os valores de 𝑥𝑖 , 𝑦𝑖 , 𝑥𝑖2 , 𝑥𝑖 𝑦𝑖 , ∑𝑛𝑖=1 𝑥𝑖 , ∑𝑛𝑖=1 𝑦𝑖 , ∑𝑛𝑖=1 𝑥𝑖2 e ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖 .
Cálculo Numérico com Python no Google Colaboratory 73

Com os valores da Tabela 4 podemos calcular os coeficientes  1 e  0 , da seguinte forma:


𝑛 ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖 − ∑𝑛𝑖=1 𝑥𝑖 ∑𝑛𝑖=1 𝑦𝑖 5 ∗ 196831000 − 9870 ∗ 99700
𝛼1 = 2 = = 10
𝑛 ∑𝑛𝑖=1 𝑥𝑖2 − (∑𝑛𝑖=1 𝑥𝑖 ) 5 ∗ 19485700 − 196831000

∑𝑛𝑖=1 𝑦𝑖 − (∑𝑛𝑖=1 𝑥𝑖 )𝛼1 99700 − (9870)10


𝛼0 = = = 200
𝑛 5
Com isto a função de ajuste é
𝑦̂ = 200 + 10𝑥
cujo gráfico está mostrado na Figura 3 juntamente com os pontos amostrados.
4
x 10
2.03

2.02

2.01

1.99

1.98

1.97

1.96

1.95

1.94
1930 1940 1950 1960 1970 1980 1990 2000 2010

Figura 3 – A reta representa o gráfico da função ajustada 𝑦̂ = 200 + 10𝑥 e os pontos os


valores amostrados. Podemos perceber o bom ajuste da curva.

O número de habitantes em 1970 é obtido pela fórmula 𝑦̂ = 200 + 10𝑥, da


seguinte forma:
𝑦̂ = 200 + 10 ∗ 1970 = 19900, logo tivemos 19900 habitantes em 1970.
Exemplo:
Com base dos dados amostrados dispostos na tabela a seguir encontre o valor quando
𝑥 = 3, segundo uma aproximação linear.

𝑖 𝑥𝑖 𝑦𝑖
1 0.5000 2.5500
2 1.0000 4.5000
3 1.5000 5.6000
4 2.0000 7.0000
5 2.5000 9.2000
6 3.5000 11.0000
7 4.0000 13.0000
Cálculo Numérico com Python no Google Colaboratory 74

Solução
Devemos completar a tabela com os valores 𝑥𝑖2 e 𝑥𝑖 𝑦𝑖
i 𝑥𝑖 𝑦𝑖 𝑥𝑖2 𝑥𝑖 𝑦𝑖
1 0.5000 2.5500 0.2500 1.2750
2 1.0000 4.5000 1.0000 4.5000
3 1.5000 5.6000 2.2500 8.4000
4 2.0000 7.0000 4.0000 14.0000
5 2.5000 9.2000 6.2500 23.0000
6 3.5000 11.0000 12.2500 38.5000
7 4.0000 13.0000 16.0000 52.0000
𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖 = 15 ∑ 𝑦𝑖 = 52.8500 ∑ 𝑥𝑖2 = 42 ∑ 𝑥𝑖 𝑦𝑖 = 141.6750


𝑖=1 𝑖=1 𝑖=1 𝑖=1

De onde temos
𝑛 ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖 − ∑𝑛𝑖=1 𝑥𝑖 ∑𝑛𝑖=1 𝑦𝑖 7 ∗ 141.6750 − 15 ∗ 52.8500
𝛼1 = 2 = = 2.8837
𝑛 ∑𝑛𝑖=1 𝑥𝑖2 − (∑𝑛𝑖=1 𝑥𝑖 ) 7 ∗ 42 − 141.6750

∑𝑛𝑖=1 𝑦𝑖 − (∑𝑛𝑖=1 𝑥𝑖 )𝛼1 52.8500 − (15)2.8837


𝛼0 = = = 1.3707
𝑛 7
Com isto a função de ajuste é
𝑦̂ = 1.3707 + 2.8837𝑥;
Logo quando 𝑥 = 3  𝑦̂ = 10.0217

ATIVIDADE
(01) Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando 𝑥 = 0.5, segundo uma aproximação linear.
𝑖 𝑥𝑖 𝑦𝑖
1 0.0000 -0.2000
2 0.2000 0.8000
3 0.4000 1.8000
4 0.6000 2.8000
5 0.8000 3.8000
6 1.0000 4.8000
7 1.2000 5.8000
Cálculo Numérico com Python no Google Colaboratory 75

5.2. AJUSTE POLINOMIAL


O ajuste linear é um caso particular do ajuste polinomial, onde ajustaremos aos
pontos amostrados um polinômio, 𝑦̂, de grau n.
𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 + 𝛼3 𝑥 3 +. . . +𝛼𝑛 𝑥 𝑛 .
Os são coeficientes 𝛼0 , 𝛼1 , 𝛼2 , 𝛼3 , . . . , 𝛼𝑛 são obtidos através de um sistema da forma:
𝑋𝐴 = 𝐵
Para que você entenda claramente a construção deste sistema iniciaremos
abordando o ajuste linear segundo esta perspectiva.
Para ajustarmos uma reta (polinômio do 1º grau) 𝑦̂ = 𝛼0 + 𝛼1 𝑥, devemos
minimizar a função 𝐷(𝛼0 , 𝛼1 ) = ∑𝑛𝑖=1[𝑦𝑖 − (𝛼0 + 𝛼1 𝑥)]2, para isto devemos fazer
𝜕𝐷(𝛼0 ,𝛼1 )
=0  𝑛𝛼0 + (∑𝑛𝑖=1 𝑥𝑖 )𝛼1 = ∑𝑛𝑖=1 𝑦𝑖
𝜕𝛼0
𝜕𝐷(𝛼0 ,𝛼1 )
=0  𝛼0 ∑𝑛𝑖=1 𝑥𝑖 + 𝛼1 ∑𝑛𝑖=1 𝑥𝑖2 = ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖
𝜕𝛼1

Podemos escrever este sistema na forma matricial


𝑛 𝑛

𝑛 ∑ 𝑥𝑖 ∑ 𝑦𝑖
𝑖=1 𝛼0 𝑖=1
𝑛 𝑛 [𝛼 ] = 𝑛
1
∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖 𝑦𝑖
[ 𝑖=1 𝑖=1 ] [ 𝑖=1 ]
Comparando com o sistema X A = B , temos que:

𝑛 ∑𝑛𝑖=1 𝑥𝑖 𝛼0 ∑𝑛𝑖=1 𝑦𝑖
𝑋=[ ], 𝐴 = [𝛼 ] e 𝐵=[ ]
∑𝑛𝑖=1 𝑥𝑖 ∑𝑛𝑖=1 𝑥𝑖2 1 ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖
Com a resolução do sistema, encontraremos 𝐴 que possibilitará a determinação do
polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥.
Cálculo Numérico com Python no Google Colaboratory 76

Para entendermos como interpolar um polinômio de grau n, observe a tabela:

Polinômio a interpolador Sistema a ser determinado

𝑛 𝑛

𝑛 ∑ 𝑥𝑖 ∑ 𝑦𝑖
𝑖=1 𝛼0 𝑖=1
𝑦̂ = 𝛼0 + 𝛼1 𝑥 𝑛 𝑛 [𝛼 ] = 𝑛
1
∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖 𝑦𝑖
[ 𝑖=1 𝑖=1 ] [ 𝑖=1 ]

𝑛 𝑛 𝑛

𝑛 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝛼0 𝑛

𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 [𝛼1 ] = ∑ 𝑥𝑖 𝑦𝑖


𝑖=1 𝑖=1 𝑖=1 𝛼2 𝑖=1
𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ∑ 𝑥𝑖2 𝑦𝑖


[ 𝑖=1 𝑖=1 𝑖=1 ] [ 𝑖=1 ]

𝑛 𝑛 𝑛 𝑛

𝑛 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑥𝑖4 𝛼0 ∑ 𝑥𝑖 𝑦𝑖


𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝛼1
𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 + 𝛼3 𝑥 3 𝑛 𝑛 𝑛 𝑛 [𝛼 ] = 𝑖=1
𝑛
2
∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ∑ 𝑥𝑖5 𝛼
3 ∑ 𝑥𝑖2 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ∑ 𝑥𝑖5 ∑ 𝑥𝑖6 ∑ 𝑥𝑖3 𝑦𝑖


[ 𝑖=1 𝑖=1 𝑖=1 𝑖=1 ] [ 𝑖=1 ]

Seguindo o raciocínio da tabela, podemos afirmar que para ajustarmos o polinômio:


𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 + 𝛼3 𝑥 3 +. . . +𝛼𝑛 𝑥 𝑛
Devemos resolver o sistema:
Cálculo Numérico com Python no Google Colaboratory 77

𝑛 𝑛 𝑛 𝑛 𝑛

𝑛 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ⋯ ∑ 𝑥𝑖𝑛 ∑ 𝑦𝑖


𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛 𝑛
∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ⋯ ∑ 𝑥𝑖𝑛+1 ∑ 𝑥𝑖 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝛼0 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛 𝛼1 𝑛
∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ∑ 𝑥𝑖5 ⋯ ∑ 𝑥𝑖𝑛+2 𝛼2 ∑ 𝑥𝑖2 𝑦𝑖
𝛼3 =
𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛 ⋮ 𝑛
∑ 𝑥𝑖3 ∑ 𝑥𝑖4 ∑ 𝑥𝑖5 ∑ 𝑥𝑖6 ⋯ ∑ 𝑥𝑖𝑛+3 [𝛼𝑛 ] ∑ 𝑥𝑖3 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1
⋮ ⋮ ⋮ ⋮ ⋮ ⋮
𝑛 𝑛 𝑛 𝑛 𝑛 𝑛

∑ 𝑥𝑖𝑛 ∑ 𝑥𝑖𝑛+1 ∑ 𝑥𝑖𝑛+2 ∑ 𝑥𝑖𝑛+3 ⋯ ∑ 𝑥𝑖2𝑛 ∑ 𝑥𝑖𝑛 𝑦𝑖


[ 𝑖=1 𝑖=1 𝑖=1 𝑖=1 𝑖=1 ] [ 𝑖=1 ]
Para você entender como montar este sistema, observe o próximo exemplo.

Exemplo: Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando x = 3 , segundo o polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 .

i 𝑥𝑖 𝑦𝑖
1 0.5000 1.2500
2 1.0000 3.0000
3 1.5000 5.2500
4 2.0000 8.0000
5 2.5000 11.2500
6 3.5000 19.2500
7 4.0000 24.0000

Solução
Para montarmos o sistema devemos completar a tabela com as informações:
i 𝑥𝑖 𝑦𝑖 𝑥𝑖2 𝑥𝑖3 𝑥𝑖4 𝑥𝑖 𝑦𝑖 𝑥𝑖2 𝑦𝑖
1 0.5000 1.2500 0.2500 0.1250 0.0625 0.6250 0.3125
2 1.0000 3.0000 1.0000 1.0000 1.0000 3.0000 3.0000
3 1.5000 5.2500 2.2500 3.3750 5.0625 7.8750 11.8125
4 2.0000 8.0000 4.0000 8.0000 16.0000 16.0000 32.0000
5 2.5000 11.2500 6.2500 15.6250 39.0625 28.1250 70.3125
6 3.5000 19.2500 12.2500 42.8750 150.0625 67.3750 235.8125
7 4.0000 24.0000 16.0000 64.0000 256.0000 96.0000 384.0000
𝑛

∑ 15 72 42 135 467.2500 219 737.2500


𝑖=1

Desta forma o sistema para o ajuste do polinômio 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 , adquire a forma:


7 15 42 𝛼0 72
[15 42 𝛼
135 ] [ 1 ] = [ 219 ]
42 135 467.2500 𝛼2 737.2500
Cálculo Numérico com Python no Google Colaboratory 78

De onde obtemos o seguinte polinômio 𝑦̂ = 0 + 2𝑥 + 𝑥 2 , cujo gráfico está mostrado na


Figura 4 juntamente com os pontos amostrado. Logo quando 𝑥 = 3  𝑦̂ = 15.
30

25

20

15

10

0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5

2
Figura 4 – Polinômio interpolador 𝑦̂ = 0 + 2𝑥 + 𝑥 e pontos amostrados.

PROGRAMA EM PYTHON
# Ajuste Linear

import numpy as np

# Entrada
x0 = 3

p = 2 # Grau do polinómio

print("Ajuste Linear")

D = np.array(
[[ 0.5000 , 1.2500],
[ 1.0000 , 3.0000],
[ 1.5000 , 5.2500],
[ 2.0000 , 8.0000],
[ 2.5000 , 11.2500],
[ 3.5000 , 19.2500],
[ 4.0000 , 24.0000]]
)

md = np.size(D[:,1])
nd = np.size(D[1,:])
pp = 2*p

xi = np.zeros((md , pp+1))
ssxi = np.zeros((1 , pp+1))
sxi = np.zeros((1 , pp+2))
yi = np.zeros((md , pp+1))
syi = np.zeros((1 , pp+1))
M = np.zeros((p+1 , p+2))

xi[:,0] = D[:,0]
Cálculo Numérico com Python no Google Colaboratory 79

yi[:,0] = D[:,1]

print(" x y")
for i in range(0 , md , 1):
for j in range(0 , nd , 1):
print("%8.4f"%D[i,j], end=' ')
print(" ")

print("\nf(%8.4f"%x0 , ") = ???")


print("Grau do polinômio: %d"%p + " grau")

for j in range(1 , pp , 1):


for i in range(0 , md , 1):
xi[i , j] = xi[i , 0]**(j+1)

s = 0
for j in range(0 , pp , 1):
s = 0
for i in range(0 , md , 1):
s = s + xi[i,j]
ssxi[0,j] = s

sxi[0,0] = md
for j in range(0 , pp , 1):
sxi[0,j+1] = ssxi[0,j]

#print(" x x^2 x^3 x^4")


#for i in range(0 , md , 1):
#for j in range(0 , pp , 1):
#print("%10.4f"%xi[i,j], end=' ')
#print(" ")

#for j in range(0 , pp , 1):


#print("%10.4f"%ssxi[0,j], end=' ')
#print(" ")

#for j in range(0 , pp+1 , 1):


#print("%10.4f"%sxi[0,j], end=' ')
#print(" ")

for j in range(1 , p+1 , 1):


for i in range(0 , md , 1):
yi[i , j] = (xi[i , 0]**(j))*yi[i , 0]

s = 0
for j in range(0 , p+1 , 1):
s = 0
for i in range(0 , md , 1):
Cálculo Numérico com Python no Google Colaboratory 80

s = s + yi[i,j]
syi[0,j] = s

#print(" (x^0)y (x^1)y (x^2)y")


#for i in range(0 , md , 1):
#for j in range(0 , p+1 , 1):
#print("%10.4f"%yi[i,j], end=' ')
#print(" ")

#for j in range(0 , p+1 , 1):


#print("%10.4f"%syi[0,j], end=' ')
#print(" ")

k = 0
for i in range(0 , p+1 , 1):
for j in range(0 , p+3 , 1):
if(j+k <= p+2):
a = sxi[0,j+k]
if(j+k > p+2):
a = 0
if(j < p+1):
M[i,j] = a
k = k + 1

for i in range(0 , p+1 , 1):


M[i,p+1] = syi[0,i]

print("sistema")
for i in range(0 , p+1 , 1):
for j in range(0 , p+2 , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

linha = np.size(M[:,1])
coluna = np.size(M[1,:])

#print('Linha: {:d}'.format(linha))
#print('Coluna: {:d}'.format(coluna))

# Zera Triangulo Infrerior


t = 1
fm = 0

for j in range(0 , linha , 1):


for i in range(t , linha , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
Cálculo Numérico com Python no Google Colaboratory 81

M[i , k] = fm * M[j , k] + M[i , k]


t = t + 1

#print("Zera Triangulo Infrerior")


#for i in range(0 , linha , 1):
#for j in range(0 , coluna , 1):
#print("%8.4f"%M[i,j], end=' ')
#print(" ")

t = 1
fm = 0

for j in range(linha - 1 , 0 , -1):


for i in range(0 , linha - t , 1):
fm = - M[i,j]/M[j,j]
for k in range(0 , coluna , 1):
M[i,k] = fm * M[j,k] + M[i,k]
t = t + 1

#print("Zera Triangulo Superior")


#for i in range(0 , linha , 1):
#for j in range(0 , coluna , 1):
#print("%8.4f"%M[i,j], end=' ')
#print(" ")

fm = 0

for i in range(0 , linha , 1):


fm = M[i,i]
for j in range(0 , coluna , 1):
M[i,j] = M[i,j]/fm

#print("Matriz Normalizada")
#for i in range(0 , linha , 1):
#for j in range(0 , coluna , 1):
#print("%8.4f"%M[i,j], end=' ')
#print(" ")

print("\nSolução")
print("f(x)= a0 + a1 x + a2 x^2 + a3 x^3 + a4 x^4")
for i in range(0 , linha , 1):
print("a%d"%i , "= %8.4f"%M[i , coluna-1])

fx0 = 0
for i in range(0 , linha , 1):
fx0 = fx0 + M[i , coluna-1] * x0**i

print(" ")
Cálculo Numérico com Python no Google Colaboratory 82

print("f(%8.4f"%x0 , ") = %8.4f"%fx0)


print(" ")
print(" ")

import matplotlib.pyplot as plt


import numpy as np
xii = np.linspace(-10, 10, 100)
nd2 = np.size(xii)
fxii = np.zeros((1 , nd2))

for j in range(0 , nd2 , 1):


fxii[0,j] = 0
for i in range(0 , linha , 1):
fxii[0,j] = fxii[0,j] + M[i , coluna-1] * xii[j]**i

fig = plt.figure()
plt.plot(D[:,0], D[:,1], '*')
plt.plot(xii[:], fxii[0,:])
plt.grid()

SAÍDA DO PROGRAMA
Ajuste Linear
x y
0.5000 1.2500
1.0000 3.0000
1.5000 5.2500
2.0000 8.0000
2.5000 11.2500
3.5000 19.2500
4.0000 24.0000

f( 3.0000 ) = ???
Grau do polinômio: 2 grau
sistema
7.0000 15.0000 42.0000 72.0000
15.0000 42.0000 135.0000 219.0000
42.0000 135.0000 467.2500 737.2500

Solução
f(x)= a0 + a1 x + a2 x^2 + a3 x^3 + a4 x^4
a0 = 0.0000
a1 = 2.0000
a2 = 1.0000

f( 3.0000 ) = 15.0000
Cálculo Numérico com Python no Google Colaboratory 83

ATIVIDADE
(01) Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando x = 3 , segundo o polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 .
𝑖 𝑥𝑖 𝑦𝑖
1 0.5000 0.7500
2 1.0000 2.0000
3 1.5000 3.7500
4 2.0000 6.0000
5 2.5000 8.7500
6 3.5000 15.7500
7 4.0000 20.0000
(02) Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando 𝑥 = 0.3, segundo o polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 .
𝑖 𝑥𝑖 𝑦𝑖
1 0.0000 0.0000
2 0.2000 -0.1600
3 0.4000 -0.2400
4 0.6000 -0.2400
5 0.8000 -0.1600
6 1.0000 0.0000
7 1.2000 0.2400
(03) Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando 𝑥 = 0.7, segundo o polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 .
i xi yi
1 0.0000 0.0000
2 0.2000 0.1200
3 0.4000 0.0800
4 0.6000 -0.1200
5 0.8000 -0.4800
6 1.0000 -1.0000
7 1.2000 -1.6800
(04) Com base dos dados amostrados dispostos na tabela a seguir encontre o valor
quando 𝑥 = 0.5, segundo o polinômio interpolador 𝑦̂ = 𝛼0 + 𝛼1 𝑥 + 𝛼2 𝑥 2 + 𝛼3 𝑥 3 .
𝑖 𝑥𝑖 𝑦𝑖
1 0.0000 0.0000
2 0.2000 0.2320
3 0.4000 0.4960
4 0.6000 0.7440
5 0.8000 0.9280
6 1.0000 1.0000
7 1.2000 0.9120
Cálculo Numérico com Python no Google Colaboratory 84

6. INTERPOLAÇÃO
Em um dado experimento foram feitas 4 amostras, cujos valores estão dispostos na
tabela abaixo e cuja representação gráfica está na figura a seguir.

Tabela 1
Número da amostra ( i ) 𝑥𝑖 𝑦𝑖
1 0.5 0.25
2 1.2 1.44
3 3.0 9.00
4 4.5 20.25

25

20

15

10

-5
-1 0 1 2 3 4 5 6

Figura 1. Representação gráfica dos dados da Tabela 1.

Quanto vale 𝑦𝑖 quando 𝑥𝑖 = 2 ?


Semelhante a este problema, onde 𝑦 = 𝑓(𝑥), existem muitos outros, onde muitas
funções são conhecidas apenas em um conjunto finito e discreto de pontos de um
intervalo [𝑎, 𝑏].
Nestes casos, onde não se tem a forma analítica da função 𝑦 = 𝑓(𝑥), devemos
substituí-la por outra função 𝑔(𝑥), que é uma aproximação da função 𝑦 = 𝑓(𝑥) e que é
deduzida a partir de dados da tabelados.
Para determinarmos o valor de 𝑦𝑖 quando 𝑥𝑖 = 2, iremos determinar a função
𝑔(𝑥) = 𝑎𝑥 2 + 𝑏𝑥 + 𝑐, que é denominada de polinômio interpolador. Para os dados da
Tabela 1, obteremos a função 𝑔(𝑥) = 1𝑥 2 + 0𝑥 + 0, cujo gráfico está mostrado na figura
a seguir juntamente com os dados da tabela 1.
Cálculo Numérico com Python no Google Colaboratory 85

25

𝑔(𝑥) = 𝑥 2
20

15

10

-5
-1 0 1 2 3 4 5 6
2
Figura 2. Gráfico da função 𝑔(𝑥) = 1𝑥 + 0𝑥 + 0 juntamente os pontos da tabela 1.

Substituindo 𝑥𝑖 = 2 no polinômio interpolador obtemos o valor de 𝑦𝑖 quando 𝑥𝑖 = 2.


𝑔(2) = 1 ⋅ 22 + 0 ⋅ 2 + 0 = 4
Este tipo de solução, também é utilizado quando se têm funções cuja forma
analítica é complicada e de difícil manuseio, nestes casos, devemos substituir a
expressão analítica por outra mais simples.
Como foi obtido o polinômio interpolador? Iremos explicar detalhadamente como
calcular o polinômio interpolador, mas primeiro devemos definir o que é interpolação.

CONCEITO DE INTERPOLAÇÃO
Seja a função y = f (x) , cujos valores estão em uma tabela. Se desejarmos
determinar f ( x ) sendo:

(a) x  ( x0 , xn ) e x  xi onde i = 0, 1, 2, ... , n

(b) x  ( x0 , xn )

O item (a) representa um problema de interpolação, isto é, x está dentro do intervalo


amostrado, logo devemos calcular um polinômio interpolador, que é uma aproximação
da função tabelada.
O item (b) representa um problema de extrapolação, isto é, x está fora do
intervalo amostrado. Nos trataremos apenas de problemas de interpolação neste
capítulo.
Cálculo Numérico com Python no Google Colaboratory 86

6.1. INTERPOLAÇÃO LINEAR


Para que você entenda claramente o que é interpolação, explicaremos interpolação
linear através de um exemplo prático ilustrado a seguir.

(01) Na tabela está a produção seguir está assinalado o número de habitantes de uma
cidade A em quatro censos.
Tabela 1
ANO 1950 1960
Nº de Habitantes 352.724 683.908

Determinar o número aproximado de habitantes na cidade A em 1955. O grau do


polinômio interpolador é uma unidade menor que o número de pontos conhecidos
Solução
Neste caso, o polinômio interpolador terá grau 1, isto é, será da forma
𝑃1 (𝑥) = 𝑎1 𝑥 + 𝑎0
Para se determinar os coeficientes, a0 e a1 devemos fazer
𝑃1 (𝑥0 ) = 𝑎1 𝑥0 + 𝑎0 = 𝑦0 𝑎1 𝑥0 + 𝑎0 = 𝑦0
{  {
𝑃1 (𝑥1 ) = 𝑎1 𝑥1 + 𝑎0 = 𝑦1 𝑎1 𝑥1 + 𝑎0 = 𝑦1
Para 𝑥0 = 1950 e 𝑦0 = 352.724 temos que
𝑎1 1950 + 𝑎0 = 352.724
Para 𝑥1 = 1960 e 𝑦1 = 683.908 temos que
𝑎1 1960 + 𝑎0 = 683.908
Com isto temos o seguinte sistema
𝑎1 1950 + 𝑎0 = 352.724
{
𝑎1 1960 + 𝑎0 = 683.908
onde 𝑎1 = 33118,40 e 𝑎0 = −64228156 logo teremos
𝑃1 (𝑥) = 33118,40𝑥 − 64228156
como queremos saber o número aproximado de habitantes na cidade A em 𝑥 = 1955,
temos
𝑃1 (𝑥) = 33118,40 ⋅ 1955 − 64228156 = 518.316habitantes
Cálculo Numérico com Python no Google Colaboratory 87

ATIVIDADE
Obs. Utilize o programa de ajuste linear e e faça a interpolação com o grau máximo que os
dados permitem.
(01) Na tabela a seguir está a produção de uma certa indústria.
ANO 1990 2000
Nº de peças 340 680

Determinar o número de peças no ano 1995.

(02) Com base na tabela a seguir encontre o valor de y para x = 7 .


X 2 10
Y 9 25

(03) Com base na tabela a seguir encontre o valor de y para x = 5 .


X 2 8
Y 2 20

(04) Com base na tabela a seguir encontre o valor de y para x = 7 .


X 2 5 9
Y -2 7 47

ERRO DE TRUNCAMENTO
Para que você entenda o erro de truncamento, observe o gráfico mostrado a figura
a seguir.

Valor Aproximado

Valor real

Figura - 𝑓(𝑥) é a função tabelada e 𝑃1 (𝑥) um polinômio interpolador de 1º grau.


Podemos observar que, neste caso, 𝑃1 (𝑥) não aproxima bem a solução.
Teoricamente o erro de truncamento cometido no ponto x é dado pela fórmula
𝐸𝑇 (𝑥) = (𝑥 − 𝑥0 )(𝑥 − 𝑥1 ) ⋅ 𝐴,
onde 𝐴 é uma constante a determinar, como a função erro de truncamento.
Cálculo Numérico com Python no Google Colaboratory 88

No cálculo de 𝐴, utilizaremos a função auxiliar 𝐺(𝑡) definida por:


𝐺(𝑡) = 𝑓(𝑡) − 𝑃1 (𝑡) − 𝐸𝑇 (𝑡).
Para que você tenha melhor entendimento, calcularemos o erro de polinômio
interpolador do primeiro grau, onde
𝑃1 (𝑡) = 𝑎1 𝑡 + 𝑎0 e 𝐸𝑇 (𝑡) = (𝑡 − 𝑥0 )(𝑡 − 𝑥1 ) ⋅ 𝐴,
substituindo, obteremos:
𝐺(𝑡) = 𝑓(𝑡) − 𝑃1 (𝑡) − (𝑡 − 𝑥0 )(𝑡 − 𝑥1 ) ⋅ 𝐴,
onde a função 𝐺(𝑡) se anula em pelo menos em três pontos 𝑡 = 𝑥0 , 𝑡 = 𝑥1 e 𝑡 = 𝑥̄ .

TEOREMA DE ROLLE
Se a função 𝑓(𝑥) é contínua no intervalo [𝑎 , 𝑏] e diferenciável no intervalo (𝑎 , 𝑏) e
𝑓(𝑎) = 𝑓(𝑏), então, existe um 𝜉 ∈ (𝑎, 𝑏), tal que 𝑓′(𝜉) = 0
Considerações:
Se 𝑓(𝑡) é contínua em [𝑥0 , 𝑥1 ] e diferenciável em (𝑥0 , 𝑥1 ), pode-se concluir que 𝐺(𝑡)
também o é, tendo em vista que 𝑃1 (𝑡) e 𝐸𝑇 (𝑡) são funções polinomiais de 1º e 2º graus,
respectivamente, logo
Existe 𝜉1 ∈ (𝑥0 , 𝑥̄ ) tal que 𝐺(𝜉1 ) = 0 e
Existe 𝜉2 ∈ (𝑥̄ , 𝑥1 ) tal que 𝐺(𝜉2 ) = 0
Aplicando o teorema de Rolle na função 𝐺′(𝑡), teremos:
Existe 𝜉 ∈ (𝜉1 , 𝜉2 ) e portanto 𝜉 ∈ (𝑥0 , 𝑥1 ), tal que 𝐺′′(𝑡) = 0, logo teremos
𝑓′′(𝜉)
𝐺′′(𝜉) = 𝑓′′(𝜉) − 2𝐴 = 0  𝐴= 2

de onde obteres a expressão para o cálculo do erro de truncamento


𝑓′′(𝜉)
𝐸𝑇 (𝑡) = (𝑥 − 𝑥0 )(𝑥 − 𝑥1 ) ⋅
2
para algum 𝜉 ∈ (𝑥0 , 𝑥1 ).
Exemplo 1. Seja a função 𝑓(𝑥) = 𝑠𝑒𝑛𝑥. Determine:
𝜋
(a) O valor aproximado para 𝑓 ( 2 ) a partir dos pontos (1,0 ; 0,84) e (2,0 ; 0,91).

(b) O erro de truncamento cometido no cálculo do item anterior.


Solução
𝜋
(a) Para determinarmos 𝑓 ( 2 ) devemos primeiro calcular o polinômio interpolador

𝑃1 (𝑥) = 𝑎1 𝑥 + 𝑎0
Para 𝑥0 = 1,0 e 𝑦0 = 0,84 temos que
Cálculo Numérico com Python no Google Colaboratory 89

𝑎1 1,0 + 𝑎0 = 0,84
Para 𝑥1 = 2,0 e 𝑦1 = 0,91 temos que
𝑎1 2,0 + 𝑎0 = 0,91
que resulta no sistema:
𝑎1 + 𝑎0 = 0,84 𝑎 = 0,07
{ cuja solução é { 1
2𝑎1 + 𝑎0 = 0,91 𝑎0 = 0,77
então teremos
𝜋 𝜋
𝑃1 (𝑥) = 0,07𝑥 + 0,77  𝑃1 ( 2 ) = 0,07 ( 2 ) + 0,77 = 0,88

(b) Para determinarmos o erro de truncamento devemos calcular a 1º e a 2º derivada da


função 𝑓(𝑥)
𝑓(𝑥) = 𝑠𝑒𝑛𝑥  𝑓′(𝑥) = 𝑐𝑜𝑠 𝑥  𝑓′′(𝑥) = −𝑠𝑒𝑛𝑥
𝑓′′(𝜉)
|𝐸𝑇 (𝜉)| ≤ |(𝜉 − 𝑥0 )(𝜉 − 𝑥1 ) ⋅ |
2
𝜋 𝜋 𝜋 (−1)
|𝐸𝑇 ( )| ≤ |( − 1) ( − 2) ⋅ |
2 2 2 2
ou seja
𝜋 𝜋
|𝐸𝑇 ( 2 )| ≤ 0,12 ou −0,12 ≤ 𝐸𝑇 ( 2 ) ≤ 0,12
Cálculo Numérico com Python no Google Colaboratory 90

6.2. INTERPOLAÇÃO DE LAGRANGE


As interpolações apresentadas anteriormente (interpolação linear) são casos
particulares da interpolação de Lagrange. Agora vamos determinar outra forma de se
obter o polinômio interpolador 𝑃(𝑥) de grau menor ou igual a 𝑛, sendo dado para isto,
𝑛 + 1 pontos distintos.

Para podemos ter uma boa compreensão da interpolação de Lagrange, temos que
primeiro entender o teorema apresentado a seguir.

Teorema
Sejam (𝑥𝑖 , 𝑦𝑖 ), 𝑖 = 0,1,2, . . . , 𝑛, 𝑛 + 1 pontos distintos, isto é, 𝑥𝑖 ≠ 𝑥𝑗 para 𝑖 ≠ 𝑗. Existe um
único polinômio 𝑃(𝑥) de grau não maior que 𝑛, tal que 𝑝(𝑥𝑖 ) = 𝑦𝑖 , para todo 𝑖. O
polinômio 𝑃(𝑥) pode ser escrito na forma:
𝑃𝑛 (𝑥) = 𝑎0 + 𝑎1 𝑥 + 𝑎2 𝑥 2 + 𝑎3 𝑥 3 +. . . +𝑎𝑛 𝑥 𝑛
ou da seguinte forma
𝑛

𝑃𝑛 (𝑥) = ∑ 𝑎𝑖 𝑥 𝑖
𝑖=0

Observe que 𝑃(𝑥) é, no máximo, de grau 𝑛, se 𝑎𝑛 ≠ 0. Para determinar o polinômio


P(x) devemos conhecer os valores 𝑎0 , 𝑎1 , 𝑎2 , . . . , 𝑎𝑛 . Como 𝑃(𝑥) contém os pontos (𝑥𝑖 , 𝑦𝑖 )
podemos escrever 𝑝(𝑥𝑖 ) = 𝑦𝑖 , da seguinte forma

𝑎0 + 𝑎1 𝑥0 + 𝑎2 𝑥02 + 𝑎3 𝑥03 +. . . +𝑎𝑛 𝑥0𝑛 = 𝑦0


𝑎0 + 𝑎1 𝑥1 + 𝑎2 𝑥12 + 𝑎3 𝑥13 +. . . +𝑎𝑛 𝑥1𝑛 = 𝑦1
S: 𝑎0 + 𝑎1 𝑥2 + 𝑎2 𝑥22 + 𝑎3 𝑥23 +. . . +𝑎𝑛 𝑥2𝑛 = 𝑦2
...............................................
{𝑎0 + 𝑎1 𝑥𝑛 + 𝑎2 𝑥𝑛2 + 𝑎3 𝑥𝑛3 +. . . +𝑎𝑛 𝑥𝑛𝑛 = 𝑦𝑛

A solução do sistema S são os valores 𝑎0 , 𝑎1 , 𝑎2 , . . . , 𝑎𝑛 , com os quais determinamos o


polinômio 𝑃𝑛 (𝑥) = 𝑎0 + 𝑎1 𝑥 + 𝑎2 𝑥 2 + 𝑎3 𝑥 3 +. . . +𝑎𝑛 𝑥 𝑛 .

O polinômio 𝑃(𝑥) é único? Para verificarmos que tal polinômio é único, basta
calcularmos o determinante da matriz 𝐴 (matriz dos coeficientes) e verificar que ele é
diferente de zero.
Cálculo Numérico com Python no Google Colaboratory 91

1 𝑥0 𝑥02 ... 𝑥0𝑛


𝐴= 1 𝑥1 𝑥12 ... 𝑥12
... ... ... ... ...
[1 𝑥𝑛 𝑥𝑛2 ... 𝑥𝑛2 ]
Observe que a matriz 𝐴, tem a forma da matriz de Vandermonte, também conhecida
como matriz das potências. Seu determinante, segundo a Álgebra Linear, é dado pela
expressão:
𝑑𝑒𝑡( 𝐴) = ∏𝑖>𝑗(𝑥𝑖 − 𝑥𝑗 ), com 𝑥𝑖 ≠ 𝑥𝑗
Sabemos que 𝑑𝑒𝑡( 𝐴) ≠ 0, logo isto prova que 𝑃(𝑥) é único.

Obtenção da Fórmula
Para que você entenda a interpolação de Lagrange é necessário que compreender
como é obtida a fórmula de recorrência deste método.
O teorema fundamental da Álgebra garante que podemos escrever o polinômio
𝑃(𝑥) da seguinte forma
𝑃(𝑥) = (𝑥 − 𝑥0 )(𝑥 − 𝑥1 )(𝑥 − 𝑥2 )(𝑥 − 𝑥3 ). . . (𝑥 − 𝑥𝑛 )
onde 𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 , . . . , 𝑥𝑛 são as raízes do polinômio 𝑃(𝑥). Montaremos agora, uma
sequência de polinômios auxiliares da seguinte forma
1º polinômio: se retirarmos (𝑥 − 𝑥0 ) obteremos o polinômio
𝑝0 (𝑥) = (𝑥 − 𝑥1 )(𝑥 − 𝑥2 )(𝑥 − 𝑥3 ). . . (𝑥 − 𝑥𝑛 )

2º polinômio: se retirarmos (𝑥 − 𝑥1 ) obteremos o polinômio


𝑝1 (𝑥) = (𝑥 − 𝑥0 )(𝑥 − 𝑥2 )(𝑥 − 𝑥3 ). . . (𝑥 − 𝑥𝑛 )

3º polinômio: se retirarmos (𝑥 − 𝑥2 ) obteremos o polinômio


𝑝2 (𝑥) = (𝑥 − 𝑥0 )(𝑥 − 𝑥1 )(𝑥 − 𝑥3 ). . . (𝑥 − 𝑥𝑛 )

Seguindo este raciocínio obteremos os polinômios 𝑝0 (𝑥), 𝑝1 (𝑥), 𝑝2 (𝑥), . . . , 𝑝𝑛 (𝑥). Estes
polinômios podem ser escritos na forma sintética:
𝑝𝑖 (𝑥) = ∏𝑛𝑗=0(𝑥 − 𝑥𝑗 ), (𝑖 = 0,1,2,3, . . . , 𝑛)
𝑗≠𝑖

Tais polinômios possuem as seguintes propriedades


(a) 𝑝𝑖 (𝑥𝑖 ) ≠ 0, para todo i.
(b) 𝑝𝑖 (𝑥𝑗 ) = 0, para todo 𝑗 ≠ 𝑖.
Cálculo Numérico com Python no Google Colaboratory 92

e são conhecidos como polinômios de Lagrange. O polinômio 𝑃(𝑥) pode ser escrito como
uma combinação linear dos polinômios 𝑝0 (𝑥), 𝑝1 (𝑥), 𝑝2 (𝑥), . . . , 𝑝𝑛 (𝑥), da seguinte forma:
𝑃(𝑥) = 𝑏0 𝑝0 (𝑥) + 𝑏1 𝑝1 (𝑥) + 𝑏2 𝑝2 (𝑥)+. . . +𝑏𝑛 𝑝𝑛 (𝑥)
ou
𝑛

𝑃(𝑥) = ∑ 𝑏𝑖 𝑝𝑖 (𝑥)
𝑖=0

Mas, como 𝑝𝑖 (𝑥𝑗 ) = 0, para todo 𝑗 ≠ 𝑖 e 𝑝𝑖 (𝑥𝑖 ) ≠ 0, para todo i, temos que
𝑃𝑛 (𝑥𝑛 ) = 𝑏𝑛 𝑝𝑛 (𝑥𝑛 )
𝑃 (𝑥 )
logo 𝑏𝑛 = 𝑝𝑛 (𝑥𝑛 )
𝑛 𝑛
𝑦𝑖
e como 𝑃𝑛 (𝑥𝑖 ) = 𝑦𝑖 , teremos 𝑏𝑖 = 𝑝 (𝑥 )
𝑖 𝑖

substituindo este valor no somatório será


𝑛
𝑦𝑖
𝑃(𝑥) = ∑ 𝑝 (𝑥)
𝑝𝑖 (𝑥𝑖 ) 𝑖
𝑖=0
𝑝 (𝑥)
de onde teremos 𝑃(𝑥) = ∑𝑛𝑖=0 𝑦𝑖 𝑝 𝑖(𝑥 )
𝑖 𝑖

como 𝑝𝑖 (𝑥) = ∏𝑛𝑗=0(𝑥 − 𝑥𝑗 ) então


𝑗≠𝑖
𝑛 𝑛
(𝑥 − 𝑥𝑗 )
𝑃(𝑥) = ∑ 𝑦𝑖 ∏
(𝑥𝑖 − 𝑥𝑗 )
𝑖=0 𝑗=0
𝑗≠𝑖

denominada de fórmula de interpolação de Lagrange.


Calma! Parece complicado, mas garantimos que não é! Acompanhe cuidadosamente o
próximo exemplo e você certamente entenderá como interpolar com o método de
Lagrange.

Exemplo 1. A partir das informações existentes na tabela, determine:


i 𝑥𝑖 𝑦𝑖
0 0.0 0.000
1 0.2 2.008
2 0.4 4.064
3 0.5 5.125
(a) O polinômio interpolador de Lagrange
(b) 𝑃(0.3)
Solução
(a) Como temos 4 pontos, o polinômio interpolador será de grau 3, logo
Cálculo Numérico com Python no Google Colaboratory 93

(𝑥−𝑥 )
𝑃3 (𝑥) = ∑3𝑖=0 𝑦𝑖 ∏3𝑗=0 (𝑥 −𝑥𝑗 ), ou seja
𝑖 𝑗
𝑗≠𝑖

(𝑥 − 𝑥1 )(𝑥 − 𝑥2 )(𝑥 − 𝑥3 )
𝑃3 (𝑥) = 𝑦0 +
(𝑥0 − 𝑥1 )(𝑥0 − 𝑥2 )(𝑥0 − 𝑥3 )
(𝑥 − 𝑥0 )(𝑥 − 𝑥2 )(𝑥 − 𝑥3 )
+𝑦1 +
(𝑥1 − 𝑥0 )(𝑥1 − 𝑥2 )(𝑥1 − 𝑥3 )
(𝑥 − 𝑥0 )(𝑥 − 𝑥1 )(𝑥 − 𝑥3 )
+𝑦2 +
(𝑥2 − 𝑥0 )(𝑥2 − 𝑥1 )(𝑥2 − 𝑥3 )
(𝑥 − 𝑥0 )(𝑥 − 𝑥1 )(𝑥 − 𝑥2 )
+𝑦3
(𝑥3 − 𝑥0 )(𝑥3 − 𝑥1 )(𝑥3 − 𝑥2 )
substituindo os valores da tabela, teremos
(𝑥 − 0.2)(𝑥 − 0.4)(𝑥 − 0.5)
𝑃3 (𝑥) = 0.000 +
(0.0 − 0.2)(0.0 − 0.4)(0.0 − 0.5)
(𝑥 − 0.0)(𝑥 − 0.4)(𝑥 − 0.5)
+2.008 +
(0.2 − 0.0)(0.2 − 0.4)(0.2 − 0.5)
(𝑥 − 0.0)(𝑥 − 0.2)(𝑥 − 0.5)
+4.064 +
(0.4 − 0.0)(0.4 − 0.2)(0.4 − 0.5)
(𝑥 − 0.0)(𝑥 − 0.2)(𝑥 − 0.4)
+5.125
(0.5 − 0.0)(0.5 − 0.2)(0.5 − 0.4)
simplificando a expressão, temos o seguinte polinômio interpolador
𝑃3 (𝑥) = 𝑥 3 + 10𝑥
(b) 𝑃3 (0.3) = 0. 33 + 10 ⋅ 0.3 = 3.027

Exemplo 2. A partir das informações existentes na tabela, determine:


I xi yi
0 1 1
1 2 4
2 4 16
(a) O polinômio interpolador de Lagrange
(b) 𝑃(3)
Solução
(a) Como temos 3 pontos, o polinômio interpolador será de grau 2, logo
(𝑥−𝑥 )
𝑃2 (𝑥) = ∑2𝑖=0 𝑦𝑖 ∏2𝑗=0 (𝑥 −𝑥𝑗 ), ou seja
𝑖 𝑗
𝑗≠𝑖

(𝑥 − 𝑥1 )(𝑥 − 𝑥2 ) (𝑥 − 𝑥0 )(𝑥 − 𝑥2 ) (𝑥 − 𝑥0 )(𝑥 − 𝑥1 )


𝑃2 (𝑥) = 𝑦0 + 𝑦1 + 𝑦2
(𝑥0 − 𝑥1 )(𝑥0 − 𝑥2 ) (𝑥1 − 𝑥0 )(𝑥1 − 𝑥2 ) (𝑥2 − 𝑥0 )(𝑥2 − 𝑥1 )
substituindo os valores da tabela, teremos
Cálculo Numérico com Python no Google Colaboratory 94

(𝑥 − 2)(𝑥 − 4) (𝑥 − 1)(𝑥 − 4) (𝑥 − 1)(𝑥 − 2)


𝑃2 (𝑥) = 1 +4 + 16
(1 − 2)(1 − 4) (2 − 1)(2 − 4) (4 − 1)(4 − 2)
que é o polinômio interpolador
(3−2)(3−4) (3−1)(3−4) (3−1)(3−2)
(b) 𝑃2 (3) = 1 (1−2)(1−4) + 4 (2−1)(2−4) + 16 (4−1)(4−2)

𝑃2 (3) = 9

PROGRAMA EM PYTHON
# Interpolação de Lagrange

import numpy as np

# Entrada
x0 = 0.3

D = np.array(
[[0.0 , 0.000],
[0.2 , 2.008],
[0.4 , 4.064],
[0.5 , 5.125]]
)

print("Interpolação de Lagrange")
print(D)
#print(D[0,:])

# Variáveis auxiliares
s = 0
p = 1

# matriz linha X coluna


linha = np.size(D[:,1])
coluna = np.size(D[1,:])

#print("[linha, coluna] = " + format([linha, coluna]))

s = 0

for i in range(linha):
p = 1;
for j in range(linha):
if(i == j):
p = p
if(i != j):
p = p * ((x0 - D[j,0])/(D[i,0] - D[j,0]));
s = s + D[i, 1] * p
Cálculo Numérico com Python no Google Colaboratory 95

print("\n interpolacao em x: {:.3f}" .format(x0))


print(" y interpolado: {:.3f}" .format(s))
SAÍDA DO PROGRAMA
Interpolação de Lagrange
[[0. 0. ]
[0.2 2.008]
[0.4 4.064]
[0.5 5.125]]

interpolacao em x: 0.300
y interpolado: 3.027

ATIVIDADE
(01) A partir das informações existentes na tabela, determine:
i 𝑥𝑖 𝑦𝑖
0 0.0 0.0000
1 0.2 1.0400
2 0.4 2.1600
3 0.6 3.3600
(a) O polinômio interpolador de Lagrange (b) 𝑃(0.3)
(02) A partir das informações existentes na tabela, determine:
i 𝑥𝑖 𝑦𝑖
0 0.1 0.1010
1 0.3 0.3270
2 0.5 0.6250
3 0.7 1.0430
(a) O polinômio interpolador de Lagrange
(b) 𝑃(0.4)
(03) A partir das informações existentes na tabela, determine:
i 𝑥𝑖 𝑦𝑖
0 0.0 0.0000
1 0.2 0.4080
2 0.4 0.8640
3 0.6 1.4160
(a) O polinômio interpolador de Lagrange
(b) 𝑃(0.5)
(04) A partir das informações existentes na tabela, determine:
I 𝑥𝑖 𝑦𝑖
0 0.1 0.0110
1 0.3 0.1170
2 0.5 0.3750
3 0.7 0.8330
(a) O polinômio interpolador de Lagrange (b) 𝑃(0.6)
Cálculo Numérico com Python no Google Colaboratory 96

6.3. INTERPOLAÇÃO DE NEWTON


Para que você tenha uma boa compreensão do método de interpolação de Newton
com diferenças divididas, iniciaremos este tópico, discorrendo sobre o conceito de
diferenças divididas.

CONCEITO DE DIFERENÇAS DIVIDIDAS


Seja 𝑦 = 𝑓(𝑥) uma função que contém 𝑛 pontos distintos (𝑥𝑖 , 𝑦𝑖 ), onde 𝑖 =
0,1,2, . . . , 𝑛. Representaremos diferença divididas, por 𝑓[]. Definiremos diferença
dividida de ordem zero a própria função, isto é,
𝑓 0 [𝑥1 ] = 𝑓(𝑥1 ) = 𝑦1 .
A diferença dividida de 1ª ordem para os argumentos 𝑥0 e 𝑥1 é uma aproximação
da 1ª derivada, isto é,
𝑓(𝑥1 )−𝑓(𝑥0 )
𝑓 1 [𝑥0 , 𝑥1 ] = ,
𝑥1 −𝑥0

onde temos a seguinte propriedade 𝑓[𝑥1 , 𝑥0 ] = 𝑓[𝑥0 , 𝑥1 ]. Considerando 𝑦𝑖 = 𝑓(𝑥𝑖 ),


podemos escrever as diferenças divididas de 1º ordem, de forma geral, por:
𝑦𝑖+1 −𝑦𝑖
𝑓 1 [𝑥𝑖 , 𝑥𝑖+1 ] = .
𝑥𝑖+1 −𝑥𝑖

A diferença dividida de 2ª ordem para os argumentos 𝑥0 , 𝑥1 e 𝑥2 é dada por:


𝑓 1 [𝑥1 ,𝑥2 ]−𝑓 1 [𝑥0 ,𝑥1 ]
𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] = .
𝑥2 −𝑥0

A diferença dividida de 3ª ordem para os argumentos 𝑥0 , 𝑥1 , 𝑥2 e 𝑥3 é dada por:


𝑓 2 [𝑥1 ,𝑥2 ,𝑥3 ]−𝑓2 [𝑥0 ,𝑥1 ,𝑥2 ]
𝑓 3 [𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ] = .
𝑥3 −𝑥0

Genericamente, a diferença dividida de ordem 𝑛 é dada por:


𝑓 𝑛−1 [𝑥𝑖+1 ,𝑥𝑖+2 ,...,𝑥𝑖+𝑛 ]−𝑓𝑛−1 [𝑥𝑖 ,𝑥𝑖+1 ,𝑥𝑖+2 ,...,𝑥𝑖+𝑛−1 ]
𝑓 𝑛 [𝑥𝑖 , 𝑥𝑖+1 , 𝑥𝑖+2 , . . . , 𝑥𝑖+𝑛 ] = .
𝑥𝑖+𝑛 −𝑥𝑖

Para que você compreenda melhor como fazer estas diferenças dividida observe o
próximo exemplo numérico.
Exemplo 1. Dada a função tabelada calcule a diferença dividida de segunda ordem.
i 𝑥𝑖 𝑦𝑖
0 0.3 3.09
1 1.5 17.25
2 2.1 25.41
Solução
Devemos calcular as diferenças divididas de primeira ordem
𝑦 −𝑦 17.25−3.09
𝑓 1 [𝑥0 , 𝑥1 ] = 𝑥1−𝑥0 = = 11.80
1 0 1.5−0.3
Cálculo Numérico com Python no Google Colaboratory 97

𝑦 −𝑦 25.41−17.25
𝑓 1 [𝑥1 , 𝑥2 ] = 𝑥2−𝑥1 = = 13.60
2 1 2.1−1.5

com todas as diferenças divididas de primeira ordem calculadas, vamos então


calcular a de segunda ordem
𝑓 1 [𝑥1 ,𝑥2 ]−𝑓 1 [𝑥0 ,𝑥1 ] 13.60−11.80
𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] = = = 1.0
𝑥2 −𝑥0 2.1−0.3

Para facilitar os procedimentos numéricos e organizar os nossos cálculos


colocaremos na própria tabela o desenvolvimento do cálculo da seguinte forma:
i 𝑥𝑖 𝑦𝑖 𝑓 1 [𝑥𝑖 , 𝑥𝑖+1 ] 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]
0 0.3 3.09 𝑓 1 [𝑥0 , 𝑥1 ] 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]
1 1.5 17.25 𝑓 1 [𝑥1 , 𝑥2 ]
2 2.1 25.41

Fazendo a substituição numérica temos:


i 𝑥𝑖 𝑦𝑖 𝑓 1 [𝑥𝑖 , 𝑥𝑖+1 ] 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]
0 0.3 3.09 11.80 1.00
1 1.5 17.25 13.60
2 2.1 25.41

Agora que já sabemos como calcular as diferenças divididas, iremos nos concentrar
na fórmula de recorrência para interpolação de Newton.
A fórmula de recorrência de interpola, de Newton com diferenças dividida,
depende do número de pontos existente na tabela.
1º Caso: Existem só dois pontos na tabela
A fórmula, de interpolação, é obtida a partir da expressão de diferença divididas de
primeira ordem,
𝑓(𝑥1 ) − 𝑓(𝑥0 ) 𝑓(𝑥0 ) − 𝑓(𝑥1 )
𝑓 1 [𝑥0 , 𝑥1 ] = =
𝑥1 − 𝑥0 𝑥0 − 𝑥1
onde isolando 𝑓(𝑥) , para obter a fórmula de interpolação:
𝑓(𝑥0 ) = 𝑓(𝑥1 ) + (𝑥0 − 𝑥1 )𝑓 1 [𝑥0 , 𝑥1 ]
assumiremos 𝑥 = 𝑥0 , onde 𝑥 é qualquer valor dentro do intervalo [𝑥0 , 𝑥1 ].

2º Caso: Existem só três pontos na tabela


A fórmula de interpolação, neste caso, é obtida a partir da expressão de diferença
divididas de segunda ordem,
𝑓 1 [𝑥1 ,𝑥2 ]−𝑓 1 [𝑥0 ,𝑥1 ] 𝑓 1 [𝑥0 ,𝑥1 ]−𝑓 1 [𝑥1 ,𝑥2 ]
𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] = =
𝑥2 −𝑥0 𝑥0 −𝑥2
Cálculo Numérico com Python no Google Colaboratory 98

onde isolando 𝑓 1 [𝑥1 , 𝑥2 ] , obtemos:


𝑓 1 [𝑥0 , 𝑥1 ] = 𝑓 1 [𝑥1 , 𝑥2 ] + (𝑥0 − 𝑥2 )𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]
Substituindo na primeira fórmula de interpolação, temos
𝑓(𝑥0 ) = 𝑓(𝑥1 ) + (𝑥0 − 𝑥1 ){𝑓 1 [𝑥1 , 𝑥2 ] + (𝑥0 − 𝑥2 )𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]}
que pode ser escrita por
𝑓(𝑥0 ) = 𝑓(𝑥1 ) + (𝑥0 − 𝑥1 )𝑓 1 [𝑥1 , 𝑥2 ] + (𝑥0 − 𝑥1 )(𝑥0 − 𝑥2 )𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ]

que é a fórmula de interpolação para este caso, onde assumiremos 𝑥 = 𝑥0 , onde 𝑥 é


qualquer valor dentro do intervalo [𝑥0 , 𝑥2 ].

3º Caso: Existem só quatro pontos na tabela


A fórmula de interpolação, neste caso, é obtida a partir da expressão de diferença
divididas de terceira ordem,
𝑓 2 [𝑥1 , 𝑥2 , 𝑥3 ] − 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] − 𝑓 2 [𝑥1 , 𝑥2 , 𝑥3 ]
𝑓 3 [𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ] = =
𝑥3 − 𝑥0 𝑥0 − 𝑥3
onde isolamos 𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] , para obter:
𝑓 2 [𝑥0 , 𝑥1 , 𝑥2 ] = 𝑓 2 [𝑥1 , 𝑥2 , 𝑥3 ] + (𝑥0 − 𝑥3 )𝑓 3 [𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ]
Substituindo na segunda fórmula de interpolação, temos
𝑓(𝑥0 ) = 𝑓(𝑥1 ) + (𝑥0 − 𝑥1 )𝑓 1 [𝑥1 , 𝑥2 ] + (𝑥0 − 𝑥1 )(𝑥0 − 𝑥2 ){𝑓 2 [𝑥1 , 𝑥2 , 𝑥3 ] + (𝑥0
− 𝑥3 )𝑓 3 [𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ]}
que pode ser expresso por:
𝑓(𝑥0 ) = 𝑓(𝑥1 ) + (𝑥0 − 𝑥1 )𝑓 1 [𝑥1 , 𝑥2 ] + (𝑥0 − 𝑥1 )(𝑥0 − 𝑥2 )𝑓 2 [𝑥1 , 𝑥2 , 𝑥3 ] + (𝑥0 − 𝑥1 )(𝑥0
− 𝑥2 )(𝑥0 − 𝑥3 )𝑓 3 [𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ]
que é a fórmula de interpolação para este caso, onde assumiremos 𝑥 = 𝑥0 , onde 𝑥 é
qualquer valor dentro do intervalo [𝑥0 , 𝑥3 ].

4º Caso: Generalização para n pontos na tabela


Para uma tabela de n pontos, a fórmula de interpolação pode ser expressa, segundo o
mesmo raciocínio, por:
𝑛 𝑖−1

𝑓(𝑥0 ) = 𝑓(𝑥1 ) + ∑ 𝑓 𝑖 [𝑥0 , . . . , 𝑥𝑖 ] ∏(𝑥 − 𝑥𝑗 )


𝑖=0 𝑗=0

onde assumiremos 𝑥 = 𝑥0 , onde 𝑥 é qualquer valor dentro do intervalo [𝑥0 , 𝑥𝑛 ].


Cálculo Numérico com Python no Google Colaboratory 99

Exemplo 1. Determinar o valor aproximado de 𝑓(0.4), usando todos os pontos


tabelados
I xi yi
0 0.0 1.008
1 0.2 1.064
2 0.3 1.125
3 0.5 1.343
4 0.6 1.512

Solução
i 𝑥𝑖 𝑦𝑖 = 𝑓[] 𝑓 1 [] 𝑓 2 [] 𝑓 3 [] 𝑓 4 []
0 0.0000 1.0080 0.2800 1.1000 1.0000 -0.0000
1 0.2000 1.0640 0.6100 1.6000 1.0000 0.0000
2 0.3000 1.1250 1.0900 2.0000 0.0000 0.0000
3 0.5000 1.3430 1.6900 0.0000 0.0000 0.0000
4 0.6000 1.5120 0.0000 0.0000 0.0000 0.0000

Utilizamos os valores em azul no momento a substituição


𝑓(0.4) = 𝑓[] + (0.4 − 𝑥0 )𝑓 1 [] + (0.4 − 𝑥0 )(0.4 − 𝑥1 )𝑓 2 [] +
+(0.4 − 𝑥0 )(0.4 − 𝑥1 )(0.4 − 𝑥2 )𝑓 3 [] + (0.4 − 𝑥0 )(0.4 − 𝑥1 )(0.4 − 𝑥2 )(0.4 − 𝑥3 )𝑓 4 []

𝑓(0.4) = 1.2160

Exemplo 2. Determinar o valor aproximado de 𝑓(0.2), usando todos os pontos


tabelados
i 𝑥𝑖 𝑦𝑖
0 0.0 1.000
1 0.1 2.001
2 0.3 4.081
3 0.6 8.296
4 1.0 21.000

i 𝑥𝑖 𝑦𝑖 = 𝑓[] 𝑓 1 [] 𝑓 2 [] 𝑓 3 [] 𝑓 4 []
0 0.000 1.0000 10.0100 1.3000 10.0000 10.0000
1 0.1000 2.0010 10.4000 7.3000 20.0000 0.0000
2 0.3000 4.0810 14.0500 25.3000 0.0000 0.0000
3 0.6000 8.2960 31.7600 0.0000 0.0000 0.0000
4 1.0000 21.0000 0.0000 0.0000 0.0000 0.0000
Utilizamos os valores em azul no momento as substituição
𝑓(0.2) = 𝑓[] + (0.2 − 𝑥0 )𝑓 1 [] + (0.2 − 𝑥0 )(0.2 − 𝑥1 )𝑓 2 [] +
+(0.2 − 𝑥0 )(0.2 − 𝑥1 )(0.2 − 𝑥2 )𝑓 3 [] + (0.2 − 𝑥0 )(0.2 − 𝑥1 )(0.2 − 𝑥2 )(0.2 − 𝑥3 )𝑓 4 []
𝑓(0.2) = 3.0160

PROGRAMA EM PYTHON
Cálculo Numérico com Python no Google Colaboratory 100

# Interpolação de Newton

import numpy as np

# Entrada
x0 = 0.4 #valor a ser interpolado

D = np.array(
[[0.0 , 1.008],
[0.2 , 1.064],
[0.3 , 1.125],
[0.5 , 1.343],
[0.6 , 1.512]]
)

print("Interpolação de Newton")
print("Dado")
print(D)
#print(D[0,:])

# Variáveis auxiliares
s = 0
p = 1

# matriz linha X coluna


linha = np.size(D[:,1])
coluna = np.size(D[1,:])

#print("[linha, coluna] = " + format([linha, coluna]))

s = 0

shape = (linha, linha)


M = np.zeros(shape)

M[:,0] = D[:,1]

t = 0

for j in range(0 , linha , 1):


t = t + 1
for i in range(1 , linha - j , 1):
#print([i , j , M[i,j-1] , M[i-1,j-1], D[i+j , 0] , D[i+j-t , 0]])
M[i-1,j+1] = (M[i , j] - M[i-1 , j]) / (D[i+j , 0] - D[i+j-t , 0])
#print("%2d"%(i-1), "%2d"%(j+1), "%8.4f"%M[i-1,j+1], "%8.4f"%M[i ,
j] , "%8.4f"%M[i-1 , j], "%8.4f"%D[i+j , 0], "%8.4f"%D[i+j-t , 0])

print("Tabela")
print(' f[] f1[] f2[] f3[] f4[]')
Cálculo Numérico com Python no Google Colaboratory 101

for i in range(0 , linha , 1):


for j in range(0 , linha , 1):
print("%8.4f"%M[i,j], end=' ')
print(" ")

s = M[0,0]
for j in range(1 , linha , 1):
p = 1;
for i in range(0 , j , 1):
p = p * ( x0 - D[i , 0] )
s = s + M[0 , j] * p

print('\nValor de x é: {:8.4f}'.format(x0))
print('Valor interpolado é: {:8.4f}'.format(s))

SAÍDA DO PROGRAMA
Interpolação de Newton
Dado
[[0. 1.008]
[0.2 1.064]
[0.3 1.125]
[0.5 1.343]
[0.6 1.512]]
Tabela
f[] f1[] f2[] f3[] f4[]
1.0080 0.2800 1.1000 1.0000 -0.0000
1.0640 0.6100 1.6000 1.0000 0.0000
1.1250 1.0900 2.0000 0.0000 0.0000
1.3430 1.6900 0.0000 0.0000 0.0000
1.5120 0.0000 0.0000 0.0000 0.0000

Valor de x é: 0.4000
Valor interpolado é: 1.2160

ATIVIDADE
Cálculo Numérico com Python no Google Colaboratory 102

(01) Determinar o valor aproximado de 𝑓(0.3), usando todos os pontos tabelados


i 𝑥𝑖 𝑦𝑖
0 0.0 0.0000
1 0.2 0.0480
2 0.4 0.2240
3 0.6 0.5760
4 0.8 1.1520

(02) Determinar o valor aproximado de 𝑓(0.4), usando todos os pontos tabelados


i 𝑥𝑖 𝑦𝑖
0 0.1 0.1010
1 0.3 0.3270
2 0.5 0.6250
3 0.7 1.0430
4 0.9 1.6290

(03) Determinar o valor aproximado de 𝑓(0.3), usando todos os pontos tabelados


i 𝑥𝑖 𝑦𝑖
0 0.0 0.1000
1 0.2 0.1080
2 0.4 0.1640
3 0.6 0.3160
4 0.8 0.6120
Cálculo Numérico com Python no Google Colaboratory 103

7. INTEGRAÇÃO NUMÉRICA
Ao se resolver certos problemas, são comuns soluções que recaiam no cálculo de
área de figuras plana onde se conhece as equações que contornam a figura. O problema a
seguir, é um bom exemplo desta situação.

Exemplo 1. Um móvel se desloca ao longo de uma trajetória retilínea segunda a equação


horária 𝑣 = 4𝑡 − 𝑡 2 , onde o tempo é medido em segundos e a distância em metros. O
gráfico da função horária está mostrado a figura a seguir.
5

v
4

t
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 1 – Gráfico da função 𝑣 = 4𝑡 − 𝑡 2 , onde o tempo está em segundos e a velocidade


em m/s.

O deslocamento deste móvel nos primeiros 4 segundos é determinado calculando a


área plana compreendida entre a equação 𝑣 = 4𝑡 − 𝑡 2 e o eixo dos tempos, isto é,
determinar a área rachurada mostrada na figura 2.
5
v
4

0
t
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 2 – Gráfico da função 𝑣 = 4𝑡 − 𝑡 2 , onde o t é tempo (seg) e v é a velocidade (m/s).


A parte rachurada corresponde ao deslocamento do móvel.
Cálculo Numérico com Python no Google Colaboratory 104

Como calcular esta área? Se a função 𝑓(𝑥) é contínua em um intervalo [𝑎, 𝑏] e sua
primitiva 𝐹(𝑥) é conhecida, então a área é calculada pela integral definida desta função
no intervalo definido e é dada por:
𝑏
∫ 𝑓(𝑥)𝑑𝑥 = 𝐹(𝑏) − 𝐹(𝑎)
𝑎

onde 𝐹′(𝑥) = 𝑓(𝑥).


Como é feito em situações práticas? Em muitas situações práticas, onde não se tem
uma fórmula analítica para a função 𝑓(𝑥), e sim uma tabela de pontos que expressão seu
comportamento, para calculamos a área através do valor da integra definida de 𝑓(𝑥) é
necessário a utilização de métodos numéricos.

7.1. REGRA DOS TRAPÉZIOS


Neste método, substituímos a rachurada que se deseja calcular pela área de um
trapézio como ilustra a figura a seguir.

y y

f(x0) f(x) f(x0) f(x)

f(x1) f(x1)

x0 x1 x x0 x1 x
h h
(a) (b)
Figura 3 – (a) Área rachurada compreendida pela função 𝑓(𝑥) e o eixo do 𝑥 no intervalo
[𝑥0 𝑥1 ]. (b) Trapézio utilizado para aproximar a área rachurada do item (a).

O trapézio utilizado para aproximar a área rachurada é determinado, utilizando os


dois pontos do intervalo, onde passamos uma reta. Da geometria sabemos que a área
deste trapézio é dada por:

𝐴= [𝑓(𝑥0 ) + 𝑓(𝑥1 )]
2
A diferença entre a integral exata de 𝑓(𝑥) (área sob a curva 𝑓(𝑥)) e a integral
aproximada (área do trapézio) é denominada de erro de integração. A diferença dos
resultados não é muito grande?
Cálculo Numérico com Python no Google Colaboratory 105

Uma forma de se melhorar o resultado estimado, isto é, diminuir a diferença entre


o resultado estimado e o exato na regra do trapézio é subdividir o intervalo [𝑥0 , 𝑥1 ] em 𝑛
intervalos de amplitude ℎ e em cada intervalo aplica-se a regra dos trapézios, como
ilustra a figura 4.

f(x)

h h h h h

a = x0 x1 x2 x3 x4 xn-1 b= xn x
Figura 4 – Área compreendida pela função 𝑓(𝑥) e o eixo do 𝑥 no intervalo [𝑥0 𝑥1 ] é
aproximada pela soma de n áreas dos trapézios de mesma base compreendidos no
intervalo [𝑥0 𝑥1 ].

Desta forma, a área aproximada é calculada pela expressão:


ℎ ℎ ℎ
𝐴= (𝑦0 + 𝑦1 ) + (𝑦1 + 𝑦2 )+. . . + (𝑦𝑛−1 + 𝑦𝑛 )
2 2 2
Que pode ser simplificado para

𝐴= (𝑦 + 2𝑦1 + 2𝑦3 +. . . +2𝑦𝑛−1 + 𝑦𝑛 )
2 0
Onde 𝐸𝑖 é o erro cometido na aplicação da regra dos trapézios no intervalo cujos
extremos são 𝑥𝑖 e 𝑥𝑖+1 , ou seja,
−ℎ3
𝐸𝑖 = 𝑓′′(𝜀)
12
Com isto o erro total cometido é a soma dos erros cometidos em cada intervalo,
logo
𝑛−1
−ℎ3
𝐸= ∑ 𝑓′′(𝜀𝑖 )
12
𝑖=1

e pela continuidade de 𝑓′′(𝜀), existe 𝑛 em 𝑎 ≤ 𝜀 ≤ 𝑏, tal que


(𝑏−𝑎)3
𝐸𝑖 = − 𝑓′′(𝜀), onde 𝑎 ≤ 𝜀 ≤ 𝑏.
12𝑛2
Cálculo Numérico com Python no Google Colaboratory 106

Exemplo 1 – Calcule a área entre o gráfico 𝑣 = 4𝑡 − 𝑡 2 e o eixo do 𝑥, dentro do intervalo


[0 , 4].
A precisão do valor aproximado depende do número 𝑛 de trapézios, observe
5

4
Resolução analítica:
4 𝑡3
3
𝐴 = ∫0 (4𝑡 − 𝑡 2 )𝑑𝑡 = (2𝑡 2 − 3 )40
2
43 03 32
A = (2 * 42 − ) − (2 * 02 − )  A = = 10.6667
1
3 3 3
0

-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

4
Aproximação para n = 2
3

𝐴 = 2 (𝑦1 + 2𝑦2 + 𝑦3 )  𝐴 = 8
2

(𝑏−𝑎)3
1

𝐸=− 𝑓′′(𝜀)  𝐸 = 2.6667


0
12𝑛2
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

Aproximação para n = 4
4


𝐴 = 2 (𝑦1 + 2𝑦2 + 2𝑦3 + 2𝑦4 + 𝑦5 )  𝐴 = 10
3

1
(𝑏−𝑎)3
𝐸=− 𝑓′′(𝜀)  𝐸 = 0.6667
0 12𝑛2
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

Aproximação para n = 6

4

3 𝐴 = (𝑦1 + 2𝑦2 + 2𝑦3 + 2𝑦4 + 2𝑦5 + 2𝑦6 + 𝑦7 )


2
2
𝐴 = 10.3704
(𝑏−𝑎)3
1
𝐸=− 𝑓′′(𝜀)  𝐸 = 0.2963
12𝑛2
0

-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4
5

Aproximação para n = 30
3
𝐴 = 10.6548
(𝑏−𝑎)3
𝐸=− 𝑓′′(𝜀)  𝐸 = 0.0119
2

1
12𝑛2

-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4

Figura 5 – Mostrando a aproximação pela regra dos trapézios para diferentes valores de n.
Com 𝑣′(𝑡) = 4 − 2𝑡, e como 𝑣′′(𝑡) = −2, logo 𝑓′′(0) = −2 em todas as expressões, onde
0 ≤ 𝜀 ≤ 4.
Cálculo Numérico com Python no Google Colaboratory 107

PROGRAMA EM PYTHON
# Regra dos Trapézios
# Entrada
xi = 0. # intervalo [xi , xf]
xf = 4.
n = 30 # número de trapézios

def f(x):
return 4*x - x**2

print("Integração Numérica - Método dos Trapézios")


print('f(x) = 4*x - x**2')

import math
import numpy as np

# variáveis auxiliar
h = 0
s = 0

h = (xf - xi)/n
vx = np.zeros((n+1))
vy = np.zeros((n+1))

vx[0] = xi
for i in range(1 , n+1 , 1):
vx[i] = vx[i-1] + h

vy[0] = f(vx[0])
vy[n] = f(vx[n])
for i in range(1 , n , 1):
vy[i] = 2 * f(vx[i])

#print(vx[:])
#print(vy[:])

s = 0
for i in range(0 , n+1 , 1):
s = s + vy[i]

s = (h/2) * s

print("Número de trapézios: " , "%d"%n)


print("Intervalo: " ,"[" , "%8.4f"%xi , "," ,"%8.4f"%xf, "]")
print('Valor da Integral: {:8.4f}'.format(s))

import matplotlib.pyplot as plt


import numpy as np
Cálculo Numérico com Python no Google Colaboratory 108

xi = np.linspace(xi, xf, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()

SAÍDA DO PROGRAMA
Integração Numérica - Método dos Trapézios
f(x) = 4*x - x**2
Número de trapézios: 30
Intervalo: [ 0.0000 , 4.0000 ]
Valor da Integral: 10.6548

ATIVIDADE
3
(01) Dada a função 𝑓(𝑥) = 𝑥 2 calcular o valor da integral 𝐼 = ∫0 𝑓(𝑥)𝑑𝑥 , usando a regra dos
trapézios e dividindo o intervalo em 6 partes.
4
(02) Dada a função 𝑓(𝑥) = 𝑙𝑛 𝑥 calcular o valor da integral 𝐼 = ∫2 𝑓(𝑥)𝑑𝑥 , usando a regra
dos trapézios e dividindo o intervalo em 6 partes.
3
(03) Dada a função 𝑓(𝑥) = 𝑥 3 calcular o valor da integral 𝐼 = ∫0 𝑓(𝑥)𝑑𝑥 , usando a regra dos
trapézios e dividindo o intervalo em 6 partes.
4
(04) Dada a função 𝑓(𝑥) = 𝑒 𝑥 calcular o valor da integral 𝐼 = ∫2 𝑓(𝑥)𝑑𝑥, usando a regra dos
trapézios e dividindo o intervalo em 6 partes.
Cálculo Numérico com Python no Google Colaboratory 109

Você saiba que na regra dos trapézios, utilizamos uma aproximação de primeira ordem
do polinômio interpolador de Gregory-Newton 𝑃𝑛 (𝑥) para representar a função 𝑓(𝑥).
𝑧(𝑧 − 1) 𝑧(𝑧 − 1)(𝑧 − 2)
𝑃𝑛 (𝑥) = 𝑦0 + 𝑧𝛥𝑦0 + ∗ 𝛥2 𝑦0 + ∗ 𝛥3 𝑦0 +. . . +
2! 3!
𝑧(𝑧 − 1)(𝑧 − 2) ∗. . .∗ (𝑧 − 𝑛 + 1)
+ ∗ 𝛥2 𝑦0
(𝑛 + 1)!
Isto é, utilizamos na regra do trapézio, utilizamos 𝑃2 (𝑥) = 𝑦0 + 𝑧𝛥𝑦0 (n = 1), para aproximar
𝑓(𝑥), com isto a integral passou a ser determinada por
𝑏 𝑏
𝐼 = ∫ 𝑓(𝑥)𝑑𝑥 = ∫ [𝑦0 + 𝑧𝛥𝑦0 ]𝑑𝑥
𝑎 𝑎
𝑥−𝑥0
Como 𝑧 =  𝑑𝑥 = ℎ𝑑𝑧,

e considerando 𝑎 = 𝑥0 e 𝑏 = 𝑥1 , temos que


𝑥0 −𝑥0
para 𝑥 = 𝑎  𝑧= = 0,

𝑥1 −𝑥0
para 𝑥 = 𝑏  𝑧= =1

substituindo os limes na integral temos


𝑏 1 1
𝑧2
𝐼 = ∫ [𝑦0 + 𝑧𝛥𝑦0 ]𝑑𝑥 = ∫ [𝑦0 + 𝑧𝛥𝑦0 ]ℎ𝑑𝑧 = ℎ [𝑧𝑦0 + 𝛥𝑦0 ]
𝑎 0 2 0

12 02
𝐼 = ℎ [1 ∗ 𝑦0 + 𝛥𝑦0 ] − ℎ [0 ∗ 𝑦0 + 𝛥𝑦0 ]
2 2
1 1
𝐼 = ℎ [𝑦0 + 2 𝛥𝑦0 ]  𝐼 = ℎ [𝑦0 + 2 (𝑦 − 𝑦0 )]
𝑦+𝑦0
𝐼 = ℎ[ ], foi esta a expressão utilizada no método dos trapézios.
2
Cálculo Numérico com Python no Google Colaboratory 110

7.2. PRIMEIRA REGRA DE SIMPSON


A vantagem, de revermos o método dos trapézios usando o polinômio interpolador
de Gregory-Newton (𝑃𝑛 (𝑥)) e que na primeira regra de Simpson, utilizamos uma
aproximação de 2ª ordem deste polinômio, isto é, faremos:
𝑧(𝑧−1) 𝑥−𝑥0
𝑓(𝑥) = 𝑦0 + 𝑧Δ𝑦0 + ∗ Δ2 𝑦0, onde 𝑧 =
2! ℎ

Com isto o valor da integral ser:


𝑏 𝑏
𝑧(𝑧 − 1) 2
𝐼 = ∫ 𝑓(𝑥)𝑑𝑥 = ∫ [𝑦0 + 𝑧Δ𝑦0 + ∗ Δ 𝑦0 ] 𝑑𝑥
𝑎 𝑎 2!
𝑥−𝑥0
Como 𝑧 =  𝑑𝑥 = ℎ𝑑𝑧,

Para se aproximar a função 𝑓(𝑥) por um polinômio do 2º grau, serão necessários 3


pontos: 𝑥0 , 𝑥1 e 𝑥2 (Figura 6).

f(x)
P2(x)
f(x0) f(x2)

f(x1)

x0 x1 x2 x
h h

Figura 6 – Gráfico de 𝑓(𝑥) juntamente com a aproximação de segunda ordem 𝑃2 (𝑥).


Considerando 𝑎 = 𝑥0 e 𝑏 = 𝑥2 , temos que :
𝑎−𝑎
𝑥=𝑎  𝑧= = 0,

𝑏−𝑎
𝑥=𝑏  𝑧= =2

Com isto, a integral será resolvida da seguinte forma


𝑏 2
𝑧(𝑧 − 1)
𝐼 = ∫ 𝑓(𝑥)𝑑𝑥 = ∫ [𝑦0 + 𝑧Δ𝑦0 + ∗ Δ2 𝑦0 ] ℎ𝑑𝑧
𝑎 0 2!
Cujo resultado é:
1
𝐼 = ℎ [2𝑦0 + 2Δ𝑦0 + Δ2 𝑦0 ]
3
Δ𝑦0 = 𝑦1 − 𝑦0
Como babemos que { 2 , então com a substituição teremos
Δ 𝑦0 = 𝑦2 − 2𝑦1 + 𝑦0

𝐼 = 3 [𝑦0 + 4𝑦1 + 𝑦2 ] que é denominado de 1ª regra de Simpson.
Cálculo Numérico com Python no Google Colaboratory 111

𝑦+𝑦0
𝐼 = ℎ[ ], foi esta a expressão utilizada no método dos trapézios.
2

Para diminuir o erro, isto é, a diferença do valor estimado e do valor real, devemos
subdividir o intervalo de integração, da mesma forma que fizemos no método dos
𝑏
trapézios, com isto, a integral 𝐼 = ∫𝑎 𝑓(𝑥)𝑑𝑥, será aplicada em cada dupla de intervalos
da seguinte forma:
ℎ ℎ ℎ
𝐼= [𝑦
⏟ 0 + 4𝑦1 + 𝑦2 ] + [𝑦
⏟ 2 + 4𝑦3 + 𝑦4 ] +. . . + [𝑦
⏟ + 4𝑦𝑛−1 + 𝑦𝑛 ]
3 3 3 𝑛−2
1º𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜 2º𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜 ú𝑙𝑡𝑖𝑚𝑜𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜

O erro total cometido será a soma dos erros cometidos em cada aplicação da 1ª
regra de Simpson nas duplas de subintervalos e são determinados por:
−(𝑏−𝑎)5
𝐸= 𝑓 (𝐼𝑉) (𝜀), onde 𝑎 ≤ 𝜀 ≤ 𝑏.
180𝑛4
1 𝑑𝑥
Exemplo 1. Calcule o valor da integral ∫0 , com 𝜀 ≤ 10−4 .
1+𝑥 2

Solução
Calcular esta integral significa calcular a área compreendida entre o gráfico e o eixo x,
como mostra a figura a seguir.

1 1

0.8 0.8

0.6 0.6

0.4 0.4

0.2 0.2

0 0

0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1

1
Figura 7 – Gráfico da função 𝑓(𝑥) = 1+𝑥 2 , onde a área rachurada representa o resultado
1 𝑑𝑥
da integral ∫0 .
1+𝑥 2

Devemos definir qual dever ser o número n de subintervalos devemos usar, para isto
utilizaremos a nossa fórmula do erro total
−(𝑏−𝑎)5
𝐸= 𝑓 (𝐼𝑉) (𝜀), onde 𝑎 ≤ 𝜀 ≤ 𝑏.
180𝑛4
1
Como 𝑓(𝑥) = 1+𝑥 2 , então temos que
Cálculo Numérico com Python no Google Colaboratory 112

24 288𝑥 2 384𝑥 4
𝑓 𝐼𝑉 (𝑥) = (1+𝑥2)3 − (1+𝑥2)4 + (1+𝑥 2)5, onde 0 ≤ 𝜀 ≤ 1

Sabemos que o maior erro total será obtido quando 𝑥 = 0, logo |𝑓 𝐼𝑉 (𝑥)|𝑚𝑎𝑥 , e
considerando 𝜀 ≤ 10−4 , então temos:
−(1−0)5 24
∗ 24 ≤ 10−4  𝑛4 ≥ 180 104  𝑛 ≥ 6.042
180𝑛4

Isto é, devemos escolher um número de subintervalos maior que 7, e escolheremos para


este caso 𝑛 = 8. O valor da aproximação foi obtido, para 𝑛 = 8, a partir da tabela a
seguir.
i xi yi ci
0 0.0000 1.0000 1
1 0.1250 0.9846 4
2 0.2500 0.9412 2
3 0.3750 0.8767 4
4 0.5000 0.8000 2
5 0.6250 0.7191 4
6 0.7500 0.6400 2
7 0.8750 0.5664 4
8 1.0000 0.5000 1
Tabela 1- ci são os coeficientes que devem ser aplicados yi para determinar a
aproximação do valor da integral.

Para calcularmos o valor da integral pela seguinte expressão


1
𝑑𝑥 1
∫ 2
= {𝑦0 + 4𝑦1 + 2𝑦2 + 4𝑦3 + 2𝑦4 + 4𝑦5 + 2𝑦6 + 4𝑦7 + 𝑦8 }
0 1+𝑥 ℎ
1 𝑑𝑥
Substituindo os valores da tabela teremos ∫0 = 0.7854
1+𝑥 2

PROGRAMA EM PYTHON
# Primeira Regra de Simpson
# Entrada
xi = 0. # intervalo [xi , xf]
xf = 1.
n = 8 # número de intervalos (deve ser um número maior que 7)

def f(x):
return 1/(1 + x**2)

print("Integração Numérica - 1a regra de Simpson")


print('f(x) = 1/(1 + x**2)')

import math
import numpy as np
Cálculo Numérico com Python no Google Colaboratory 113

# variáveis auxiliar
h = 0
s = 0

h = (xf - xi)/n
vx = np.zeros((n+1))
vy = np.zeros((n+1))

vx[0] = xi
for i in range(1 , n+1 , 1):
vx[i] = vx[i-1] + h

vy[0] = f(vx[0])
vy[n] = f(vx[n])
for i in range(1 , n , 1):
vy[i] = f(vx[i])

#print(vx[:])
#print(vy[:])

s = 0
for i in range(0 , n , 2):
s = s + (h/3)*(vy[i]+4*vy[i+1]+vy[i+2])

#s = (1/h) * s

print("Número de intervalos: " , "%d"%n)


print("Intervalo: " ,"[" , "%8.4f"%xi , "," ,"%8.4f"%xf, "]")
print('Valor da Integral: {:8.4f}'.format(s))
print(' ')

import matplotlib.pyplot as plt


import numpy as np
#xi = np.linspace(-10, 10, 100)
xi = np.linspace(xi, xf, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()

SAÍDA DO PROGRAMA
Integração Numérica - 1a regra de Simpson
f(x) = 1/(1 + x**2)
Número de intervalos: 8
Intervalo: [ 0.0000 , 1.0000 ]
Valor da Integral: 0.7854
Cálculo Numérico com Python no Google Colaboratory 114

ATIVIDADE
1 𝑑𝑥
(01) Calcule a integral ∫0 1+2𝑥 2 , com 𝜀 ≤ 10−4 , usando a 1ª regra de Simpson.
2
(02) Calcule a integral ∫1 𝑙𝑛( 1 + 𝑥)𝑑𝑥, com 𝜀 ≤ 10−4 , usando a 1ª regra de Simpson.
1 𝑑𝑥
(03) Calcule o valor da integral ∫0 , com 𝜀 ≤ 10−4 , usando a primeira regra de
1+2𝑥 3

Simpson.
2
(04) Calcule o valor da integral ∫1 𝑙𝑛( 1 + 𝑥 2 )𝑑𝑥, com 𝜀 ≤ 10−4 , usando a primeira regra
de Simpson.
Cálculo Numérico com Python no Google Colaboratory 115

7.3. SEGUNDA REGRA DE SIMPSON


Na segunda regra de Simpson utilizamos uma aproximação de terceira ordem no
polinômio interpolador de Gregory-Newton (𝑃𝑛 (𝑥)) o que resulta na expressão:
𝑧(𝑧−1) 𝑧(𝑧−1)(𝑧−2) 𝑥−𝑥0
𝑃𝑛 (𝑥) = 𝑦0 + 𝑧𝛥𝑦0 + ∗ 𝛥2 𝑦0 + ∗ 𝛥3 𝑦0 , onde 𝑧 = .
2! 3! ℎ

Com isto o valor da integral ser:


𝑏 𝑏
𝑧(𝑧 − 1) 𝑧(𝑧 − 1)(𝑧 − 2)
𝐼 = ∫ 𝑓(𝑥)𝑑𝑥 = ∫ [𝑦0 + 𝑧𝛥𝑦0 + ∗ 𝛥2 𝑦0 + ∗ 𝛥3 𝑦0 ] 𝑑𝑥
𝑎 𝑎 2! 3!
𝑥−𝑥0
como 𝑧 =  𝑑𝑥 = ℎ𝑑𝑧,

Desta forma a solução da integral é:


3ℎ
𝐼= [𝑦 + 3𝑦1 + 3𝑦2 + 𝑦3 ]
8 0
O erro total neste método é dado pela expressão
−3𝑥 5
𝐸= 𝑓 𝐼𝑉 (𝜀), 𝑎 ≤ 𝜀 ≤ 𝑏.
80

Para diminuir o erro quando o intervalo não for muito pequeno, devemos
subdividir o intervalo de integração da seguinte forma:
3ℎ
𝐼= [𝑦 + 3𝑦1 + 3𝑦2 + 𝑦3 ]

8 0
1º𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜

3ℎ 3ℎ
+ [𝑦
⏟ 3 + 3𝑦4 + 3𝑦5 + 𝑦6 ] +. . . + [𝑦⏟ + 3𝑦𝑛−2 + 3𝑦𝑛−1 + 𝑦𝑛 ]
8 8 𝑛−3
2º𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜 ú𝑙𝑡𝑖𝑚𝑜𝑠𝑢𝑏 𝑖𝑛𝑡 𝑒𝑟𝑣𝑎𝑙𝑜

4
Exemplo 1 – Calcule o valor da integral 𝐼 = ∫1 𝑙𝑛( 𝑥 3 + 𝑒 𝑥 )𝑑𝑥
Solução
Calcular esta integral significa determinar a área compreendida entre o gráfico e o eixo
x, como mostra a Figura 8. O valor da integral é obtido pela seguinte expressão:
4
3ℎ
∫ 𝑙𝑛( 𝑥 3 + 𝑒 𝑥 )𝑑𝑥 = {𝑦 + 3𝑦1 + 3𝑦2 + 2𝑦3 + 3𝑦4 + 3𝑦5 + 2𝑦6 + 3𝑦7 + 3𝑦8 + 𝑦9 }
1 8 0
Os valores de 𝑦0 , 𝑦1 , 𝑦2 , . . . , 𝑦𝑛 são obtidos na tabela a seguir,
7 7

6 6

5 5

4 4

3 3

2 2

1 1

0 0

-1 -1
-1 0 1 2 3 4 5 -1 0 1 2 3 4 5
Cálculo Numérico com Python no Google Colaboratory 116

Figura 8 – Gráfico da função 𝑓(𝑥) = 𝑙𝑛( 𝑥 3 + 𝑒 𝑥 ), onde a área rachurada representa o


4
resultado da integral ∫1 𝑙𝑛( 𝑥 3 + 𝑒 𝑥 )𝑑𝑥.

O valor da aproximação foi obtido, para 𝑛 = 9, a partir da tabela a seguir.


i xi yi ci
0 1.0000 1.3133 1
1 1.3333 1.8187 3
2 1.6667 2.2950 3
3 2.0000 2.7337 2
4 2.3333 3.1362 3
5 2.6667 3.5072 3
6 3.0000 3.8520 2
7 3.3333 4.1754 3
8 3.6667 4.4821 3
9 4.0000 4.7757 1
Tabela 2 - ci são os coeficientes que devem ser aplicados yi para determinar a
aproximação do valor da integral.
4
Substituindo os valores da tabela teremos∫1 𝑙𝑛( 𝑥 3 + 𝑒 𝑥 )𝑑𝑥 = 9.6880

PROGRAMA EM PYTHON
# Segunda Regra de Simpson
# Entrada
xi = 0. # intervalo [xi , xf]
xf = 1.
n = 9 # número de intervalos (deve ser um numeto maior que 8)

def f(x):
return 1/(1 + x**2)

print("Integração Numérica - 2a regra de Simpson")


print('f(x) = 1/(1 + x**2)')

import math
import numpy as np

# variáveis auxiliar
h = 0
s = 0

h = (xf - xi)/n
vx = np.zeros((n+1))
vy = np.zeros((n+1))

vx[0] = xi
for i in range(1 , n+1 , 1):
Cálculo Numérico com Python no Google Colaboratory 117

vx[i] = vx[i-1] + h

vy[0] = f(vx[0])
vy[n] = f(vx[n])
for i in range(1 , n , 1):
vy[i] = f(vx[i])

#print(vx[:])
#print(vy[:])

s = 0
for i in range(0 , n-2 , 3):
s = s + (3*h/8)*(vy[i]+3*vy[i+1]+3*vy[i+2]+vy[i+3])

print("Número de intervalos: " , "%d"%n)


print("Intervalo: " ,"[" , "%8.4f"%xi , "," ,"%8.4f"%xf, "]")
print('Valor da Integral: {:8.4f}'.format(s))
print(' ')

import matplotlib.pyplot as plt


import numpy as np
#xi = np.linspace(-10, 10, 100)
xi = np.linspace(xi, xf, 100)

fig = plt.figure()
plt.plot(xi, f(xi), '-')
plt.grid()

SAÍDA DO PROGRAMA
Integração Numérica - 2a regra de Simpson
f(x) = 1/(1 + x**2)
Número de intervalos: 9
Intervalo: [ 0.0000 , 1.0000 ]
Valor da Integral: 0.7854
Cálculo Numérico com Python no Google Colaboratory 118

ATIVIDADE
1 𝑑𝑥
(01) Calcule o valor da integral ∫0 1+2𝑥 2 , com 𝜀 ≤ 10−4 , usando a segunda regra de

Simpson.
2
(02) Calcule o valor da integral ∫1 𝑙𝑛( 1 + 𝑥)𝑑𝑥 , com 𝜀 ≤ 10−4 , usando a segunda regra
de Simpson.
1 𝑑𝑥
(03) Calcule a integral ∫0 , com 𝜀 ≤ 10−4 , usando a 2ª regra de Simpson.
1+2𝑥 3
2
(04) Calcule a integral ∫1 𝑙𝑛( 1 + 𝑥 2 )𝑑𝑥, com 𝜀 ≤ 10−4 , usando a 2ª regra de Simpson.
Cálculo Numérico com Python no Google Colaboratory 119

FÁBIO JOSÉ DA COSTA ALVES - Licenciatura em Matemática pela União


das Escolas Superiores do Pará, Licenciatura em Ciências de 1º Grau
pela União das Escolas Superiores do Pará, Graduação em Engenharia
Civil pela Universidade Federal do Pará. Possui Mestrado e Doutorado
em Geofísica pela Universidade Federal do Pará e Pós-Doutorado pelo Programa de Pós-
Graduação em Ensino de Ciências e Matemática da Universidade Federal do Rio Grande
do Norte. Professor da Universidade do Estado do Pará. Docente do Programa de Pós-
Graduação em Educação/UEPA e Docente do Programa de Pós-Graduação em Ensino de
Matemática/UEPA. Líder do Grupo de Pesquisa em Ensino de Matemática e Tecnologias.
Experiência em desenvolvimento de software educativo para o ensino de matemática.

CINTHIA CUNHA MARADEI PEREIRA - Possui Graduação em


Licenciatura em Matemática e em Tecnologia em Processamento de
Dados, Especialização em Informática Médica, Mestrado em Ciências da
Computação e Doutorado em Genética e Biologia Molecular
(Bioinformática). Professora da Universidade do Estado do Pará. Docente do Programa
de Pós-Graduação em Ensino de Matemática/UEPA. Vice-líder do Grupo de Pesquisa em
Ensino de Matemática e Tecnologias.

Você também pode gostar