基于matlab的达朗贝尔方程动画演示

适配于梁昆淼的数学物理方法(第五版)的p125——p127的内容

e5e464a0c8f8481fabca1552e65b33de.jpeg

第一个例子,无限长弦无初速度,只有初始位移

35843de70bcf48178863989ca0972bda.png

第二个例子,无限长弦无初始位移,只有初始速度。

        第一个例子中,“波”已通过的区域,振动消失而弦静止在原平衡位置,波已通过的区域,虽然振动也消失,但弦偏离了原平衡位置

840dbad65e8a4f0f87447a7457a19a2a.png

第三个例子(端点反射)研究半无限长弦的自由振动。

        看合成的波形,端点x=0保持不动,由演示可见,端点的影响表现为反射波。反射波的相位跟入射波相反,这就是所谓半波损失

53c0493921b341bf85719abc31b286d0.png

给你们代码

function createInteractiveAnimation
    % 创建UI figure
    fig = uifigure('Name', '动画控制', 'Position', [100, 100, 800, 600]);
    
    % 创建坐标轴
    ax = uiaxes(fig, 'Position', [50, 250, 700, 300]);
    axis(ax, 'off'); % 初始隐藏坐标轴

    % 显示初始文本
    text(ax, 0.5, 0.6, '达朗贝尔方程', 'FontSize', 24, 'HorizontalAlignment', 'center', 'Color', 'b');
    text(ax, 0.5, 0.4, '授课人:xxx', 'FontSize', 18, 'HorizontalAlignment', 'center');

    % 创建按钮和滑块
    animation1Button = uibutton(fig, 'push', 'Text', '无限长弦有初始位移', ...
        'Position', [50, 150, 200, 30], 'ButtonPushedFcn', @(btn, event) playAnimation1(ax));
    
    animation2Button = uibutton(fig, 'push', 'Text', '无限长弦有初始速度', ...
        'Position', [300, 150, 200, 30], 'ButtonPushedFcn', @(btn, event) playAnimation2(ax));
    
    animation3Button = uibutton(fig, 'push', 'Text', '半无限长弦有初始位移', ...
        'Position', [550, 150, 200, 30], 'ButtonPushedFcn', @(btn, event) playAnimation3(ax));
    
    pauseButton = uibutton(fig, 'push', 'Text', '暂停', ...
        'Position', [300, 100, 100, 30], 'BackgroundColor', 'g', 'ButtonPushedFcn', @togglePause);
    
    exitButton = uibutton(fig, 'push', 'Text', '退出', ...
        'Position', [420, 100, 100, 30], 'ButtonPushedFcn', @(btn, event) close(fig));
    
    speedSlider = uislider(fig, 'Position', [550, 100, 200, 3], 'Limits', [0.1, 2], 'Value', 0.5);
    speedLabel = uilabel(fig, 'Position', [550, 130, 200, 20], 'Text', '波速: 0.5');
    
    is_paused = false; % 初始状态为非暂停
    currentTime = 0; % 当前时间

    function resetState()
        is_paused = false;
        currentTime = 0;
        set(pauseButton, 'Text', '暂停', 'BackgroundColor', 'g');
    end

    function playAnimation1(ax)
        resetState();
        % 显示坐标轴
        axis(ax, 'on');

        % 清除当前轴内容
        cla(ax);

        % 动画1的参数设置
        x = linspace(-10, 10, 1000);
        f = @(x) exp(-x.^2);
        
        % 显示设置
        ax.Title.String = '动画1: 无限长弦有初始位移';
        axis(ax, [-10 10 -1 1]);

        % 初始绘图
        hold(ax, 'on');
        h_main = plot(ax, x, f(x), 'g', 'LineWidth', 3);
        h1 = plot(ax, x, f(x), 'r', 'LineWidth', 1);
        h2 = plot(ax, x, f(x), 'b', 'LineWidth', 1);
        legend(ax, '总位移', '右行波分量', '左行波分量');
        hold(ax, 'off');
        
        % 动画
        while currentTime < 500
            if ~is_paused
                v = speedSlider.Value; % 当前波速
                u1 = 0.5 * f(x - v * currentTime);
                u2 = 0.5 * f(x + v * currentTime);
                u = u1 + u2;
                set(h_main, 'XData', x, 'YData', u);
                set(h1, 'XData', x, 'YData', u1);
                set(h2, 'XData', x, 'YData', u2);
                drawnow;
                
                % 更新时间
                currentTime = currentTime + 0.1;
            else
                pause(0.1);
            end
            speedLabel.Text = ['波速: ' num2str(speedSlider.Value, '%.1f')];
        end
    end

    function playAnimation2(ax)
        resetState();
        % 显示坐标轴
        axis(ax, 'on');

        % 清除当前轴内容
        cla(ax);

        % 动画2的参数设置
        x = linspace(-700, 700, 1000);
        g = @(x) 0.3 * (x >= 0 & x <= 10);

        g_values = g(x);
        integral_values = cumtrapz(x, g_values);
        integral_values_symmetric = -integral_values;

        % 显示设置
        ax.Title.String = '动画2: 无限长弦有初始速度';
        axis(ax, [-50 50 -7 7]);

        % 初始绘图
        hold(ax, 'on');
        h_main = plot(ax, x, integral_values, 'g', 'LineWidth', 3);
        h1 = plot(ax, x, integral_values, 'r', 'LineWidth', 1);
        h2 = plot(ax, x, integral_values, 'b', 'LineWidth', 1);
        legend(ax, '总位移', '左行波分量', '右行波分量');
        hold(ax, 'off');
        
        % 动画
        while currentTime < 500
            if ~is_paused
                v = speedSlider.Value; % 当前波速
                x_shifted_left = x + v * currentTime * 2;
                x_shifted_right = x - v * currentTime * 2;

                shifted_integral_left = interp1(x, integral_values, x_shifted_left, 'linear', 0);
                shifted_integral_right = interp1(x, integral_values_symmetric, x_shifted_right, 'linear', 0);
                u1 = shifted_integral_left;
                u2 = shifted_integral_right;
                u = u1 + u2;

                set(h_main, 'XData', x, 'YData', u);
                set(h1, 'XData', x, 'YData', u1);
                set(h2, 'XData', x, 'YData', u2);
                drawnow;
                
                % 更新时间
                currentTime = currentTime + 0.1;
            else
                pause(0.1);
            end
            speedLabel.Text = ['波速: ' num2str(speedSlider.Value, '%.1f')];
        end
    end

    function playAnimation3(ax)
        resetState();
        % 显示坐标轴
        axis(ax, 'on');

        % 清除当前轴内容
        cla(ax);

        % 动画3的参数设置
        x = linspace(-80, 80, 1000);
        f = @(x) 0.2*exp(-(x-5).^2); % 初始位移,高斯函数
        
        % 显示设置
        ax.Title.String = '动画3: 半无限长弦有初始位移';
        axis(ax, [-20 20 -0.5 0.5]);

        % 初始绘图
        hold(ax, 'on');
        h5 = plot(ax, x, f(x) + -f(-x), 'LineWidth', 4, 'Color', [0.2, 1, 0.2]);
        h1 = plot(ax, x, f(x), 'r', 'LineWidth', 1);
        h2 = plot(ax, x, f(x), 'r', 'LineWidth', 1);
        h3 = plot(ax, x, -f(-x), 'b', 'LineWidth', 1);
        h4 = plot(ax, x, -f(-x), 'b', 'LineWidth', 1);
        line(ax, [0 0], [-1 1], 'Color', 'k', 'LineStyle', '--');
        legend(ax, '总位移函数', '左行波分量', '右行波分量', '左行波分量的中心对称', '右行波分量的中心对称', 'x=0');
        hold(ax, 'off');
        
        % 动画
        while currentTime < 700
            if ~is_paused
                v = speedSlider.Value; % 当前波速
                u1 = 0.5 * f(x - v * currentTime);
                u2 = 0.5 * f(x + v * currentTime);
                u3 = -0.5 * f(-x - v * currentTime);
                u4 = -0.5 * f(-x + v * currentTime);
                u5 = u1 + u2 + u3 + u4;
                
                set(h1, 'YData', u1);
                set(h2, 'YData', u2);
                set(h3, 'YData', u3);
                set(h4, 'YData', u4);
                set(h5, 'YData', u5);
                drawnow;
                
                % 更新时间
                currentTime = currentTime + 0.1;
            else
                pause(0.1);
            end
            speedLabel.Text = ['波速: ' num2str(speedSlider.Value, '%.1f')];
        end
    end

    function togglePause(src, event)
        is_paused = ~is_paused;
        if is_paused
            set(src, 'Text', '播放', 'BackgroundColor', 'r');
        else
            set(src, 'Text', '暂停', 'BackgroundColor', 'g');
        end
    end
end

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值