2016-12-02 79 views
-1

我的家庭作業讓我寫一個代碼,模擬泰勒教科書在經典力學中的數字。如果有人有興趣知道,請撥打12.4012.41分岔圖沒有繪圖/劇情只是沒有出現

我能夠重現他們中的一個是下面的代碼(這可能是我確實遇到問題的代碼很好的參考):

import nympy as np 
import matplotlib.pyplot as plt 

# We need to calculate the first fixed point 
r1=np.array(np.arange(0,4,0.09)) 
x1 = np.zeros((len(r1),1)) 

# Now calculating the second fixed point 
r2=np.array(np.arange(1,4,0.1)) 
x2 = (r2 -1)/r2 

# Now finding when the fixed points split up again 
r3=np.array(np.arange(3,4,0.1)) 
y1 = (((r3**2 - 2*r3 - 3)**0.5) + 1 + r3)/(2*r3) 
y2 = ((-(r3**2 - 2*r3 - 3)**0.5) + 1 + r3)/(2*r3) 

# Now finding the experimental values for 1/2 of a split 
x3 = [] 
for r in np.arange(0,4,0.09): 
    x = 0.666 
    for i in range(100): 
     x = (r**2) * x * (1.0 -x) - (r**3) * (x**2)*((1-x)**2) 
    x3.append(x) 

# Doing the same as above second 1/2 
x4 = [] 
for r in np.arange(0,4,0.09): 
    x = 0.8 
    for i in range(100): 
     x = (r**2) * x * (1.0 -x) - (r**3) * (x**2)*((1-x)**2) 
    x4.append(x) 

plt.plot(r1,x3,'bo', label='Experimental') 
plt.plot(r1,x4,'bo') 
plt.plot(r3,y2,'k-') 
plt.plot(r3,y1,'k-') 
plt.plot(r1,x1,'k-', label='Theoretical') 
plt.plot(r2,x2,'k-') 
plt.legend(loc=2) 
plt.show() 

,這裏是第二圖像的代碼這似乎並不奏效。我不知道爲什麼。任何幫助,將不勝感激。這個數字只是沒有繪製,我不知道爲什麼。

import numpy as np 
import matplotlib.pyplot as plt 

for r in n.arange(2.8,4,0.01): 
    x = 0.5 
    for i in range(150): 
     x = r*x*(1-x) 
     if i >= 125: 
      plt.plot(r,x,'k') 
plt.xlim (2.8,4) 
plt.show() 
+0

歡迎所以堆棧溢出。請閱讀[如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)。另外,請粘貼您的代碼,而不是插入圖片。在帖子中有一個「{}」按鈕,可以將所有內容縮進四個空格,並顯示爲代碼 –

+0

您是否在使用IPython筆記本? – Xevaquor

回答

0

有一個很好的理由你的代碼不工作。

當一個數組預期用於x和y時,您使用標量值重複調用plt.plot:僅用一個點繪製一條線是相當困難的。 試試這個,你會看到你會得到一個空的情節:

plt.plot(0,1) 
plt.show(); 

我不知道如果這是你在找什麼,最終,但這裏有一個工作版本,你可以爲至少使用初始點。請注意,我改變了循環的我:與其做i in range(150)其次是if i >=125,更好的只是i in range(125,150),你會避免不必要的重複:

fig, ax = plt.subplots(nrows=1, ncols=1) 
r1 = [] 
x1 = [] 
for r in np.arange(2.8,4,0.01): 
    x=0.5 
    # Instead of range(150) then checking if i >= 125... 
    for i in range(125,150): 
     x = r*x*(1-x) 
     r1.append(r) 
     x1.append(x) 

ax.plot(r1,x1,'k') 
plt.show() 

Result graph

0

我偶然發現了這個一歲後和意識到對OP報告的問題有一個簡單的答案。

缺失的位是標記的說法。

plot(r,x,'k')替換爲plot(r,x,'.',color='k')並且突然顯示分叉圖。

Bifurcation for logistic regression

import numpy as np 
import matplotlib.pyplot as plt 

plt.figure() 
for r in n.arange(2.8,4,0.01): 
    x = 0.5 
    for i in range(150): 
     x = r*x*(1-x) 
     if i >= 125: 
      plt.plot(r,x,'.',color='black',markersize=2) 
plt.xlim (2.8,4) 
plt.show() 

此代碼是好的,但相當低效。撥打plot()只需要一次。

plt.figure() 
def mark(r,x,diagram,v): 
    N,M = np.shape(diagram) 
    rmin,rmax = r[0],r[-1] 
    for (i,j) in zip(r,x): 
     nx = int(j*(M-1)) 
     nr = int((i-rmin)/(rmax-rmin)*(N-1)) 
     diagram[nx,nr] = v 

r = np.arange(2.8,4,0.01) 
diagram = np.zeros((200,200)) 
x0 = 0.5 
x = np.ones_like(r)*x0 
for i in range(150): 
    x = np.multiply(np.multiply(r,x),(1-x)) 
    if i >= 125: 
     mark(r,x,diagram,1) 

plt.imshow(np.flipud(diagram), extent=[r[0],r[-1],0,1], 
      aspect=(r[-1]-r[0]),cmap=plt.cm.Greys) 
plt.show() 

Another bifurcation diagram

後者代碼使用

CPU times: user 224 ms, sys: 29 µs, total: 224 ms 
Wall time: 261 ms 

雖然前者代碼效率不高花費更長的時間超過30次

CPU times: user 8.59 s, sys: 91.7 ms, total: 8.68 s 
Wall time: 8.68 s