|
Author |
hbghlyj
Posted at 2025-3-5 00:54:24
例:设 $f(x)=\frac{1}{1+x^2}$ ,在 $[-5,5]$ 上利用 $T_{11}(x)$ 的零点作插值点,构造 10 次 Lagrange 插值多项式 $\bar{L}_{10}(x)$ 。与等距节点造出的 $L_{10}(x)$ 作比较。
解:在 $[-1,1]$ 上的 11 次 Chebyshev 多项式 $T_{11}(x)$ 的零点 $t_k$ 做变换后得 $[-5,5]$ 上的 Chebyshev 节点
\[
x_k=5 t_k=5 \cos \frac{2 k+1}{22} \pi, \quad k=0,1, \cdots, 10
\]
MATLAB代码
- %
- % 利用Chebyshev多项式零点作为拉格朗日插值节点作拉格朗日插值
- %
- clear
- clc
- close all
- % 定义Runge函数
- RungeFun = @(x) 1./(1 + x.^2);
- % 区间[-5,5]
- a = -5.0;
- b = 5.0;
- % 分段数10和20
- n = 10;
- %
- % 为画图所取的点(包含各小区间内再分10段的点)
- xx = a:(b-a)/(10*n):b;
- % 所有点个数
- xxlen = length(xx);
- % 所有点上的函数值
- yy = RungeFun(xx);
- plot(xx,yy,'-b')
- c={'r','k'};
- for index = 1:2
- % 插值节点
- if index == 1
- % Chebyshev零点
- x = (b-a)/2*cos((2*[0:n]+1)*pi/(2*(n+1))) + (a+b)/2;
- else
- % 均匀取点
- x=linspace(-5,5,n+1);
- end
- % 节点函数值
- y = RungeFun(x);
- % 插值节点数
- xlen = length(x);
- % 计算Lagrange插值函数在所有点上的取值
- temp = zeros(xlen,xxlen);
- for i = 1: xlen
- temp(i,:) = xx - x(i);
- end
- val = zeros(xlen,xxlen);
- % w_n'(x_k)
- WnDer = zeros(xlen,1);
- for k = 1: xlen
- t = x(k) - x;
- tk = [t(1:k-1) t(k+1:end)];
- % prod:连乘函数
- WnDer(k) = prod(tk);
- for j = 1 : xxlen
- if k == 1
- val(k,j) = prod(temp(2:end,j));
- else
- val(k,j) = prod(temp(1:k-1,j))*prod(temp(k+1:end,j));
- end
- end
- end
- % 基函数法算插值函数(求和)
- Lag = val'*(y'./WnDer);
- % 画图比较
- hold on
- h=plot(xx,Lag','--');
- set(h,'Color',c{index})
- xlabel('x')
- ylabel('y')
- end
- legend('y = 1/(1+x^2)',strcat( 'Chebyshev: L', num2str(n) ),strcat( 'L', num2str(n) ),'Location','South')
Copy the Code
|
|