Julio de 2010


Categorías

Inicio
Ayuntamiento
Entorno
Situación
Salón Social
Meteorología
Foro
Boletín
Tecnología
Fútbol
Turismo
Empresas
Fiestas
Asoc. Cultural
Patrimonio
Cultura
Visitas
Prensa
Cartelera
Anuncios DPH
Mercadillo

Citas del día:

El valor, la buena conducta y la perseverancia conquistan todas las cosas y obstáculos que quieran destruirlas y se interpongan en su camino. Ralph Waldo Emerson. Filósofo, ensayista, poeta y político EE.UU.











La Puebla de Castro (www.lapuebladecastro.com)
www.lapuebladecastro.com > Tecnología > Programación > Interpolación en Ruby


Interpolación lineal en Ruby

La interpolación lineal de datos es una tarea llevada a cabo de forma intensiva en cualquier tipo de análisis numérico como los llevados a cabo en laboratorios, consultorías de estudios financieros, bolsa y etc ...

El problema pasa por partir de una serie de valores tabulados sobre los cuales pretendemos estimar valores intermedios que se encuentran a caballo entre dos datos registrados. La manera más inmediata de conseguirlo es la de hacer pasar una recta por los puntos precedente y posterior al valor sobre el cual se pretende la estimación y extraer de ésta última el valor estimado.

Por ejemplo y para clarificar ideas supongamos que tenemos un fichero llamado "data.dat" en el que constan los siguientes valores tabulados:

1.0 3.0
2.0 9.0
3.0 4.0
4.0 -3.0
5.0 10.0

Si ahora deseamos conocer el valor de la estimación construida a partir de dichos datos para x = 2.5 podemos proceder según ilustra el gráfico adjunto para obtener la respuesta estimada de forma lineal: yaproximada = 6.5.

Interpol. Lineal en Ruby
Interpolación lineal en Ruby de los datos contenidos en el fichero "data.dat"

Código Ruby


class NumericalData
  attr_accessor :data

  def initialize
    @data = []
  end
  
  def interpolate(x)
    if ( pnt = @data.select { |d| x == d[:x] }.shift )
      return pnt[:y]
    end
    prv = @data.select { |d| x > d[:x] }.pop
    nxt = @data.select { |d| x < d[:x] }.shift
    if (prv and nxt)
      a = (nxt[:y] - prv[:y])/(nxt[:x] - prv[:x])
      return a*(x-prv[:x]) + prv[:y]
    end
    nil
  end

  def read(filename,column)
    @data = []
    File.open(filename).each do |l|
      t,*arr = l.split(/\s+/).collect { |n| n.to_f }
      @data.push({ :x => t , :y => arr[column-2]})
    end
    self
  end
end


f = NumericalData::new()
f.read("data.dat",2)
puts f.interpolate(2.5)

He implementado algoritmos similares en muchas ocasiones y lenguajes de programación distintos, no obstante, estoy iniciándome en Ruby y me ha llamado la atención el hecho de que no se hace necesario ningún tipo de loop o bucle para realizar la interpolación lineal descrita anteriormente. El uso abstracto de bloques a partir de filtros como:

  • select (selecciona valores de una lista)
  • shift (extrae el primer elemento de una lista)
  • pop (extrae el último elemento de una lista)
  • collect (opera y acumula sobre elementos de una lista)

es suficiente para conseguir nuestro objetivo de forma muy compacta y natural revelándonos algunos aspectos de la verdadera potencia de Ruby gracias a su tratamiento generalizado de lo que conocemos como bloques de código en lenguajes como C o Perl.
















































Ultima actualización: Julio de 2010
Página mantenida por el equipo de www.lapuebladecastro.com
Correo electrónico: webmaster@lapuebladecastro.com







Casas de Pueblo, Pisos y Apartamentos en el Pirineo

Ya puedes acceder a la nueva Web de Fincas Graus, Expertos inmobiliarios a tu servicio con oficina en Graus y una gran oferta de inmuebles en el Pirineo


Desguaces, solicitud de recambios y
piezas de coche

Ya puedes acceder a la nueva Web de Desguaces Balaguer, tu desguace de confianza, ahora en internet !


Embutidos El Cortante

El que de buen paladar presume, Embutidos El Cortante consume