题 7:一维函数插值算法
课题内容:
课题 7:一维函数插值算法
课题内容:对函数||
e-
y x
=,取[-5,5]之间步长为 1 的值
*
10
作为粗值,以步长
0.1 作为细值,编写程序实现插值算法:最邻近插值算法,线性插
值算法和三次多项式函数插值算法,并对比插值效果。
课题要求:
1、设计良好的人机交互 GUI 界面。
2、自己编写实现插值算法。
3、在同一个图形窗口显示对比最后的插值效果。
附录
一、界面设计
二、图像结果
三、程序设计
1、线性插值
function pushbutton1_Callback(hObject, eventdata, handles) x=-5:5;
y=10*exp(-abs(x));
f1=[];
for x1=-5:0.1:5
a=(x1-floor(x1));%请读者认真逐一带入推导
if x1==floor(x1)
f1=[f1,y(floor(x1)+6)];
else
f1=[f1,y(floor(x1)+6)+a*(y(floor(x1)+7)-y(floor(x1)+6))]; end
end
m=-5:0.1:5
plot(m,f1,'-r',x,y,'+')
axis([-5 5 0 10])
legend('liner插值','原函数');
xlabel('X');
ylabel('Y');
title('liner插值与原函数的对比');
grid
2、多项式插值
x0=-5:1:-3;
y0=10*exp(-abs(x0));
x=-5:0.1:-3;
n=length(x0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
axis([-5 5 0 10])
plot(x,y,'m',x0,y0,'+')
legend('三次多项式插值','原函数');
xlabel('X');
ylabel('Y');
title('三次多项式插值与原函数的对比');
grid
hold on
x0=-3:1:-1;
y0=10*exp(-abs(x0));
x=-3:0.1:-1;
n=length(x0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
axis([-5 5 0 10])
plot(x,y,'m',x0,y0,'+')
legend('三次多项式插值','原函数');
xlabel('X');
ylabel('Y');
title('三次多项式插值与原函数的对比');
grid
hold on
x0=-1:1:1;
y0=10*exp(-abs(x0));
x=-1:0.1:1;
n=length(x0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
axis([-5 5 0 10])
plot(x,y,'m',x0,y0,'+')
legend('三次多项式插值','原函数');
xlabel('X');
ylabel('Y');
title('三次多项式插值与原函数的对比');
grid
hold on
x0=1:1:3;
y0=10*exp(-abs(x0));
x=1:0.1:3;
n=length(x0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
axis([-5 5 0 10])
plot(x,y,'m',x0,y0,'+')
legend('三次多项式插值','原函数');
xlabel('X');
ylabel('Y');
title('三次多项式插值与原函数的对比');
grid
hold on
x0=3:1:5;
y0=10*exp(-abs(x0));
x=3:0.1:5;
n=length(x0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
axis([-5 5 0 10])
plot(x,y,'m',x0,y0,'+')
legend('三次多项式插值','原函数');
xlabel('X');
ylabel('Y');
title('三次多项式插值与原函数的对比');
grid
3、最邻近插值
function pushbutton3_Callback(hObject, eventdata, handles) x=-5:5;
y=10*exp(-abs(x));
f2=[];
for x1=-5:0.1:5
if abs(x1-floor(x1))<0.5
f2=[f2,y(floor(x1)+6)];
else
f2=[f2,y(floor(x1)+7)];
end
end
m=[-5:0.1:5];
f4=10*exp(-abs(m));
plot(m,f2,'-r',x,y,'+')
axis([-5 5 0 10])
legend('nearest插值','原函数');
xlabel('X');
ylabel('Y');
title('nearest插值与原函数的对比');
grid。