2015-11-16 33 views
1

我必須繪製兩個圖表。問題:繪製幾個Y值vs X

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

限制:

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

我要繪製兩個圖表所有可能的值。 1 - x1與x2; 2 - f1與f2。 對於限制x2 < = x1和x1 < = 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

+0

我建議熟悉'numpy'。例如,你可以調用'numpy.linspace(0,1,1000)'產生'x1'(儘管它也會包含'1000')。 'pValues11'也一樣。我不確定你實際想要達到什麼,但是你可以將'x2'轉換成'numpy'二維數組(即矩陣),並繪製每個'x2'與'x1'的列:'plot(x1,numpy .array(×2))'。對於所有這些,你必須首先「輸入numpy」。我相信你當前的代碼會產生大量的零,因爲'python'默認使用整數除法,所以'999/1000 == 0'。 –

+0

澄清我想達到的目標 - http://i.imgur.com/FlRNgSF.jpg –

+0

您確定沒有任何限制嗎?或者你的規格是正確的?首先你說'x2

回答

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值,然後根據條件檢查每一對。那些不合格的測試將被丟棄,所以我們只保留正確的x1,x2,f1,f2值。然後我們只是繪製它們。

我的輸出:

x2 vs x1f2 vs f1

你的預期輸出:

expected

的差異的事實,預期的輸出被繪製高達x2=0.5出現了,我用的全程可達x2=1

+0

謝謝!該死的優雅 –