Simulación de Pruebas de Presión con el Algoritmo de Stehfest
Inversión numérica de Laplace para verificar k, C y skin con datos reales
Yacimientos
Pruebas de Presión
Python
R
Usa el algoritmo de Stehfest para simular la respuesta de presión de un pozo con almacenamiento y daño, y compara con datos reales de una prueba de decremento. Código en Python y R.
Cuando analizas una prueba de presión — ya sea por método semilog, curvas tipo o TDS — obtienes valores de permeabilidad (\(k\)), coeficiente de almacenamiento (\(C\)) y factor de daño (\(s\)). Pero, ¿cómo verificas que esos parámetros son correctos?
La respuesta es simular la respuesta de presión con esos parámetros y compararla con los datos reales. Si la simulación ajusta los datos, los parámetros son confiables.
El problema es que la solución analítica del yacimiento con almacenamiento y daño está en el espacio de Laplace — no se puede invertir analíticamente al espacio del tiempo. Ahí es donde entra el algoritmo de Stehfest (1970): una técnica numérica que invierte la transformada de Laplace usando solo 8 coeficientes precalculados.
¿Por qué Stehfest?
Es el método estándar en la industria para inversión numérica de Laplace en pruebas de presión. Software como Saphir, PanSystem y Ecrin lo usan internamente. Con este algoritmo, puedes hacer lo mismo en 20 líneas de código.
Donde \(\bar{f}(s)\) es la función en el espacio de Laplace evaluada en \(s = i \cdot \ln(2)/t\), y \(V(i)\) son los coeficientes de Stehfest precalculados.
Para \(N = 8\):
Los 8 coeficientes de Stehfest con N=8. Estos números son todo lo que necesitas.
\(V(1)\)
\(V(2)\)
\(V(3)\)
\(V(4)\)
\(V(5)\)
\(V(6)\)
\(V(7)\)
\(V(8)\)
-0.3333
48.3333
-906
5464.6667
-14376.6667
18730
-11946.6667
2986.6667
Solución en Laplace: Yacimiento con WBS y Skin
La presión adimensional en el espacio de Laplace para un yacimiento homogéneo infinito con almacenamiento y daño es:
# Variables adimensionalestD = (0.0002637* k * t) / (phi * vis * ct * rw**2)cD = (0.8936* C) / (phi * ct * h * rw**2)# Simular presión con StehfestPwD = stehfest_inversion(tD[1:], cD, s) # Excluir t=0# Convertir a dimensionalesdp_sim = (PwD *141.2* Bo * vis * Qo) / (h * k)pwf_sim = Pi - dp_sim# Derivada de la simulacióndpdt_sim = np.zeros(len(dp_sim))for i inrange(1, len(dp_sim)): dpdt_sim[i] = (dp_sim[i] - dp_sim[i-1]) / (np.log(t[i+1]) - np.log(t[i]))# === GRÁFICO LOG-LOG: DATOS vs SIMULACIÓN ===fig, ax = plt.subplots(figsize=(11, 7))# Datos reales (puntos)ax.loglog(t[1:], dp[1:], 'o', ms=7, color='#2980b9', alpha=0.5, label='Δp (datos)')ax.loglog(t[1:], dpdt[1:], 'o', ms=7, color='#2d8a4e', alpha=0.5, label="tΔp' (datos)")# Simulación (líneas)ax.loglog(t[1:], dp_sim, '-', lw=2.5, color='#2980b9', label='Δp (Stehfest)')ax.loglog(t[2:], dpdt_sim[1:], '-', lw=2.5, color='#2d8a4e', label="tΔp' (Stehfest)")ax.set_xlabel('Tiempo (hr)', fontsize=12)ax.set_ylabel('Δp, tΔp\' (psi)', fontsize=12)ax.set_title('Datos Reales vs Simulación con Stehfest', fontsize=14, fontweight='bold')ax.legend(fontsize=10); ax.grid(True, which='both', alpha=0.3)# Anotar parámetrosax.text(0.02, 0.05, f'k = {k} md\nC = {C} bbl/psi\ns = {s}', transform=ax.transAxes, fontsize=11, verticalalignment='bottom', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))plt.tight_layout(); plt.show()
Figure 3: Comparación datos reales vs simulación con Stehfest. Las líneas continuas (simulación) ajustan los puntos (datos reales), validando los parámetros k, C y s.
Figure 5: Presión de fondo fluyente: datos medidos vs simulación.
Ver código
data_DD$pwf_sim <- Pi - data_DD$dp_simggplot(data_DD) +geom_point(aes(x=t, y=pwf, color="Datos"), size=2, alpha=0.5) +geom_line(aes(x=t, y=pwf_sim, color="Stehfest"), linewidth=1) +scale_color_manual(values=c("Datos"="#2980b9", "Stehfest"="#c0392b")) +labs(x="Tiempo (hr)", y="Pwf (psia)",title="Presión de Fondo: Datos vs Simulación", color="") +theme_minimal() +theme(plot.title=element_text(face="bold", size=14))
Figure 6: Pwf medido vs simulado.
¿Qué Aprendimos?
El algoritmo de Stehfest permite cerrar el ciclo del análisis de pruebas de presión:
Datos → Análisis (semilog, curvas tipo, TDS) → k, C, s → Stehfest → Simulación → Verificación
Si la simulación ajusta los datos, los parámetros son confiables. Si no ajusta, hay que revisar el modelo o los parámetros. Este paso de verificación es el que separa un análisis profesional de uno académico.
Mejora potencial
El siguiente paso sería usar regresión no lineal para optimizar k, C y s automáticamente — minimizar la diferencia entre los datos y la simulación de Stehfest. Eso lo veremos en un post futuro.
Referencias
Stehfest, H. (1970). Algorithm 368: Numerical Inversion of Laplace Transforms. Communications of the ACM, 13(1).
Spivey, J. & Lee, J. (2013). Applied Well Test Interpretation. SPE.
Lee, J., Rollins, J. & Spivey, J. (2003). Pressure Transient Testing. SPE.
Sun, H. (2015). Advanced Production Decline Analysis. Gulf Professional Publishing.