Interpolacion por el Método de Distancia Inversa

Generación de mapa de permeabilidad usando el método de distancia inversa en R y Plotly

Rigoberto Chandomi https://www.linkedin.com/in/rigobertochandomi/
2024-02-04

Para comprender y predecir el comportamiento de un yacimiento de hidrocarburos, hay que tener un conocimiento lo más preciso y detallado posible de la formación. El flujo de aceite y del gas está condicionado por la geometría del yacimiento (forma estructural, espesor de los estratos, etc) y los valores locales de los parámetros petrofísicos. De ahí que la precisión de la predicción está estrechamente relacionada con el detalle con el que se describe el yacimiento.

Se han desarrollado diversas técnicas de estimación geoestadística para intentar describir con precisión la distribución espacial de las propiedades de las rocas. El concepto de continuidad espacial sugiere que los puntos de datos cercanos entre sí tienen más probabilidades de ser similares que los puntos de datos más alejados entre sí. Una de las mejores herramientas geoestadísticas para representar esta continuidad es un mapa visual que muestre el valor de un conjunto de datos con respecto a su ubicación. Para preparar estos mapas se utilizan métodos automáticos o informáticos de contorneado y ceñido. Estos métodos implican interpolar entre puntos de datos conocidos, como la elevación o la permeabilidad, y extrapolar más allá de estos valores de datos conocidos. Estas propiedades de las rocas suelen denominarse variables regionalizadas.

Existen varios métodos convencionales de interpolación y extrapolación que pueden aplicarse a los valores de una variable regionalizada en diferentes lugares

El método de la distancia inversa Con la distancia inversa, los puntos de datos se ponderan durante la interpolación de forma que las influencias de un punto de datos con respecto a otro disminuyen con la distancia desde la ubicación deseada. El método de la distancia inversa asigna un factor de ponderación λi a cada variable regionalizada medida por la distancia inversa entre el valor medido y el punto que se está estimando

\[ \lambda_{\mathrm{i}}=\left(\frac{1}{\mathrm{~d}_{\mathrm{i}}}\right) / \sum_{\mathrm{i}=1}^{\mathrm{n}}\left(\frac{1}{\mathrm{~d}_{\mathrm{i}}}\right) \] Para este ejemplo, cargaremos los datos de permeabilidad y producción acumulada de 11 pozos con sus respectivas coordenadas \(X\) y \(Y\).

library(plotly)

data <- read.csv("CSV_Produccion_V2.csv")
head(data)
    Pozo        X       Y       Np       K
1 Pozo-1 692042.4 2267048 31.96746 480.816
2 Pozo-2 691497.0 2267630 49.06818 442.260
3 Pozo-3 692219.0 2266683  1.73502  70.308
4 Pozo-4 693481.7 2266412  1.07730  34.020
5 Pozo-5 691666.2 2266182 18.96048 283.500
6 Pozo-6 691032.7 2268344 30.06234  74.844

Para generar un mapa de permeabilidad necesitamos crear una matriz que contenga valores para en cada coordenada \(X\) y \(Y\). Para ello generamos vectores de coordenadas dentro de los rangos observados en los datos. El valor de cada coordenada se estima con el método de distancia inversa, primero calculando el factor para cada valor y su distancia, y posteriormente la la propiedad estimada para cada coordenada.

CORDX <- seq( min(data$X)-500, max(data$X)+500, by = 100)
CORDY <- seq( min(data$Y)-500, max(data$Y)+500, by = 100)
variable_map <- data$K

MATZ <- matrix(0, length(CORDY), length(CORDX))

for (i in 1:nrow(MATZ)){
  
  for (j in 1:ncol(MATZ)){
    
    distance <- (1/sqrt((CORDX[j] - data$X)^2 + (CORDY[i] - data$Y)^2))
    
    index <- which(distance == Inf)
      
      if(length(index) == 0){
        
        factor <- (1/sqrt((CORDX[j] - data$X)^2 + (CORDY[i] - data$Y)^2)) / sum(1/sqrt((CORDX[j] - data$X)^2 + (CORDY[i] - data$Y)^2))
        
        MATZ[i,j]  <- sum(variable_map * factor)
        
      }else{
        
        MATZ[i,j]  <- variable_map[index]
       
      }
    
  }
  
}

Una vez generada la matriz podemos crear un mapa usando la librería Plotly y el tipo de grafico “contour”. Para una correcta visualización definimos los rangos de los contornes y una factor de suavizado.

plot_ly(
  x = CORDX, 
  y = CORDY, 
  z = MATZ, 
  type = "contour",
  contours = list(
    end = 600, 
    size = 10, 
    start = 0,
    showlabels = FALSE
  ), 
  line = list(smoothing = 3)
  
) %>%  add_trace(
  x = data$X, 
  y = data$Y,  type = "scatter", mode = "llines+markers", color = I('#FF5733')
  
)