绘制几个Y值与X的关系

时间:2015-11-16 23:26:25

标签: python matplotlib plot

我必须绘制两张图表。问题:

f1 = x1*(x2-1)
f2 = x1^2+x2^2

限制:

x2 <= x1
x1 <= x2*4
0 <= x1 <= 1
0 <= x2 <= 1

我必须在两个图表中绘制所有可能的值。 1 - x1 vs x2; 2 - f1 vs f2。 对于x2&lt; = x1和x1&lt; = x2 * 4的限制,我提出了x2<=x1<=x2*4,因此编码更容易。

我尝试创建一个可以创建x1和x2的小代码,但遗憾的是没有运气。

x1 = []
for n in range(1,1000,1):
   x1.append(n/1000) #Couldn't find a better solution to create a list between 0 and 1

pValues11 = []
for n in range(1,10000,1):
   pValues11.append(n/10000)

x2 = []
for index,n in enumerate(x1):
   x2.append([])
   for m in pValues11:
      if n <= m and m <= 4*n:
        x2[index].append(m)

x2创建列表列表,而x1就像索引一样。但是,如果我试图绘制它们:

plt.plot(x1,x2,'bo')
plt.show()

我收到ValueError: setting an array element with a sequence.

总而言之,我认为这是一个解决这个问题的混乱方法,但是我不知道如何干净利落地做到这一点。

结果应该是这样的,我的同学:

enter image description here

1 个答案:

答案 0 :(得分:0)

以下是基于numpy的解决方案:

import numpy as np
import matplotlib.pyplot as plt

x1=np.linspace(0,1,1000)
x2=np.linspace(0,1,1000)[:,None]

#f1=x1*(x2-1)
#f2=x1**2+x2**2

inds=(x2<=x1) & (x1<=4*x2)

x1new=(x1+np.zeros(x2.shape))[inds]
x2new=(x2+np.zeros(x1.shape))[inds]
#f1new=f1[inds]
#f2new=f2[inds]
f1new=x1new*(x2new-1)
f2new=x1new**2+x2new**2

plt.figure()
plt.scatter(x1new,x2new)
plt.xlabel(r"$x_1$")
plt.ylabel(r"$x_2$")

plt.figure()
plt.scatter(f1new,f2new)
plt.xlabel(r"$f_1$")
plt.ylabel(r"$f_2$")

plt.show()

这将基本上生成x1x2值的2d网格,然后根据条件检查每对。那些未通过测试的人将被丢弃,因此我们只保留正确的x1x2f1f2值。然后我们只是绘制它们。

我的输出:

x2 vs x1 f2 vs f1

您的预期输出:

expected

差异源于这样一个事实,即预期输出最多绘制为x2=0.5,而我使用的整个范围最高为x2=1