线性规划可行区域绘制遇阻,请求排查代码与图形异常
修复线性规划可行区域绘制问题
原代码中的核心错误
- 拼写与范围问题:
np.linespace是笔误,应为np.linspace;x1的取值范围仅到30,远小于约束上限80,导致线条无法延伸到与x轴的交点。 - 约束方程错误:
x1 + x2 ≤120对应的x2表达式应为120 - x1,原代码错误除以3,导致约束线完全偏离。 - 标签逻辑错误:
plt.axvline(80)对应约束是x1 ≤80,原标签写成x1 ≥80,逻辑相反。 - 坐标轴标签错误:重复调用
plt.ylabel覆盖了x轴标签,应使用plt.xlabel设置x1轴。 - 填充区域参数混乱:
fill_between的上下边界与约束条件匹配错误,未正确组合所有限制。
修正后的代码
import numpy as np import matplotlib.pyplot as plt # 扩展x1的取值范围,覆盖所有约束区间 x_1 = np.linspace(0, 120, 1000) # 初始化画布 fig, ax = plt.subplots() fig.set_size_inches(14.7, 8.27) # 绘制约束线 plt.axvline(80, color='g', label=r'$x_1 \leq 80$') # 修正标签逻辑 plt.axvline(15, color='g', label=r'$x_1 \geq 15$') plt.plot(x_1, 120 - x_1, label=r'$x_1 + x_2 \leq 120$') # 修正约束3的表达式 plt.plot(x_1, (65 - x_1) / 0.5, label=r'$x_1 + 0.5x_2 \leq 65$') # 设置坐标轴范围与标签 plt.xlim((0, 120)) plt.ylim((0, 130)) plt.xlabel(r'$x_1$') # 正确设置x轴标签 plt.ylabel(r'$x_2$') # 计算可行区域的上下边界 # 上边界:取两个线性约束的较小值,同时不超过y轴上限 upper_bound = np.minimum(120 - x_1, (65 - x_1)/0.5) # 下边界:x2≥0,同时x1在15到80之间 lower_bound = np.where((x_1 >=15) & (x_1 <=80), 0, -np.inf) # 填充可行区域,添加约束条件过滤 plt.fill_between(x_1, lower_bound, upper_bound, where=(x_1 >=15) & (x_1 <=80) & (upper_bound >=0), color='green', alpha=0.25) # 图例与样式设置 plt.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0.) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) plt.show()
关键修改说明
- 扩展x1的取值范围到0-120,确保所有约束线能完整显示到交点。
- 修正第一个线性约束的表达式,还原正确的约束线。
- 修正竖线约束的标签逻辑,匹配实际限制条件。
- 正确区分x轴和y轴标签,避免覆盖。
- 重新计算可行区域的上下边界,结合
x1≥15、x1≤80、x2≥0所有约束,使用where参数精准过滤填充区域。
内容的提问来源于stack exchange,提问作者Tracy McGinn
相关产品推荐
相关产品推荐

