【微实验】机械波的反射与透射现象及 MATLAB 模拟仿真

发布于:2025-08-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

试想,你向装满水的盆里,滴上一滴水,水波就会一圈一圈蔓延开,遇到盆的边缘又会反弹回来;又或者再走廊里说话,声音就在墙壁之间回荡 —— 这些都是波的反射现象在生活中的生动体现。

水波
声波

然而对于机械波的透射,再我们在所认识的只关心现象中,似乎比较少见。毕竟,“隔墙有耳”这种,更多的是声波的衍射,而不是透射。倒是光波的透射现象比较易于感知,但它又不是机械波。

波动世界里,机械波在均匀介质中可以匀速传播,但当它抵达不同介质的 "边境线" 时,就会上演一场奇妙的 "分身术":一部分波原路返回,这就是反射;另一部分则穿越边界继续前行,成为透射波。更有趣的是,在特定情况下,反射波还会发生神秘的 "相位突变",这就是我们要探讨的半波损失。

下文讨论了这些现象的物理规律,然后,为了更直观地展现这些现象,进行了MATLAB建模仿真。

一、机械波的反射和透射现象

(一)基本概念:

机械波本质上是振动在介质中的传播,介质的性质(如密度、弹性模量)决定了波的传播速度,就像不同路况影响汽车行驶速度一样。当波从一种介质进入另一种介质时,在两种介质的分界面处,由于 "路况" 突变,波的传播方向和强度会发生改变。

反射就像波遇到了 "镜子",比如回声是声波的反射,我们能看到物体是因为光的反射(光本质上是电磁波,但反射规律与机械波相似);透射则像波穿过了 "栅栏",比如阳光能穿透玻璃照亮房间,超声波能穿透人体进行检查。

(二)反射和透射的规律:波的 "交通规则"

波在分界面处的行为遵循严格的 "交通规则",这些规则由荷兰科学家斯涅尔等人总结发现:

  1. 共面性:入射波、反射波和透射波的传播方向(波线)与分界面的法线(垂直于界面的直线)始终在同一个平面内,就像所有车辆都在同一平面内行驶。
  1. 反射定律:反射角等于入射角。可以想象成篮球撞向篮板时,反弹角度与撞击角度相等,这是最直观的波动规律。
  1. 透射定律(折射定律)入射角的正弦与透射角的正弦之比,等于波在两种介质中的传播速度之比。当波从波速大的介质进入波速小的介质时,透射角会小于入射角,就像车辆从高速路驶入低速路时会自动转向内侧。

这些规律不仅适用于机械波,也适用于电磁波(包括光),是波动世界的通用法则。

(三)半波损失

半波损失是波在反射时发生的奇妙现象:当波从波疏介质(波速大的介质)入射到波密介质(波速小的介质)时,反射波的相位会突然反转,相当于波传播了半个波长的距离后发生的变化,因此得名 "半波损失"。

与光的联系:薄膜干涉中的 "明暗密码"

半波损失在光学中有着重要应用。比如我们常见的肥皂泡五颜六色的花纹,就是光的干涉现象,而半波损失是导致干涉条纹明暗变化的关键 "密码"。当光从空气(波疏介质,光速约300000km/s)入射到肥皂膜(波密介质,光速约200000km/s\))时,反射光会发生半波损失;而当光从肥皂膜入射到空气时,反射光则没有半波损失。这两种情况的相位差会导致干涉加强或减弱,从而形成绚丽的彩色条纹。

在机械波中,比如绳子上的波:当绳子一端固定(相当于波密介质边界),波反射时会出现半波损失,表现为反射波与入射波在边界处振动方向相反(这点在生活中,用跳绳甩一甩就能够验证);如果绳子一端自由(相当于波疏介质边界),则没有半波损失,反射波与入射波振动方向相同。

判断波疏与波密介质的 "黄金标准":波速大的是波疏介质,波速小的是波密介质。这一标准对机械波和电磁波(包括光)均适用。

二、MATLAB 模拟仿真:亲眼见证波的 "跨界之旅"

(一)1 维波的反射与传播模拟:波的 "直线跨界"

基本原理

一维情况下,我们可以把波想象成沿绳子传播的振动。采用有限差分法求解波动方程,就像用一系列离散的点来模拟连续的波动过程。通过设置两种介质的波速差异,观察波在分界面处的反射和透射行为。

% 1维波的反射与透射模拟(修正版)
clear; clc; close all;

