2016-07-12 8 views
0

Ich verwende den folgenden Code, um ein eindimensionales Array für jedes z und t zu erstellen. Im gegenwärtigen Augenblick, ich versuche, ihre Größe äquivalent zu machen, so dass sie jeweils eine Länge von 501. habenNumpy linspace unerwartete Ausgabe

import numpy as np 

#constants & parameters 
omega = 1. 
eps = 1. 
c = 3.*(10.**8.) 
hbar = 1. 
eta = 0.01 
nn = 10.**7. 
n = eta*nn 

lambdaOH = c/(1612.*10.**(6.)) 
gamma = 1.282*(10.**(-11.)) 
Tsp = 1./gamma 
TR = 604800. 
L = (Tsp/TR)*(np.pi)/((3.*(lambdaOH**2.))*n) 

#time 
Ngridt = 500. 
tmax = 1. 
dt = tmax/Ngridt 
intervalt = tmax/dt + 1 
t = np.linspace(0.01,tmax,intervalt) 

#z space 
Ngridz = 500. 
zmax = L 
dz = zmax/Ngridz 
intervalz = zmax/dz + 1 
z = np.linspace(0.01,zmax,intervalz) 

Wenn der Code ausgeführt wird, sowohl intervalt und IntervalZ gleich 501,0, aber bei der Überprüfung der Länge der beiden z und t, len (z) = 500 während len (t) = 501. Ich habe mit dem obigen Code herumgespielt, um len (z) = 501 zu ergeben, indem ich bestimmte Teile modifiziere. Zum Beispiel, wenn ich den Code

zmax = int(zmax) 

dann len (z) = 501. Aber ich frage mich, warum den ursprünglichen Code einfügen, genau wie geschrieben, nicht nachgibt eine Array z mit der Länge 501?

(Ich verwende Python 2.7.)

+0

I IntervalZ = 500,99999999999994 bekommen, was zu 501 nicht gleich ist und erklärt die Ausgabe. Vielleicht verwenden Sie: intervalz = np.ceil (zmax/dz + 1) –

+0

Wenn Sie möchten, dass die Länge gleich ist, warum berechnen Sie dann die Länge zweimal? Sie können nur ein "Intervall" berechnen und es für beide verwenden? Warum sollten Intervallz und Intervallt berechnet werden? –

+1

Ich habe in diesen Arten von Dingen gefunden, es ist immer nützlich, ein '1E-10' zu Ihren Grenzen hinzuzufügen, um die von Nikolas angemerkten Fließkomma-Probleme zu vermeiden. – zephyr

Antwort

0

Es ist ein Problem der Rundung. Wenn Sie versuchen, 501 von intervalz zu subtrahieren, finden Sie eine sehr kleine negative Zahl, -5,68e-14; linspace nimmt nur den ganzzahligen Teil davon, das heißt 500, und stellt eine 500-lange Liste bereit.

Hinweis zwei weitere Probleme mit Ihrem Code:

  1. dt den richtigen Abstand nicht liefern, da Sie die anfänglichen t (gleich für dz) nicht entfernen
  2. Ngridt und Ngridz sind konzeptionell ganze Zahlen sind, während Sie initialisieren sie als Schwimmer. Entfernen Sie einfach den Punkt am Ende.

Ich denke, dass der Code durch das Schreiben vereinfacht werden könnte (man beachte, dass Ngridt und Ngridz-501 initialisiert)

#time 
Ngridt = 501 
tmax = 1. 
t, dt = np.linspace(0.01,tmax,Ngridt,retstep=True) 

#z space 
Ngridz = 501 
zmax = L 
z, dz = np.linspace(0.01,zmax,Ngridz,retstep=True) 
+0

Ich habe die Antwort bearbeitet, weil ich dz in der letzten Zeile des Codes vergessen habe. –

0

Dieser Zusammenhang ist arithmetische Ungenauigkeit zu schweben. Es kommt vor, dass die Formel für intervalz500.99999999999994 ergibt. Dies ist nur schwimmende Genauigkeit Problem können Sie überall in SO finden. Der np.linspace Befehl nimmt dann diese Nummer als 500 und nicht als 501.

Da linspace einen int erwartet, ist es besser, sicherzustellen, dass Sie es geben. BTW

: mathematisch gesprochen Ich sehe nicht, warum Sie nicht

gesetzt haben
intervalz = Ngridz + 1 

seit intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1

Verwandte Themen