[Ifeffit] Purple & Red E Derivatives

Matthew Marcus mamarcus at lbl.gov
Tue Feb 22 21:42:46 CST 2011


Should the line
        out[i] = (x[i+1] - x[i])/2.0
be
        out[i] = (x[i+1] - x[i-1])/2.0  ?

That would account for the 2.0.  That is, in fact, exactly what I proposed was meant by 'numerical differential'.

I don't actually resample.  I do a cubic spline interpolation onto the given grid and pull the derivatives out that way.  Of course, 
you have to test for
grids that aren't strictly monotonic.  The smooth() function as given would definitely cause problems with non-uniform tabulation 
unless resampled.
My program (2-column Editor on the ALS Beamline 10.3.2 website) offers resampling and tensioned spline fitting but does not smooth 
the derivative
before or after - the user has to take control of that using the tensioned spline fit.  I thought about smoothing but never got 
around to figuring out what makes
a decent smooth algorithm for general data.  A possibility would be a slow version of Savitzky-Golay in which you do the polynomial 
fits explicitly instead of
being able to use pre-computed coefficients as in the actual S-G method.  Similarly, a VSFT (Very Slow Fourier Transform) in which 
you fit the data to
a sum of sines and cosines (linear fit - the frequencies are fixed), filter using your favorite low-pass filter, then 
inverse-transform, might be good.  Or, there's
always reading the literature to see what actual numerical mathematicians have done :-)

There are two obvious ways to get non-uniform tabulation in XAS data.  One is that it's taken on a varying grid, either 
constant-k-step or varying E step.  The
other is that pieces have been chopped out due to glitches, Bragg peaks or some other problem.  Also, the 2-column Editor program 
was designed to be general,
not restricted to XAS-like data.
    mam
----- Original Message ----- 
From: "Matt Newville" <newville at cars.uchicago.edu>
To: "XAFS Analysis using Ifeffit" <ifeffit at millenia.cars.aps.anl.gov>
Sent: Tuesday, February 22, 2011 5:28 PM
Subject: Re: [Ifeffit] Purple & Red E Derivatives


Hi Bruce, Matthew,

Oh, deriv() (and smooth()) are not nearly as sophisticated as what
Matthew suggests.  They are simply applied to a single array,
sequentially, without regard to "the x axis"  (as, in fact, it does
not know what x might be):

Deriv would translate (sorry for the python) to
def deriv(x):
    npts = len(x)
    out  = array(npts)
    out[0] = x[1] - x[0]
    out[npts-1] = x[npts-1] - x[npts-2]
    for i in range(1, npts-2):  # (1, 2, 3, ... npts-2)
        out[i] = (x[i+1] - x[i])/2.0

    return out

and Smooth:
def smooth(x):
    npts = len(x)
    out  = array(npts)
    out[0] = 0.75*x[0] + 0.25 * x[1]
    out[npts-1] = 0.75*x[npts-1] + 0.25 * x[npts-2]
    for i in range(1, npts-2): # (1, 2, 3, ... npts-2)
        out[i] = 0.5*x[i] + 0.25*x[i+1] + 0.25*x[i-1]

    return out

Like Matthew suggests, interpolating onto a finer, uniform x (energy)
grid and then taking the derivative might be a better approach, at
least for data which needs smoothing.

--Matt



On Wed, Feb 23, 2011 at 8:46 AM, Bruce Ravel <bravel at bnl.gov> wrote:
> On Tuesday, February 22, 2011 06:19:16 pm Matthew Marcus wrote:
>> > The numerical derivative
>> > is computed as the numerical differential of the mu(E) spectrum
>> > divided by the numerical differential of the energy array. Ã, Smoothing
>> > happens as explained above. Ã, Justw atch the lines that get printed to
>> > the buffer when you click the plot buttons. - B. Ravel
>>
>> I wonder if that's the right way to go for data that, for instance, might
>> have gaps or changes in step size. Ã, What I do in my code is run a cubic
>> spline through the data, with the abscissa as is,
>> then take the derivative of that spline. Ã, Thus, if the data is smooth
>> enough to be locally approximated by a cubic, the derivative will come out
>> smooth regardless of how it's tabulated. Ã, I'm not
>> sure that's the case with Bruce's algorithm. Ã, Is the 'numerical
>> differential' the difference E(i+1)-E(i) or (1/2)*(E(i+1)-E(i-1)) or some
>> form that's intended to approximate dE(i)/di (i= point index)?
>>
>> It's not clear to me whether it's any more correct to do smoothing before
>> or after differentiating. Ã, You can take the red pill or the blue pill :-)
>> Ã, Ã, mam
>
> Well ... red pill or purple pill. Ã, They both have side effects that 4
> out of 5 doctors advise against :)
>
> So, I do what's easy using Ifeffit as Ifeffit is implemented. Ã, I would
> have to code dive (or ask Matt) what the deriv() function actually
> does.
>
> A big gap in the data might result in a weird derivative spectrum, but
> changes in step size isn't so much of a problem because I ask Ifeffit
> to compute d(mu)/d(E).
>
> I agree that "smooth then differentiate" is not obviously better than
> "differentiate then smooth". Ã, What is certainly wrong is to do this
> inconsistently.
>
> B
>
>
> --
>
> Ã, Bruce Ravel Ã, ------------------------------------ bravel at bnl.gov
>
> Ã, National Institute of Standards and Technology
> Ã, Synchrotron Methods Group at NSLS --- Beamlines U7A, X24A, X23A2
> Ã, Building 535A
> Ã, Upton NY, 11973
>
> Ã, My homepage: Ã, Ã, http://xafs.org/BruceRavel
> Ã, EXAFS software: http://cars9.uchicago.edu/~ravel/software/exafs/
> _______________________________________________
> Ifeffit mailing list
> Ifeffit at millenia.cars.aps.anl.gov
> http://millenia.cars.aps.anl.gov/mailman/listinfo/ifeffit
>
>

_______________________________________________
Ifeffit mailing list
Ifeffit at millenia.cars.aps.anl.gov
http://millenia.cars.aps.anl.gov/mailman/listinfo/ifeffit




More information about the Ifeffit mailing list