BOMBOLOM.COM

(python) Interpolação Linear

Este é um post de José Lopes.

Embora o módulo math do Python tenha uma função para a interpolação linear, cuja utilização consiste salvo o erro em dar os pontos adjacentes ao ponto em que pretendemos a interpolação, quando necessitei desta função matemática criei uma.
A razão deste autismo foi de que necessitava de uma série de interacções onde os pontos adjacentes variavam, para além de não me ter lembrado de ver se existia uma função para a interpolação linear.

Este post fornece assim uma solução para a interpolação linear com uma base de referência declarada.

A interpolação linear não é mais do que um método de aproximação para determinar um ponto entre dois pontos conhecidos, considerando um segmento de recta entre esses dois pontos, como mostra a imagem.

Sendo x conhecido podemos calcular Y pela fórmula:

y = y0 + (x - x0) (y1 - y0)/ (x1 - x0)

Assim, se considerarmos que temos um conjunto de pontos (x0, y0), (x1, y1), ... (xn, yn) e que queremos determinar a coordenada y para uma qualquer coordenada x, podemos criar uma função como a que se segue.

Para este exemplo:

(1)def Linterpolacao (xpoints, ypoints, value):
(2)  for n in range(len(xpoints)):
(3)    if (n==0 and value < xpoints[n]) or (n==len(xpoints)-1 and value > xpoints[n]):
(4)      result = "Fora do intervalo conhecido"
(5)    elif value <= xpoints[n]:
(6)      result = ypoints[n-1] + ((value-xpoints[n-1])*(ypoints[n]-ypoints[n-1]))/(xpoints[n]-xpoints[n-1])
     return result

Explicando o código:

(1) Declaração da função, tomando como argumentos a lista de coordenadas de x e y, e o valor de x para o qual se quer a coordenada y.
(2) Para correr a lista de pontos conhecidos.
(3) e (4) Testa se o valor da coordenada dado se encontra fora do intervalo de pontos conhecidos e devolve mensagem de erro se verdadeiro.
(5) e (6) Testa se encontra o valor máximo adjacente e aplica a interpolação se verdadeiro.

Como tudo em programação podemos sempre obter uma solução mais elegante ou adaptar ao que necessitamos.
No exemplo considerei que os pontos conhecidos podem ser descriminados numa tabela com uma coluna para x e y, e consequentemente agrupados numa lista para cada eixo. Poderia ter optado por ter como argumento da função uma lista de tuples do tipo [(x0, y0), (x1, y1), ... (xn, yn)] que equivale mais à linguagem matemática mas, como os meus dados não vêm normalmente nesse formato, implementei duas listas de coordenadas nos eixos.

06.09.2007 | Ler mais | Comentários | Tags

Voltar à Página principal | Made with PyBlosxom