lsqcurvefit does not follow convergence criteria in summation.

5 vues (au cours des 30 derniers jours)
Chris Pruefert
Chris Pruefert le 27 Mai 2023
Commenté : Torsten le 30 Mai 2023
I have a function that uses summation to fit an bi-exponential function. Because I have to retrieve other information from that fit, I cannot use the exp2-fit function unfortunately. As for the procedure over the 8 parts (n=8). The data is in t(xdata) and S(ydata). For each of the terms 1-8 the individual contribution (yfit_n) is calculated and then added up together to get the final results for the fit (yfit). The fucntion has 7 variables for the fitting in the vector x or x0 for the respective startin point (x(2) is not used at this stage).
FS_1=0.05;
FS_2=2.0264;
d=1E-4;
dy=1E-5;
n=1:8;
t=t_S_mathworks(:,1);
S=t_S_mathworks(:,2);
x0=rand(7,1);
fun=@(x,t) x(1)+x(3).*(FS_1+FS_2*sum(((-1.^n)./n.^2).*(1-cos(n*pi*dy/d))...
.*(x(4).*exp(-x(6)*(t).*n.^2.*pi^2./d^2)...
+x(5).*exp(-x(7)*(t).*n.^2.*pi^2./d^2)),2));
options.OptimalityTolerance = 1e-15;
[x,resnorm]=lsqcurvefit(fun,x0,t,S);
Because I got the flag that indicates that the convergence criterion is too low I wanted to change, but it was incorporated in the fit-options, I think.
After the fit has converged (but not giving a useful result) I checked for the convergence criterion and it wasn't replaced with the new one of 1E-15.
Optimization completed: The first-order optimality measure, 1.132517e-08,
is less than options.OptimalityTolerance = 1.000000e-06.
And when I check for the fit using
S_fitted =x(1)+x(3).*(FS_1+FS_2*sum(((-1.^n)./n.^2).*(1-cos(n*pi*dy/d))...
.*(x(4).*exp(-x(6)*(t).*n.^2.*pi^2./d^2)...
+x(5).*exp(-x(7)*(t).*n.^2.*pi^2./d^2)),2));
plot(t,S_fitted)
I see that only the first two data points gave a result other than the minium of data points. So it seems that the fitting itself did not happen. I inlcued the data to let you see of that error is reproducable. I hope that it is just a bening error I cannot seem locate right now.
All help is appreciated.
All the best,
Chris
  3 commentaires
Chris Pruefert
Chris Pruefert le 29 Mai 2023
Hi Alex,
thank you for your post. I can't seem to achieve these outputs. Are you using the code exactly as I posted it above, or did you make changes to it? I am aware of the co-dependece of the fitting values, I have to contrain a few of these to make physical sense.
What comand did you use to get the fitting parameters as you show it here?
All the best,
Chris
Torsten
Torsten le 30 Mai 2023
@Alex Sha has his own software - usually with extraordinary good results for fitting problems.

Connectez-vous pour commenter.

Réponse acceptée

Matt J
Matt J le 27 Mai 2023
After the fit has converged (but not giving a useful result) I checked for the convergence criterion and it wasn't replaced with the new one of 1E-15.
Because you have not passed the options variable to lsqcurvefit
options.OptimalityTolerance = 1e-15;
[x,resnorm]=lsqcurvefit(fun,x0,t,S,[],[],options);
  7 commentaires
Matt J
Matt J le 30 Mai 2023
Modifié(e) : Matt J le 30 Mai 2023
I imagine it is because you are using a random initial guess, x0. If you initialize with Alex's solution, or values close to it, I would bet that you will get a more reasonable looking fit.
In any case, it is unrelated to your posted question. Your question was why the optimization was not obeying your options settings, and that has been solved.
Chris Pruefert
Chris Pruefert le 30 Mai 2023
That is correct. Thank you.

Connectez-vous pour commenter.

Plus de réponses (0)

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by