Dear all,

I am using the nlsLM function to fit a Lorentzian function to my experimental 
data.
The LM algorithm should allow to specify limits, but the upper limit appears 
not to work as expected in my code.
The parameter 'w', which is peak width at half maximuim always hits the upper 
limit if the limit is specified. I would expect the value to be in-between the 
upper and lower limit with maybe hitting either limit occasionally.

The code below calculates a lorentzian curve with some noise added that looks 
like a typical experimental spectrum. Then a fit is made to this data. Note 
that if 'w' in the upper limit is set to e.g 0.6, 0.7, or 0.8 the fit always 
hits this limit. If 'w'=Inf, the fit calculates to something around 0.06, which 
is correct.

Why does the fit go wrong if 'w' is not Inf?

library(minpack.lm)
#Create x axis
x<-seq(from=0.1,to=0.6,by=0.5/150)
#Simulate a function with noise
fu<-function(y0,A,w,xc,x){
  eq<-y0 + 2*A/pi*w/(4*(x-xc)^2+w^2)
  eq<-jitter(eq,factor=200)
  }
#Evaluate function aka Measured data
y<-fu(0,0.01,0.06,0.23,x)
data<-as.data.frame(cbind(x,y))

#Start values for fitting
st2<-data.frame(
  y0=0,
  A=0.0001,
  w=0.055,
  xc=0.28
)
#Fit function to data
fit<-nlsLM(y ~ y0 + 2*(A/pi)*w/(4*(x-xc)^2+w^2),
            control=nls.lm.control(
              factor=100,
              maxiter=1024,
              ftol = .Machine$double.eps,
              ptol = .Machine$double.eps
            ),
            data=data,
            na.action=na.exclude,
            start=st2,
            algorith='LM',
            lower=c(-0.0001,-1e-8,0.05,0.2),
            #upper=c(1e-6,0.003,0.08,0.35),
            upper=c(Inf,Inf,0.07,Inf),
            trace=F
)
#Predict fitting values
fity<-predict(fit,data$x)

plot(data$x,data$y)
lines(data$x,fity,col=2)
text(0.4,0.08,coef(fit)['y0'])
text(0.4,0.07,coef(fit)['A'])
text(0.4,0.06,coef(fit)['w'])
text(0.4,0.05,coef(fit)['xc'])

Best regard
Martin

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to