三个弹簧振子理论及其MATLAB实现
创作时间:
作者:
@小白创作中心
三个弹簧振子理论及其MATLAB实现
引用
CSDN
1.
https://blog.csdn.net/qq_46129398/article/details/126025250
三个弹簧振子系统是物理学中一个经典的振动问题,它可以帮助我们理解更复杂的振动系统。本文将通过MATLAB代码实现三个弹簧振子系统的动力学方程求解,并通过动画模拟展示其运动轨迹。
系统模型
考虑如图 1 所示的一维三弹簧振子实验系统:三个弹簧振子的质量分别为 (m_1, m_2, m_3),弹簧的劲度系数分别为 (k_1, k_2, k_3)。三个谐振子在微振动过程中相对自身的平衡位置的位移分别为 (x_1, x_2, x_3)。取 (x_1, x_2, x_3) 为广义坐标,则系统的动力学方程可表示为:
MATLAB代码实现
位置和速度变化曲线
% 弹簧摆摆动图
clc; clear;
global k1 k2 k3 M1 M2 M3
k1 = 145000;
k2 = 180000;
k3 = 121000;
M1 = 220;
M2 = 240;
M3 = 350;
t1 = [0, 5];
H1 = [4; 0; 8; 0; 12; 0];
[t, H] = ode45(@dH, t1, H1); % 求解动力学方程
figure('numbertitle', 'off', 'name', '弹簧摆摆动图');
subplot(1, 2, 1);
plot(t, H(:, 1), 'b', 'linestyle', '-', 'LineWidth', 1.5); hold on;
plot(t, H(:, 3), 'r', 'linestyle', '-', 'LineWidth', 1.5); hold on;
plot(t, H(:, 5), 'g', 'linestyle', '-', 'LineWidth', 1.5); hold on;
legend('x1位置关系', 'x2位置关系', 'x3位置关系');
axis([0 2.5 -13 13]);
set(gca, 'linewidth', 2);
title('位置变化曲线');
xlabel('时间'); ylabel('位置'); box on; grid on;
subplot(1, 2, 2);
plot(t, H(:, 2), 'b', 'linestyle', '-', 'LineWidth', 1.5); hold on;
plot(t, H(:, 4), 'r', 'linestyle', '-', 'LineWidth', 1.5); hold on;
plot(t, H(:, 6), 'g', 'linestyle', '-', 'LineWidth', 1.5); hold on;
legend('x1速度关系', 'x2速度关系', 'x3速度关系');
axis([0 2.5 -110 110]);
set(gca, 'linewidth', 2);
title('速度变化曲线');
xlabel('时间'); ylabel('速度'); box on; grid on;
function dHdt = dH(t, H)
global k1 k2 k3 M1 M2 M3
dHdt = zeros(6, 1);
dHdt(1) = H(2);
dHdt(2) = -k1 * H(1) / M1 + k2 * (H(3) - H(1)) / M1;
dHdt(3) = H(4);
dHdt(4) = -k2 * (H(3) - H(1)) / M2 + k3 * (H(5) - H(3)) / M2;
dHdt(5) = H(6);
dHdt(6) = k3 * (H(3) - H(5)) / M3;
end
动画模拟
% 弹簧动图
clc; clear;
global k1 k2 k3 M1 M2 M3
k1 = 145000;
k2 = 180000;
k3 = 121000;
M1 = 220;
M2 = 240;
M3 = 350;
t1 = [0, 5];
H1 = [4; 0; 8; 0; 12; 0];
[t, H] = ode45(@dH, t1, H1); % 求解动力学方程
figure('numbertitle', 'off', 'name', '弹簧轨迹图');
R = 0.3;
xx1 = 20; xx2 = 40; xx3 = 60;
for i = 1:10:length(t)
clf; hold on;
gg1 = 0:0.1:xx1 + H(i, 1); yy1 = 0.15 + 0.02 * sin(gg1);
plot(gg1, yy1, 'LineWidth', 3, 'Color', 'b'); hold on; % 第一个弹簧
gg2 = xx1 + H(i, 1):0.1:xx2 + H(i, 3); yy2 = 0.15 + 0.02 * sin(gg2);
plot(gg2, yy2, 'LineWidth', 3, 'Color', 'r'); hold on; % 第二个弹簧
gg3 = xx2 + H(i, 3):0.1:xx3 + H(i, 5); yy3 = 0.15 + 0.02 * sin(gg3);
plot(gg3, yy3, 'LineWidth', 3, 'Color', 'g'); hold on; % 第三个弹簧
plot([xx1 + H(i, 1), xx1 + H(i, 1)], [0, R], 'LineWidth', 16, 'Color', 'b'); hold on; % 第一个物体
plot([xx2 + H(i, 3), xx2 + H(i, 3)], [0, R], 'LineWidth', 16, 'Color', 'r'); hold on; % 第二个物体
plot([xx3 + H(i, 5), xx3 + H(i, 5)], [0, R], 'LineWidth', 16, 'Color', 'g'); hold on; % 第三个物体
line([0, 0], [0, 0.3], 'color', 'k', 'linewidth', 2); hold on;
line([0, 100], [0 0], 'color', 'k', 'linewidth', 2); hold on;
xlabel('x'); ylabel('y'); box on;
hold off; set(gca, 'Visible', 'off'); % 设置边框宽度
axis([0 100 0 0.8]);
pause(0.5); % 加坐标边框%加网格线%可以在这里添加输出动图的程序
drawnow; % 实时更新坐标图窗口
end
function dHdt = dH(t, H)
global k1 k2 k3 M1 M2 M3
dHdt = zeros(6, 1);
dHdt(1) = H(2);
dHdt(2) = -k1 * H(1) / M1 + k2 * (H(3) - H(1)) / M1;
dHdt(3) = H(4);
dHdt(4) = -k2 * (H(3) - H(1)) / M2 + k3 * (H(5) - H(3)) / M2;
dHdt(5) = H(6);
dHdt(6) = k3 * (H(3) - H(5)) / M3;
end
热门推荐
在相互依存的全球化时代,经济制裁是徒劳的:数据驱动的博弈论研究
老丝瓜的多重价值:从洗碗到入药的全面解析
攒机单点评:“三朝元老”显卡别再碰了
方大同去世,终年41岁
自主神经紊乱症状怎么治疗
学写梗概:从定义到实践应用的全面指南
无线网卡突然无法使用?试试这几招
全国683个城市城区面积数据首次公布:总面积达11.02万平方公里
自动挡汽车离合器的工作原理与雨刮器保养指南
李兰娟团队研究:益生菌和粪便微生物移植对这种疾病有惊人疗效
框架结构房屋造价预算每平米多少钱?
如何把谋杀变成公众支持的正义复仇?来自民国奇女子施剑翘的示范
周恩来:和平共处五项原则的创意者、发起者、牵头者
APP放贷乱象调查:美图、写名片都能借钱,违规用日息利率
Steam新家庭共享系统深度解析:从设备到账号的共享革命
伤口肿胀是什么原因
跨越江海,大湾区又上新
体坛联播|U20国足今日冲击世青赛,韩国围棋队农心杯夺冠
如何在不同规模的企业中实施区域经理薪资考核表?
腰椎间盘突出护理别让腰痛再烦你!
营销策划师平常主要做什么工作?任职需要什么要求?
国企调岗处理的法律全解析
让宠物轻松服药——如何以猫咪喂药片(15个小技巧教你妙手喂药)
一文读懂外周血细胞形态:检查指征、鉴别要点、如何报告
好听的国学名字,国学典籍里的好名字
超10万人大型队列显示,每日饮用牛奶超过这个量,患心血管疾病的风险大增
Windows 11:如何使用「文件历史记录」功能保护和备份文件
怎样撤销行政处罚
2型糖尿病患者的饮食禁忌,你了解多少?
方大同去世,曾因“爆肺”消失8年,什么是“爆肺”?