Python: While loop - how do I avoid division by zero?
我正在编写用于求和[-n,n]范围的傅里叶级数的代码。 然而,当它到达n = 0时我遇到麻烦。我在while循环中写了一个'if'语句,所以它可以忽略它,但似乎不是。 这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | from __future__ import division import numpy as np import math import matplotlib.pyplot as plt #initial values ni = -10 nf = 10 ti = -3 tf = 3 dt = 0.01 yi = 0 #initial f(t) value j = complex(0,1) #initialization tarray = [ti] yarray = [yi] t = ti n = ni y = yi cn = 1/(8*(np.pi)**3*n**3*j**3)*(j*4*np.pi*n) #part (b) #iterating loop while t<tf: n = ni y = yi while n<nf: if n == 0: cn = 1/6 y += cn n += 1 else: y += cn*np.exp(j*np.pi*n*t) n += 1 yarray.append(y) t+=dt tarray.append(t) #converting list-array tarray = np.array(tarray) yarray = np.array(yarray) #plotting plt.plot(tarray,yarray, linewidth = 1) plt.axis("tight") plt.xlabel('t') plt.ylabel('f(t) upto n partial sums') plt.title('Fourier Series for n terms') plt.legend() plt.show() |
我希望它迭代并创建一个y值的数组,范围从一些负数到一些正数(比如来自[-10,10]的n),但是一旦它达到n = 0,它似乎是 将其插入'else'子句即使我希望它使用'if'子句中的内容,给我一个"ZeroDivisionError:复杂除零"。 我该如何解决?
编辑:将整个代码块放在此处,以便您可以查看上下文。
系数
内环可能看起来像
1 2 3 | y = 1/6 # starting with n = 0 for n in range(1,nf): y -= 1/(2*np.pi*n)**2 * np.sin(np.pi*n*t) # see below |
正n和负n的对应系数是相等的并且exp(ix) - exp(-ix)= 2i sin(x),所以它很好地减少了。 (仔细检查计算。)
这不是最优雅的方式,但尝试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | while t<tf: n = ni y = yi while n<nf: try: 1/n cn = 1/6 y += cn n += 1 except ZeroDivisionError: y += cn*np.exp(j*np.pi*n*t) #1/n*np.sin(n*t) n += 1 yarray.append(y) t+=dt tarray.append(t) |