En la solución de problemas de ingeniería frecuentemente nos topamos con información que viene dada en tablas y necesitamos hallar un dato específico que por desgracia no se encuentra tabulado. Por esta razón, nos vemos obligados a llevar a cabo una interpolación con el fin de conseguir el dato que requerimos.
Revisando las funciones de Excel me encuentro con que esta función tan básica en ingeniería no se encuentra como una función predeterminada. Por lo anterior, decidí crear dicha función y compartirles el código para que la incorporen a la automatización de sus programas en Excel. A continuación les planteo un ejemplo y cómo pueden utilizar la función que les traigo hoy (abajo les dejo el código para que lo copien en un módulo del VBA).
Ejemplo
Resolviendo un problema de termodinámica necesitamos hallar la presión de saturación del agua a una temperatura de 172°C teniendo la siguiente tabla:
Después, destinamos una celda para introducir el dato de entrada (172) y otra para utilizar la función que nos retornará el dato buscado (Psat). En las siguientes imágenes ilustro el paso a paso
Finalmente, obtenemos el resultado esperado que es 0.8318 kPa.
Espero les haya sido de utilidad el código
Saludos!!
Código
' Definicion de la funcion y sus entradasFunction INTERPOLAR(valor As Double, vec_ref As Range, vec_resultado As Range) As Double '
' Definicion de variables
Dim y0, x0, y1, x1, m, x As Double
Dim i, nElementos As Long
nElementos = vec_ref.Count ' Especifica el numero de elementos del rango seleccionado
x = valor ' Dato de entrada
' Interpolacion lineal
If vec_ref(vec_ref.Count) > vec_ref(1) Then
For i = 1 To nElementos - 1
' Condicional para encontrar el intervalo en el que se encuentra el valor a evaluar (Rango con datos ascendentes)
If valor >= vec_ref(i) And valor < vec_ref(i + 1) Then
y1 = vec_resultado(i + 1)
y0 = vec_resultado(i)
x1 = vec_ref(i + 1)
x0 = vec_ref(i)
m = (y1 - y0) / (x1 - x0) ' Calculo de pendiente de la ecuacion lineal
INTERPOLAR = y0 + m * (x - x0) 'Calculo del valor interpolado
End If
Next i
Else
For i = 1 To nElementos - 1
' Condicional para encontrar el intervalo en el que se encuentra el valor a evaluar (Rango con datos descendentes)
If valor >= vec_ref(i + 1) And valor < vec_ref(i) Then
y1 = vec_resultado(i)
y0 = vec_resultado(i + 1)
x1 = vec_ref(i)
x0 = vec_ref(i + 1)
m = (y1 - y0) / (x1 - x0) ' Calculo de pendiente de la ecuacion lineal
INTERPOLAR = y0 + m * (x - x0) 'Calculo del valor interpolado
End If
Next i
End If
End Function
Excelente, gracias
ResponderEliminarGracias hermano!
ResponderEliminarUn maestro! Gracias
ResponderEliminarMuy bien. Adjunto una variante que permite la extrapolación y simplifica la consideración del sentido de crecimiento de los datos aportados
ResponderEliminarFunction PP(x As Double, vrx As Range, vry As Range) As Double 'Por Puntos
'Interpolación por puntos (los valores de referencia deben darse en orden creciente)
'usando un rango para x y otro para y damos flexibilidad a los valores a escoger
'no debe repetirse ningún punto en los valores de referencia pues daría error (división por cero al ser (x1-x0)=0
'los puntos deben estar en orden de crecimiento o decrecimiento pero no mezclados
'Definicion de variables (conveniente pero no estrictamente necesaria
Dim y0, x0, y1, x1 As Double
Dim i, n, nmax, s As Long
nmax = vrx.Count ' Especifica el numero de elementos del rango seleccionado
If vrx(0) < vrx(1) Then s = 1 Else s = -1 'sentido de crecimiento
n = 1
x1 = vrx(n): y1 = vry(n)
Do 'haciendolo con loop permitiremos extrapolar cuando x esté fuera del rango de los elementos conocidos
n = n + 1
x0 = x1: y0 = y1
x1 = vrx(n): y1 = vry(n)
Loop While ((n < nmax) And (x * s > x1 * s))
PP = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
End Function
Y como le puedo hacer cuando mis valores de x son ascendentes y los valores de y descendentes???
ResponderEliminar¿Cuál sería el código para regresar un error (#VALUE o algo así) sí el Dato de entrada (X) está fuera de rango para interpolar?
ResponderEliminar