matplotlib 可行域固定填充

g52tjvyc  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(82)

我尝试使用Python的matplotlib来纠正可行区域的填充
这些是不平等:

x = np.linspace(0, 2000, 1000)
y1 = (3600 - 3*x) / 5
y2 = (1600 - x) / 2
y3 = (48000 - 50*x) / 20

字符串
我只关心可行域,但我不能得到正确的约束

fig, ax = plt.subplots()
ax.plot(x, y1, label='3x+5y<=3600')
ax.plot(x, y2, label='x+2y<=1600')
ax.plot(x, y3, label='50x+20y<=48000')
ax.fill_between(x, 0, y3, where=(y1<= (3600-3*x)/5) & (y2<= (1600-x)/2) & (y3<= (48000-50*x)/20), alpha=0.2)

# plot the vertices
for vertex in vertices:
    ax.plot(vertex[0], vertex[1], 'ro')

plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Feasible Region')
plt.legend()
plt.show()


的数据
正如你所注意到的,可行域没有被正确填充,尽管逻辑对我来说似乎很好。
如何修复fill_between参数,使其正确填充?

zd287kbt

zd287kbt1#

首先,让我解释一下为什么你的代码不起作用。如果仔细阅读fill_between文档,您会发现where参数用于限制填充区间的左右范围。所以,如果你做了where=(x<=500),这条线会停在x=500
在这种情况下,因为所有的线都是可行域顶部的边界,所以可以使用np.minimum.reduce来获得所有线的元素最小值,从而获得可行域的顶部。然后,您可以使用where参数将区域限制为所有线都在0以上的区域(如果没有它,阴影将进一步向下延伸到右侧,尽管您不会看到指定的限制)。

top = np.minimum.reduce([y1, y2, y3])
ax.fill_between(x, top, 0, alpha=0.2, where=(top>0))

字符串


的数据

bsxbgnwa

bsxbgnwa2#

不使用fill_between方法,而是使用fill方法来正确填充可行域。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2000, 1000)

# Define the inequalities for each constraint
y1 = (3600 - 3*x) / 5
y2 = (1600 - x) / 2
y3 = (48000 - 50*x) / 20

# Find the vertices of the feasible region
vertices = []
for i in range(len(x)):
    if y1[i] >= 0 and y2[i] >= 0 and y3[i] >= 0:
        vertices.append((x[i], min(y1[i], y2[i], y3[i])))

# Plot the constraints
plt.plot(x, y1, label='3x+5y<=3600')
plt.plot(x, y2, label='x+2y<=1600')
plt.plot(x, y3, label='50x+20y<=48000')

# Plot the feasible region
vertices.append((0, 0))  # Add the origin as a vertex
vertices.sort()
x_coords, y_coords = zip(*vertices)
plt.fill(x_coords, y_coords, 'b', alpha=0.2)

# plot the vertices
for vertex in vertices:
    plt.plot(vertex[0], vertex[1], 'ro')

plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Feasible Region')
plt.legend()
plt.grid(True)
plt.show()

字符串


的数据

相关问题