You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制梁剪力图无法计入B支座荷载 代码运行异常如何解决

Python绘制外伸梁剪力弯矩图的代码修正方案

问题核心原因

  • 原剪力函数仅定义了A支座到B支座的单段表达式,未计入B支座反力带来的剪力突变
  • x坐标范围仅覆盖到B支座位置,未包含B支座后的外伸段,无法观察到陡降后上升的规律

修正后完整代码

from sympy import solve, symbols, Eq
import numpy as np
import matplotlib.pyplot as plt

def simple_beam_uniform(L1, L2, g):
    """
    绘制外伸梁的剪力图和弯矩图
    L1: A支座到B支座的长度(m)
    L2: B支座外伸段长度(m)
    g: 均布荷载大小(kN/m)
    """
    By = symbols("By")
    total_L = L1 + L2
    # 均布荷载总合力
    total_load = total_L * g
    # 合力作用点距离A支座的距离
    load_point = total_L / 2
    # 对A支座取矩求解B支座反力
    mom_eq = Eq(By * L1, total_load * load_point)
    By_val = solve(mom_eq)[0]
    # 求解A支座反力
    Ay_val = total_load - By_val
    print(f"A支座反力:{Ay_val:.2f} kN")
    print(f"B支座反力:{By_val:.2f} kN")

    # 生成全梁坐标点,步长0.1保证曲线平滑
    x = np.arange(0, total_L + 0.1, 0.1)
    # 分段计算剪力:过B支座后扣除B支座反力
    v_values = np.where(x < L1, 
                        -Ay_val + g * x, 
                        -Ay_val + g * x - By_val)
    # 分段计算弯矩
    m_values = np.where(x < L1,
                        -Ay_val * x + g * x ** 2 / 2,
                        -Ay_val * x + g * x ** 2 / 2 + By_val * (x - L1))

    # 绘图
    plt.figure(figsize=(10, 6))
    plt.plot(x, v_values, label="剪力 (kN)", color="tab:red")
    plt.plot(x, m_values, label="弯矩 (kN·m)", color="tab:blue")
    # 绘制B支座位置辅助线
    plt.axvline(x=L1, color="gray", linestyle="--", label="B支座位置")
    plt.axhline(y=0, color="black", linewidth=0.8)
    plt.xlabel("梁长度位置 (m)")
    plt.ylabel("内力值")
    plt.title("外伸梁剪力弯矩图")
    plt.legend()
    plt.grid(alpha=0.3)
    plt.show()

simple_beam_uniform(15, 7.5, 9.5)

关键修改说明

  • 扩展x坐标范围到总梁长L1+L2,覆盖B支座后的外伸段
  • 用np.where实现剪力、弯矩的分段计算:x超过B支座位置时,扣除B支座的向上反力,实现剪力的陡降效果
  • 明确使用Eq定义平衡方程,提升代码可读性
  • 补充了绘图辅助元素,方便核对内力突变位置和数值规律

内容的提问来源于stack exchange,提问作者Murat Aracı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:09:01