% 参数设置
L1 = 5;          % 介质1长度
L2 = 5;          % 介质2长度
N1 = 100;        % 介质1网格数
N2 = 100;        % 介质2网格数
dx = L1/N1;      % 空间步长
x1 = -L1:dx:0;   % 介质1坐标(含0点,共N1+1个点)
x2 = dx:dx:L2;   % 介质2坐标(从dx开始,避免与x1的0点重复)
x = [x1, x2];    % 总坐标(长度N1+1 + N2)
N = length(x);   % 总网格数(应为201)

v1 = 0.618;          % 介质1波速
v2 = 0.1416;        % 介质2波速
% 注意波速的设定值不要过大,否则会出现波形错乱、无意义的振荡、振幅异常增大的现象
dt = 0.01;       % 时间步长(满足CFL条件)
% 这里CFL条件就是——
%在一个时间步长内,波传播的距离不能超过一个空间网格的长度。
%如果违反该条件,数值解会出现不稳定的振荡,甚至发散,无法准确反映波的真实传播情况。
T = 10;          % 总时间
nt = round(T/dt);% 时间步数

% 初始位移(高斯脉冲波源)
u = zeros(1, N);
u_prev = u;
u_next = u;
sigma = 0.5;
x0 = -L1 + 1;
u(1:N1+1) = exp(-((x1 - x0).^2)/(2*sigma^2));

% 创建动画
fig = figure('Position', [100, 100, 800, 500]);
ax = axes(fig, 'Position', [0.1, 0.1, 0.8, 0.8]);

for n = 1:nt
    % 介质1内部计算(不含分界面和边界)
    for i = 2:N1  % 注意:N1是100,这里i最大为100(x1的倒数第二个点)
        u_next(i) = 2*u(i) - u_prev(i) + (v1^2*dt^2/dx^2)*(u(i+1)-2*u(i)+u(i-1));
    end
    
    % 分界面处理(x=0处,即x1的最后一个点)
    i_interface = N1 + 1;  % 分界面索引(101)
    u_next(i_interface) = 2*u(i_interface) - u_prev(i_interface) + ...
        (v1^2*dt^2/dx^2)*(u(i_interface+1)-2*u(i_interface)+u(i_interface-1));
    
    % 介质2内部计算
    for i = (N1 + 2):(N-1)  % 最大i为N-1(200),确保i+1不超过201
        u_next(i) = 2*u(i) - u_prev(i) + (v2^2*dt^2/dx^2)*(u(i+1)-2*u(i)+u(i-1));
    end
    
    % 边界条件(固定端)
    u_next(1) = 0;
    u_next(end) = 0;
    
    % 更新位移
    u_prev = u;
    u = u_next;
    
    % 每10步绘图
    if mod(n, 10) == 0
        cla(ax);
        plot(x1, u(1:N1+1), 'b', 'LineWidth', 2); hold on;
        plot(x2, u(N1+2:end), 'r', 'LineWidth', 2);
        line([0, 0], [-120, 120], 'Color', 'k', 'LineStyle', '--', 'LineWidth', 1.5);
        text(-5, -10, sprintf('介质1(v=%.4f)', v1), 'Color', 'b');
        text(0, -10, sprintf('介质2(v=%.4f)', v2), 'Color', 'r');
        xlabel('位置x'); ylabel('位移');
        title(['1维波传播(t = ', num2str(n*dt, '%.1f'), 's)']);
        %ylim([-120, 120]); grid on;
        legend('入射波与反射波', '透射波', '分界面');
        drawnow;
    end
end
左右的固定边界(位移始终为 0)等价于波速无穷小的介质,能量 100% 反射,
因此,如果你的设置波速较快,或者仿真时间较长,还可以看到反射波的叠加

模拟效果:蓝色波形代表介质 1 中的入射波和反射波,红色波形代表介质 2 中的透射波。如代码中的参数,当波从波疏介质(v=0.6180)进入波密介质(v=0.1416)时,反射波会出现明显的相位反转(半波损失),表现为与入射波的振动方向相反;而透射波则保持原相位方向,只是传播速度变慢。

(二)2 维波的反射与传播模拟:波的 "平面跨界"

基本原理

二维情况下,波像水面波纹一样向四周扩散。我们用二维网格模拟平面空间,通过有限差分法求解二维波动方程,观察波在两种介质分界面处的反射、折射现象。

以下代码采用伪彩色图和动态色标,让波的传播强度分布更清晰:

% 2维波的反射与透射模拟
clear; clc; close all;

