Complex value computed by model function, fitting cannot continue. Try using or tightening upper and lower bounds on coefficients.
조회 수: 31 (최근 30일)
이전 댓글 표시
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
Torsten
2024년 6월 3일
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.
채택된 답변
Matt J
2024년 6월 3일
편집: Matt J
2024년 6월 3일
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
Matt J
2024년 6월 4일
You're welcome, but when you've decided upon a solution, please Accept-click the appropriate answer.
추가 답변 (1개)
Mathieu NOE
2024년 6월 3일
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
참고 항목
카테고리
Help Center 및 File Exchange에서 Get Started with Curve Fitting Toolbox에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!