[Ifeffit] Fwd: problems with setting parameters in new Artemis (Demeter 0.9.16)

Bruce Ravel bravel at bnl.gov
Fri Feb 28 07:47:37 CST 2014

On 02/28/2014 07:52 AM, Cristina Alonso Escobar wrote:
> 1.- How can I restrain "a" ? I tried to  manually add a restraint, but I
> do not know how to make an interval restraint...( 0<a<1)
> 2.- If you select "restrain" and after in the math expression "build
> restrain from ..."
> What is the meaning of scale by?
> Why the program duplicate the restrain (i.e restrain- a and restrain-
> res_a - 1* penalty (a, 0, 1)?
> I think I am not doing well because the value of my parameter "a" is
> suspiciously always 0.

In Artemis and in Ifeffit, a "constraint" is a mathematical relation
between parameters.  A "restraint" is a math expression which is
evaluated and added in quadrature to chi-square when the fit is

The "penalty" function has this functional form:

    penalty(a, min, max) = 0      for min < a < max
    penalty(a, min, max) = a-max  for a > max
    penalty(a, min, max) = min-1  for a < min

This is useful as a restraint because it assesses no penalty in the
evaluation of chi-square when a is "well-behaved", i.e. between min
and max.  As a deviates from its range, the penalty increases linearly
by its excursion out of range.

This will serve the purpose of a restraint.  Since it is added in
quadrature to chi-square, it has no impact on chi-square as long as a
stays within range.  It can, however, leave its range so long as there
is a compensating improvement in the quality of the fit.

The "scale" term is needed because you want the restraint to be
significant on the scale of chi-square.  If the restraint is too
small, then the fit will not be sensitive to it and a will not be
encouraged to stay within its range.  If the restraint is too big,
then a will not be allowed out of range even if that would improve the
quality of fit.

As a rule of thumb, I find that the square root of chi-square in the
absence of the restraint is about the right size for the scaling
factor.  So if, chi-square without the restraint is 400,

    set      scale  = 20
    restrain my_res = scale * penalty(a, 0 , 1)

A few additional points:

  1. The restraint I described above is linear in its excursion out of
     bounds.  You can make it quadratic very simply:

       set      scale  = 20
       restrain my_res = scale * (penalty(a, 0 , 1))**2

  2. You don't have to use the penalty function.  Any expression can be
     a restraint and get added in quadrature to chi-square.  Here's a
     talk Matt gave many years ago in which he explains restraints very
     clearly.  At the end he also gives an example of restraint that
     does not use the penalty function.


  3. There is another way in Artemis (and Ifeffit) to set a boundary on
     a parameter value:

        guess b = 0.5
        def   a = max(0, min(1, b))

     This sets hard-wall boundaries on a.  This is not as attractive as
     you might think, however.  Because the boundaries are hard walls,
     if the fit is pushing the value beyond one of the walls, error
     bars can no longer be computed.  This is because values outside
     the hard-wall boundaries do not change the fit, thus the
     covarience matrix cannot be calculated, and error bars cannot be
     determined.  Restraints are an improvement on hard wall boundaries
     in that they allow error bars to be evaluated.  You can make a
     restraint behave somewhat like a hard wall by making the scaling
     factor large.

  4. You said "I think I am not doing well because the value of my
     parameter 'a' is suspiciously always 0."  I find that that sort of
     thing is usually trying to tell me something about my fit.  In
     your case, I would encourage you to think about how a is used in
     the fit.  You think that a should be bigger than 0, but perhaps
     the fit is trying to tell you either that your assumption is
     mistaken or that your fitting model has a mistake.  Just something
     to think about ....

  5. There is hope for better things on the horizon.  Larch has a much
     more robust way of restraining parameter values than does Ifeffit.


     Artemis is not ready to begin using Larch, but it will one of
     these days.  Then you will have access to much richer tools for
     defining fitting parameters.  Something to look forward to....


  Bruce Ravel  ------------------------------------ bravel at bnl.gov

  National Institute of Standards and Technology
  Synchrotron Science Group at NSLS --- Beamlines U7A, X24A, X23A2
  Building 535A
  Upton NY, 11973

  Homepage:    http://xafs.org/BruceRavel
  Software:    https://github.com/bruceravel

More information about the Ifeffit mailing list