0%

计算方法实验/实验四

实验四

插值算法的Matlab实现

【作业内容与要求】:对函数

进行插值。

  1. 在区间[-1, 1]上求出f(x)的10次Lagrange插值多项式$L_{10}(x)$,并且绘制图像;
  2. 在区间[-1, 1]上求出f(x)的10次一致逼近插值多项式$P_{10}(x)$,并且绘制图像;
  3. 将区间[-1, 1]10等分,进行分段线性插值,求出表达式,并且绘制图像。
  4. 将区间[-1, 1]10等分,进行三次样条插值(参考例4.5),求出表达式,并且绘制图像。

在区间[-1, 1]上求出f(x)的10次Lagrange插值多项式$L_{10}(x)$,并且绘制图像;

matlab代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
% Lagrange1.m
%输入初始数据
clc;
% 插值区间为[-1,1]
x0 = -1:0.2:1;
y0= 1./(1+9*x0.^2);
x=-1:0.01:1;%插值计算点;一共有200个
m=length(x);
yx=zeros(m,1);

for k=1:m%分别对每一点进行插值
tx=x(k); %插值点
n=length(x0);
s=0;
%进入迭代计算过程
for j=1:n
t=1;
for i=1:n
if i~=j
t=t*(tx-x0(i))/(x0(j)-x0(i));
end
end
s=s+t*y0(j);
end
yx(k)=s;
end
%画图显示结果
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
plot(x0,y0,'-r','LineWidth',0.5);
grid on;
% % title('Lagrange插值时的Runge振荡现象');
xlabel('x轴');
ylabel('y轴');
legend('插值曲线','原曲线');

在区间[-1, 1]上求出f(x)的10次一致逼近插值多项式$P_{10}(x)$,并且绘制图像;

与(1)的不同在于先计算切比雪夫多项式 $T_{11}$的零点作为插值节点

matlab代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
% Lagrange2.m
format long;

k = 1:1:11;
% 计算切比雪夫多项式T(11)的零点
x0 = cos((2*k-1)*pi/22);
y0 = 1./(1+9*x0.^2);
% 以下将切比雪夫多项式T(11)的零点作为插值节点进行Lagrange插值即可

x=-1:0.01:1;%插值计算点;一共有200个
m=length(x);
yx=zeros(m,1);

for k=1:m%分别对每一点进行插值
tx=x(k); %插值点
n=length(x0);
s=0;
%进入迭代计算过程
for j=1:n
t=1;
for i=1:n
if i~=j
t=t*(tx-x0(i))/(x0(j)-x0(i));
end
end
s=s+t*y0(j);
end
yx(k)=s;
end
%画图显示结果
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
plot(x0,y0,'-r','LineWidth',0.5);
grid on;
% % title('Lagrange插值时的Runge振荡现象');
xlabel('x轴');
ylabel('y轴');
legend('插值曲线','原曲线');

format short;

将区间[-1, 1]10等分,进行分段线性插值,求出表达式,并且绘制图像。

matlab代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
%Lagrange3.m
%分段线性插值
%被插函数f(x)=1/(1+9*x^2),在区间[-1,1]上
clear;
clc;
x0 = -1:0.2:1;
y0 = 1./(1+9*x0.^2);

x=-1:0.01:1;%插值计算点;一共有200个
n=length(x0);
yx=zeros(length(x),1);
k=1;
i = 1;
for z=-1.0:0.01:1
for i=1:n-1
if (z >= x0(i)) && (z <= x0(i+1))
yx(k)=(z-x0(i+1))/ (x0(i)-x0(i+1))*y0(i)+ (z-x0(i))/ (x0(i+1)-x0(i))*y0(i+1);
break
end
end
k= k+1;
end

%画出分段线性插值以后得到的近似函数
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
xlabel('x轴');
ylabel('y轴');
legend('插值曲线');

将区间[-1, 1]10等分,进行三次样条插值(参考例4.5),求出表达式,并且绘制图像。

依据例4.5,进行三次样条插值时调用系统函数spline

matlab代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% Lagrange4.m
% 三次样条插值
% 将区间[-1, 1]分为10等份,进行三次样条插值,得到插值后的分段3次样条函数
%在调用spline函数的时候,希望取得100个点
clear;
clc;
x0=-1:0.2:1; %将区间10等份,得11个插值节点
y0=1./(1+9*x0.^2);
x=-1:0.02:1; %在调用spline函数的时候,希望取得100个点上插值后的3次样条函数函数值

%进入迭代计算过程
y=spline(x0,y0,x); %x是向量,y也是向量;得到在100个点上的插值y.
plot(x,y,'r'); %以这100个节点为基础,画出y=1/(1+x^2)的3次样条插值后得到的函数图形

hold on;
%end

title('三次样条插值');
legend('10等份');