% 参数设置
L = 10;                  % 区域大小
N = 100;                 % 网格数(每边网格数量)
dx = L/N;                % 空间步长
x = 0:dx:L;              % x坐标
y = x;                   % y坐标(与x对称)
[X, Y] = meshgrid(x, y); % 生成网格坐标

v1 = 1;                  % 左侧介质波速(波疏)
v2 = 0.6;                % 右侧介质波速(波密)
dt = 0.01;               % 时间步长(满足CFL条件)
T = 8;                   % 总模拟时间
nt = round(T/dt);        % 时间步数

% 初始位移(高斯脉冲波源)
u = zeros(N+1, N+1);     % 当前位移矩阵(N+1阶)
u_prev = u;              % 前一时刻位移
u_next = u;              % 下一时刻位移
sigma = 0.8;             % 高斯脉冲宽度
x0 = 3; y0 = 5;          % 波源位置
u = exp(-((X - x0).^2 + (Y - y0).^2)/(2*sigma^2));

% 创建动画窗口
fig = figure('Position', [200, 200, 800, 600]);
ax = axes(fig, 'Position', [0.1, 0.1, 0.7, 0.8]);
caxis([-0.6, 0.6]);      % 固定颜色范围

for n = 1:nt
    % 内部网格计算(避免边界索引溢出)
    for i = 2:N          % i范围:2到N(避免i+1=N+1超出索引)
        for j = 2:N      % j范围:2到N(同上)
            % 根据x位置选择波速(左半区域v1,右半区域v2)
            if x(j) < L/2
                v = v1;
            else
                v = v2;
            end
            
            % 二维波动方程差分格式(拉普拉斯算子离散化)
            u_next(i,j) = 2*u(i,j) - u_prev(i,j) + ...
                (v^2*dt^2/dx^2)*( ...
                u(i+1,j) - 2*u(i,j) + u(i-1,j) + ...  % y方向二阶导数
                u(i,j+1) - 2*u(i,j) + u(i,j-1) );     % x方向二阶导数
        end
    end
    
    % 固定边界条件(边缘位移始终为0)
    u_next(1,:) = 0;     % 上边界
    u_next(end,:) = 0;   % 下边界
    u_next(:,1) = 0;     % 左边界
    u_next(:,end) = 0;   % 右边界
    
    % 更新位移矩阵
    u_prev = u;
    u = u_next;
    
    % 每5步绘图(优化可视化)
    if mod(n, 5) == 0
        cla(ax);  % 清空当前轴
        p = pcolor(X, Y, u);  % 伪彩色图显示波场
        shading interp;   % 插值平滑
        line([L/2, L/2], [0, L], 'Color', 'w', 'LineStyle', '--', 'LineWidth', 2);  % 分界面
        
        % 显示介质波速信息
        text(L/2-2, L-1, sprintf('介质1(v=%.1f)', v1), 'Color', 'w', 'FontSize', 12);
        text(L/2+0.5, L-1, sprintf('介质2(v=%.2f)', v2), 'Color', 'w', 'FontSize', 12);
        
        xlabel('x坐标');
        ylabel('y坐标');
        title(['2维波传播(t = ', num2str(n*dt, '%.1f'), 's)']);
        axis equal;        % 等比例显示
        axis tight;        % 紧凑显示范围
        
        % 重新创建或更新颜色条,避免对象失效
        if ~exist('cbar', 'var') || ~isvalid(cbar)
            cbar = colorbar('Position', [0.85, 0.1, 0.03, 0.8]);
        end
        cbar.Label.String = '位移强度';
        drawnow;
    end
end
    

模拟效果:伪彩色图直观展示了波的强度分布(颜色越深表示位移越大)。中间的白色虚线是分界面,左侧波速快,右侧波速慢。可以清晰看到波遇到分界面后分成两部分:反射波向左侧反弹,透射波向右侧偏折(折射),符合折射定律。当波从波疏介质进入波密介质时,反射波的相位变化在图中表现为颜色分布的对称性破缺,与光的反射现象高度相似。

如果觉得二维颜色以及不直观,可以复制这个代码看效果:

% 2维波的反射与透射模拟(三维网格显示)
clear; clc; close all;

% 参数设置
L = 20;                  % 区域大小
N = 50;                  % 网格数(平衡性能与精度)
dx = L/N;                % 空间步长
x = 0:dx:L;              % x坐标
y = x;                   % y坐标
[X, Y] = meshgrid(x, y); % 生成网格坐标

