2010-10-23 28 views
3

Je veux interpoler un polynôme avec la méthode Lagrange, mais ce code ne fonctionne pas:interpolation Lagrange en Python

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)) 

J'ai suivi Wikipedia, mais quand je le lance, je reçois un IndexError à la ligne 3!

Merci

+2

Je vous serais reconnaissant si les downvoters expliqueraient la downvote ... – rubik

Répondre

2

Vérifiez les indices, Wikipedia dit « k + 1 points de données », mais vous configurez k = len(x_values) où il devrait être k = len(x_values) - 1 si vous avez suivi la formule exactement.

+0

Merci! Maintenant, je vérifie cela et je vous dis le résultat. – rubik

+0

Ok, et pourquoi si je le fais: 'interpolate ([1, 2, 3], [1, 4, 9])' il renvoie '-0.5x^2 + 1.5x'? Jetez un oeil à ceci: http://i.imgur.com/MkATz.gif – rubik

+0

@rubik: Désolé, mais je ne peux pas vous aider avec un tel problème spécifique sans connaître l'algorithme d'interpolation (et je ne lirai pas dessus). Vérifiez à nouveau votre logique ou recherchez une implémentation existante. Si vous postez plus de code sur la façon dont vous appliquez l'interpolation (par exemple, la définition/valeur initiale de «x» est manquante dans votre question), alors quelqu'un pourrait être en mesure de vous aider davantage. – AndiDog

4

Essayez

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)) 

Vous pouvez le confirmer comme suit:

>>> 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 

Le résultat est donc la valeur interpolée en fonction du polynôme qui passe par les points donnés. Dans ce cas, les 3 points définissent une parabole et les 3 premiers tests montrent que le y_value indiqué est retourné pour la x_value donnée.

+0

Merci! Un peu tard mais je vais essayer ça! :) – rubik