首页 > 解决方案 > Matlab poly() 函数的奇怪行为

问题描述

我目前正在处理有关查找给定数据点的拉格朗日插值的 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 必须是根向量,它是

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]

我怀疑这可能与溢出错误有关,但不确定。
有没有人遇到过类似的情况?任何建议都会很有帮助。

谢谢。

标签: matlab

解决方案


推荐阅读