J'ai ce programme pour calculer l'interpolation d'Hermite.Interpellation d'Hermite en Python
Le problème est, que son comportement est vraiment mauvais.
Ceci est un graphique pour 35 nœuds Chebyshev. Si je mets plus de points, le pic au début sera plus élevé (c'est environ 10^7 avec ce nombre de nœuds).
J'ai interpolé cette même fonction en utilisant la méthode de Lagrange (en vert, il est décalé donc on peut le voir) et comme vous pouvez le voir, ça a l'air bien.
Voici le code:
def hermit_interpolate(input): #input is list of tuples [(x1,y1),(x2,y2)...] xi are Chebyshev nodes
points = [(input[0][0], input[0][1] - 0), (input[0][0], calculate_f_p_x(input[0][0]))] #"input[0][1] - 0" this is just to change type of second element
#calculate_f_p_x returns value of derivative
for k in range(1, len(input)): #Divided differences and derivatives in one list alternately
points.append((input[k][0], (input[k][1] - input[k - 1][1])/(
input[k][0] - input[k - 1][0])))
points.append((input[k][0], calculate_f_p_x(input[k][0])))
x, c = zip(*points)
x = list(x)
c = list(c)
n = len(points)
for i in range(2, n): #calculating factors
for j in range(n - 1, i - 1, -1):
c[j] = (c[j] - c[j - 1])/(x[j] - x[j - i])
def result_polynomial(xpoint): #here is function to calculate value for given x
val = c[0]
factor = 1.0
for l in range(1, n):
factor *= (xpoint - x[l - 1])
val += (c[l] * factor)
return val
return result_polynomial
Je ne peux pas voir ce qui ne va pas ici. Merci!
Avez-vous regardé 'numpy.polynomial.hermite'? – MirekE
Il avait aussi d'énormes erreurs. Peut-être que c'était un problème avec le prétraitement des données. En tout cas, je l'ai encore écrit. Cet algorithme est moins optimal car il utilise la matrice au lieu du vecteur, mais cela fonctionne. Je mets le code correct en réponse si quelqu'un en a besoin – Purple
Je ne sais pas, mais il y a de bonnes chances que les erreurs aient été introduites par la division entière, donc si vous avez des entiers dans vos données et que vous ne prenez pas de mesures spéciales, calcul où vous divisez par une différence peut être tronqué. Essayez d'utiliser 'from __future__ import division 'au début de votre code et voir si les erreurs disparaissent. – chthonicdaemon