11
Feb

0

Interpolación

¿Qué es la interpolación? y las diferentes herramientas para calcularla.

El ingeniero trabaja con datos discretos resultado de un análisis del laboratorio, datos de producción o datos de la literatura (manual del ingeniero químico). Los datos involucra una variable independiente «x» y una variable dependiente «y», por ejemplo «Temperatura» vs «Presión» para un gas CO2. Deseamos conocer cuál es la Presión a una temperatura la cual no está tabulada. ¿Qué podemos hacer para obtener el resultado? hay dos opciones, una hacer una regresión que genera un polinomio de grado 1 o «n», la regresión minimiza la diferencia entre el dato de la tabla y el dato calculado, esto se llama regresión por mínimos cuadrados. El polinomio de la regresión no pasa necesariamente por todos los puntos, sino que asegura la mínima diferencia entre el dato calculado y el dato tabulado. Por otro lado, la interpolación propone también un polinomio para representar los datos tabulados, pero a diferencia de la regresión, la interpolación asegura que el polinomio debe tocar los puntos tabulados.

Regresión vs Interpolación

La interpolación lineal se calcula con la siguiente ecuación

donde «x» es el valor que deseamos interpolar, esta ecuación solo es válida en el intervalo . El cálculo de «y» entonces se obtiene con los datos de la tabla y es necesaria una simple calculadora, pero si se desea calcular muchas interpolaciones con la misma tabla de datos es conveniente apoyarse con una herramienta de cómputo ¿qué herramienta utilizar? Algunos podrían pensar en Excel, la herramienta favorita de los ofimáticos (herramientas de oficina), dentro de las casi 500 funciones que tiene excel, no cuenta con alguna para calcular la interpolación lineal ni para otro tipo de interpolación. Entonces pensamos en crear un programa en algún lenguaje, pensamos quizá en Java, C, C++, C#, Pascal, VBA o Fortran, pero ninguno de ellos cuenta con una función para calcular una interpolación. Otras opciones podrían ser Matlab, Python, Mathematica, Scilab, Octave, todas estas herramientas tienen una función para calcular la interpolación lineal, polinómica (cuadrática, cúbica, etc), trazadores o spline, además del método del vecino más cercano, incluso interpolaciones de 2 o más dimensiones. Vemos entonces que éstas herramientas están diseñadas para ingeniería y ciencias, los lenguajes son de propósito general y por lo tanto no tienen funciones pre construidas.

Resolvamos el siguiente ejemplo:

La densidad del carbonato de potasio en solución acuosa varía con la temperatura y la concentración. En un experimento para determinar la densidad del carbonato, se consideró la temperatura constante y se varió la concentración, obteniendo la tabla:

Calcule la Densidad a una concentración del 25%. Revisemos la codificación en cada lenguaje y vean sus diferencias y características.

Matlab

>> con=[4 12 20 28 38 45];
>> den=[1.0276 1.1013 1.1801 1.2652 1.3480 1.4120];
>> y=interp1(con,den,25)
y =
    1.2333

Java

class Interp1 {
//calcula la interpolacion lineal
    public double calcula(double[] x, double[] y, double xi) {
        boolean encontrado = false;
        double yi = 0;
        int i = 0;

        while (i < x.length && encontrado == false) {
            if (x[i] <= xi && xi <= x[i + 1]) {
                yi = y[i] + (y[i + 1] - y[i]) / (x[i + 1] - x[i]) * (xi - x[i]);
                encontrado = true;
            }
            i++;
        }
        return yi;
    }
    public static void main(String args[]) {
        double y[] = {
            1.0276,1.1013,1.1801,1.2652,1.3480,1.4120};
        double x[] = {
            4,12,20,28,38,45};
        double xi = 25;
        double yi;
        Interp1 i = new Interp1();
        yi = i.calcula(x, y, xi);
        System.out.println("Valor interpolado=" + yi);
    }
}

C#

using System;
namespace Interpolacion
{
    class Interp1
    {
        //calcula la interpolacion lineal
        public static double calcula(double[] x, double[] y, double xi)
        {
            bool encontrado = false;
            double yi = 0;
            int i = 0;

            while (i < x.Length && encontrado == false)
            {
                if (x[i] <= xi && xi <= x[i + 1])
                {
                    yi = y[i] + (y[i + 1] - y[i]) / (x[i + 1] - x[i]) * (xi - x[i]);
                    encontrado = true;
                }
                i++;
            }
            return yi;
        }

        public static void Main(string[] args)
        {
            double[] y = {
        1.0276,1.1013,1.1801,1.2652,1.3480,1.4120};
            double[] x = {
        4,12,20,28,38,45};
            double xi = 25;
            double yi;

            yi = calcula(x, y, xi);
            Console.WriteLine("Valor interpolado=" + yi);
        }
    }
}

C

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <conio.h>

float inter_lin(int,float[],float[],float);

void main(){
    float y[]={1.0276,1.1013,1.1801,1.2652,1.3480,1.4120};
    float x[]={4,12,20,28,38,45};
    float xi=2;
    float yi;
    int n=4;

    yi=inter_lin(n,x,y,xi);
    printf("valor interpolado = %f",yi);
    getch();
}

float inter_lin(int n,float x[],float y[],float xi){
    float yi;
    int i=0;
    bool encontrado=0;
    while (i<n&&encontrado==0){
        if (x[i]<=xi && xi<=x[i+1]){
            yi=y[i]+(y[i+1]-y[i])/(x[i+1]-x[i])*(xi-x[i]);
            encontrado=1;
        }
        i++;
    }
    return yi;
}

Python

import numpy as np
from scipy import interpolate

x=np.array([4.1,12.2,20.3,28.2,38.1,45.2])
y=np.array([1.0276,1.1013,1.1801,1.2652,1.3480,1.4120])

yi=interpolate.interp1d(x,y,kind='linear')

xi=15
yii=yi(xi)

VBA Excel

Function interp1(xr As Range, yr As Range, xi As Double)
Dim yi As Double
Dim i As Integer
Dim encontrado As Boolean
n = xr.Count
ReDim x(1 To n) As Double
ReDim y(1 To n) As Double

'pasa el rango a un arreglo
For i = 1 To n
    x(i) = xr(i).Value
    y(i) = yr(i).Value
Next i
i = 1
While i < n And encontrado = False
    If (x(i) <= xi And xi <= x(i + 1)) Then
        yi = y(i) + (y(i + 1) - y(i)) / (x(i + 1) - x(i)) * (xi - x(i))
        encontrado = True
    End If
    i = i + 1
Wend
interp1 = yi
End Function