我一直在使用Matlab中的polyfit
函数,来对数据进行线性最小二乘多项式拟合。根据我的阅读,这使用标准的多项式基(单项式基)。我读到说使用Chebyshev多项式基进行拟合可以获得更高的数值稳定性,所以我想这样做。Matlab是否有这个选项?
我一直在使用Matlab中的polyfit
函数,来对数据进行线性最小二乘多项式拟合。根据我的阅读,这使用标准的多项式基(单项式基)。我读到说使用Chebyshev多项式基进行拟合可以获得更高的数值稳定性,所以我想这样做。Matlab是否有这个选项?
在这里,我假设你想要第一类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基函数(第一种)的最小二乘多项式逼近。