利用MATLAB做出一个具有界面的小程序,可通过输入参数对梁上的受力及变形情况进行分析,画出弯矩图,剪力图和挠度图
function beam_analysis_gui
% 主函数:创建梁分析GUI界面
fig = uifigure('Name', '梁分析工具 v5.0', 'Position', [100 100 1000 750]);
%% ================= 界面布局参数 =================
panelWidth = 280; % 面板宽度
paramPanelHeight = 180; % 参数面板高度
sectionPanelHeight = 120; % 截面面板高度
resultHeight = 80; % 结果面板高度
btnPanelHeight = 60; % 按钮面板高度
margin = 20; % 边距
totalHeight = 750; % 窗口总高度
%% ================= 坐标计算(从上到下) =================
% 基本参数面板
paramPanelY = totalHeight - margin - paramPanelHeight;
% 材料参数面板
materialPanelY = paramPanelY - margin - paramPanelHeight;
% 截面参数面板
sectionPanelY = materialPanelY - margin - sectionPanelHeight;
% 结果面板
resultPanelY = sectionPanelY - margin - resultHeight;
% 按钮面板(确保在可视范围内)
btnPanelY = max(margin, resultPanelY - margin - btnPanelHeight);
%% ================= 左侧面板区域 =================
% 基本参数面板(最顶部)
paramPanel = uipanel(fig, 'Title', '基本参数',...
'Position', [margin paramPanelY panelWidth paramPanelHeight]);
createInputField(paramPanel, 30, 130, '长度 L (m):', 'editL', 130);
createInputField(paramPanel, 30, 80, '荷载 P (N):', 'editP', 130);
createInputField(paramPanel, 30, 30, '荷载位置 a (m):', 'editA_pos', 130);
% 材料参数面板
materialPanel = uipanel(fig, 'Title', '材料参数',...
'Position', [margin materialPanelY panelWidth paramPanelHeight]);
createInputField(materialPanel, 30, 130, '弹性模量 E (Pa):', 'editE', 130);
createInputField(materialPanel, 30, 80, '许用正应力 (Pa):', 'editSigma', 130);
createInputField(materialPanel, 30, 30, '许用剪应力 (Pa):', 'editTau', 130);
% 截面参数面板
sectionPanel = uipanel(fig, 'Title', '截面参数',...
'Position', [margin sectionPanelY panelWidth sectionPanelHeight]);
createInputField(sectionPanel, 30, 70, '宽度 b (m):', 'editWidth', 130);
createInputField(sectionPanel, 30, 20, '高度 h (m):', 'editHeight', 130);
%% ================= 功能按钮面板 =================
btnPanel = uipanel(fig, 'Position',...
[margin btnPanelY panelWidth btnPanelHeight],...
'BorderType', 'none');
uibutton(btnPanel, 'push',...
'Text', '计 算', 'Position', [20 15 70 30],...
'ButtonPushedFcn', @(btn,event) calculateAnalysis(fig),...
'BackgroundColor', [0.8 0.8 1], 'FontWeight', 'bold');
uibutton(btnPanel, 'push',...
'Text', '清 空', 'Position', [110 15 70 30],...
'ButtonPushedFcn', @clearAll,...
'BackgroundColor', [0.8 1 0.8], 'FontWeight', 'bold');
uibutton(btnPanel, 'push',...
'Text', '退 出', 'Position', [200 15 70 30],...
'ButtonPushedFcn', @(btn,event) delete(fig),...
'BackgroundColor', [1 0.8 0.8], 'FontWeight', 'bold');
%% ================= 结果显示区域 =================
resultPanel = uipanel(fig, 'Title', '强度校核结果',...
'Position', [margin resultPanelY panelWidth resultHeight]);
resultLabel = uilabel(resultPanel,...
'Position', [10 10 panelWidth-20 resultHeight-20],...
'FontSize', 10, 'WordWrap', 'on',...
'HorizontalAlignment', 'left');
%% ================= 图形显示区域 =================
ax1 = uiaxes(fig, 'Position', [320 520 650 200]); % 剪力图
ax2 = uiaxes(fig, 'Position', [320 290 650 200]); % 弯矩图
ax3 = uiaxes(fig, 'Position', [320 60 650 200]); % 挠度图
%% ================= 其他控件 =================
uidropdown(fig, 'Position', [320 730 150 22],...
'Items', {'简支梁', '悬臂梁'}, 'Value', '简支梁',...
'Tag', 'beamType', 'FontSize', 10);
%% ================= 存储句柄 =================
handles = struct(...
'editL', findobj(fig, 'Tag', 'editL'),...
'editP', findobj(fig, 'Tag', 'editP'),...
'editA_pos', findobj(fig, 'Tag', 'editA_pos'),...
'editE', findobj(fig, 'Tag', 'editE'),...
'editWidth', findobj(fig, 'Tag', 'editWidth'),...
'editHeight', findobj(fig, 'Tag', 'editHeight'),...
'editSigma', findobj(fig, 'Tag', 'editSigma'),...
'editTau', findobj(fig, 'Tag', 'editTau'),...
'ax1', ax1, 'ax2', ax2, 'ax3', ax3,...
'resultLabel', resultLabel);
guidata(fig, handles);
%% ================= 嵌套函数 =================
function createInputField(parent, x, y, label, tag, fieldX)
uilabel(parent, 'Text', label,...
'Position', [x y 100 22], 'FontSize', 9);
uieditfield(parent, 'numeric',...
'Tag', tag,...
'Position', [fieldX y 120 22],...
'FontSize', 9,...
'Limits', [0 inf]);
end
function calculateAnalysis(fig)
handles = guidata(fig);
%% 参数获取与验证
params = struct(...
'L', handles.editL.Value,...
'P', handles.editP.Value,...
'a', handles.editA_pos.Value,...
'E', handles.editE.Value,...
'b', handles.editWidth.Value,...
'h', handles.editHeight.Value,...
'sigma_allow', handles.editSigma.Value,...
'tau_allow', handles.editTau.Value);
% 输入有效性检查
if any(structfun(@(x) isempty(x) || x <= 0, params)) || params.a > params.L
errordlg('输入参数错误:请检查数值是否合法且为正数', '输入错误');
return;
end
%% 自动计算截面参数
A = params.b * params.h;
I = (params.b * params.h^3)/12;
W = (params.b * params.h^2)/6;
%% 力学计算
x = linspace(0, params.L, 1000);
[V, M, v] = deal(zeros(size(x)));
beamType = findobj(fig, 'Tag', 'beamType').Value;
switch beamType
case '简支梁'
R1 = params.P*(params.L - params.a)/params.L;
R2 = params.P*params.a/params.L;
V = R1*(x < params.a) - R2*(x >= params.a);
M = R1*x.*(x <= params.a) + (R1*x - params.P*(x - params.a)).*(x > params.a);
b = params.L - params.a;
v(x <= params.a) = (params.P*b*x(x <= params.a))./(6*params.E*I*params.L) .*...
(params.L^2 - x(x <= params.a).^2 - b^2);
v(x > params.a) = (params.P*params.a*(params.L - x(x > params.a)))./(6*params.E*I*params.L) .*...
(2*params.L*x(x > params.a) - x(x > params.a).^2 - params.a^2);
case '悬臂梁'
V(x <= params.a) = params.P;
M(x <= params.a) = -params.P*(params.a - x(x <= params.a));
v(x <= params.a) = -(params.P./(6*params.E*I)) .*...
(3*params.a*x(x <= params.a).^2 - x(x <= params.a).^3);
v(x > params.a) = -(params.P*params.a^2./(6*params.E*I)) .*...
(3*x(x > params.a) - params.a);
end
v = -v;
%% 强度校核
M_max = max(abs(M));
V_max = max(abs(V));
sigma_max = M_max / W;
tau_max = 1.5 * V_max / A;
%% 结果显示
resultColor = ifelse(sigma_max <= params.sigma_allow && tau_max <= params.tau_allow,...
[0 0.6 0], [0.8 0 0]);
resultText = {...
sprintf('正应力: %.2e/%.2e Pa', sigma_max, params.sigma_allow),...
sprintf('剪应力: %.2e/%.2e Pa', tau_max, params.tau_allow)};
handles.resultLabel.Text = strjoin(resultText, newline);
handles.resultLabel.FontColor = resultColor;
%% 图形绘制
plotDiagram(handles.ax1, x, V, '剪力图', 'N', [0.2 0.7 0.2]);
plotDiagram(handles.ax2, x, M, '弯矩图', 'N·m', [0.8 0.2 0.2]);
plotDiagram(handles.ax3, x, v, '挠度图', 'm', [0.2 0.2 0.8]);
end
function plotDiagram(ax, x, y, titleStr, unit, color)
cla(ax);
plot(ax, x, y, 'Color', color, 'LineWidth', 2);
ax.Title.String = titleStr;
ax.XLabel.String = '位置 (m)';
ax.YLabel.String = ['数值 (' unit ')'];
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.XLim = [min(x) max(x)];
[ymax, idx] = max(abs(y));
text(ax, x(idx), y(idx), sprintf('Max: %.2e', ymax),...
'VerticalAlignment', 'bottom',...
'HorizontalAlignment', 'center',...
'FontSize', 20);
end
function clearAll(~, ~)
% 清空所有输入和图形
handles = guidata(gcbf);
% 单独清空每个输入框
handles.editL.Value = [0];
handles.editP.Value = [0];
handles.editA_pos.Value = [0];
handles.editE.Value = [0];
handles.editWidth.Value = [0];
handles.editHeight.Value = [0];
handles.editSigma.Value = [0];
handles.editTau.Value = [0];
% 清除图形
cla(handles.ax1);
cla(handles.ax2);
cla(handles.ax3);
% 重置结果标签
handles.resultLabel.Text = '等待计算...';
handles.resultLabel.FontColor = [0.2 0.2 0.2];
end
function out = ifelse(condition, trueVal, falseVal)
if condition
out = trueVal;
else
out = falseVal;
end
end
end