Para o dióxido de carbono (CO2), a equação de estado de um gás tem os seguintes coeficientes: a =
0, 401Pa m3 e b = 42, 7.10−6m3. Determine o volume ocupado por 1000 moléculas deste gás, à
temperatura de 300K e pressão de 3, 5.107Pa, pelo método de bissecção, com uma tolerância de 10-
12. Constante de Boltzmann é k = 1, 3806503.10-23 Joule K-1.
Faça também outros algoritmos para resolução usando os métodos de falsa-posição e de Newton-
Raphson.
De inicio utilizaremos o critério de parada F(x) < tolerância, e o intervalo [-0.5,1] no qual pelo gráfico
sabemos que se encontra a raiz.
Resultado:
V = 0.042699999999999995
Número de iterações: 56
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 1/6
30/08/2018 Atividade 2 - Cálculo Numérico
O método da falsa-posição utiliza a média ponderada entre os limites do intervalo analisado para
escolher o valor da raiz com a tolerância permitida.
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 2/6
30/08/2018 Atividade 2 - Cálculo Numérico
Resultado:
V = 0.04270000000000034
Número de iterações: 3167
O critério de parada do código é o de F(x) < tolerância, porém utilizando esse método, nunca iria chegar
a precisão que queríamos de 10-12, pois foi observado que a partir de n = 3167 a suposta raiz da equação
não muda, ou seja, a partir de n= 3167 a raiz sempre será a mesma, por isso foi implementado ao código
uma estrutura de comparação, quando Pn = Pn-1 o código é interrompido evitando assim um looping
infinito. Ao calcularmos o F(0.004270000000000136) = 8.84473399906 *10-8 observamos que a precisão
dele é de 10-8 e não de 10-12 como foi proposto no enunciado.
Resolução pelo Método da Newton-Raphson:
def f(x):
return ((3.5*10**7) + (0.401*((1000/x)**2))) * (x - (1000*42.7*10**-6)) -
((1.3806503*10**-23)*1000*300)
def df(x):
return (3.5*10**7 - (0.401*(1000/x)**2) + (2*0.401*42.7*10**-6*(1000/x)**3))
def nr(a):
c = a
n = 0
X = []
Y = []
while (f(c) > 10**-12) or (f(c) < -(10**-12)):
c = a - (f(a)/df(a))
n += 1
X.append(n)
Y.append(c)
if a==c:
return c, n, X, Y
a = c
return c, n, X, Y
a,n,x,y = nr(1)
i t( )
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 3/6
30/08/2018 Atividade 2 - Cálculo Numérico
print(a,n)
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
plt.style.use('fivethirtyeight')
plt.plot(x,y, '-b', color='green')
plt.show()
Resultado:
V = 0.042699999999999995
Número de iterações: 8
Para o critério de parada F(x) < tolerância ao analisar todos os métodos implementados nesse problema
vemos que o de Newton-Raphson, foi o mais rápido e eficiente, uma vez que ele usou um número menor
de iterações e ele chegou a uma boa aproximação da raiz.
Agora analisaremos os métodos com o critério de parada (b-a) < tolerância onde a e b são as
extremidades do intervalo escolhido:
Resolução pelo Método da Bissecção:
def f(V):
a = 0.401
b = 42.7*10**-6
N = 1000
T = 300
3 5*10**7
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 4/6
30/08/2018 Atividade 2 - Cálculo Numérico
p = 3.5*10**7
k = 1.3806503*10**-23
return (p + a*(N/V)**2)*(V - N*b) - k*N*T
def iterar(e,a,b):
ni =0
while (b-a) >= e:
ni +=1
V = (a + b)/2.0
M = f(a)
if M * f(V) >0:
a=V
else:
b=V
a = -0.5
b = 1
iterar(10**-12,a,b)
Resultado:
V =0.0427000000002
Número de iterações: 41
def iterar(e,a,b):
ni = 0
#x = (a*f(b) - b*f(a))/(f(b) - f(a))
while (b-a)>= e:
ni +=1
x = (a*f(b) - b*f(a))/(f(b) - f(a))
if x==a or x==b:
break
if f(a)*f(x) >0:
a=x
else:
b=x
Resultado:
V =0.0427
Número de iterações: 3105
def f(V):
a = 0.401
b = 42.7*10**-6
N = 1000
T = 300
p = 3.5*10**7
k = 1.3806503*10**-23
return (p + a*(N/V)**2)*(V - N*b) - k*N*T
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 5/6
30/08/2018 Atividade 2 - Cálculo Numérico
def fi(V):
a = 0.401
b = 42.7*10**-6
N = 1000
p = 3.5*10**7
return V - (f(V)/(p-(a*(N**2)*(V**-2))+(2*a*b*(N**3)*(V**-3))))
def iterar(x,e):
ni = 0
while abs(f(x))>= e:
ni +=1
x1 = fi(x)
if abs(x1 - x) <e:
x = x1
break
x = x1
print "V = ",x," Iterações: ",ni
iterar(1, 10**-12)
Como o método de Newton necessita apenas de um chute inicial, executaremos o algoritmo para
ambas as extremidades do intervalo:
Em x = -0.5:
V = 0.0427
Número de iterações: 27
Em x = 1:
V = 0.0427
Número de iterações: 8
Com os resultados vemos que com o critério de parada (b-a) < tolerância, tanto o método de Newton
quanto o método da falsa-posição nos dão resultados com boa aproximação da raiz da função, porém ao
analisar o número de iterações observamos que o método da falsa posição precisa de cerca de 300 vezes
mais iterações que o método de Newton e 75 vezes mais iterações que o método da bisecção.
Agora comparando os critérios de parada, ambos deram boa aproximação para a raiz da função
porém o critério (b-a) < tolerância, em todos os três métodos o número de iterações foi menor do que o
critério f(x)< 0.
https://sites.google.com/site/calculonumerico2016ufabc/atividade-2 6/6