Clear Filters
Clear Filters

Complex value computed by model function, fitting cannot continue. Try using or tightening upper and lower bounds on coefficients.

14 views (last 30 days)
Hello, I really need some help on data fitting. I would like to fit my data custom equation:a+b*exp((-(x/c))^d. I try to use upper and lower bounds on coefficients but it does not work.If anyone can tell me what to do to resolve this I would greatly appreciate it.
  4 Comments
Daniel Jiao
Daniel Jiao on 4 Jun 2024
@Torsten Thanks lot, I'll check it. This equation is given by an article, so it's a theoretical formula, but yeah, I'll check whether it's correct, thanks so much!

Sign in to comment.

Accepted Answer

Matt J
Matt J on 3 Jun 2024
Edited: Matt J on 3 Jun 2024
fminspleas from this FEX download,
is helpful for these kinds of models.
[x,y]=readvars('200ms_SD.xlsx');
flist={1,@(c,x) exp(-c*x)};
[c,ab]=fminspleas(flist,+1,x,y);
a=ab(1);
b=ab(2);
f=@(x)a+b*exp(-c*x);
xf=linspace(min(x),max(x));
plot(x,y,'.c',xf,f(xf)); axis padded; legend Data Fit
  3 Comments
Daniel Jiao
Daniel Jiao on 4 Jun 2024
Thanks a lot for this answer, it really give me some ideas and confidence, as the comment you mentioned above, I just try to use fit() and fittype(), like:
ft = fittype( 'a+b*exp((-(x/c))^d)', 'independent', 'x', 'dependent', 'y' );
fitobject = fit(x,y,ft,'lower',[-1,0,0.002,0],'upper',[0,3,0.005,1]);
and I also use the curve fitting toolbox. Just some basic way, since it was first time I try to do curve fitting.
Anyway that's really helpful! Thanks so much for that, and I'll try it!

Sign in to comment.

More Answers (1)

Mathieu NOE
Mathieu NOE on 3 Jun 2024
hello
a very basic code using only fminsearch (no toolbox required )
I preferred to smooth a bit your data (otherwise it looks more like a cloud) but it's not absolutely needed - but you end up with other parameters after the fit
hope it helps !
data = readmatrix('200ms_SD.xlsx');
x = data(:,1);
y = data(:,2);
[x,ia,ic] = unique(x);
y = y(ia);
ys = smoothdata(y,'gaussian',100);
% curve fit using fminsearch
% model a+b*exp((-(x/c))^d
f = @(a,b,c,d,x) a + b.*exp(-(x/c).^d);
obj_fun = @(params) norm(f(params(1), params(2), params(3), params(4),x)-ys);
sol = fminsearch(obj_fun, [ys(end),(max(ys)-ys(end)),1,1]);
Exiting: Maximum number of function evaluations has been exceeded - increase MaxFunEvals option. Current function value: 1.159572
a_sol = sol(1)
a_sol = 0.0903
b_sol = sol(2)
b_sol = 0.5209
c_sol = sol(3)
c_sol = 0.0028
d_sol = sol(4)
d_sol = 0.1143
y_fit = f(a_sol, b_sol, c_sol, d_sol, x);
R2 = my_R2_coeff(ys,y_fit); % correlation coefficient
plot(x,y, 'k.',x,ys,'r',x, y_fit,'b-')
title([' Fit / R² = ' num2str(R2) ], 'FontSize', 15)
legend('raw data','smoothed','fit');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function R2 = my_R2_coeff(data,data_fit)
% R2 correlation coefficient computation
% The total sum of squares
sum_of_squares = sum((data-mean(data)).^2);
% The sum of squares of residuals, also called the residual sum of squares:
sum_of_squares_of_residuals = sum((data-data_fit).^2);
% definition of the coefficient of correlation (R squared) is
R2 = 1 - sum_of_squares_of_residuals/sum_of_squares;
end
  1 Comment
Daniel Jiao
Daniel Jiao on 4 Jun 2024
Hello,thanks a lot for the answer, it's really helpful! I'll try to read and try the code you offered! My original code is much more basic, since I'm just a beginner.
Thanks again that I really got some knowledge from you!

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!