Странное поведение функции Matlab poly () - PullRequest
2 голосов
/ 28 марта 2020

В настоящее время я имею дело с кодом 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]

Я подозреваю, что это может быть связано с ошибкой переполнения, но не уверен.
Кто-нибудь сталкивался с подобным случаем? Любой совет будет очень полезным.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...