MATLAB模拟一维波动方程传播

本程序使用MATLAB模拟一维波动方程中波的传播过程,并将模拟结果与理论波形进行对比。

%% 清空工作空间并关闭图窗
clc;
clear;
close all;

%% 创建一个由 0 值组成的 151×151 矩阵
f = zeros(151);

%% 定义初始条件
u = -0.5;  % 波速
dt = 0.1;  % 时间步长
dx = 0.1;  % 空间步长

% 设置初始波形
for i = 1:151
    if i >= 100 && i <= 120
        f(1, i) = 3;
    else
        f(1, i) = 0;
    end
end

%% 设定左右边界条件
f(:, 1) = 0;
f(:, 151) = 0;

%% 使用显式格式差分方法进行求解
for n = 1:150
    for i = 2:150
        f(n+1, i) = f(n, i) - (u * dt / dx) * (f(n, i) - f(n, i-1));
    end
end

%% 可视化结果
% 设定参数
C = 0:0.05:15;  % 用于理论波形的 x 坐标
Z = zeros(150, 302);
Z(1, 200:240) = 3;  % 设置理论波形的初始形状

% 模拟理论波形的传播
for n = 1:150
    for i = 1:300
        Z(n+1, i) = Z(n, i+1);
    end
end

% 画出传播的波并将绘图存进视频
fig = figure;
writerobj = VideoWriter('MTX_HW.avi', 'MPEG-4');
open(writerobj);

x = 0:0.1:15;  % 用于模拟波形的 x 坐标
for n = 1:151
    % 绘制模拟波形
    plot(x, f(n, :), 'LineWidth', 2, 'Color', 'r');
    
    % 设置图形属性
    set(gca, 'fontsize', 15, 'FontName', 'Helvetica');
    xlabel('x', 'FontSize', 15, 'FontName', 'Helvetica');
    ylabel('u(x, t)', 'FontSize', 15, 'FontName', 'Helvetica');
    title('22334146 - Yilia', 'FontSize', 18, 'FontName', 'Helvetica');
    axis([0, 15, -0.5, 5]);
    grid on;
    hold on;
    
    % 绘制理论波形
    D = Z(n, :);
    D(:, 301) = [];
    plot(C, D, 'LineWidth', 2, 'Color', 'b');
    hold off;
    
    % 添加图例
    legend({'传播的波', '理论波形'}, 'FontSize', 12, 'FontName', 'Helvetica');
    
    % 保存视频帧
    frame = getframe(fig);
    writeVideo(writerobj, frame);
end

close(writerobj);

本程序模拟了波在一维空间中的传播过程,并通过动画展示了波的形态变化。程序中使用了显式差分方法求解波动方程,并通过设置初始条件和边界条件来控制波的传播。同时,程序还绘制了理论波形,并将模拟结果与理论波形进行对比,以验证模拟的准确性。


原文地址: https://www.cveoy.top/t/topic/UXf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录