Python: While 循环 - 如何避免被零除?
Python: While loop - how do I avoid division by zero?
我正在编写代码来求和 [-n,n] 范围内的傅里叶级数。但是,当它到达 n = 0 时,我在迭代时遇到了麻烦。我在我的 while 循环中写了一个 'if' 语句,所以它可以忽略它,但它似乎不是。这是我的代码:
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()
我希望它迭代并为 n 创建一个 y 值数组,范围从某个负数到某个正数(比如 n 来自 [-10,10]),但是一旦它命中 n = 0 它似乎将其插入 'else' 子句,即使我希望它使用 'if' 子句中的内容,给我一个 "ZeroDivisionError: complex division by zero"。我该如何解决这个问题?
编辑:将整个代码块放在此处以便您可以看到上下文。
这根本不是最优雅的方式,但试试这个:
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)
系数cn
是n
的函数,应该在每个循环中更新。您将其设为常数(对于正 n 甚至等于 1/6)。
内部循环可能看起来像
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的对应系数相等,exp(ix) - exp(-ix) = 2i sin(x),所以它很好地减少了。 (仔细检查计算。)
我正在编写代码来求和 [-n,n] 范围内的傅里叶级数。但是,当它到达 n = 0 时,我在迭代时遇到了麻烦。我在我的 while 循环中写了一个 'if' 语句,所以它可以忽略它,但它似乎不是。这是我的代码:
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()
我希望它迭代并为 n 创建一个 y 值数组,范围从某个负数到某个正数(比如 n 来自 [-10,10]),但是一旦它命中 n = 0 它似乎将其插入 'else' 子句,即使我希望它使用 'if' 子句中的内容,给我一个 "ZeroDivisionError: complex division by zero"。我该如何解决这个问题?
编辑:将整个代码块放在此处以便您可以看到上下文。
这根本不是最优雅的方式,但试试这个:
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)
系数cn
是n
的函数,应该在每个循环中更新。您将其设为常数(对于正 n 甚至等于 1/6)。
内部循环可能看起来像
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的对应系数相等,exp(ix) - exp(-ix) = 2i sin(x),所以它很好地减少了。 (仔细检查计算。)