Complex value computed by model function, fitting cannot continue. Try using or tightening upper and lower bounds on coefficients.
Ältere Kommentare anzeigen
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 Kommentare
We do not know what you tried (no code is shown), so we cannot guess what went wrong. I will point out though that the model is over-parametrized. It is enough to use 3-parameters y=a+b*exp(-c*x). No custom equation is needed for this - it falls within the 'exp2' fitType of the fit() command.
Torsten
am 3 Jun. 2024
Because of the error message and the overfitting, I suspect
a+b*exp(-(x/c)^d)
instead of
a+b*exp((-(x/c))^d
is meant.
Daniel Jiao
am 4 Jun. 2024
Akzeptierte Antwort
Weitere Antworten (1)
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]);
a_sol = sol(1)
b_sol = sol(2)
c_sol = sol(3)
d_sol = sol(4)
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 Kommentar
Daniel Jiao
am 4 Jun. 2024
Kategorien
Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


