Matlab `surf` 是如何进行插值的?

计算科学 matlab 插值
2021-12-06 21:22:29

当我使用 Matlab 的surf函数时,我注意到我无法重新执行它的插值,这会产生不可靠的结果。你知道surf引擎盖下做什么吗?

下面的代码比较splinesurf插值:

z= linspace(-1,1,4001);
x = linspace(-2*pi,2*pi,150);
sharp_gausian = @(y,sigma) exp((-y.^2).*sigma);

% initializing low-resolution surf
for j=1:length(z)
    psi_grid(j,:) = sharp_gausian(x + sin(5*z(j)),10);
end
subplot(2,2,1)
s =surf(x,z, psi_grid);
set(s,'linestyle','none')
xlabel('$x$' , 'FontSize', 14, 'Interpreter', 'latex');
ylabel('$z$', 'FontSize', 14, 'interpreter', 'latex','rot',0);
title('$Nx = 150$')

% using higher resolution grid and interpolating the function using spline.
x_fine = linspace(-2*pi,2*pi,1500);
for j=1:length(z)
    psi_grid2(j,:) = spline(x, psi_grid(j,:), x_fine);
end
subplot(2,2,2)
s2 =surf(x_fine,z, psi_grid2);
set(s2,'linestyle','none')
xlabel('$x$' , 'FontSize', 14, 'Interpreter', 'latex');
ylabel('$z$', 'FontSize', 14, 'interpreter', 'latex','rot',0);
title('$Nx = 1500$')
1个回答

我假设您对surf函数如何控制表面的着色感兴趣。大多数信息都可以在 Matlab 帮助页面上找到,用于surfshading.

默认情况下,surf使用faceted着色,因此“每个网格线段和面都有一个恒定的颜色,由线段端点或具有最小索引索引的面角的颜色值确定”因此,在您的代码中 - 没有执行显式插值。

通过引入精细网格并使用spline,您自己执行了插值,现在surfNx=1500只使用你喂它的结果。

在下图中,我演示了surf具有不同shading选项的函数的工作。很明显surf对于shading interpNx=150(左下)非常类似于通过罚款获得的数字(10×) 网格Nx=1500(右下)。shading flat并且shading faceted看起来相同,因为您手动禁用了曲面图的线条。

在此处输入图像描述

Matlab代码:

sharp_gausian = @(y,sigma) exp((-y.^2).*sigma);

Nz=4001;
Nx=150;
Nx_refine=Nx*10;
z=linspace(-1,1,Nz);
x=linspace(-2*pi,2*pi,Nx);
x_fine=linspace(-2*pi,2*pi,Nx_refine);

% initializing low-resolution surf
psi_grid=zeros(Nz,Nx);
for j=1:length(z)
    psi_grid(j,:)=sharp_gausian(x+sin(5*z(j)),10);
end

% using higher resolution grid and interpolating the function using spline.
psi_grid2=zeros(Nz,Nx_refine);
for j=1:length(z)
    psi_grid2(j,:)=spline(x,psi_grid(j,:),x_fine);
end

%% ONLY VISUALIZATION AFTER THIS POINT
set(groot,'DefaultTextInterpreter','latex');
set(groot,'defaultLegendInterpreter','latex');
set(groot,'defaultAxesTickLabelInterpreter','latex'); 
ff=20;

figure(1)
set(gcf,'Units','inches');
set(gcf,'Position',[2 2 13 12]);
% original x, flat shading
subplot(2,2,1)
s1=surf(x,z, psi_grid);
shading flat;
set(s1,'linestyle','none')
xlabel('$x$','FontSize', ff, 'Interpreter', 'latex');
ylabel('$z$','FontSize', ff, 'interpreter', 'latex','rot',0);
title('$N_x = 150$, shading flat');
set(gca,'FontSize',ff-2);
% original x, faceted (default) shading
subplot(2,2,2)
s2=surf(x,z, psi_grid);
shading faceted;
set(s2,'linestyle','none')
xlabel('$x$' , 'FontSize', ff, 'Interpreter', 'latex');
ylabel('$z$', 'FontSize', ff, 'interpreter', 'latex','rot',0);
title('$N_x = 150$, shading faceted');
set(gca,'FontSize',ff-2);
% original x, inerpolated shading
subplot(2,2,3)
s3=surf(x,z, psi_grid);
shading interp;
set(s3,'linestyle','none')
xlabel('$x$' , 'FontSize', ff, 'Interpreter','latex');
ylabel('$z$', 'FontSize', ff, 'interpreter','latex','rot',0);
title('$N_x = 150$, shading interp');
set(gca,'FontSize',ff-2);
% 10* refinement in x, faceted (default) shading
subplot(2,2,4)
s4=surf(x_fine,z, psi_grid2);
shading faceted;
set(s4,'linestyle','none')
xlabel('$x$','FontSize',ff,'Interpreter','latex');
ylabel('$z$','FontSize',ff,'interpreter','latex','rot',0);
title('$N_x = 1500$, shading default (faceted)');
set(gca,'FontSize',ff-2);