切比雪夫插值是一种基于切比雪夫节点的多项式插值方法,其优势是减少插值误差(特别是龙格现象:表现为高维插值时在边缘处插值误差骤增)。本文对其基本操作进行说明。
1. 切比雪夫节点
切比雪夫插值的核心是使用切比雪夫节点作为插值点。切比雪夫节点是切比雪夫多项式的零点,在区间[-1,1]上定义为:
x
k
=
c
o
s
(
(
2
k
+
1
)
π
2
n
)
,
k
=
0
,
2
,
.
.
.
,
n
−
1
(1)
x_k=cos(\frac{(2k+1)\pi}{2n}),k=0,2,...,n-1 \tag{1}
xk=cos(2n(2k+1)π),k=0,2,...,n−1(1)
其中
n
n
n是插值点数。
若将插值区间由[-1,1]变化为
[
a
,
b
]
[a,b]
[a,b],则切比雪夫节点可以表示为
x
k
=
a
+
b
2
+
b
−
a
2
c
o
s
(
(
2
k
+
1
)
π
2
n
)
,
k
=
0
,
2
,
.
.
.
,
n
−
1
(2)
x_k=\frac{a+b}{2}+\frac{b-a}{2}cos(\frac{(2k+1)\pi}{2n}),k=0,2,...,n-1 \tag{2}
xk=2a+b+2b−acos(2n(2k+1)π),k=0,2,...,n−1(2)
2. 切比雪夫插值步骤
切比雪夫插值包含以下步骤:
(1)计算切比雪夫节点
根据插值区间
[
a
,
b
]
[a,b]
[a,b]和插值个数n,根据(2)式计算切比雪夫节点
x
k
x_k
xk;
(2)计算函数值
在切比雪夫节点处计算目标函数
f
(
x
)
f(x)
f(x)的值,得到数据点
(
x
k
,
f
(
x
k
)
)
(x_k,f(x_k))
(xk,f(xk));
(3)构建插值多项式
使用拉格朗日插值法或牛顿插值法,基于切比雪夫数据点
(
x
k
,
f
(
x
k
)
)
(x_k,f(x_k))
(xk,f(xk)),构建插值多项式
P
(
x
)
P(x)
P(x);
(4)插值结果验证
比较其他插值点选取方式和切比雪夫插值的结果差异。
3. 仿真验证
假设我们需要在区间[-5,5]上对函数 f ( x ) = 1 1 + 25 x 2 f(x)=\frac{1}{1+25x^2} f(x)=1+25x21进行插值,插值算法为拉格朗日插值(原理见《拉格朗日插值原理推导》)。按均匀点和切比雪夫节点分别进行插值,结果如下(代码见附录):
从上图可见,采用均匀分布的点进行插值,在两端会有明显的震荡,插值误差很大(称为龙格现象),而采用切比雪夫节点进行插值,则没有该现象。切比雪夫节点抑制龙格现象的原因主要为:
- 切比雪夫节点在区间端点附近更加密集,这种分布方式能够有效抑制插值多项式在区间端点附近的振荡。相比之下,均匀分布的节点在区间端点附近较为稀疏,容易导致插值多项式在这些区域产生剧烈振荡。
- 切比雪夫节点的分布是基于最小最大准则(Minimax Criterion)的,即通过选择节点位置,使得插值多项式与目标函数之间的最大误差最小化。这种优化方式能够确保插值多项式在整个区间内均匀逼近目标函数,而不会在某些区域(如区间端点)产生过大的误差。
【附录】:仿真代码
clc;close all;clear;
a=-5;
b=5;
interp_x = linspace(a,b,100); % 期望的插值坐标
ref_y=test_func(interp_x); % 真实函数值
n=20; % 已知插值点数
k=0:n-1;
uniform_x=linspace(a,b,n);
uniform_y=test_func(uniform_x); % 等间隔分布的已知插值点
chebyshev_x=0.5*(a+b)+0.5*(b-a)*cos((2*k+1)*pi/(2*n));
chebyshev_y=test_func(chebyshev_x); % 切比雪夫插值点
uniform_interp_y=lagrange_interpolation(uniform_x, uniform_y, interp_x);
chebyshev_interp_y=lagrange_interpolation(chebyshev_x, chebyshev_y, interp_x);
figure;
hold on;
plot(interp_x,ref_y, 'r');
plot(uniform_x,uniform_y, 'bo');
plot(interp_x,uniform_interp_y, 'b');
plot(chebyshev_x,chebyshev_y, 'ko');
plot(interp_x,chebyshev_interp_y, 'k');
legend('ideal', 'uniform points', 'uniform interp.', 'chebyshev points', 'chebyshev interp.');
box on;
grid on;
function y = test_func(x)
% 函数说明:用于测试的目标函数
% x:横坐标
% y:函数返回值
y=1./(1+25*x.^2);
end
function P = lagrange_interpolation(x, y, xi)
% x: 已知数据点的 x 坐标
% y: 已知数据点的 y 坐标
% xi: 需要插值的点
% P: 插值结果
n = length(x);
P = zeros(size(xi));
for k = 1:n
L = ones(size(xi));
for i = 1:n
if i ~= k
L = L .* (xi - x(i)) / (x(k) - x(i));
end
end
P = P + y(k) * L;
end
end