В настоящее время я имею дело с кодом Matlab для нахождения интерполяции Лагранжа заданных точек данных.
Вот мой код:
X=1998:1:2008;
Y=[21300 23057 24441 25917 27204 28564 29847 31200 32994 34800 36030];
plot(X,Y,'-o'); %intuitive interpolation
hold on
I=zeros(1,length(X));
for k=1:1:length(X)
r=X;
r(k)=[];
p=poly(r);
m=polyval(p,X(k));
m=1/m;
p=p*m;
p=p*Y(k);
I=I+p;
end
t=1997:0.001:2010;
funcval=polyval(I,t);
plot(t,funcval)
hold on
Как видите, точки (X, Y) обозначены точки данных, а I - вектор коэффициента полинома интерполяционного полинома. Этот код работает хорошо, пока не будет 5 точек, когда
X=1998:1:2002
Y=[21300 23057 24441 25917 27204]
Но когда добавляется больше точек данных, p = poly (r) неожиданно производит странный вывод, что приводит нас к полиному со сложными корнями. Например, при наличии 6 точек данных
X=1998:1:2003;
Y=[21300 23057 24441 25917 27204 28564];
plot(X,Y,'-o'); %intuitive interpolation
hold on
I=zeros(1,length(X));
for k=1:1:length(X)
r=X;
r(k)=[];
p=poly(r);
m=polyval(p,X(k));
m=1/m;
p=p*m;
p=p*Y(k);
I=I+p;
end
n=roots(I);
n должно быть root вектором, а это
2006.55014379998 + 0.00000000000000i
2002.53696731502 + 5.24636347412357i
2002.53696731502 - 5.24636347412357i
1995.63481881447 + 3.41460653963521i
1995.63481881447 - 3.41460653963521i
, что, безусловно, не является желаемым результатом
[1998 1999 2000 2001 2002 2003]
Я подозреваю, что это может быть связано с ошибкой переполнения, но не уверен.
Кто-нибудь сталкивался с подобным случаем? Любой совет будет очень полезным.
Спасибо.