您可以看到下面的回圈,它每次都會給出不同的圖,大約 20 次運行中有 1 次是我想要的結果,這是一個三角形傅里葉級數。如何讓它每次的結果都是一樣的?
L=1
N=1000
#Array for x
x=np.linspace(-3*L,3*L,N 1)
#Array for sum
s=np.empty(N 1)
#While loop for sum
i=1
while(i<N 1):
s=(1/((2*i-1)**2))*(np.cos((2*i-1)*np.pi*x/L)) s
i=i 1
print(s)
#f(x)
y=(L/2)-(4*L/((np.pi)**2))*s
#Settings for plot
plt.plot(x,y)
uj5u.com熱心網友回復:
這條線
s=np.empty(N 1)
生成一個填充有未定義(任意)值的陣列。您應該使用一個用零填充的新陣列:
s=np.zeros(N 1)
uj5u.com熱心網友回復:
正如所指出的那樣,這np.empty會給您帶來問題。您的回圈初始列印為s:
In [26]: L=1
...: N=10
...:
...: #Array for x
...: x=np.linspace(-3*L,3*L,N 1)
...: #Array for sum
...: s=np.empty(N 1)
...: print(s)
...: i=1
...: while(i<N 1):
...: s=(1/((2*i-1)**2))*(np.cos((2*i-1)*np.pi*x/L)) s
...: i=i 1
...:
[-3. -2.4 -1.8 -1.2 -0.6 0. 0.6 1.2 1.8 2.4 3. ]
In [27]: s
Out[27]:
array([-4.20872131, -2.15330145, -1.06005191, -1.93994809, -0.84669855,
1.20872131, 0.35330145, 0.46005191, 2.53994809, 2.64669855,
1.79127869])
同樣的事情,但有np.zeros:
In [28]: L=1
...: N=10
...:
...: #Array for x
...: x=np.linspace(-3*L,3*L,N 1)
...: #Array for sum
...: s=np.zeros(N 1)
...: print(s)
...: i=1
...: while(i<N 1):
...: s=(1/((2*i-1)**2))*(np.cos((2*i-1)*np.pi*x/L)) s
...: i=i 1
...:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
In [29]: s
Out[29]:
array([-1.20872131, 0.24669855, 0.73994809, -0.73994809, -0.24669855,
1.20872131, -0.24669855, -0.73994809, 0.73994809, 0.24669855,
-1.20872131])
但是你不需要迭代。而是創建i值范圍,并構造一個二維結果(廣播 (11,1)x對 (10,) i:
In [30]: i = np.arange(1,N 1)
In [31]: S = (1/((2*i-1)**2))*(np.cos((2*i-1)*np.pi*x[:,None]/L))
In [32]: S.shape
Out[32]: (11, 10)
In [33]: s.shape
Out[33]: (11,)
然后在i維度上求和:
In [34]: S.sum(axis=1)
Out[34]:
array([-1.20872131, 0.24669855, 0.73994809, -0.73994809, -0.24669855,
1.20872131, -0.24669855, -0.73994809, 0.73994809, 0.24669855,
-1.20872131])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473871.html
標籤:Python 麻木的 matplotlib while循环
上一篇:如何防止pip自動安裝支持包?
