我必须绘制两张图表。问题:
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.
总而言之,我认为这是一个解决这个问题的混乱方法,但是我不知道如何干净利落地做到这一点。
结果应该是这样的,我的同学:
答案 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()
这将基本上生成x1
,x2
值的2d网格,然后根据条件检查每对。那些未通过测试的人将被丢弃,因此我们只保留正确的x1
,x2
,f1
,f2
值。然后我们只是绘制它们。
我的输出:
您的预期输出:
差异源于这样一个事实,即预期输出最多绘制为x2=0.5
,而我使用的整个范围最高为x2=1
。