2016-07-12 2 views
0

아래 코드를 실행하여 각 z 및 t에 대해 1 차원 배열을 만듭니다. 현재의 순간에, 나는 코드, intervalt 및 501.0 intervalz 동일, 모두를 실행할 때 그들은 각각 501Numpy linspace 예기치 않은 출력

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) 

의 길이를 가질 수 있도록 해당하는 자신의 크기를 만들려고 노력하지만,하고 모두 Z의 길이를 검사 할 때 t, len (z) = 500 인 반면 len (t) = 501입니다. 위의 코드를 사용하여 특정 부분을 수정하여 len (z) = 501을 얻었습니다. I 코드

zmax = int(zmax) 

후 렌 (z) = (501)을 삽입하지만 기록 정확하게 이유 초기 코드 궁금 예를 들어, 길이 (501)와 어레이 (Z)을 산출하지 않는다?

(I 파이썬 2.7을 사용하고 있습니다.)이 산술 부정확성을 떠 관련

+0

나는 501와 동일하지 않은 출력을 설명하는 intervalz = 500.99999999999994 수 (NgridtNgridz가 501으로 초기화되는 것을 알). 어쩌면 다음을 사용하십시오 : intervalz = np.ceil (zmax/dz + 1) –

+0

길이를 같게하려면 길이를 두 번 계산하는 이유는 무엇입니까? 당신은 단지 하나의 "간격"을 계산할 수 있으며 둘 다 사용할 수 있습니다. 왜 간격과 간격을 계산해야합니까? –

+1

이런 종류의 것들에서 Nikolas가 언급 한 부동 소수점 문제를 피하기 위해 항상 '1E-10'을 제한에 추가하는 것이 유용합니다. – zephyr

답변

0

때문에 설정하지 않는 이유가 표시되지 않습니다 말하기. intervalz에서 501을 빼면 아주 작은 음수 인 -5.68e-14를 찾을 수 있습니다. linspace는 그것의 정수 부분 즉, 500을 취하고 500-long 목록을 제공합니다. 코드와

공지 사항이 다른 문제 :

  1. dt 당신이 (dz에 대한 동일) 초기 t을 제거하지 않기 때문에
  2. NgridtNgridz 정수는 동안, 개념적있는 정확한 간격을 제공하지 않습니다 당신은 수레로 그들을 초기화합니다. 끝 부분의 점을 제거하면됩니다.

내가 당신의 코드를 작성하여 간단하게 할 수 있다고 생각

#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

나는 코드의 마지막 줄에 dz을 잊었 기 때문에 대답을 편집했습니다. –

0

. 따라서 intervalz의 수식은 500.99999999999994이됩니다. 이것은 단지 SO를 통해 찾을 수있는 부동 정확도 문제입니다. np.linspace 명령은이 숫자를 501이 아닌 500으로 취급합니다.

linspaceint을 예상하므로이 값을 지정하는 것이 좋습니다.

은 BTW : 수학적으로는 그것은 반올림의 문제가

intervalz = Ngridz + 1 

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