MATLAB画出湖面波纹相遇所形成的现象

我们可以使用 MATLAB 来模拟和绘制湖面波纹相遇时产生的干涉现象。这是一个非常经典的物理现象,可以通过二维波动方程的叠加来实现。

下面是完整的 MATLAB 代码,它将模拟两个点波源产生的波纹在水面上传播并相遇的过程,并生成一个动态的 GIF 动画来展示这一现象。

本文介绍了一个使用MATLAB模拟湖面波纹干涉现象的完整代码。该程序通过定义两个点波源,计算其在二维空间产生的波纹传播,并叠加生成干涉图案。代码采用sinc函数模拟振幅衰减,避免奇点问题,并通过循环计算每一时刻的波面状态,最终生成动态GIF动画展示干涉过程。模拟参数包括波源位置、振幅、波长等可调变量,输出结果直观展示了波纹相遇时的干涉现象。该模拟适用于波动光学和水波干涉的教学演示。

完整 MATLAB 代码

Matlab 复制代码
%% 湖面波纹干涉现象模拟

% 清理工作区
clear; clc; close all;

%% 1. 定义模拟参数
L = 100;                  % 模拟区域的大小 (L x L)
N = 200;                  % 网格点数,用于离散化空间
x = linspace(-L/2, L/2, N); % x轴坐标
y = linspace(-L/2, L/2, N); % y轴坐标
[X, Y] = meshgrid(x, y);   % 创建二维网格

% --- 波源参数 ---
S1 = [-20, 0];            % 第一个波源的坐标
S2 = [20, 0];             % 第二个波源的坐标
A = 1.0;                  % 波的振幅
lambda = 10;              % 波长
k = 2 * pi / lambda;      % 波数
omega = 2;                % 角频率

% --- 时间参数 ---
T_total = 20;             % 总模拟时间
Nt = 100;                 % 时间步数
t = linspace(0, T_total, Nt); % 时间数组

% 准备GIF动画
gif_filename = 'ripple_interference.gif';

%% 2. 循环计算并绘制每一帧
for i = 1:Nt
    % 当前时间
    current_t = t(i);
    
    % --- 计算两个波源产生的波 ---
    % r1 和 r2 是网格上任意一点到两个波源的距离
    r1 = sqrt((X - S1(1)).^2 + (Y - S1(2)).^2);
    r2 = sqrt((X - S2(1)).^2 + (Y - S2(2)).^2);
    
    % 计算每个波的相位和振幅
    % 使用 sinc 函数来避免在波源点 (r=0) 处出现无穷大,并模拟振幅随距离衰减
    wave1 = A * sinc(r1 / lambda) .* cos(k * r1 - omega * current_t);
    wave2 = A * sinc(r2 / lambda) .* cos(k * r2 - omega * current_t);
    
    % --- 波的叠加 (干涉) ---
    % 根据波的叠加原理,总位移是各个波位移的代数和
    total_wave = wave1 + wave2;
    
    % --- 绘制当前帧 ---
    figure(1);
    surf(X, Y, total_wave, 'EdgeColor', 'none');
    axis equal;
    axis([-L/2, L/2, -L/2, L/2, -2*A, 2*A]); % 限制坐标轴范围
    colormap('jet'); % 使用 jet 颜色图,蓝色表示波谷,红色表示波峰
    colorbar;
    title(sprintf('湖面波纹干涉 (t = %.2f s)', current_t));
    xlabel('X (cm)');
    ylabel('Y (cm)');
    zlabel('振幅');
    view(2); % 从上方俯视,更像看湖面
    drawnow;
    
    % --- 将当前帧写入GIF文件 ---
    frame = getframe(gcf);
    im = frame2im(frame);
    [imind, cm] = rgb2ind(im, 256);
    
    if i == 1
        imwrite(imind, cm, gif_filename, 'GIF', 'Loopcount', inf, 'DelayTime', 0.1);
    else
        imwrite(imind, cm, gif_filename, 'GIF', 'WriteMode', 'append', 'DelayTime', 0.1);
    end
end

close(gcf); % 关闭图形窗口
disp(['动画已保存为: ', gif_filename]);
相关推荐
花心蝴蝶.2 小时前
Java 中的代理模式
java·开发语言·代理模式
风语者6663 小时前
perl踩坑系列=====正则表达式捕获
开发语言·perl
我科绝伦(Huanhuan Zhou)3 小时前
银河麒麟V10编译perl-5.42.0,并设置环境变量
开发语言·perl
大飞pkz3 小时前
【设计模式】享元模式
开发语言·设计模式·c#·享元模式
茉莉玫瑰花茶3 小时前
C++扩展 --- 并发支持库(补充3)
开发语言·c++
一只乔哇噻3 小时前
java后端工程师进修ing(研一版‖day49)
java·开发语言
枫叶丹43 小时前
【Qt开发】输入类控件(二)-> QTextEdit
开发语言·qt
JAVA学习通4 小时前
微服务项目->在线oj系统(Java-Spring)----[前端]
java·开发语言·前端
hrrrrb5 小时前
【Python】文件处理(二)
开发语言·python