La méthode d'interpolation de Lagrange
- Je utiliser la convolution et pour les boucles (trop pour les boucles) pour le calcul de l'interpolation à l'aide de
Lagrange's method
, voici le code principal :
function[p] = lagrange_interpolation(X,Y)
L = zeros(n);
p = zeros(1,n);
% computing L matrice, so that each row i holds the polynom L_i
% Now we compute li(x) for i=0....n ,and we build the polynomial
for k=1:n
multiplier = 1;
outputConv = ones(1,1);
for index = 1:n
if(index ~= k && X(index) ~= X(k))
outputConv = conv(outputConv,[1,-X(index)]);
multiplier = multiplier * ((X(k) - X(index))^-1);
end
end
polynimialSize = length(outputConv);
for index = 1:polynimialSize
L(k,n - index + 1) = outputConv(polynimialSize - index + 1);
end
L(k,:) = multiplier .* L(k,:);
end
% continues
end
Ceux qui sont trop pour les boucles pour le calcul de la l_i(x)
(ce qui est fait avant le dernier calcul de P_n(x) = Sigma of y_i * l_i(x)
) .
Des suggestions en la rendant plus matlab formelle ?
Grâce
OriginalL'auteur JAN | 2012-06-14
Vous devez vous connecter pour publier un commentaire.
Oui, plusieurs suggestions (mis en œuvre dans la version 1 ci-dessous):
if
boucle peut être combiné avecfor
au-dessus d'elle (il suffit de s'index
sauterk
par quelque chose commejr(jr~=j)
ci-dessous);polynomialSize
est toujours égalelength(outputConv)
qui est toujours égalen
(parce que vous avezn
points de données,(n-1)th
polynôme avecn
coefficients), de sorte que le dernierfor
boucle et la ligne suivante peut également être remplacés par de simplesL(k,:) = multiplier * outputConv;
Donc j'ai repris l'exemple sur http://en.wikipedia.org/wiki/Lagrange_polynomial (et adopté leur
j-m
la notation, mais pour moij
va1:n
etm
est1:n
etm~=j
), d'où mon initialisation ressemblealors v 1.0 ressemble
qui peut encore être simplifié si vous vous rendez compte que le numérateur de l_j(x) est un polynôme spécifiques racines - pour qu'il y est une belle commande matlab -
poly
. De même, le dénominateur est juste que polyn évalué à X(j) - pour qu'il y estpolyval
. Par conséquent, v 1.9:Pourquoi la version 1.9 et 2.0 pas? eh bien, il y a sans doute une façon de se débarrasser de ce dernier pour la boucle, et d'écrire tout cela en 1 ligne, mais je ne peux pas penser à cela maintenant - c'est une todo pour v 2.0 🙂
Et, pour le dessert, si vous voulez obtenir la même image que wikipédia:
produit
profiter et n'hésitez pas à réutiliser/améliorer
OriginalL'auteur alexey
Essayer:
Pourquoi il y a une énorme différence?
OriginalL'auteur Erdem