我的家庭作业让我编写了一个代码,用泰勒教科书模拟经典力学中的数字。数字和如果有人有兴趣知道。
我能够重现其中一个,这是下面的代码(对于我实际上遇到问题的代码可能是很好的参考):
<impact_categories>
<impact_category>
<name>Cat1</name>
<impact_levels>
<impact_level>
<name>Insignificant</name>
</impact_level>
</impact_levels>
</impact_category>
<impact_category>
<name>Cat2</name>
<impact_levels>
<impact_level>
<name>Lowest</name>
</impact_level>
</impact_levels>
</impact_category>
<impact_category>
<name>Cat3</name>
<impact_levels>
<impact_level>
<name>Insignificant</name>
</impact_level>
</impact_levels>
</impact_category>
</impact_categories>
这是第二张图片的代码似乎不起作用。而且我不确定为什么。任何帮助,将不胜感激。这个数字没有图,我不确定为什么。
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()
答案 0 :(得分:0)
您的代码无法正常运行。
当你想要x和y的数组时,你会用标量值重复调用plt.plot
:很难用一行只绘制一个点。
试试这个,你会看到你会得到一个空图:
plt.plot(0,1)
plt.show();
我不知道这是不是你最终要找的东西,但这是一个可以至少用作起点的工作版本。请注意,我更改了i上的循环:而不是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()
答案 1 :(得分:0)
我偶然发现了这个一年的帖子,并意识到对OP报告的问题有一个简单的答案。
缺少的是标记参数。
将plot(r,x,'k')
替换为plot(r,x,'.',color='k')
,然后突然显示分叉图。
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()
后一个代码使用
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