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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:31:18