Re: Fun with Int_tabulated.pro [message #68472] |
Mon, 02 November 2009 06:15 |
pgrigis
Messages: 436 Registered: September 2007
|
Senior Member |
|
|
On Oct 31, 10:12 am, Jeremy Bailin <astroco...@gmail.com> wrote:
> On Oct 30, 1:20 pm, wlandsman <wlands...@gmail.com> wrote:
>
>
>
>> I ran into a couple of gotchas with int_tabulated.pro this
>> morning, It performs numerical integration for the simple case:
>
>> IDL> x = findgen(5)
>> IDL> y = x^2
>> IDL> print,int_tabulated(x,y)
>> 21.3333
>
>> But if one has flipped both vectors (say while converting wavelength
>> to frequency), then -- even though a plot of the two vectors looks
>> exactly the same -- int_tabulated gives a different answer.
>
>> IDL> x = reverse(x) & y = reverse(y)
>> IDL> print,int_tabulated(x,y)
>> 42.3619
>
>> A closer look at the int_tabulated documentation tells us that if X if
>> not monotonic increasing, then one needs to set the /SORT keyword.
>> So now we follow the documentation:
>
>> IDL> print,int_tabulated(x,y,/sort)
>> 21.3333
>
>> and get the right answer again. But as the documentation also "sort"
>> of warns
>> you, setting the /SORT keyword reorders the input X and Y variables.
>> This is
>> probably not a problem unless one has modified the Y vector on the fly
>> by
>> some factor f
>
>> f = findgen(5) + 0.5
>> print,int_tabulated(x, y*f,/sort)
>
>> Upon output, the X vector has been sorted, but the Y vector has not,
>> since it
>> was passed as part of a temporary variable y*f. So one has lost
>> the one to
>> one correspondence between X and Y, screwing up all subsequent
>> processing.
>
>> --Wayne
>
> It looks ridiculous, but here's a workaround:
>
> print, int_tabulated(x+0, y*f, /sort)
I was looking at that thinking - yes, I see why that would help...
I feel an IDL hangover coming up :)
Ciao,
Paolo
Hint for the less addicted: issue help,x and
help,x+0 to see the subtle difference
>
> -Jeremy.
|
|
|
Re: Fun with Int_tabulated.pro [message #68485 is a reply to message #68472] |
Sat, 31 October 2009 08:12  |
Jeremy Bailin
Messages: 618 Registered: April 2008
|
Senior Member |
|
|
On Oct 30, 1:20 pm, wlandsman <wlands...@gmail.com> wrote:
> I ran into a couple of gotchas with int_tabulated.pro this
> morning, It performs numerical integration for the simple case:
>
> IDL> x = findgen(5)
> IDL> y = x^2
> IDL> print,int_tabulated(x,y)
> 21.3333
>
> But if one has flipped both vectors (say while converting wavelength
> to frequency), then -- even though a plot of the two vectors looks
> exactly the same -- int_tabulated gives a different answer.
>
> IDL> x = reverse(x) & y = reverse(y)
> IDL> print,int_tabulated(x,y)
> 42.3619
>
> A closer look at the int_tabulated documentation tells us that if X if
> not monotonic increasing, then one needs to set the /SORT keyword.
> So now we follow the documentation:
>
> IDL> print,int_tabulated(x,y,/sort)
> 21.3333
>
> and get the right answer again. But as the documentation also "sort"
> of warns
> you, setting the /SORT keyword reorders the input X and Y variables.
> This is
> probably not a problem unless one has modified the Y vector on the fly
> by
> some factor f
>
> f = findgen(5) + 0.5
> print,int_tabulated(x, y*f,/sort)
>
> Upon output, the X vector has been sorted, but the Y vector has not,
> since it
> was passed as part of a temporary variable y*f. So one has lost
> the one to
> one correspondence between X and Y, screwing up all subsequent
> processing.
>
> --Wayne
It looks ridiculous, but here's a workaround:
print, int_tabulated(x+0, y*f, /sort)
-Jeremy.
|
|
|