如何用Python绘制线性不等式并着色可行域?
使用Python绘制线性不等式可行域并着色的解决方案
原问题与代码
我尝试绘制以下线性不等式的可行域并着色,但效果不理想:
x + y ≤ 300
(y/7) ≥ (x/8)
x ≥ 0
y ≥ 0
原代码如下:
import os import sys import numpy as np import matplotlib.pyplot as plt # plot the feasible region d = np.linspace(0,400) x,y = np.meshgrid(d,d) plt.imshow( ((y>=0) & (y>=7*x/8) & (x+y<=300) & (x>=0)).astype(int) , extent=(x.min(),x.max(),y.min(),y.max()),origin="lower", cmap="Greys", alpha = 0.3); # plot the lines defining the constraints x = np.linspace(0, 600, 2000) # y >= 0 y1 = (x*0) # 2y <= 25 - x y2 = (7*x)/ 8 # 4y >= 2x - 8 y3 = (300 - x) # y <= 2x - 5 y4 = 600 l2 = r'$x/7\geqx/8$' # Make plot plt.plot(x, y1, label=r'$y\geq0$') plt.plot(x, y2) plt.plot(x, y3, label=r'$x+y\leq300$') #plt.plot(x, y4, label=r'$x\geq0') plt.xlim(0,16) plt.ylim(0,11) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) plt.xlabel(r'$x$') plt.ylabel(r'$y$')`enter code here` plt.show()
问题排查
原代码存在几个关键问题:
- 坐标轴范围错误:设置的
xlim(0,16)和ylim(0,11)远小于约束的实际范围,导致可行域被截断,无法看到完整区域。 - 标签错误与缺失:约束
y/7 ≥ x/8的标签写成了$x/7\geqx/8$,且未给对应线条添加图例;x≥0的约束也未正确绘制和标注。 - 变量名冲突:网格变量
x被后续的边界线变量覆盖,易引发混淆。 - 冗余代码:引入了未使用的
os、sys模块,以及无效的y4变量和注释。
修正后的代码
import numpy as np import matplotlib.pyplot as plt # 生成覆盖约束范围的网格数据 d = np.linspace(0, 400, 400) x_grid, y_grid = np.meshgrid(d, d) # 定义所有约束条件 constraints = ( y_grid >= 0 & x_grid >= 0 & y_grid >= (7 * x_grid) / 8 & # 等价于 y/7 ≥ x/8 x_grid + y_grid <= 300 ) # 绘制可行域着色区域 plt.imshow(constraints.astype(int), extent=(0, 400, 0, 400), origin='lower', cmap='Greens', alpha=0.5) # 绘制各约束的边界线 x_line = np.linspace(0, 400, 200) # y ≥ 0 plt.plot(x_line, np.zeros_like(x_line), label=r'$y \geq 0$', color='blue') # y/7 ≥ x/8 → y = 7x/8 plt.plot(x_line, (7 * x_line)/8, label=r'$y/7 \geq x/8$', color='orange') # x + y ≤ 300 → y = 300 - x plt.plot(x_line, 300 - x_line, label=r'$x + y \leq 300$', color='red') # x ≥ 0 为y轴,用axvline绘制 plt.axvline(x=0, label=r'$x \geq 0$', color='purple') # 设置坐标轴与标题 plt.xlim(0, 400) plt.ylim(0, 400) plt.xlabel(r'$x$') plt.ylabel(r'$y$') plt.title('线性约束的可行域') # 添加图例 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.show()
代码说明
- 用
x_grid、y_grid区分网格变量和边界线的x_line,避免变量冲突。 - 调整坐标轴范围至0-400,完整展示所有约束下的可行域。
- 修正约束标签,并为每条边界线添加图例,清晰对应约束条件。
- 使用
axvline绘制x≥0的边界(y轴),更符合直观认知。 - 更换配色为
Greens,着色区域辨识度更高。
内容的提问来源于stack exchange,提问作者tahayparker
相关产品推荐
相关产品推荐

