绘制梁剪力图无法计入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ı
相关产品推荐
相关产品推荐

