适配于梁昆淼的数学物理方法(第五版)的p125——p127的内容
第一个例子,无限长弦无初速度,只有初始位移
第二个例子,无限长弦无初始位移,只有初始速度。
第一个例子中,“波”已通过的区域,振动消失而弦静止在原平衡位置,波已通过的区域,虽然振动也消失,但弦偏离了原平衡位置。
第三个例子(端点反射)研究半无限长弦的自由振动。
看合成的波形,端点x=0保持不动,由演示可见,端点的影响表现为反射波。反射波的相位跟入射波相反,这就是所谓半波损失
给你们代码
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