Matlab polyfit 的多项式插值

计算科学 matlab 插值 多项式
2021-11-27 21:06:25

给定N数据点,polyfit度数N1产生唯一的插值多项​​式?

具体来说,这是一个代码示例:

x=[1:10]
y= x.^3;
pp = polyfit(x,y,9)

发出以下警告的地方:

Warning: Polynomial is badly conditioned. Add points with
distinct X values, reduce the degree of the polynomial, or try
centering and scaling as described in HELP POLYFIT. 
> In polyfit (line 79) 

pp确实是x3,应该是这样,但为什么这是病态的?插值仅对某些基是病态的(例如,单项式1,x,x2,),但不考虑其他人?

2个回答

根据文档polyfit 是一个函数,它可以在最小二乘的意义上进行近似。为此,您可以选择最后一个输入参数,即度数。如果你把度数等于N1您处于插值环境中(对于迂腐的部分感到抱歉:-))。

在这种情况下,正如 Federico 的回答所解释的,该函数构建Vandermonde 矩阵并求解相对线性系统(参见此处)。这个矩阵是病态的,当 matlab 尝试运行时

p = V\y

那么问题来了。请注意,matlab 尝试使用QR分解求解线性系统和当矩阵R用 1 范数 matlab/octave 病态,||R||1||R1||1>1010,有错误信息。我在意大利语课程笔记中找到了这一点,目前我无法为您提供比更好的参考(见幻灯片 10)。

为避免此问题,您可以使用Barycentric Lagrange Interpolation,请参阅Berrut 和 Trefethen 的此 pdf摘要是一份很好的简历:

重心插值是拉格朗日多项式插值的一种变体,快速且稳定。它应该被称为多项式插值的标准方法。

您可以在此处找到 Greg von Winckel 的相应代码

最后,这是一个线性系统。它的矩阵是病态的:cond(vander(1:10))returns 2.1063e+12所以如果你改变y了一定的量,这个改变就会被放大(在最坏的情况下,使用相对误差)一个因子2.1063e+12

即使没有制定诸如“插值仅对某些基的病态”之类的陈述,图片也应该很清楚(这并不完全正确:例如,如果您的节点是统一的根,则单项式基础中的插值是完美的条件良好)。

无论如何,这里的插值基是固定的:函数计算插值多项式相对于单项式基的系数,所以这就是我们最后必须返回的。