Как рассчитать распределение чисел данных в IDL - PullRequest
0 голосов
/ 12 июня 2018

У меня есть данные, состоящие из времени и потока (4117 строк x 2 столбца). Я хочу рассчитать и построить график распределения числа вариаций яркости между всеми парами двух последовательных точек данных, таких же, как на рисунке. Распределение вариации яркости.

Это код, который я использовал в idl

nx=4117
t=fltarr(nx)
f=fltarr(nx)
df=fltarr(nx-1)
dt=fltarr(nx-1)
n=4116
dff=fltarr(n)
dc=fltarr(n-1)

data=read_table('data.dat')
;print,data(0,*) ;this is t (time)
;print,data(1,*) ;this is f (flux)

; Plot the light curve

window,0
plot,data(0,*)/data(0,0),data(1,*)/data(1,0),yrange=[0.93,1.1],ystyle=1 

; calculate the flux difference (dff)

for i=0,nx-2 do begin
df(i)=data(1,i+1)/data(1,0) - data(1,i)/data(1,0)
dt(i)=data(0,i+1)/data(0,0) - data(0,i)/data(0,0)
endfor

for i=0,n-1 do dff(i)=min(df)+i*(max(df)-min(df))/float(n-1.0)

print,dff

; calculate the number distribution (dc), I want the counter to reset to zero after every point and start to count again

for i=0,n-2 do begin
c=0.0
for j=0,nx-2 do begin
IF (df(j) < dff(i+1)) or (df(j) > dff(i)) THEN begin
c=c+1
dc(i)=c
endif
endfor

print, dc(i)
endfor

end

, когда я запускаю код, все значение dc равно 4116.Я думаю, что способ, которым я рассчитал постоянный ток, неверен.Любое предложение сделать это правильно?

1 Ответ

0 голосов
/ 12 июня 2018

Я почти уверен, что проблема в этой строке:

IF (df(j) < dff(i+1)) or (df(j) > dff(i)) THEN begin

В IDL a < b является сокращением для "меньшего из a и b", а a > b также "для большегоа и б ".Итак, прямо сейчас ваш оператор IF на самом деле оценивается как:

IF (df(j) or dff(i+1), whichever is less) OR (df(j) or dff(i), whichever is more) THEN begin

, и поскольку ненулевые значения с плавающей точкой в ​​IDL оцениваются как TRUE, в конечном итоге это так:

IF TRUE or TRUE THEN begin

Поскольку оператор IFвсегда истинно, c всегда увеличивается, и каждое значение dc заканчивается 4116.

Чтобы исправить это, вы хотите использовать реляционные операторы LT и GT, которые возвращаютПравда или ложь.Другими словами, ваш код должен выглядеть так:

IF (df(j) LT dff(i+1)) or (df(j) GT dff(i)) THEN begin
...