问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

切比雪夫插值

创作时间:
2025-03-17 06:49:01
作者:
@小白创作中心

切比雪夫插值

引用
CSDN
1.
https://m.blog.csdn.net/u011572784/article/details/145084092

切比雪夫插值是一种基于切比雪夫节点的多项式插值方法,其优势是减少插值误差(特别是龙格现象:表现为高维插值时在边缘处插值误差骤增)。本文对其基本操作进行说明。

1. 切比雪夫节点

切比雪夫插值的核心是使用切比雪夫节点作为插值点。切比雪夫节点是切比雪夫多项式的零点,在区间[-1,1]上定义为:

$$
x_k=cos(\frac{(2k+1)\pi}{2n}),k=0,2,...,n-1 \tag{1}
$$

其中n是插值点数。

若将插值区间由[-1,1]变化为[a,b],则切比雪夫节点可以表示为

$$
x_k=\frac{a+b}{2}+\frac{b-a}{2}cos(\frac{(2k+1)\pi}{2n}),k=0,2,...,n-1 \tag{2}
$$

2. 切比雪夫插值步骤

切比雪夫插值包含以下步骤:

(1)计算切比雪夫节点

根据插值区间[a,b]和插值个数n,根据(2)式计算切比雪夫节点$x_k$;

(2)计算函数值

在切比雪夫节点处计算目标函数$f(x)$的值,得到数据点$(x_k,f(x_k))$;

(3)构建插值多项式

使用拉格朗日插值法或牛顿插值法,基于切比雪夫数据点$(x_k,f(x_k))$,构建插值多项式$P(x)$;

(4)插值结果验证

比较其他插值点选取方式和切比雪夫插值的结果差异。

3. 仿真验证

假设我们需要在区间[-5,5]上对函数$f(x)=\frac{1}{1+25x^2}$进行插值,插值算法为拉格朗日插值(原理见《拉格朗日插值原理推导》)。按均匀点和切比雪夫节点分别进行插值,结果如下(代码见附录):


图1. 线性插值示意图

从上图可见,采用均匀分布的点进行插值,在两端会有明显的震荡,插值误差很大(称为龙格现象),而采用切比雪夫节点进行插值,则没有该现象。切比雪夫节点抑制龙格现象的原因主要为:

  • 切比雪夫节点在区间端点附近更加密集,这种分布方式能够有效抑制插值多项式在区间端点附近的振荡。相比之下,均匀分布的节点在区间端点附近较为稀疏,容易导致插值多项式在这些区域产生剧烈振荡。
  • 切比雪夫节点的分布是基于最小最大准则(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
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号