Baixar e Instalar o Anaconda (Python 3.5)
Inicializar o Spyder (IDE Python)
Painéis Disponíveis:
Atalhos Importantes:
Baseado no Exemplo 11.1 do livro Engenharia de Reservatórios de Petróleo de Rosa, A. et al.
Método simplificado e bastante usado na prática para a realização de ajuste de histórico e/ou previsão do comportamento de poços isolados (Rosa, A. et al, 2006)
Equação do Declinio Hiperbólico:
$$q = \frac{q_i}{(1 + n a_i t)^{1/n}}$$Dado o histórico de produção de um poço na tabela abaixo:
t (ano) | q (m³std/d) |
---|---|
0 | 100 |
1 | 77.0 |
2 | 61.0 |
3 | 49.5 |
4 | 41.0 |
5 | 34.5 |
Determinar, através da equação do declínio hiperbólico:
Vamos criar uma lista com os dados do histórico
qm = [100, 77, 61, 49.5, 41, 34.5]
Listas não são Arrays!
Lista | Array |
---|---|
import numpy as np
qm = np.array([100, 77, 61, 49.5, 41, 34.5])
tsteps = np.arange(6)
Utilizando a equação de Declínio Hiperbólico, a vazão $q$ de um poço no tempo $t$ pode é dada por:
$$q = \frac{q_i}{(1 + n a_i t)^{1/n}}$$Podemos escrever esta equação em Python da seguinte forma:
def declinio_hiperb(t, qi, ai, n):
'''
Calcula vazão instantânea do poço usando curva de declinio hiperbólica
'''
q = qi / (1 + n * ai * t) ** (1 / n)
return q
Tipagem dinâmica e foco na legibilidade
Exemplo da mesma função em C++:
#include <math.h>
/*
* Calcula vazão instantânea do poço usando curva de declinio hiperbólica
*/
const double &declinio_hiper(double &t, double &qi, double &ai, double &n)
{
return qi / pow((1 + n * ai * t), (1 / n));
}
Vamos testar a função
declinio_hiperb(2, 100, 0.3, 1/3)
57.87037037037038
Como nossos vetores tem suporte a operadores, podemos chamar a função passando um valor escalar ou vetorial:
declinio_hiperb(tsteps, 100, 0.3, 1/3)
array([ 100. , 75.13148009, 57.87037037, 45.51661356, 36.44314869, 29.62962963])
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(tsteps, qm, "ro")
[<matplotlib.lines.Line2D at 0x6df2710>]
qs = declinio_hiperb(tsteps, 100, 0.3, 1/3)
plt.plot(tsteps, qs)
[<matplotlib.lines.Line2D at 0x7538278>]
plot()
function - documentação da função plot()
import scipy.optimize
params, fitted = scipy.optimize.curve_fit(declinio_hiperb, tsteps, qm, p0=[100, 0.3, 1/3])
qi_fit, ai_fit, n_fit = params
print(qi_fit)
print(ai_fit)
print(n_fit)
100.012075806 0.279526724773 0.489424884092
Plotando contra os dados de histórico, temos:
qs = declinio_hiperb(tsteps, qi_fit, ai_fit, n_fit)
plt.plot(tsteps, qm, "ro", label="medido")
plt.plot(tsteps, qs, label="simulado")
plt.xlabel("anos")
plt.ylabel("$m^3 std/d$")
plt.legend()
<matplotlib.legend.Legend at 0x7f515f8>
Para encontrar o tempo de abandono, vamos isolar $t$ na equação de declíneo:
$$q = \frac{q_i}{(1 + n a_i t)^{1/n}}$$temos:
$$t = \frac{(q_i/q)^n - 1}{n a_i}$$def tempo_abandono(qa, qi, ai, n):
t = ((qi/qa)**n - 1) / (ai*n)
return t
qa = 5
tempo_abandono(qa, qi_fit, ai_fit, n_fit)
24.36224982496239
Temos que o tempo de abandono é de 24.36 anos
import scipy.integrate
result, error = scipy.integrate.quad(declinio_hiperb, 0, 24.36, (qi_fit, ai_fit, n_fit))
Np = result * 365.25 # mult por 365.25 (vazão está em dias e tempo em anos)
print("Np: %.2f" % (Np))
Np: 200503.96
Produção acumulada até o tempo de abandono de 200.503 m³std
tsteps_a = np.linspace(0, 24.3)
qs_a = declinio_hiperb(tsteps_a, qi_fit, ai_fit, n_fit)
plt.plot(tsteps_a, qs_a)
plt.plot(tsteps, qm, "ro")
plt.xlabel("anos")
plt.ylabel("$m^3 std/d $")
plt.title("Curva Declinio")
plt.annotate(r"$N_p = %.0f m^3std$" % Np, xy=(0.3, 0.5), xycoords='figure fraction', size=16)
plt.fill_between(tsteps_a, qs_a, 0, facecolor="g", alpha=0.3)
plt.savefig("declinio.png", dpi=300)
Executar o Anaconda Command Prompt e instalar a biblioteca yahoo_finance
com o seguinte comando:
pip install yahoo_finance
import yahoo_finance
yahoo_finance.Currency("USDBRL").get_rate()
'3.7408'
brent_share = yahoo_finance.Share("BZZ15.NYM")
brent_price = float(brent_share.get_price())
"OIL Brent: U$ %.2f" % (brent_price)
'OIL Brent: U$ 47.24'
# Imprimindo valor em moeda corrente, agrupand milhar
m3tobrl = 6.28981077
Np_usd = Np * m3tobrl * brent_price
print("Produção em US$: %.2f" % (Np_usd))
Produção em US$: 59575873.77
import locale
dolar = float(yahoo_finance.Currency("USDBRL").get_rate())
# Aplica as configurações regionais que estão definidas no computador
locale.setlocale(locale.LC_MONETARY, "Portuguese_Brazil")
locale.currency(Np_usd * dolar, grouping=True)
'R$ 222.843.555,82'