Complex value computed by model function, fitting cannot continue. Try using or tightening upper and lower bounds on coefficients.
31 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Daniel Jiao
el 3 de Jun. de 2024
Comentada: Matt J
el 4 de Jun. de 2024
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 comentarios
Torsten
el 3 de Jun. de 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.
Respuesta aceptada
Matt J
el 3 de Jun. de 2024
Editada: Matt J
el 3 de Jun. de 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 comentarios
Matt J
el 4 de Jun. de 2024
You're welcome, but when you've decided upon a solution, please Accept-click the appropriate answer.
Más respuestas (1)
Mathieu NOE
el 3 de Jun. de 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]);
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
Ver también
Categorías
Más información sobre Get Started with Curve Fitting Toolbox en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!