使用切比雪夫多项式基函数拟合多项式。

10

我一直在使用Matlab中的polyfit函数,来对数据进行线性最小二乘多项式拟合。根据我的阅读,这使用标准的多项式基(单项式基)。我读到说使用Chebyshev多项式基进行拟合可以获得更高的数值稳定性,所以我想这样做。Matlab是否有这个选项?

2个回答

15

在这里,我假设你想要第一类Chebyshev多项式。据我所知,Matlab没有内置此功能。但自己编写代码很容易。Chebyshev多项式仅在[-1,1]上定义,因此首先必须将x数据映射到该范围内。然后使用用于生成Chebyshev多项式的递归关系 http://en.wikipedia.org/wiki/Chebyshev_polynomials#Definition

T_(n+1)(x) = 2xT_(n)x - T_(n-1)(x)

如果x是您的横坐标,y是数据点,请使用以下命令生成度数为n的多项式拟合的观察矩阵A(这相当于基于单项式的Vandermonde矩阵):

n = degree;
m = length(x);
%% Generate the z variable as a mapping of your x data range into the 
%% interval [-1,1]

z = ((x-min(x))-(max(x)-x))/(max(x)-min(x));

A(:,1) = ones(m,1);
if n > 1
   A(:,2) = z;
end
if n > 2
  for k = 3:n+1
     A(:,k) = 2*z.*A(:,k-1) - A(:,k-2);  %% recurrence relation
  end
end

那么您可以使用矩阵除法来解决线性系统,得到解的参数(近似系数)b

b = A \ y
记住,当你评估近似值时,必须在评估之前将该值映射到区间[-1,1]。系数仅对您用于近似的初始范围内的x有效。您将无法以有效的方式在初始x范围之外评估近似值。如果要这样做,应使用比您的数据范围更宽的区间,这样,在使用变换将点映射为内部点时,您的点始终位于[-1,1]范围内,因此可以有效地评估近似值。 我已经有一段时间没有使用Matlab了,所以新版本可能实际上已经具有内置函数,可以为您完成所有这些操作。当我最后一次使用它时,情况并非如此,如果所有其他方法都失败,则可以使用上述方法生成使用Chebyshev基函数(第一种)的最小二乘多项式逼近。

6
我认为您正在寻找Chebfun工具箱。它使用切比雪夫点和切比雪夫插值重载了polyfit函数,以及其他一些函数。
除此之外,您也可以自己编写代码。这并不难。编辑:请参阅mathematician1975的帖子 :). 编辑2:已更新chebfun网站。

谢谢你的回答。这个工具箱似乎非常有用,还有其他一些有用的功能。我还没有实际尝试过,但文档表明它可能非常有用。 - user1593853
请注意,Chebfun 不使用最小二乘多项式,而是通过所有点进行插值。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接