2016-03-31 7 views
0

Ich schreibe Code zum Summieren der Fourier-Serie, die von [-n, n] reicht. Allerdings habe ich Probleme mit der Iteration, wenn es zu n = 0 kommt. Ich habe eine 'if' Anweisung in meine while-Schleife geschrieben, damit sie sie ignorieren kann, aber es scheint, als ob sie es nicht ist. Hier ist mein Code:Python: While-Schleife - wie vermeide ich Division durch Null?

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() 

Ich will es eine Reihe von y-Werten für n iterieren und erstellen von einer negativen Zahl zu einem gewissen positiven Zahl im Bereich (etwa für n von [-10,10]), sondern als sobald es n = 0 trifft, scheint es den in die 'else' -Klausel einzufügen, obwohl ich möchte, dass es das verwendet, was in der 'if' -Klausel ist, was mir einen "ZeroDivisionError: complex division by zero" gibt. Wie behebe ich das?

Bearbeiten: Setzen Sie den gesamten Codeblock hier, damit Sie den Kontext sehen können.

+3

Es wäre wahrscheinlich hilfreich, wenn Sie den gesamten Code enthalten würden, der erforderlich ist, damit das Snippet tatsächlich ausgeführt wird und den Fehler durch Division durch Null erzeugt, den Sie sehen. – d512

+0

Ich habe das gerade gemacht, vielleicht wird das helfen. – Ferreroire

+1

Ihr Code funktioniert gut für mich – user5219763

Antwort

0

Dies ist nicht die eleganteste Art und Weise überhaupt, aber diese versuchen:

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) 
0

Der Koeffizient cn ist eine Funktion der n und sollte in jeder Schleife aktualisiert werden. Du hast es konstant gemacht (und sogar gleich 1/6 für positives n).

Die innere Schleife wie

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 

entsprechenden Koeffizienten für positive und negative Ns gleich sind und exp (ix) aussehen könnte - exp (-ix) = 2i sin (x), so dass es reduziert gut. (Überprüfen Sie die Berechnung.)