Лагранжева интерполяция в Python - PullRequest
6 голосов
/ 23 октября 2010

Я хочу интерполировать полином с помощью метода Лагранжа, но этот код не работает:

def interpolate(x_values, y_values):
    def _basis(j):
        p = [(x - x_values[m])/(x_values[j] - x_values[m]) for m in xrange(k + 1) if m != j]
        return reduce(operator.mul, p)

    assert len(x_values) != 0 and (len(x_values) == len(y_values)), 'x and y cannot be empty and must have the same length'

    k = len(x_values)
    return sum(_basis(j) for j in xrange(k))

Я следовал Википедии , но когда я запускаю его, я получаю IndexError в строке 3!

Спасибо

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Попробуйте

def interpolate(x, x_values, y_values):
    def _basis(j):
        p = [(x - x_values[m])/(x_values[j] - x_values[m]) for m in xrange(k) if m != j]
        return reduce(operator.mul, p)
    assert len(x_values) != 0 and (len(x_values) == len(y_values)), 'x and y cannot be empty and must have the same length'
    k = len(x_values)
    return sum(_basis(j)*y_values[j] for j in xrange(k))

Вы можете подтвердить это следующим образом:

>>> interpolate(1,[1,2,4],[1,0,2])
1.0
>>> interpolate(2,[1,2,4],[1,0,2])
0.0
>>> interpolate(4,[1,2,4],[1,0,2])
2.0
>>> interpolate(3,[1,2,4],[1,0,2])
0.33333333333333331

Таким образом, результатом является интерполированное значение, основанное на полиноме, который проходит через заданные точки.В этом случае 3 точки определяют параболу, а первые 3 теста показывают, что указанное значение y_value возвращается для данного значения x_value.

3 голосов
/ 23 октября 2010

Проверьте индексы, Википедия говорит "k + 1 точек данных", но вы устанавливаете k = len(x_values), где должно быть k = len(x_values) - 1, если вы точно следовали формуле.

...