O scipy.interpolate é útil para a montagem de uma função a partir de dados experimentais e, portanto, avaliar os pontos onde não existe nenhuma medida. O módulo é baseado nas subrotinas Fortran FitPack do projecto netlib.
Ao imaginar dados experimentais perto de uma função seno:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
measured_time = np.linspace(0, 1, 10)
noise = (np.random.random(10)*2 - 1) * 1e-1
measures = np.sin(2 * np.pi * measured_time) + noise
[/pastacode]
A classe scipy.interpolate.interp1d pode construir uma função de interpolação linear:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
from scipy.interpolate import interp1d
linear_interp = interp1d(measured_time, measures)
[/pastacode]
Em seguida, o exemplo scipy.interpolate.linear_interp precisa ser avaliada no instante de interesse:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
computed_time = np.linspace(0, 1, 50)
linear_results = linear_interp(computed_time)
[/pastacode]
Uma interpolação cúbica também pode ser selecionada através da palavra-chave argumento kind opcional:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
ubic_interp = interp1d(measured_time, measures, kind='cubic')
cubic_results = cubic_interp(computed_time)
[/pastacode]
Os resultados estão agora reunidos na seguinte figura Matplotlib:
[pastacode lang=”python” message=”” highlight=”” provider=”manual”]
import numpy as np
from scipy.interpolate import interp1d
import pylab as pl
measured_time = np.linspace(0, 1, 10)
noise = (np.random.random(10)*2 - 1) * 1e-1
measures = np.sin(2 * np.pi * measured_time) + noise
linear_interp = interp1d(measured_time, measures)
computed_time = np.linspace(0, 1, 50)
linear_results = linear_interp(computed_time)
cubic_interp = interp1d(measured_time, measures, kind='cubic')
cubic_results = cubic_interp(computed_time)
pl.plot(measured_time, measures, 'o', ms=6, label=u'Medições')
pl.plot(computed_time, linear_results, label=u'Interpolação Linear')
pl.plot(computed_time, cubic_results, label=u'Interpolação Cúbica')
pl.legend()
[/pastacode]
scipy.interpolate.interp2d é semelhante ao scipy.interpolate.interp1d, mas para matrizes de 2-D. Note que para a família interp, o tempo computado deve ficar dentro do intervalo de tempo medido.