मैं निम्नलिखित समस्या में 3 पंक्तियों के बीच भरना चाहता हूं। यहाँ कोड है:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Construct lines
# x > 0
x = np.linspace(0, 20, 2000)
# C1
y1 = (36-2*x)/6
# C2
y2 = (30-5*x)/3
# C3
y3 = (40-8*x)/2
# C4
# y4 = 0*x

# Make plot
plt.plot(x, y1, label=r'$2 x_{1} + 6 x_{2}\leq 36$')
plt.plot(x, y2, label=r'$x_{1} + 3 x_{2}\leq 30$')
plt.plot(x, y3, label=r'$x_{1} + 2 x_{2}\leq 40$')
# plt.plot(x, y4, label=r'$x_{1}, x_{2}\geq 0$')
plt.xlim((0, 16))
plt.ylim((0, 11))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')

# Fill feasible region
y5 = np.minimum(0, 0)
y6 = np.maximum(y2, y3)
plt.fill_between(x, y1, y2, color='grey', alpha=0.5,
                interpolate=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

मैं नीचे दी गई छवि (y1, y2, y3 और शून्य के बीच) में लाल रंग में रची गई सामग्री को भरना चाहता हूंयहां छवि विवरण दर्ज करें

1
AGH 15 सितंबर 2020, 07:37

2 जवाब

सबसे बढ़िया उत्तर

आप शून्य और न्यूनतम तीन वक्रों के बीच भर सकते हैं:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 2000)
y1 = (36 - 2 * x) / 6
y2 = (30 - 5 * x) / 3
y3 = (40 - 8 * x) / 2

plt.plot(x, y1, label=r'$2 x_{1} + 6 x_{2}\leq 36$')
plt.plot(x, y2, label=r'$x_{1} + 3 x_{2}\leq 30$')
plt.plot(x, y3, label=r'$x_{1} + 2 x_{2}\leq 40$')
plt.xlim((0, 16))
plt.ylim((0, 11))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')

plt.fill_between(x, y1, y2, color='grey', alpha=0.5,
                 interpolate=True)
plt.fill_between(x, 0, np.min([y1, y2, y3], axis=0), color='red', alpha=0.5, hatch='//',
                 interpolate=True, label='$intersection$')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.tight_layout()
plt.show()

resulting plot

3
JohanC 15 सितंबर 2020, 09:28

ध्यान दें कि:

  1. np.vstack([y1, y2, y3]) आपके 3 "y" सरणियों से एक 3-पंक्ति सरणी बनाता है।

  2. ….min(0) प्रत्येक कॉलम के साथ न्यूनतम गणना करता है, इसलिए यह वास्तव में है आपके कम से कम 3 स्रोत सरणियाँ (उच्च x के लिए नकारात्मक मानों के साथ भी)।

  3. ….clip(min=0) उपरोक्त नकारात्मक तत्वों को 0 में बदल देता है।

तो अपने कोड में जोड़ें:

plt.fill_between(x, 0, np.vstack([y1, y2, y3]).min(0).clip(min=0),
    color='yellow', alpha=0.5, interpolate=True)

जैसे आपके पहले भरने_के बीच के बाद।

आपके डेटा के लिए, और उपरोक्त निर्देश के साथ कोड जोड़ा गया, मुझे मिला:

enter image description here

यदि आप चाहें, तो अपनी आवश्यकताओं के अनुरूप भरने वाले रंग को बदल दें।

2
Valdi_Bo 15 सितंबर 2020, 10:11