I am trying to fit an exponential fit to some data... I have tried using Nlinfit but don't seem to be getting anywhere
nlmodel=@(b,time_bbdom)b(1)+b(2)*exp(-b(3)*time_bbdom(:,1));
beta0=[0;1;0.1];
mdl=nlinfit(time_bbdom,lum_bbdom,nlmodel,beta0);
I think the problem is my starting conditions beta0... How do I choose these variables? the error i get is Error using nlinfit>checkFunVals (line 612) The function you provided as the MODELFUN input has returned Inf or NaN values.
Error in nlinfit>LMfit (line 559) if funValCheck && ~isfinite(sse), checkFunVals(r); end
Error in nlinfit (line 276) [beta,J,~,cause,fullr] = LMfit(X,yw, modelw,beta,options,verbose,maxiter); Can anyone point me in the right direction? I would have thought its quite easy but i am not finding the documentation particularly helpful....

 Akzeptierte Antwort

Star Strider
Star Strider am 13 Nov. 2015

1 Stimme

If the values of ‘time_bbdom(:,1)’ are large enough, the ‘exp(-b(3)*time_bbdom(:,1))’ term will be zero, causing the Inf error. Without knowing more, one way to avoid this could be to set the initial value of ‘b(3)’ to ‘max(time_bbdom(:,1))/10’ or some such. You may have to experiment to get the result you want.

7 Kommentare

Matthew
Matthew am 13 Nov. 2015
Ok thanks very much... just getting warnings now so thats some progress =] I will experiment a bit
Star Strider
Star Strider am 13 Nov. 2015
My pleasure.
What are the warnings?
Matthew
Matthew am 15 Nov. 2015
I am getting warnings about the jaconbian having values very close to zero
Star Strider
Star Strider am 15 Nov. 2015
No worries, unless the fit is not the best. A Jacobian with values close to zero means that nlinfit has encountered a minimum. This is good if the errors are low (because it means you have likely found the global minimum), but if the errors are higher than you would expect them to be at convergence, you may want to experiment with different initial parameter estimates. If you have the Global Optimization Toolbox, the simplest genetic algorithm implementation is the best way I know of to find the global minimum to your function. With noisy data, you likely cannot reduce the errors significantly even with the ‘correct’ parameter estimates.
Matthew
Matthew am 16 Nov. 2015
Hi Yes the fit is terrible ha.. I do have access to GOT but i have never used it. I will look into it. Thanks for your help.. Ill post back here if I run into anymore problems
Matthew
Matthew am 17 Nov. 2015
Ok so i am still struggling... I essentially want to fit an exponential decay with a variable constant added (like above) which will all be done in a loop over many files... so I can't really input the initial values manually.. The x values range from 0 to about 1...
What is the best way to go about doing this? I initially tried taking the log and fitting with polyfit (it worked well) but I need to include this free variable that adds to exponential (the b(1)) mentioned above...is there a way i can do this with polyfit for example?
Star Strider
Star Strider am 17 Nov. 2015
The easiest way I can think of to estimate ‘b(1)’ is to take the mean or max of your data. Experiment with both and use the one that works best.
I don’t have your data or the code you used to implement polyfit, so I can’t comment on them.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by