v1 = 3.1416;                  % 左侧介质波速(波疏)
v2 = 1.4142;                % 右侧介质波速(波密)
dt = 0.01;               % 时间步长(满足CFL条件)
T = 30;                   % 总模拟时间
nt = round(T/dt);        % 时间步数

% 初始位移(高斯脉冲波源)
u = zeros(N+1, N+1);     % 当前位移矩阵
u_prev = u;              % 前一时刻位移
u_next = u;              % 下一时刻位移
sigma = 0.8;             % 高斯脉冲宽度
x0 = 3; y0 = 5;          % 波源位置
u = exp(-((X - x0).^2 + (Y - y0).^2)/(2*sigma^2));

% 创建3D显示窗口
fig = figure('Position', [200, 200, 1000, 700]);
ax = axes(fig);
view(3);                 % 设置3D视角
axis tight;
xlabel('X坐标');
ylabel('Y坐标');
zlabel('位移');
title('2维波传播的三维网格显示');

for n = 1:nt
    % 内部网格计算
    for i = 2:N
        for j = 2:N
            % 根据位置选择波速
            if x(j) < L/2
                v = v1;
            else
                v = v2;
            end
            
            % 二维波动方程差分格式
            u_next(i,j) = 2*u(i,j) - u_prev(i,j) + ...
                (v^2*dt^2/dx^2)*( ...
                u(i+1,j) - 2*u(i,j) + u(i-1,j) + ...
                u(i,j+1) - 2*u(i,j) + u(i,j-1) );
        end
    end
    
    % 固定边界条件
    u_next(1,:) = 0;     % 上边界
    u_next(end,:) = 0;   % 下边界
    u_next(:,1) = 0;     % 左边界
    u_next(:,end) = 0;   % 右边界
    
    % 更新位移矩阵
    u_prev = u;
    u = u_next;
    
    % 每10步绘制3D网格
    if mod(n, 10) == 0
        cla(ax);  % 清空当前轴
        
        % 绘制三维网格表面
        surf(X, Y, u, ...
            'EdgeColor', 'k', 'EdgeAlpha', 0.3, ...  % 网格线设置
            'FaceColor', 'interp', 'FaceAlpha', 0.7); % 表面透明度设置
        
        % 绘制分界面(垂直平面,修正Alpha属性错误)
        hold on;
        [Z_grid, Y_grid] = meshgrid([-0.5, 0.5], y);  % 匹配维度
        % 使用FaceAlpha设置表面透明度
        surf(ones(size(Y_grid))*L/2, Y_grid, Z_grid, ...
            'FaceColor', 'r', 'EdgeColor', 'none', 'FaceAlpha', 0.3);
        
        % 显示介质信息
        text(2, L-1, 0.5, sprintf('介质1(v=%.3f)', v1), ...
            'Color', 'b', 'FontSize', 12);
        text(L-2, L-1, 0.5, sprintf('介质2(v=%.3f)', v2), ...
            'Color', 'r', 'FontSize', 12);
        
        % 设置视角和范围
        view(30, 45);  % 视角
        zlim([-50, 50]); %坐标范围,根据波的振幅显示调整,或者注释掉自动适应,但是这样显示容易抽风
        title(['3D网格显示:t = ', num2str(n*dt, '%.1f'), 's']);
        drawnow;
    end
end
    

三、总结:波动世界的 "跨界法则"

通过理论分析和模拟实验,我们系统认识了波的反射与透射规律:

  1. 通用法则:反射定律和折射定律是所有波动的 "通行证",无论是机械波还是电磁波都必须遵守。
  1. 半波损失的特殊性:仅发生在波从波疏介质到波密介质的反射过程中,是理解薄膜干涉、声波反射等现象的关键。
  1. 模拟的价值:MATLAB 的可视化模拟让抽象的波动规律变得直观可见,通过调整波速、介质边界等参数,可以探索更多 "如果... 会怎样" 的波动场景,比如模拟声波在不同介质中的传播来优化建筑声学设计,或者模拟光波在多层膜中的行为来设计光学滤镜。

最后来一段AI文案收尾吧——

波动的折射反射现象无处不在,从海洋的潮汐到手机的信号,从琴弦的振动到彩虹的形成,掌握这些规律能让我们更好地理解自然,并创造出更美好的技术产品。下次当你看到水面的波纹或听到山谷的回声时,不妨试着用今天学到的知识来解读这背后的波动奥秘!


网站公告

今日签到

点亮在社区的每一天
去签到