Is this code efficient to generate the Lagrange polynomial?
7 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
% P57_MN0306_08_06M
clearvars
%% Datos:
% xi=1:7;yi=[.5,2.5,2,4,3.5,6,5.5];
% xa=1.5;n=2;
xi=[1,4,6];yi=log(xi);
xa=2;n=2;
% n - grado del polinomio
% n+1 - mínimo número de puntos
% Li=producto(x-xi)/(xj-xi), j=1,n+1, j<>i
% yL=suma(Li*yi), i=1,n+1
% Generación y evaluación del Polinomio de interpolación de Lagrange
% con los operadores Li, de grado n, dependiendo del número de n+1 datos
% Evaluación en x = xa
S=0;Li=zeros(1,n+1);
for k=1:n+1
P=1;
for kk=1:n+1
if k~=kk
P=P*(xa-xi(kk))/(xi(k)-xi(kk));
end
end
Li(k)=P;
S=S+Li(k)*yi(k);
end
% Resultado
S
log(2)
% Generación del Polinomio de interpolación de Lagrange
% con los operadores Li, de grado n, dependiendo del número de n+1 datos
% En forma simbólica y numérica
%
disp('Generación del Polinomio de interpolación de Lagrange, de grado n')
%
L=zeros(n,n+1);Sp=zeros(1,n+1);
for k=1:n+1
P=1;
for kk=1:n+1
if k~=kk
P=conv(P,[1,-xi(kk)]/(xi(k)-xi(kk)));
end
end
L(k,:)=P;
Sp=Sp+L(k,:)*yi(k);
end
Sp
Sps=poly2sym(Sp);pretty(Sps)
polyval(Sp,xa)
log(xa)
0 comentarios
Respuestas (2)
John D'Errico
el 24 de En. de 2021
Editada: John D'Errico
el 24 de En. de 2021
Is your code efficient to generate something you should not be doing in the first place? Note that a Lagrange interpolating polynomial is one of those things everybody gets taught in the beginning, but many people think that means it is something good, that they should remember and use in the future. WRONG. High order interpolating polynomials are just bad news. Virtually ALWAYS this is true. Sadly, that part is something teachers often forget to tell their students, probably because they learned from someone who knew no better themselves.
Is your code efficient? No. It uses repeated calls to conv, when a simple use of polyfit would do the same thing, more efficiently. Hint: polyfit with an n'th degree polynomial, applied to n+1 points will yield an interpolating polynomial. Since the interpolating polynomial is unique, there is no need to do something inefficient as you have done. Even better than polyfit would probably be just a simple use of backslash with a Vandermonde matrix. Compared to the doubly nested loop in your code, the difference should be significant.
Again, that polynomial is nothing you want to generate in the first place in any real problem, but you asked only about efficiency.
As such, if this was for a homework assignment, then who cares how efficient it is? If this is for some real problem, then STOP! Return to step 1, and learn how to use other tools, usually splines in some form, that will do the job far better.
Ver también
Categorías
Más información sobre Polynomials en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!