材料力学课程大作业

利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值