如何在不显示其整个范围且仅显示脉冲本身的情况下为单个传播脉冲制作动画,因为其 x 轴动态变化?

How do I animate a single propagating pulse without showing its entire range and only the pulse itself as its x-axis changes dynamically?

找到的代码 here 实现了一个 MATLAB 脚本,该脚本求解并绘制边界为 x=0 和 x=90 的一维波动方程。当您 运行 MATLAB 中的脚本时,它显示单个脉冲从 x=0 传播到 x=90 并来回反弹。

此脚本显示了 x 的整个范围(即从 x=0 到 90),即使脉冲本身在 x 方向上只有大约 20 个单位长。见下图:

我的问题:如何构建上图中所示的假想绿色框,它只显示脉冲沿其移动而不是整个范围?假想的绿色盒子随着脉搏移动。所以当你播放电影时,你所看到的只是脉冲和不断变化的 x 轴限制(比如 x=0 到 20,然后 x=20 到 40,然后 x=40 到 60,等等)。

我认为这个问题的答案与camera position or view有关,但我不确定如何。

代码如下:

% 1D wave equation using boundary condition
% Mohammad Ismail Hossain
% Jacobs University Bremen
clc
clear all
c = 1;
l = 4.5;
dt = 0.06;
dx = 0.05;
ldx = 4.5/dx;
x = 1:ldx;
tm = 300;
N = 0.4/dt;
n = 1:8*N;
n0 = 4*N;
En = zeros(tm,ldx);
En0 = zeros(tm,1);
En0(1:8*N) = exp(((-(n-n0).^2)/(2*N^2)));
Ent(1:tm) = 0;
En(1,1) = En0(1);
for p = 2:tm-1
   En(p,1) = En0(p);
   for q = 2:ldx-1
       
       if (q == (ldx/9)*4)||(q == (ldx/9)*5)
           c = sqrt(0.4);
       end
       if ((q > (ldx/9)*4) && (q < (ldx/9)*5))
           c = 0.5;
       end
       if ((q < (ldx/9)*4) || (q > (ldx/9)*5))
           C = 1;
       end
       En(p+1,q) = ((c*dx)/dt)^2*(En(p,q+1)-2*En(p,q)+En(p,q-1)) + 2*En(p,q) - En(p-1,q); 
   end
   plot(En(p,:))
   title(['Time = ',num2str(p+1)]);
   YLIM([-1.5 1.5])
   pause(0.03);
   
end

您只需动态更改xlim。理想情况下,它应该与波浪的速度和方向同步,但很难说出代码在做什么(没有注释,不是非常有用的变量名称)。

一种更“自动”的方法是找到波的绝对最大值的位置并围绕该位置定义 xlim。为此,只需在外循环的末尾添加以下几行。还要将 YLIM 更改为 ylim 以避免错误:

···
title(['Time = ',num2str(p+1)]);
ylim([-1.5 1.5])                    % changed line
[~, xm] = max(abs(En(p,:)));        % new line: find position of maximum
xlim(xm + [-20 20])                 % new line: set xlim around that value
pause(0.03);
···