Livro Cálculo Numérico Com Python Google Colab Fábio e Cinthia
Livro Cálculo Numérico Com Python Google Colab Fábio e Cinthia
Livro Cálculo Numérico Com Python Google Colab Fábio e Cinthia
Cálculo Numérico
com Python no Google Colaboratory
Pedro Franco de Sá
PROGRAMA DE PÓS-GRADUAÇÃO EM ENSINO DE MATEMÁTICA
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
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)
Os Autores
Cálculo Numérico com Python no Google Colaboratory 6
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
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𝑛
𝑖=𝑛
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
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
13 2
1 6 2
0 3 2
1 1
1310 = 11012
0,25 0,50
2 2
0,50 1,00
Você sabia que, de maneira geral, o número 𝑥 em uma base 𝛽 é representado por:
𝑑1 𝑑2 𝑑3 𝑑𝑡
𝑥 = ±[ + 2 + 3 +. . . + 𝑡 ] . 𝛽 𝑒𝑥𝑝
𝛽 𝛽 𝛽 𝛽
onde:
𝑑 𝑑 𝑑 𝑑
[ 𝛽1 + 𝛽22 + 𝛽33 +. . . + 𝛽𝑡𝑡] ⎯ é chamado de mantissa e é a parte do número que representa
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
Mantissa Expoente
Expoente
Mantissa
Sinal da
Sinal do
1 1 1 0 0 1 0 0 0 0 0 0 1 0 1
dado pelo valor decimal do último bit da mantissa, ou seja, o bit de maior significado,
logo:
1
𝑃𝑅𝐸𝐶𝐼𝑆Ã𝑂 ≤
𝛽𝑡
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.
(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:
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.
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.
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.
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
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
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)
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:
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
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.
Para você entender melhor, observe o exemplo a seguir, onde utilizamos a função
𝑓(𝑥) = 𝑥 2 − 7𝑥 + 10 que possui raízes 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:
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
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
𝑓(𝑥𝑜 ). 𝑓(𝑏) < 0 implica que a raiz está no intervalo [𝑥𝑜 , 𝑏].
x
Cálculo Numérico com Python no Google Colaboratory 21
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 |
≤𝐸
|𝑥𝑛 |
Exemplo:
Solução: Primeiro devemos determinar um intervalo onde está a raiz que desejamos
calcular, para isto devemos fazer uma no seu gráfico.
14
6
y
-2
-4
-4 -3 -2 -1 0 1 2 3 4
x
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
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
if v < 0: b = xm2
if v > 0: a = xm2
if v == 0: print("o valor da raiz é %4.4f" %xm2)
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
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
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
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
𝑐=𝑏 𝑐=𝑎
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
y
4
-2
-4
-4 -3 -2 -1 0 1 2 3 4
x
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)
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
vfa = 0
vfb = 0
vder2a = 0
vder2b = 0
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
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
ATIVIDADE
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
f(a) f(b)
x
b x
f(b) f(a)
14
6
y
-2
-4
-4 -3 -2 -1 0 1 2 3 4
x
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
𝑓(𝑥 )
𝑥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
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 (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
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
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
6 𝑦−𝑥 =1
4
?
Y
2
𝑦+𝑥 =5
0
-2
-4 -2 0 2 4 6 8
X
𝐴𝑥 = 𝑏
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
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.
MÉTODO DIRETO
Consiste de métodos que determinam a solução do sistema linear com um número
finito de transformações elementares.
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
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
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
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
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
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
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]]
)
linha = np.size(M[:,1])
coluna = np.size(M[1,:])
print('Linha: {:d}'.format(linha))
print('Coluna: {:d}'.format(coluna))
t = 1
fm = 0
fm = 0;
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
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)
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
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]]
)
linha = np.size(MM[:,1])
coluna = np.size(MM[1,:])
print('Linha: {:d}'.format(linha))
print('Coluna: {:d}'.format(coluna))
M = np.zeros((linha , 2*linha))
M0 = np.eye(3)
for j in range(linha , 2*linha , 1):
M[: , j] = M0[: , j - linha]
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
t = 1
fm = 0
fm = 0;
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
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)
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]]
)
linha = np.size(M[:,1])
coluna = np.size(M[1,:])
#print('Linha: {:d}'.format(linha))
#print('Coluna: {:d}'.format(coluna))
t = 1
fm = 0
Cálculo Numérico com Python no Google Colaboratory 57
det = 1.
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
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 𝑥.
𝑘→∞
É 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
[ 𝑎𝑛𝑛 𝑎𝑛𝑛 𝑎𝑛𝑛 ]
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
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
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
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.
1
𝑥1𝑘+1 = 2 (1 + 𝑥2𝑘 )
{ 1 onde 𝑘 = 0,1,2, . ..
𝑥2𝑘+1 = 2 (3 − 𝑥1𝑘+1 )
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
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
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
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.
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
Explicaremos o uso destas fórmulas através de um exemplo e você perceberá que sua
aplicação é simples.
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
𝑛 𝑛 𝑛 𝑛
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
𝑖 𝑥𝑖 𝑦𝑖
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
𝑛 𝑛 𝑛 𝑛
De onde temos
𝑛 ∑𝑛𝑖=1 𝑥𝑖 𝑦𝑖 − ∑𝑛𝑖=1 𝑥𝑖 ∑𝑛𝑖=1 𝑦𝑖 7 ∗ 141.6750 − 15 ∗ 52.8500
𝛼1 = 2 = = 2.8837
𝑛 ∑𝑛𝑖=1 𝑥𝑖2 − (∑𝑛𝑖=1 𝑥𝑖 ) 7 ∗ 42 − 141.6750
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
𝑛 ∑ 𝑥𝑖 ∑ 𝑦𝑖
𝑖=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
𝑛 𝑛
𝑛 ∑ 𝑥𝑖 ∑ 𝑦𝑖
𝑖=1 𝛼0 𝑖=1
𝑦̂ = 𝛼0 + 𝛼1 𝑥 𝑛 𝑛 [𝛼 ] = 𝑛
1
∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖 𝑦𝑖
[ 𝑖=1 𝑖=1 ] [ 𝑖=1 ]
𝑛 𝑛 𝑛
𝑛 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝛼0 𝑛
𝑛 𝑛 𝑛 𝑛
𝑛 ∑ 𝑥𝑖 ∑ 𝑥𝑖2 ∑ 𝑥𝑖3 ∑ 𝑦𝑖
𝑖=1 𝑖=1 𝑖=1 𝑖=1
𝑛 𝑛 𝑛 𝑛 𝑛
𝑛 𝑛 𝑛 𝑛 𝑛
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
𝑛
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(" ")
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]
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
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
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))
t = 1
fm = 0
fm = 0
#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
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
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.
CONCEITO DE INTERPOLAÇÃO
Seja a função y = f (x) , cujos valores estão em uma tabela. Se desejarmos
determinar f ( x ) sendo:
(b) x ( x0 , xn )
(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
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
ERRO DE TRUNCAMENTO
Para que você entenda o erro de truncamento, observe o gráfico mostrado a figura
a seguir.
Valor Aproximado
Valor real
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
𝑃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
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
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
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 ). . . (𝑥 − 𝑥𝑛 )
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, . . . , 𝑛)
𝑗≠𝑖
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 𝑏𝑖 = 𝑝 (𝑥 )
𝑖 𝑖
(𝑥−𝑥 )
𝑃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
𝑃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
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
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
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
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 ].
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
𝑓(0.4) = 1.2160
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
s = 0
M[:,0] = D[:,1]
t = 0
print("Tabela")
print(' f[] f1[] f2[] f3[] f4[]')
Cálculo Numérico com Python no Google Colaboratory 101
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
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.
v
4
t
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4
0
t
-1
-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4
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:
𝑏
∫ 𝑓(𝑥)𝑑𝑥 = 𝐹(𝑏) − 𝐹(𝑎)
𝑎
y y
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).
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 ].
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
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
-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
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
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 𝑧 = 𝑑𝑥 = ℎ𝑑𝑧,
ℎ
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
f(x)
P2(x)
f(x0) f(x2)
f(x1)
x0 x1 x2 x
h h
𝑦+𝑦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
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
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)
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
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
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
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)
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])
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